GraphRAG conscient de l’ontologie : lorsque les vecteurs ont besoin de relations typées
Comment les ancrages d’identification, les contrats ontologiques, la fusion de classements et les mécanismes « citer ou rejeter » corrigent les défaillances du RAG concernant les CVE, la propriété à plusieurs étapes et les faits graphiques non exprimés verbalement.
La récupération dense répond bien à de nombreuses questions, mais échoue encore de manière récurrente : avec des identifiants exacts, des relations à plusieurs étapes, et des faits qui n’existent que sous forme de structure graphique. GraphRAG, conscient de l’ontologie, considère ces échecs comme des éléments à intégrer dans la conception — non pas comme des raisons d’abandonner les vecteurs, mais plutôt comme des motifs pour ajouter une couche de connaissances typée à côté d’eux.
Partie 1 — Comment fonctionne précisément RAG
Le RAG classique incorpore une question, récupère les fragments les plus proches, et génère du contenu à partir de ce contexte. Pour une requête concernant une vulnérabilité telle que :
question: "path traversal apache httpd"
les classements vectoriels et lexicaux peuvent être en désaccord :
VECTOR (cosine) LEXICAL (keyword overlap)
1. CVE-2021-41773 0.746 ← correct 1. CVE-2021-28544 6.60
2. CVE-2021-23797 0.735 2. CVE-2021-40525 6.47
3. CVE-2021-32643 0.728 5. CVE-2021-41773 5.57 ← correct, buried
Lorsque le CVE correct est présent mais pas prédominant, la génération invente des réponses de manière confiante. Les domaines riches en identifiants (CVE, SKU, IDs de tickets) révèlent rapidement cette lacune.
Partie 2 — Le mur qu’il rencontre, mesuré
Échec 1 — identifiants exacts
La correspondance lexicale est utile, mais les voisins bruyants l’emportent malgré tout. Le texte récupéré peut même rejeter la formulation basée sur la vulnérabilité :
[S1] "Rejected reason: This vulnerability does not meet the criteria for a
security vulnerability…"
La génération reflète alors le mauvais voisin.
Echec 2 — complétude relationnelle
« Quels produits sont affectés ? » nécessite des liens, et non simplement le paragraphe le plus proche. La similarité renvoie des CVEs associés ; elle ne suit pas les liens AFFECTS.
Echec 3 — faits que personne n’a notés
Certaines réponses n’existent qu’en tant qu’intersections entre entités — jamais sous forme de phrase. Aucun fragment ne contient cette connexion ; seul un graphe le fait.
Partie 3 — Ce qu’ajoute un graphe de connaissances
Les nœuds et les arêtes typés font des identifiants et des relations des éléments de premier plan :
(:Vulnerability {cve_id: 'CVE-2021-41773', cvss_base_score: 9.8, cvss_severity: 'CRITICAL'})
-[:AFFECTS {version: '2.4.49'}]-> (:Product {key: 'apache:http_server'})
-[:HAS_WEAKNESS]-> (:Weakness {cwe_id: 'CWE-22'})
La navigation permet de répondre aux questions relationnelles ; les vecteurs restent utiles lorsque le texte constitue la preuve adéquate.
Ontologie vs. graphe de connaissances — une distinction opérationnelle
ontologie représente le contrat définissant quels types d’entités, quels types de liens et quelles propriétés sont nécessaires. Un graphe de connaissances est l’instance remplie conformément à ce contrat. Sans ontologie, l’extraction devient imprécise et les jointures peu fiables. Avec une ontologie, les pipelines valident et rejetent les triples incorrects avant qu’ils ne détériorent les résultats de recherche.
Trois interprétations possibles de « GraphRAG »
- Le graphe en tant qu’index — stocker des fragments de texte, mais les récupérer via les voisins du graphe.
- Le graphe en tant que mémoire — les entités et les liens constituent le stock principal ; le texte sert de preuve.
- Le graphe en tant que planificateur — l’agent planifie les étapes à suivre avant de récupérer le texte.
Les conceptions prenant en compte l’ontologie combinent généralement (2) et (1) : des faits structurés pour assurer la précision, ainsi que du texte source pour les citations.
Partie 4 — L’architecture, couche par couche
L’ingestion extrait des entités/relations au sein de l’ontologie, enregistre les faits du graphe, conserve les segments sources, et construit en même temps un index vectoriel/lexical à partir du texte. Le temps de requête permet d’ancrer les identifiants, d’élargir les voisins du graphe, de réaliser une recherche dense/lexicale, de fusionner les classements, et de créer un prompt comprenant des sections distinctes FAITS et PREUVES, ainsi que des règles de citation.
Trois décisions imposées par les données
- Les ancrages d’identifiants sont préférables aux correspondances floues lorsqu’un token CVE/produit est présent.
- La fusion pondérée doit renforcer les classements du graphe pour les requêtes d’identifiants sans noyer le texte narratif pour les demandes de type récit.
- Les vérifications de fidélité doivent rejeter les réponses qui citent des balises manquantes ou contredisent les propriétés du graphe.
Partie 5 — Une question, du début à la fin
Question :
Q: "which products are affected by CVE-2021-41773"
Résolution des ancrages :
ANCHOR Vulnerability CVE-2021-41773 method=identifier conf=1.00
Poids de fusion lorsqu’un identifiant sert d’ancre :
weights = {graph: 2.0, vector: 1.0} # identifier match
# a lexical product match would be 1.2; no anchor at all, 0.0
Listes concurrentes :
VECTOR 1. CVE-2021-21022 (Magento IDOR) 2. CVE-2021-27385 …
GRAPH 1. CVE-2021-41773 (anchor) 2. CVE-2021-25216 (shares netapp:cloud_backup)
Score de fusion par rang réciproque :
CVE-2021-41773 2.0/(60+1) = 0.03279 ← graph, rank 1
CVE-2021-21022 1.0/(60+1) = 0.01639 ← vector, rank 1
Faits graphiques compressés pour le modèle :
FACTS (from the knowledge graph):
[G1] CVE-2021-41773 | CRITICAL 9.8 (CVSS 3.1) | CWE: CWE-22
affects: apache:http_server 2.4.49, fedoraproject:fedora 34,
fedoraproject:fedora 35, netapp:cloud_backup,
oracle:instantis_enterprisetrack 17.1 / 17.2 / 17.3
source: https://nvd.nist.gov/vuln/detail/CVE-2021-41773
Preuves sources :
EVIDENCE (source text):
[S1] "A flaw was found in a change made to path normalization in Apache
HTTP Server 2.4.49. An attacker could use a path traversal attack…"
Réponse structurée avec citations :
{"answer": "CVE-2021-41773 is CRITICAL with a CVSS base score of 9.8 [G1].
It affects apache:http_server 2.4.49, fedoraproject:fedora 34,
fedoraproject:fedora 35 [G1].",
"sources": ["G1"],
"entities": [{"label": "Vulnerability", "key": "CVE-2021-41773"}],
"confidence": "high"}
Portes de contrôle post-génération :
✓ every cited tag exists in the context
✓ the answer cites something at all
✓ every CVE id in the answer appears in the context
✓ entity labels are real ontology classes
✓ numbers that look like CVSS scores match the graph facts
→ ACCEPTED
Une mauvaise réponse qui échoue aux portes de contrôle :
{"answer": "CVE-2021-41773 scores 4.3 and affects nginx [G1]."}
Raisons de rejet :
✗ states 4.3 but the graph facts say [9.8]
✗ entity Product nginx:nginx is not in the context
→ REJECTED → one repair attempt → still bad → REFUSAL
Même mécanisme, un pas de plus
Les jointures d’inventaire transforment les « produits affectés » en « applications de niveau 1 affectées et équipes responsables » :
application criticality team library pinned match_precision
checkout-web tier1 payments httpd 2.4.49 version-exact
log-aggregator tier2 infrastructure httpd 2.4.49 version-exact
api-gateway tier1 platform-core httpd 1.15.17 product-level
Même mécanisme d’ancre et de fusion ; un pas supplémentaire à travers les points d’application.
Partie 6 — Résultats, coûts et bugs
On identifie les suites à plusieurs sauts ; la fusion tenant compte de l’ontologie améliore la précision par rapport aux méthodes basées uniquement sur des vecteurs ; pour les questions en prose pure, l’amélioration est plus faible — il convient donc de conserver les vecteurs. Les coûts proviennent de l’extraction, des opérations sur les graphes et de prompts légèrement plus longs — pas du renoncement aux embeddings.
Les bugs, car ce sont eux le véritable contenu
Bugs typiques en environnement de production : dérive de l’ontologie (apparition d’un nouveau type d’arête), hallucinations de l’extraiteur (gravité incorrecte), erreurs de copier-coller des poids de fusion, étiquettes de citation inexistantes dans le contexte, ainsi que des caches affichant des snapshots de graphes obsolètes après une mise à jour CVE. Chaque bug correspond à un test : validation du schéma, vérification des plages de valeurs des propriétés, tests de fusion, contrôles d’existence des citations, et gestion du TTL/invalidation.
Partie 7 — Quand le construire, et quand ne pas le faire
Utilisez cette méthode lorsque les données contiennent des identifiants, des questions relatives à la propriété ou aux impacts sur plusieurs étapes, ou des faits jamais formulés en phrases. Évitez-la lorsque le corpus est suffisamment petit pour se contenter d’une recherche hybride efficace, ou lorsque personne ne prendra en charge l’entité conceptuelle. GraphRAG n’est pas un symbole de sophistication ; c’est une réponse à des modes d’échec identifiés.
Les cinq invariants à conserver à n’importe quelle échelle
- L’entité conceptuelle en premier — les types avant les triples.
- Ancre pour les identifiants — correspondance exacte avant utilisation du coefficient de cosinus.
- Séparer les faits des preuves dans la demande.
- Citer ou rejeter les résultats après génération.
- Évaluer sur des questions spécifiques — et non seulement en se basant sur des blogs de taux de réussite publics.
Ces invariants restent utiles, que ce soit pour une démonstration sur ordinateur portable ou pour un plan de connaissances sécurisées multi-locataires. Étendre la couverture doit signifier enrichir l’ontologie et les éléments fixes, et non ajouter une instruction supplémentaire à un ensemble non structuré de fragments. Conservez des métriques d’extraction (précision/rappel pour les entités et les arêtes) en même temps que des métriques de réponse ; sinon, un modèle « meilleur » peut inventer silencieusement des relations qui semblent cohérentes mais échouent aux audits. Versionnez l’ontologie comme une API : les modifications additionnelles sont simples, les renommages nécessitent des tâches de migration, et les suppressions exigent des marques funéraires afin que les anciennes captures d’écran ne fassent pas revivre des arêtes supprimées. Pour les équipes de surveillance, alertez en cas d’augmentation soudaine des rejets aux portes d’accès ainsi que des taux d’erreur de l’extraiteur, et non seulement en cas de latence du Gateway — ces signaux permettent de détecter les défaillances du plan de connaissances avant que les utilisateurs ne remarquent des gravités CVE incorrectes. Enfin, prévoyez une file d’examen humain pour les CVE contestés et les mappages de produits durant les premiers mois ; les étiquettes deviennent alors des indicateurs de régression.
Des tests de fusion qui maintiennent l’exactitude des poids de fusion à mesure que le catalogue s’agrandit.Lors de l’évaluation des fournisseurs ou des frameworks, demandez comment ils encodent les contraintes ontologiques, comment ils fusionnent les classements graphiques et vectoriels, et comment ils testent la fiabilité des citations. Les démonstrations qui ne montrent qu’une interface graphique attrayante sans ces trois réponses recréent généralement le même problème de type RAG sous un nouveau nom. Préférez des pipelines simples et textuels avec des points de référence explicites à un « raisonnement graphique agentiel » mystérieux qui ne peut pas indiquer quelles arêtes justifient une affirmation de gravité. C’est cette approche simple qui rend GraphRAG conscient de l’ontologie fonctionnel.
Considérez les poids de fusion comme une configuration à tester : stockez-les aux côtés des fichiers fixes qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » ces poids dans un notebook, exigez une proposition de modification qui met à jour ces fichiers fixes afin que les dérives ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui fixent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne puissent pas se cacher dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui fixent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne puissent pas se cacher dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui fixent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne puissent pas se cacher dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui fixent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne puissent pas se cacher dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui fixent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne puissent pas se cacher dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui fixent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne puissent pas se cacher dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui fixent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne puissent pas se cacher dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui fixent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne puissent pas se cacher dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui fixent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne puissent pas se cacher dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui fixent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui fixent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui fixent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de référence qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de référence afin que les dégradations ne restent pas cachées dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de configuration qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de configuration afin que les dérives ne puissent pas se cacher dans des connaissances propres à un groupe.
Considérez les poids de fusion comme une configuration à tester : stockez-les à côté des fichiers de configuration qui définissent la question, les listes de candidats et l’ID principal attendu. Lorsque quelqu’un « ajuste » les poids dans un carnet de notes, exigez une proposition de modification qui met à jour ces fichiers de configuration afin que les dérives ne puissent pas se cacher dans des connaissances propres à un groupe.