GraphRAG : La Révolution qui Rend le RAG Traditionnel Obsolète
Découvrez GraphRAG de Microsoft : knowledge graphs + recherche vectorielle pour mieux répondre aux questions multi-hop et globales. Architecture, comparaison et implémentation complète.
GraphRAG : La Révolution qui Rend le RAG Traditionnel Obsolète
Le RAG traditionnel a une faiblesse fondamentale : il traite les documents comme des morceaux isolés. GraphRAG, introduit par Microsoft Research, change la donne en construisant un graphe de connaissances complet avant même de recevoir la première question. Le résultat ? Des gains de précision marqués sur les questions multi-hop et de raisonnement, et la capacité inédite de répondre à des questions globales sur l'ensemble d'un corpus.
TL;DR
- GraphRAG combine knowledge graphs et recherche vectorielle pour un retrieval supérieur
- Processus : extraction d'entités, construction du graphe, détection de communautés, résumés de communautés
- Killer feature : répondre à des questions globales ("Quels sont les thèmes principaux du corpus ?")
- Meilleure précision sur les questions multi-hop et de raisonnement que le RAG standard (l'écart est plus net sur les requêtes complexes que sur les questions factuelles simples)
- Cas d'usage : analyse documentaire, intelligence économique, recherche juridique, bases de connaissances complexes
- Limites : coût d'indexation élevé, complexité accrue, latence potentiellement supérieure
Le problème du RAG traditionnel
Le RAG standard fonctionne en trois étapes : découper les documents en chunks, les vectoriser, puis retrouver les chunks les plus similaires à la question. Ce fonctionnement a deux failles majeures.
Faille 1 : Les questions multi-hop
Question : "Comment la politique énergétique de l'Allemagne a-t-elle influencé
les décisions de la France en matière de nucléaire ?"
RAG Standard :
├── Chunk 1 : "L'Allemagne a fermé ses centrales nucléaires en 2023..."
├── Chunk 2 : "La France a relancé son programme nucléaire..."
└── ❌ Aucun chunk ne fait explicitement le LIEN entre les deux
GraphRAG :
├── Entité : Allemagne → relation : "a influencé" → Entité : France
├── Contexte : politique énergétique, nucléaire, transition
└── ✅ Le graphe capture la RELATION entre les entités
Faille 2 : Les questions globales
Question : "Quels sont les thèmes principaux abordés dans ce corpus de 500 documents ?"
RAG Standard : ❌ Impossible - la similarité vectorielle ne peut pas synthétiser
GraphRAG : ✅ Les résumés de communautés fournissent une vue d'ensemble
Comment fonctionne GraphRAG
L'architecture GraphRAG se décompose en quatre phases distinctes lors de l'indexation, suivies de deux modes de requête.
Phase 1 : Extraction d'entités et de relations
Un LLM analyse chaque chunk de texte pour en extraire les entités (personnes, organisations, concepts, lieux) et les relations entre elles.
DEVELOPERpythonfrom graphrag.index import create_pipeline from graphrag.config import GraphRagConfig # Configuration de l'extraction config = GraphRagConfig( llm_model="gpt-4o", chunk_size=1200, chunk_overlap=100, entity_extraction_prompt=""" Extrait toutes les entités et relations de ce texte. Entités : personnes, organisations, technologies, concepts, lieux Relations : type de lien entre deux entités Format : ENTITÉS: [(nom, type, description)] RELATIONS: [(source, cible, type, description)] """, max_entities_per_chunk=30, max_relations_per_chunk=50 ) # Lancement de l'indexation pipeline = create_pipeline(config) result = await pipeline.run(documents)
Phase 2 : Construction du graphe de connaissances
Les entités et relations extraites sont fusionnées pour construire un graphe cohérent. Les entités similaires sont regroupées (résolution d'entités).
┌─────────────────────────────────────────────────────────────────┐
│ Knowledge Graph │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [Microsoft] ──créé──▶ [GraphRAG] │
│ │ │ │
│ emploie améliore │
│ │ │ │
│ [Researchers] ──publie──▶ [Paper 2024] │
│ │ │
│ référence │
│ │ │
│ [Neo4j] ◀──utilise── [Knowledge Graph] │
│ │ │ │
│ stocke construit par │
│ │ │ │
│ [Entités] ◀──extraits── [LLM] │
│ │
└─────────────────────────────────────────────────────────────────┘
Phase 3 : Détection de communautés
L'algorithme de Leiden identifie des communautés (clusters) d'entités fortement connectées dans le graphe. Chaque communauté représente un thème ou sous-thème du corpus.
DEVELOPERpythonimport networkx as nx from graspologic.partition import hierarchical_leiden # Construction du graphe NetworkX G = nx.Graph() for entity in entities: G.add_node(entity.name, type=entity.type, description=entity.description) for relation in relations: G.add_edge( relation.source, relation.target, type=relation.type, description=relation.description, weight=relation.confidence ) # Détection de communautés hiérarchiques communities = hierarchical_leiden( G, max_cluster_size=10, random_seed=42 ) print(f"Nombre de communautés détectées : {len(communities)}") # Nombre de communautés détectées : 47
Phase 4 : Résumés de communautés
Un LLM génère un résumé pour chaque communauté, capturant les thèmes, entités clés et relations importantes. Ces résumés sont la clé du mode de requête global.
DEVELOPERpythoncommunity_summary_prompt = """ Voici les entités et relations d'une communauté thématique : Entités : {entities} Relations : {relations} Génère un résumé complet de cette communauté qui inclut : 1. Le thème principal 2. Les entités clés et leur rôle 3. Les relations importantes 4. Les insights ou conclusions qu'on peut en tirer """ # Chaque communauté reçoit son résumé for community in communities: summary = llm.generate( community_summary_prompt.format( entities=community.entities, relations=community.relations ) ) community.summary = summary
Les deux modes de requête
Mode Local : questions spécifiques
Le mode local fonctionne comme un RAG amélioré. Il identifie les entités pertinentes dans la question, traverse le graphe pour collecter le contexte, et génère une réponse.
DEVELOPERpythonfrom graphrag.query import LocalSearch local_search = LocalSearch( llm=llm, context_builder=context_builder, token_budget=12000, community_level=2 # Niveau de détail ) # Question spécifique result = await local_search.search( "Quelle est l'architecture technique de GraphRAG ?" ) print(result.response) print(f"Entités utilisées : {result.context_data['entities']}") print(f"Relations traversées : {result.context_data['relationships']}")
Mode Global : questions de synthèse
Le mode global est LA killer feature de GraphRAG. Il utilise les résumés de communautés pour répondre à des questions qui nécessitent une vue d'ensemble du corpus entier.
DEVELOPERpythonfrom graphrag.query import GlobalSearch global_search = GlobalSearch( llm=llm, context_builder=context_builder, map_llm=map_llm, # LLM pour le map reduce_llm=reduce_llm, # LLM pour le reduce community_level=1 # Niveau macro ) # Question globale - impossible en RAG standard result = await global_search.search( "Quels sont les principaux défis et tendances " "dans le domaine du RAG en 2026 ?" ) # Utilise un pattern Map-Reduce : # 1. Map : chaque résumé de communauté est évalué # 2. Reduce : les réponses partielles sont synthétisées
Comparaison : RAG Standard vs GraphRAG
| Critère | RAG Standard | GraphRAG Local | GraphRAG Global |
|---|---|---|---|
| Questions factuelles simples | Excellent | Excellent | Bon |
| Questions multi-hop | Faible | Excellent | Bon |
| Questions globales/synthèse | Impossible | Limité | Excellent |
| Coût d'indexation | Faible (~$0.01/doc) | Elevé (~$0.50/doc) | Elevé |
| Latence de requête | ~1-2s | ~3-5s | ~8-15s |
| Stockage nécessaire | Vecteurs uniquement | Vecteurs + graphe | Vecteurs + graphe + résumés |
| Complexité de mise en place | Simple | Complexe | Complexe |
| Mise à jour incrémentale | Facile | Difficile | Difficile |
| Scalabilité | Excellente | Bonne | Moyenne |
| Hallucinations | Moyen | Faible | Faible |
Benchmarks de précision (évaluation systématique 2025)
Les gains réels sont plus nuancés que le marketing ne le suggère. Une évaluation systématique comparant RAG et GraphRAG (Han et al., 2025, arXiv:2502.11371) montre que l'avantage de GraphRAG se concentre sur les questions multi-hop et de raisonnement, tandis que le RAG standard reste compétitif — voire meilleur — sur les questions factuelles simples.
| Benchmark | Type de question | RAG Standard | GraphRAG |
|---|---|---|---|
| MultiHop-RAG (global) | Multi-hop | 67,0% | 69,0% |
| MultiHop-RAG (temporel) | Multi-hop sensible au temps | 30,7% | 50,6% (local) / 53,3% (global) |
| HotpotQA (F1) | Multi-hop | 60,0% | 61,7% |
| Natural Questions (F1) | Single-hop | 64,8% | 63,0% |
L'écart le plus spectaculaire apparaît sur les questions temporelles et de raisonnement, où GraphRAG peut gagner plus de 20 points de précision. Sur les questions single-hop et factuelles, le RAG standard conserve souvent l'avantage.
Implémentation avec LangChain et Neo4j
Setup de l'environnement
DEVELOPERpython# Installation # pip install langchain langchain-community neo4j graphrag from langchain_community.graphs import Neo4jGraph from langchain_openai import ChatOpenAI, OpenAIEmbeddings from langchain.chains import GraphCypherQAChain # Connexion à Neo4j graph = Neo4jGraph( url="bolt://localhost:7687", username="neo4j", password="your-password" ) # LLM pour l'extraction et la génération llm = ChatOpenAI(model="gpt-4o", temperature=0) embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
Extraction d'entités avec LangChain
DEVELOPERpythonfrom langchain_experimental.graph_transformers import LLMGraphTransformer # Transformer des documents en graphe transformer = LLMGraphTransformer( llm=llm, allowed_nodes=["Person", "Organization", "Technology", "Concept"], allowed_relationships=[ "CREATED", "WORKS_FOR", "USES", "IMPROVES", "COMPETES_WITH", "PART_OF", "RELATED_TO" ], node_properties=["description"], relationship_properties=["description", "strength"] ) # Conversion des documents from langchain_core.documents import Document documents = [ Document(page_content="Microsoft Research a créé GraphRAG en 2024..."), Document(page_content="Neo4j est la base de données graphe la plus utilisée..."), ] graph_documents = transformer.convert_to_graph_documents(documents) # Injection dans Neo4j graph.add_graph_documents( graph_documents, baseEntityLabel=True, include_source=True )
Requêtage hybride (Graphe + Vecteurs)
DEVELOPERpythonfrom langchain_community.vectorstores.neo4j_vector import Neo4jVector from langchain.chains import RetrievalQA # Index vectoriel dans Neo4j vector_store = Neo4jVector.from_existing_graph( embedding=embeddings, graph=graph, node_label="Document", text_node_properties=["text"], embedding_node_property="embedding" ) # Chain hybride : graphe + vecteurs class HybridGraphRAGChain: def __init__(self, graph, vector_store, llm): self.graph_chain = GraphCypherQAChain.from_llm( llm=llm, graph=graph, verbose=True, validate_cypher=True ) self.vector_retriever = vector_store.as_retriever( search_kwargs={"k": 5} ) self.llm = llm async def query(self, question: str) -> str: # 1. Récupérer le contexte du graphe graph_context = await self.graph_chain.arun(question) # 2. Récupérer le contexte vectoriel vector_docs = await self.vector_retriever.aget_relevant_documents( question ) vector_context = "\n".join([doc.page_content for doc in vector_docs]) # 3. Fusionner et générer prompt = f""" Contexte du graphe de connaissances : {graph_context} Contexte des documents : {vector_context} Question : {question} Réponds en combinant les deux sources de contexte. """ return await self.llm.ainvoke(prompt)
Quand utiliser GraphRAG vs RAG Standard
Utilisez GraphRAG quand :
- Votre corpus contient des relations complexes entre entités
- Les utilisateurs posent des questions multi-hop (reliant plusieurs concepts)
- Vous avez besoin de synthèses globales sur l'ensemble du corpus
- Le domaine est riche en entités nommées (juridique, médical, intelligence économique)
- La précision prime sur la latence et le coût
Restez sur le RAG Standard quand :
- Les questions sont principalement factuelles et simples
- Le corpus change fréquemment (mise à jour incrémentale difficile en GraphRAG)
- Le budget est limité (GraphRAG coûte 10-50x plus à indexer)
- La latence est critique (< 2 secondes requises)
- Le corpus est petit (< 100 documents) - le graphe n'apporte pas assez de valeur
Arbre de décision
Votre corpus contient-il des relations complexes entre entités ?
├── Non → RAG Standard
└── Oui
├── Les utilisateurs posent-ils des questions multi-hop ?
│ ├── Non → RAG Standard avec métadonnées enrichies
│ └── Oui
│ ├── Avez-vous besoin de synthèses globales ?
│ │ ├── Non → GraphRAG mode Local uniquement
│ │ └── Oui → GraphRAG complet (Local + Global)
│ └── Budget indexation > $50/mois ?
│ ├── Non → RAG Standard + post-traitement LLM
│ └── Oui → GraphRAG
└── Le corpus change-t-il souvent ?
├── Oui → RAG Standard (ou GraphRAG avec re-indexation planifiée)
└── Non → GraphRAG
Optimisation des coûts GraphRAG
L'indexation GraphRAG est coûteuse car elle nécessite des appels LLM pour chaque chunk. Voici comment réduire les coûts.
| Stratégie | Réduction de coût | Impact sur la qualité |
|---|---|---|
| Utiliser GPT-4o-mini pour l'extraction | -70% | -10% précision |
| Augmenter la taille des chunks (2000 tokens) | -40% | -5% granularité |
| Limiter les types d'entités | -30% | Dépend du domaine |
| Indexation incrémentale (nouveaux docs seulement) | -60-80% | Graphe potentiellement fragmenté |
| Cache des embeddings | -20% | Aucun |
| Utiliser un modèle local (Llama 3) pour l'extraction | -90% | -15-20% précision |
Coût estimé par taille de corpus
| Taille du corpus | RAG Standard | GraphRAG (GPT-4o) | GraphRAG (GPT-4o-mini) |
|---|---|---|---|
| 100 documents | ~$0.50 | ~$25 | ~$8 |
| 1 000 documents | ~$5 | ~$250 | ~$75 |
| 10 000 documents | ~$50 | ~$2 500 | ~$750 |
| 100 000 documents | ~$500 | ~$25 000 | ~$7 500 |
Outils et frameworks
Microsoft GraphRAG (officiel)
Le framework open source de Microsoft, le plus complet pour GraphRAG.
DEVELOPERbashpip install graphrag # Initialisation du projet graphrag init --root ./my-project # Indexation graphrag index --root ./my-project # Requête locale graphrag query --root ./my-project --method local \ "Quelle est l'architecture de GraphRAG ?" # Requête globale graphrag query --root ./my-project --method global \ "Quels sont les thèmes principaux du corpus ?"
Neo4j + LangChain
Idéal pour une intégration dans un système existant. Voir la section implémentation ci-dessus.
LlamaIndex Knowledge Graph
DEVELOPERpythonfrom llama_index.core import KnowledgeGraphIndex, SimpleDirectoryReader from llama_index.graph_stores.neo4j import Neo4jGraphStore # Chargement des documents documents = SimpleDirectoryReader("./data").load_data() # Construction de l'index Knowledge Graph graph_store = Neo4jGraphStore( username="neo4j", password="password", url="bolt://localhost:7687" ) kg_index = KnowledgeGraphIndex.from_documents( documents, graph_store=graph_store, max_triplets_per_chunk=10, include_embeddings=True ) # Requêtage query_engine = kg_index.as_query_engine( include_text=True, response_mode="tree_summarize" ) response = query_engine.query("Quels sont les liens entre X et Y ?")
Recherche actuelle et évolutions
Évolutions récentes de Microsoft GraphRAG
Depuis sa version 1.0 (décembre 2024), le framework a beaucoup mûri (v3.1.0 en mai 2026). Plusieurs limites évoquées plus haut sont déjà adressées :
- Indexation incrémentale native : la commande
graphrag updatecalcule le delta entre l'index existant et les nouveaux documents pour éviter une réindexation complète (disponible depuis la v0.4.0, novembre 2024) - DRIFT Search : un mode de requête qui combine recherche locale et globale
- LazyGraphRAG (annoncé en novembre 2024) : diffère les appels LLM et ramène le coût d'indexation à celui d'un RAG vectoriel classique (environ 0,1% du coût de GraphRAG complet), avec un coût de requête jusqu'à environ 700x inférieur sur les questions globales
RAPTOR (Recursive Abstractive Processing)
Approche complémentaire qui construit des résumés hiérarchiques plutôt qu'un graphe. Peut être combiné avec GraphRAG pour le meilleur des deux mondes.
HippoRAG (2024)
Inspiré de la mémoire hippocampique humaine, utilise un graphe de connaissances personnalisé combiné à un mécanisme de consolidation de la mémoire. Prometteur pour les systèmes à long terme.
FAQ
GraphRAG est-il adapté aux petits corpus (< 50 documents) ?
Pas vraiment. Pour les petits corpus, le RAG standard avec un bon chunking et du reranking sera plus efficace et beaucoup moins coûteux. GraphRAG commence à briller à partir de quelques centaines de documents où les relations entre entités deviennent trop complexes pour être capturées par la seule similarité vectorielle.
Peut-on utiliser GraphRAG sans Neo4j ?
Oui. Le framework officiel de Microsoft utilise son propre stockage (Parquet + fichiers). Vous pouvez aussi utiliser d'autres bases graphe comme Amazon Neptune, ArangoDB ou TigerGraph. Cependant, Neo4j reste le choix le plus populaire grâce à son écosystème mature et son langage Cypher.
Comment gérer la mise à jour du graphe quand le corpus change ?
C'était historiquement le principal défi de GraphRAG. Le framework de Microsoft propose désormais une indexation incrémentale native via la commande graphrag update (depuis la v0.4.0) : elle n'extrait que les entités des nouveaux documents, puis les fusionne avec le graphe existant pour éviter une réindexation complète. Des approches comme LazyGraphRAG réduisent encore le coût de mise à jour.
GraphRAG fonctionne-t-il en français ?
Oui, mais avec des nuances. L'extraction d'entités fonctionne bien avec GPT-4o et Claude en français. En revanche, les modèles plus petits (GPT-4o-mini, Mistral) peuvent être moins précis pour l'extraction de relations en français qu'en anglais. Testez systématiquement sur un échantillon de votre corpus avant de lancer l'indexation complète.
Quel est le surcoût en latence par rapport au RAG standard ?
Le mode local ajoute environ 1 à 3 secondes (traversée du graphe + contexte enrichi). Le mode global peut prendre 8 à 15 secondes car il utilise un pattern Map-Reduce sur tous les résumés de communautés. Pour une utilisation en temps réel (chatbot), privilégiez le mode local avec un cache agressif sur les requêtes fréquentes.
Conclusion
GraphRAG représente un saut qualitatif majeur pour les systèmes RAG complexes. Sa capacité unique à répondre aux questions globales et multi-hop en fait un outil incontournable pour les corpus riches en relations entre entités.
Points clés :
- GraphRAG excelle sur les questions multi-hop et de raisonnement, ainsi que les synthèses globales
- Le coût d'indexation est significativement plus élevé que le RAG standard (10-50x)
- Le mode Global est la vraie innovation : synthétiser un corpus entier via les résumés de communautés
- L'écosystème est mature : Microsoft GraphRAG, LangChain, LlamaIndex, Neo4j
- Évaluez votre besoin : si vos questions sont simples et factuelles, le RAG standard suffit
Ailog intègre les techniques avancées de retrieval, y compris les approches basées sur les graphes de connaissances, pour offrir les meilleures performances à ses utilisateurs. Testez gratuitement notre plateforme pour découvrir comment le RAG avancé peut transformer votre relation client.
Ressources
- Microsoft GraphRAG (GitHub) - Framework officiel
- Paper GraphRAG - "From Local to Global: A Graph RAG Approach to Query-Focused Summarization"
- Neo4j + LangChain - Intégration officielle
- Guide retrieval fondamentaux - Les bases du retrieval RAG
- Hybrid Search RAG - Combiner recherche vectorielle et lexicale
- Agentic RAG - Agents autonomes avec RAG
Tags
Articles connexes
MMR : Diversifier les Résultats de Recherche avec la Pertinence Marginale Maximale
Réduisez la redondance dans la récupération RAG : utilisez MMR pour équilibrer pertinence et diversité pour une meilleure qualité de contexte.
Stratégies de Récupération Avancées pour le RAG
Au-delà de la recherche de similarité basique : recherche hybride, expansion de requêtes, MMR et récupération multi-étapes pour de meilleures performances RAG.
Recherche Hybride RAG : Tutoriel BM25 + Recherche Vectorielle (2025)
+20-30% de précision RAG avec la recherche hybride. Tutoriel pas-à-pas pour combiner BM25 et recherche vectorielle avec Weaviate, Qdrant ou Pinecone.