Se rendre au contenu

comment-le-faire-avec-deepinfra-pour-gerer-des-formats-onthologies-dont-saferener

DeepInfra

DeepInfra expose des endpoints OpenAI-compatibles, ce qui permet d’utiliser des SDK ou appels API similaires aux appels OpenAI.

Exemple simplifié côté Node.js :

const response = await fetch("https://api.deepinfra.com/v1/openai/chat/completions", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.DEEPINFRA_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "qwen-or-mistral-model-name",
messages: [
{
role: "system",
content: `
Tu es un assistant de structuration sémantique.
Tu dois produire uniquement un JSON-LD valide.
Tu dois utiliser les vocabulaires fournis : ETIM, Haystack, SAREF4ENER, Energy Core.
Tu ne dois pas inventer de propriété non autorisée.
Si une information est incertaine, ajoute requiresHumanValidation = true.
`
},
{
role: "user",
content: `
Document extrait :
${extractedText}

Contexte dictionnaire :
${ragContext}

Produit attendu :
JSON-LD pour un équipement énergie exploitable par un EMS Overlay.
`
}
],
response_format: {
type: "json_object"
}
})
});

const result = await response.json();

Pour Mistral, le JSON mode est officiellement documenté ; la documentation recommande aussi d’indiquer explicitement dans le prompt que la réponse doit être en JSON.

Pour Qwen, la documentation Alibaba Cloud indique aussi un usage de response_format avec json_object et demande que le prompt contienne explicitement le mot JSON.

7. Pipeline technique recommandé

Étape 1 — Préparer les dictionnaires

Vous créez des tables ou collections :

etim_classes
etim_features
haystack_tags
saref4ener_terms
energy_core_concepts
jsonld_contexts
shacl_shapes

Le LLM ne doit pas “inventer” l’ontologie. Il doit sélectionner dans des dictionnaires contrôlés.

Étape 2 — RAG avant appel LLM

Avant d’appeler Qwen ou Mistral, vous récupérez uniquement le contexte utile :

Document : fiche batterie

RAG recherche :
- classes ETIM proches
- tags Haystack proches
- concepts SAREF4ENER pertinents
- concepts Energy Core pertinents

Prompt compact

Cela évite d’envoyer tout ETIM ou tout SAREF au LLM.

Étape 3 — Générer un JSON-LD candidat

Le LLM produit un objet :

status = draft
confidence = 0.78
requiresHumanValidation = true

Il faut éviter de publier directement.

Étape 4 — Validation déterministe

Après la réponse LLM :

1. Vérifier JSON valide
2. Vérifier JSON Schema / Zod
3. Vérifier contexte JSON-LD
4. Faire expansion JSON-LD
5. Appliquer SHACL
6. Extraire relations critiques
7. Stocker dans PostgreSQL

Étape 5 — Stockage

Table principale :

CREATE TABLE semantic_objects (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
source_system TEXT NOT NULL,
source_ref TEXT NOT NULL,
object_type TEXT NOT NULL,
ontology_profile TEXT NOT NULL,
jsonld JSONB NOT NULL,
llm_model TEXT,
llm_confidence NUMERIC,
validation_status TEXT DEFAULT 'draft',
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);

Table de relations extraites :

CREATE TABLE semantic_relations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
subject_id TEXT NOT NULL,
predicate TEXT NOT NULL,
object_id TEXT NOT NULL,
source_object_id UUID REFERENCES semantic_objects(id),
confidence NUMERIC,
status TEXT DEFAULT 'candidate'
);

C’est cette table semantic_relations qui remplace partiellement le graphe RDF pour un MVP.

8. Ce que l’EMS consomme

L’EMS ne doit pas appeler le LLM à chaque décision.

Mauvais design :

EMS temps réel → appel LLM → décision de pilotage

Trop lent, trop incertain, trop difficile à auditer.

Bon design :

LLM → prépare les descriptions sémantiques
Validation → publication
EMS → consomme les objets validés

Exemple d’objet publié vers l’EMS :

{
"equipmentId": "zendure-4000-pro-001",
"type": "StorageAsset",
"controllable": true,
"canCharge": true,
"canDischarge": true,
"minSoc": 20,
"backupReserve": 30,
"availableControlPoints": [
"chargeLimit",
"dischargeLimit",
"operatingMode"
],
"semanticSource": "saref4ener-jsonld",
"validationStatus": "validated"
}

9. Cas d’usage où Qwen / Mistral apportent beaucoup

CasApport du LLM
Lire une fiche PDFExtraction intelligente
Trouver la bonne classe ETIMMatching sémantique
Mapper vers HaystackTags proposés automatiquement
Ajouter SAREF4ENERFlexibilité, profils, événements
Créer un JSON-LDGénération structurée
Corriger une incohérenceRéparation assistée
Expliquer à l’expertJustification lisible
Générer des tests SHACLProposition de contraintes
Requête en langage naturelTraduction vers SQL/JSON ou SPARQL

10. Ce qu’il faut éviter

ErreurRisque
LLM seul comme base de donnéesPas de persistance fiable
LLM seul comme validateurErreurs silencieuses
Tags libres inventésPollution de l’ontologie
Publication automatique vers EMSMauvaise décision énergétique
Prompt trop large avec tout ETIMCoût, lenteur, confusion
Pas de versioningAudit impossible
Pas de validation humaineRisque métier

11. Architecture cible pour votre projet

Odoo
= source de vérité métier

PostgreSQL / Supabase
= stockage JSON-LD, mappings, embeddings, cache relationnel

DeepInfra / Qwen ou Mistral
= génération et mapping sémantique

Semantic API
= orchestration, validation, versioning

SHACL / JSON Schema
= garde-fous

EMS Overlay
= décision énergétique sur objets validés

Visuellement :

PDF / CCTP / DPGF / datasheet

OCR / parsing

RAG dictionnaires

LLM DeepInfra

JSON-LD candidat

Validation JSON Schema + SHACL

PostgreSQL jsonb + semantic_relations

Human Review

Published semantic profile

EMS Overlay

12. Conclusion

Oui, vous pouvez utiliser un LLM open source sur DeepInfra pour “gérer” les JSON-LD, mais uniquement comme moteur de génération, mapping, enrichissement et réparation.

La meilleure formulation serait :

Le LLM ne remplace pas GraphDB comme base graphe.
Il remplace une partie de l’effort humain de modélisation sémantique.

L’architecture que je recommande :

Pas de GraphDB au début.
PostgreSQL jsonb + pgvector + semantic_relations.
LLM DeepInfra pour générer les JSON-LD.
SHACL / JSON Schema pour valider.
Odoo comme vérité métier.
EMS uniquement alimenté par les objets validés.

C’est plus léger, plus rapide à développer, moins coûteux, et parfaitement compatible avec une montée en puissance future vers GraphDB ou Apache Jena si vous avez ensuite besoin de SPARQL lourd et d’inférence RDF.

C.