[{"data":1,"prerenderedAt":1123},["ShallowReactive",2],{"post-rag-graphrag-connecter-ia-donnees-fr":3,"surround-/fr/blog/rag-graphrag-connecter-ia-donnees-fr":1113,"post-translations-25":1118},{"id":4,"title":5,"body":6,"canonical_id":1093,"category":1094,"date_created":1095,"date_updated":1096,"description":1097,"extension":1098,"head":1099,"image":1100,"lang":1101,"layout":1102,"meta":1103,"navigation":1104,"ogImage":1099,"path":1105,"reading_time":1106,"robots":1099,"schemaOrg":1099,"seo":1107,"sitemap":1109,"stem":1111,"__hash__":1112},"blog/fr/blog/25.rag-graphrag-connecter-ia-donnees.md","RAG et GraphRAG : comment connecter une IA à vos données",{"type":7,"value":8,"toc":1064},"minimark",[9,23,34,41,44,49,52,59,62,67,70,99,102,106,109,112,184,187,191,194,197,200,213,221,224,269,272,276,279,283,286,297,300,303,307,310,313,316,319,346,350,353,356,367,370,373,377,380,394,397,400,403,406,410,413,420,430,469,472,475,479,482,485,496,499,503,506,509,512,523,526,530,533,540,568,571,595,598,608,612,615,618,634,660,663,667,670,674,677,688,691,695,702,709,712,716,719,726,771,774,778,781,798,801,805,808,811,815,907,911,914,917,928,931,939,942,949,953,959,963,1060],[10,11,12,13,17,18,22],"p",{},"Le ",[14,15,16],"strong",{},"RAG"," (",[19,20,21],"em",{},"Retrieval-Augmented Generation",") est un pattern d'architecture logicielle qui permet à une application d'IA, comme un chatbot IA, de rechercher dans vos propres contenus avant de répondre. Au lieu de s'appuyer seulement sur les connaissances de son modèle, il récupère les passages pertinents et les ajoute à son contexte.",[10,24,25,26,33],{},"C'est le principe que j'utilise dans ",[14,27,28],{},[29,30,32],"a",{"href":31},"/fr/blog/pourquoi-lancer-begonia-pro-saas-local-seo","Begonia.pro",", mon SaaS de SEO local. Son chatbot IA recherche dans les articles du blog Begonia.pro et le contenu du site, pour répondre avec des informations précises et à jour, sans que le modèle ait été réentraîné sur le contenu Begonia.",[10,35,36,37,40],{},"Une autre approche d'architecture dérivée du RAG a récemment attiré mon attention : le ",[14,38,39],{},"GraphRAG",", que je teste actuellement. Cette technique ne cherche plus seulement des passages similaires à une question. Elle exploite aussi les relations entre les concepts, les entités et les documents.",[10,42,43],{},"Dans cet article, je vais expliquer le fonctionnement de ces deux solutions pour les applications IA, comment les implémenter et dans quels cas choisir l'une ou l'autre.",[45,46,48],"h2",{"id":47},"rag-récupérer-avant-de-générer","RAG : récupérer avant de générer",[10,50,51],{},"Le terme RAG vient d'un article de recherche publié en 2020. Le principe consiste à compléter les connaissances apprises par le modèle avec une source externe que l'application interroge au moment de répondre.",[10,53,54,55,58],{},"Cette source peut être une base vectorielle, un moteur de recherche, une base SQL ou une API. ",[14,56,57],{},"RAG ne signifie donc pas obligatoirement base vectorielle."," L'essentiel est de récupérer une information pertinente, puis de l'ajouter au contexte du modèle.",[10,60,61],{},"Une implémentation RAG classique sépare deux pipelines.",[63,64,66],"h3",{"id":65},"le-pipeline-dindexation-prépare-les-connaissances","Le pipeline d'indexation prépare les connaissances",[10,68,69],{},"Avant qu'un utilisateur pose une question, l'application prépare les sources :",[71,72,73,77,80,87,90,96],"ol",{},[74,75,76],"li",{},"collecter les pages, articles, fichiers ou enregistrements intéressants ;",[74,78,79],{},"extraire et nettoyer leur contenu ;",[74,81,82,83,86],{},"les découper en passages cohérents, appelés ",[19,84,85],{},"chunks"," ;",[74,88,89],{},"conserver leurs métadonnées : titre, URL, langue, date, droits d'accès ;",[74,91,92,93,86],{},"transformer chaque passage en représentation numérique, ou ",[19,94,95],{},"embedding",[74,97,98],{},"enregistrer le texte, ses métadonnées et son embedding dans un index.",[10,100,101],{},"Un embedding transforme un texte en un vecteur numérique conçu pour en capturer le sens. La recherche sémantique peut ainsi retrouver des passages liés à une question même s'ils n'emploient pas les mêmes mots. Elle peut, par exemple, rapprocher une question sur la visibilité dans Google Maps d'un contenu sur le référencement local.",[63,103,105],{"id":104},"le-pipeline-de-réponse-recherche-avant-dappeler-le-llm","Le pipeline de réponse recherche avant d'appeler le LLM",[10,107,108],{},"Lorsqu'une question arrive, l'application recherche les passages pertinents, les classe, puis envoie les meilleurs au modèle avec la question. La réponse peut ensuite citer les sources utilisées.",[10,110,111],{},"Le fonctionnement complet peut se résumer ainsi :",[113,114,119],"pre",{"className":115,"code":116,"language":117,"meta":118,"style":118},"language-mermaid shiki shiki-themes enchanter-dark","flowchart LR\n    A[\"Documents autorisés\"] --> B[\"Découpage en passages\"]\n    B --> C[\"Création des embeddings\"]\n    C --> D[(\"Index\")]\n    E[\"Question\"] --> F[\"Recherche\"]\n    D --> F\n    F --> G[\"Passages pertinents\"]\n    G --> H[\"LLM\"]\n    E --> H\n    H --> I[\"Réponse avec sources\"]\n","mermaid","",[120,121,122,130,136,142,148,154,160,166,172,178],"code",{"__ignoreMap":118},[123,124,127],"span",{"class":125,"line":126},"line",1,[123,128,129],{},"flowchart LR\n",[123,131,133],{"class":125,"line":132},2,[123,134,135],{},"    A[\"Documents autorisés\"] --> B[\"Découpage en passages\"]\n",[123,137,139],{"class":125,"line":138},3,[123,140,141],{},"    B --> C[\"Création des embeddings\"]\n",[123,143,145],{"class":125,"line":144},4,[123,146,147],{},"    C --> D[(\"Index\")]\n",[123,149,151],{"class":125,"line":150},5,[123,152,153],{},"    E[\"Question\"] --> F[\"Recherche\"]\n",[123,155,157],{"class":125,"line":156},6,[123,158,159],{},"    D --> F\n",[123,161,163],{"class":125,"line":162},7,[123,164,165],{},"    F --> G[\"Passages pertinents\"]\n",[123,167,169],{"class":125,"line":168},8,[123,170,171],{},"    G --> H[\"LLM\"]\n",[123,173,175],{"class":125,"line":174},9,[123,176,177],{},"    E --> H\n",[123,179,181],{"class":125,"line":180},10,[123,182,183],{},"    H --> I[\"Réponse avec sources\"]\n",[10,185,186],{},"Le grand modèle de langage (LLM) continue de générer la réponse. Le RAG ne garantit pas qu'il dira vrai : il lui fournit un contexte plus précis et plus récent.",[45,188,190],{"id":189},"le-rag-de-begoniapro-pour-illustrer-ce-concept","Le RAG de Begonia.pro pour illustrer ce concept",[10,192,193],{},"Sur Begonia.pro, je publie du contenu sur le référencement local : les fiches Google Business Profile, les avis, comment optimiser son site d'entreprise, la visibilité dans les moteurs de recherche classiques ou les IA.",[10,195,196],{},"Avec le RAG, une question comme « comment remplir ma fiche Google ? » déclenche une recherche dans les contenus de Begonia.pro. Le modèle reçoit les passages les plus pertinents avec leurs titres et leurs URL, puis compose sa réponse à partir de ce contexte.",[10,198,199],{},"Ce système permet de répondre à des questions précises en s'appuyant sur des informations fiables et à jour, tout en citant les sources. Il est utilisé dans 2 fonctionnalités de mon SaaS :",[201,202,203,206],"ul",{},[74,204,205],{},"Le chatbot Begonia.pro dans l'interface pour les utilisateurs",[74,207,208,209,212],{},"Le serveur MCP et son outil ",[120,210,211],{},"search_local_seo_knowledgebase"," pour les agents",[10,214,215,216,220],{},"J'ai d'ailleurs expliqué dans ",[29,217,219],{"href":218},"/fr/blog/serveur-mcp-saas-retour-experience","mon retour d'expérience sur les serveurs MCP de mes SaaS"," pourquoi je préfère exposer une recherche ciblée plutôt que transmettre toute une base de connaissances à l'agent.",[10,222,223],{},"Les deux usages se complètent :",[225,226,227,243],"table",{},[228,229,230],"thead",{},[231,232,233,237,240],"tr",{},[234,235,236],"th",{},"Surface",[234,238,239],{},"Qui pilote la recherche ?",[234,241,242],{},"Où apparaît la réponse ?",[244,245,246,258],"tbody",{},[231,247,248,252,255],{},[249,250,251],"td",{},"Chatbot Begonia.pro",[249,253,254],{},"L'application",[249,256,257],{},"Dans le SaaS",[231,259,260,263,266],{},[249,261,262],{},"Outil MCP",[249,264,265],{},"Un agent compatible",[249,267,268],{},"Dans ChatGPT, Claude, Codex ou un autre client",[10,270,271],{},"Le moteur de recherche reste le même. Seuls l'interface et le système qui l'appelle changent.",[45,273,275],{"id":274},"une-première-implémentation-rag-doit-rester-simple","Une première implémentation RAG doit rester simple",[10,277,278],{},"Pour comprendre comment construire un RAG, il suffit de suivre le parcours de l'information : définir les questions à traiter, préparer les contenus, les indexer, retrouver les passages utiles, puis les transmettre au modèle.",[63,280,282],{"id":281},"_1-partir-de-questions-concrètes","1. Partir de questions concrètes",[10,284,285],{},"Avant de construire le système, je liste les questions auxquelles le chatbot IA devra répondre. Pour Begonia.pro, ce pourrait être :",[201,287,288,291,294],{},[74,289,290],{},"« Comment choisir la catégorie principale de ma fiche Google ? »",[74,292,293],{},"« Comment répondre à un avis négatif ? »",[74,295,296],{},"« Que dois-je améliorer pour améliorer mon classement dans les moteurs de recherche ? »",[10,298,299],{},"J'ajoute aussi une question dont la réponse n'existe pas dans les contenus. Le chatbot doit alors reconnaître que l'information lui manque.",[10,301,302],{},"Cette liste définit simplement ce que le RAG doit savoir faire. Elle permet ensuite de vérifier s'il retrouve les bons passages et s'il répond correctement à partir de ces sources.",[63,304,306],{"id":305},"_2-préparer-des-passages-qui-gardent-leur-sens","2. Préparer des passages qui gardent leur sens",[10,308,309],{},"Le découpage influence directement la qualité de la recherche.",[10,311,312],{},"Un chunk trop long va potentiellement mélanger plusieurs sujets. Un chunk trop court va perdre les informations nécessaires pour comprendre de quoi parle le texte.",[10,314,315],{},"Pour des articles Markdown, je préfère partir de la structure éditoriale : titre, introduction, sections et paragraphes. Chaque passage doit pouvoir être compris sans avoir besoin de deviner ce qui se trouvait trois paragraphes plus haut.",[10,317,318],{},"Chaque passage conserve au minimum l'identifiant du document, le titre, la section, l'URL canonique, la langue et la date de mise à jour. Ces métadonnées servent à filtrer la recherche et à produire de vraies citations.",[320,321,325,326],"div",{"className":322},[323,324],"text-center","mx-auto","\n    ",[327,328,329,330,329,335,329,339,325],"picture",{},"\n      ",[331,332],"source",{"srcSet":333,"type":334},"/img/blog/illustration/rag-chunking.avif","image/avif",[331,336],{"srcSet":337,"type":338},"/img/blog/illustration/rag-chunking.webp","image/webp",[340,341],"img",{"src":342,"alt":343,"loading":344,"className":345},"/img/blog/illustration/rag-chunking.jpg","Illustration comparant un passage trop long, des passages trop courts et des passages équilibrés pour un RAG","lazy",[324],[63,347,349],{"id":348},"_3-indexer-les-passages","3. Indexer les passages",[10,351,352],{},"Une fois les passages préparés, l'application les envoie à un modèle d'embedding. Pour chacun d'eux, le modèle produit un vecteur : une suite de nombres qui représente son sens. Deux passages qui parlent de sujets proches obtiennent ainsi des vecteurs proches, même s'ils n'utilisent pas exactement les mêmes mots.",[10,354,355],{},"L'application enregistre ensuite trois éléments dans l'index :",[201,357,358,361,364],{},[74,359,360],{},"le vecteur, utilisé pour effectuer la recherche ;",[74,362,363],{},"le texte original, qui sera transmis au LLM ;",[74,365,366],{},"les métadonnées, comme le titre, l'URL, la langue ou la date.",[10,368,369],{},"Lors de la première indexation, ce traitement est appliqué à tout le corpus. Par la suite, il suffit de mettre à jour les passages concernés lorsqu'un contenu est ajouté ou modifié, et de les retirer de l'index lorsqu'il est supprimé.",[10,371,372],{},"À ce stade, le LLM ne génère encore aucune réponse. L'objectif est simplement de préparer un index dans lequel l'application pourra chercher rapidement lorsqu'une question arrivera.",[63,374,376],{"id":375},"_4-rechercher-sélectionner-puis-générer","4. Rechercher, sélectionner, puis générer",[10,378,379],{},"Lorsqu'une question arrive, l'application la transforme en embedding avec le même modèle que celui utilisé pour indexer les passages. L'index compare ensuite ce vecteur à ceux de la base et classe les résultats selon leur proximité.",[10,381,382,383,386,387,390,391,393],{},"L'application demande alors les ",[120,384,385],{},"k"," premiers résultats : c'est ce que l'on appelle le ",[14,388,389],{},"top-k",". Avec un ",[120,392,389],{}," de 5, elle récupère par exemple les cinq passages les mieux classés et les ajoute au contexte du LLM avec la question et leurs sources.",[10,395,396],{},"Il n'existe pas de valeur idéale pour tous les RAG. Trop peu de passages peut laisser de côté une information utile. Trop de passages augmente le nombre de tokens et peut ajouter du bruit dans le contexte. Je commencerais avec une petite valeur, puis je l'ajusterais à partir des questions de test définies précédemment.",[10,398,399],{},"Avant d'appeler le LLM, l'application peut aussi éliminer les résultats qui ne respectent pas la langue, les droits d'accès ou un seuil minimal de pertinence. Pour des documents privés, ce contrôle doit avoir lieu avant que les passages soient transmis au modèle. Le LLM reçoit ainsi uniquement les passages retenus et doit indiquer lorsque ces sources ne suffisent pas pour répondre.",[10,401,402],{},"La recherche vectorielle peut être combinée à une recherche par mots-clés comme BM25. Les embeddings retrouvent le sens général ; les mots-clés restent utiles pour un nom de produit, un acronyme ou une expression exacte.",[10,404,405],{},"Pour un petit corpus bien structuré, ce premier classement peut suffire. Si les tests montrent que le bon passage est retrouvé, mais qu'il apparaît régulièrement derrière des résultats moins utiles, il devient intéressant d'ajouter une seconde étape de classement.",[63,407,409],{"id":408},"_5-optionnel-améliorer-le-classement-avec-un-cross-encoder","5. Optionnel : améliorer le classement avec un cross-encoder",[10,411,412],{},"Cette étape est une optimisation avancée, pas une obligation pour construire un RAG.",[10,414,415,416,419],{},"La recherche vectorielle décrite jusqu'ici utilise généralement un ",[14,417,418],{},"bi-encoder",". Il transforme séparément la question et les passages en vecteurs, puis compare leur proximité. Cette méthode est rapide, car les embeddings des passages ont déjà été calculés pendant l'indexation. Elle peut toutefois sélectionner des textes qui parlent du bon sujet sans répondre précisément à la question.",[10,421,12,422,425,426,429],{},[14,423,424],{},"cross-encoder"," travaille différemment : il lit la question et un passage ensemble pour vérifier plus précisément si le passage répond à la demande. Il répète cette opération pour chaque résultat de la première recherche, puis les classe à nouveau. Cette étape est appelée ",[14,427,428],{},"reranking",".",[113,431,433],{"className":115,"code":432,"language":117,"meta":118,"style":118},"flowchart LR\n    A[\"Question\"] --> B[\"Bi-encoder ou recherche hybride\"]\n    B --> C[\"Par exemple : 20 à 50 candidats\"]\n    C --> D[\"Cross-encoder\"]\n    D --> E[\"Par exemple : 5 à 10 passages\"]\n    E --> F[\"LLM\"]\n    F --> G[\"Réponse\"]\n",[120,434,435,439,444,449,454,459,464],{"__ignoreMap":118},[123,436,437],{"class":125,"line":126},[123,438,129],{},[123,440,441],{"class":125,"line":132},[123,442,443],{},"    A[\"Question\"] --> B[\"Bi-encoder ou recherche hybride\"]\n",[123,445,446],{"class":125,"line":138},[123,447,448],{},"    B --> C[\"Par exemple : 20 à 50 candidats\"]\n",[123,450,451],{"class":125,"line":144},[123,452,453],{},"    C --> D[\"Cross-encoder\"]\n",[123,455,456],{"class":125,"line":150},[123,457,458],{},"    D --> E[\"Par exemple : 5 à 10 passages\"]\n",[123,460,461],{"class":125,"line":156},[123,462,463],{},"    E --> F[\"LLM\"]\n",[123,465,466],{"class":125,"line":162},[123,467,468],{},"    F --> G[\"Réponse\"]\n",[10,470,471],{},"Le cross-encoder n'est appliqué qu'à quelques dizaines de candidats, car relire chaque passage de toute la base serait trop lent et trop coûteux. Son objectif est de réduire le bruit avant d'envoyer le contexte au LLM.",[10,473,474],{},"Cette optimisation a deux limites : elle ajoute de la latence et ne peut pas retrouver un passage absent de la première sélection. Il faut donc comparer une version avec et sans reranking sur les mêmes questions pour vérifier que le gain est réel.",[45,476,478],{"id":477},"comment-vérifier-quun-rag-fonctionne","Comment vérifier qu'un RAG fonctionne ?",[10,480,481],{},"Une mauvaise réponse ne vient pas toujours du LLM. L'information peut être absente ou obsolète, la recherche peut ne pas retrouver le bon passage, ou le modèle peut mal utiliser le contexte reçu.",[10,483,484],{},"Avec les questions préparées au début, je vérifie donc séparément :",[201,486,487,490,493],{},[74,488,489],{},"si le bon passage apparaît parmi les premiers résultats ;",[74,491,492],{},"si la réponse reste fidèle aux passages fournis et cite les bonnes sources ;",[74,494,495],{},"si le chatbot reconnaît que l'information manque lorsqu'aucune source ne permet de répondre.",[10,497,498],{},"Ce même jeu de questions permet ensuite de comparer chaque changement : nouveau découpage, recherche hybride, reranking ou GraphRAG.",[45,500,502],{"id":501},"pourquoi-le-rag-vectoriel-atteint-ses-limites","Pourquoi le RAG vectoriel atteint ses limites",[10,504,505],{},"La recherche vectorielle retrouve ce qui ressemble sémantiquement à la question. Elle ne représente pas explicitement les relations contenues dans les documents.",[10,507,508],{},"Par exemple, trois documents peuvent indiquer qu'un composant dépend d'un service et que la panne de ce service a provoqué plusieurs incidents. Une recherche vectorielle peut retrouver un ou deux passages et manquer cette chaîne complète.",[10,510,511],{},"La difficulté apparaît surtout avec :",[201,513,514,517,520],{},[74,515,516],{},"les questions relationnelles : « quels composants dépendent de ce service et dans quels documents sont-ils décrits ? » ;",[74,518,519],{},"les questions en plusieurs étapes : « quels incidents ont la même cause et quels produits ont été touchés ? » ;",[74,521,522],{},"les questions globales : « quels thèmes reviennent dans toute cette base ? ».",[10,524,525],{},"C'est le terrain du GraphRAG.",[45,527,529],{"id":528},"le-graphrag-ajoute-une-carte-des-relations","Le GraphRAG ajoute une carte des relations",[10,531,532],{},"GraphRAG désigne une famille d'architectures qui utilisent un graphe pour récupérer le contexte.",[10,534,535,536,539],{},"Dans un ",[14,537,538],{},"graphe de connaissances",", les informations sont représentées par :",[201,541,542,545,565],{},[74,543,544],{},"des nœuds : comme une entreprise, un produit, un composant, un incident ou un document ;",[74,546,547,548,551,552,551,555,551,558,561,562,86],{},"des relations : comme ",[120,549,550],{},"DÉPEND_DE",", ",[120,553,554],{},"CAUSE",[120,556,557],{},"EXPLIQUE",[120,559,560],{},"CITE"," ou ",[120,563,564],{},"CONCERNE",[74,566,567],{},"des propriétés : comme un nom, une date, une importance ou une URL.",[10,569,570],{},"Une information ne vit plus seulement dans un paragraphe. Elle peut être exprimée comme une relation interrogeable :",[113,572,574],{"className":115,"code":573,"language":117,"meta":118,"style":118},"flowchart LR\n    A[\"Application web\"] -- \"DÉPEND_DE\" --> B[\"Service d'authentification\"]\n    B -- \"A_CAUSÉ\" --> C[\"Incident du 12 juin\"]\n    D[\"Guide d'architecture\"] -- \"EXPLIQUE\" --> B\n",[120,575,576,580,585,590],{"__ignoreMap":118},[123,577,578],{"class":125,"line":126},[123,579,129],{},[123,581,582],{"class":125,"line":132},[123,583,584],{},"    A[\"Application web\"] -- \"DÉPEND_DE\" --> B[\"Service d'authentification\"]\n",[123,586,587],{"class":125,"line":138},[123,588,589],{},"    B -- \"A_CAUSÉ\" --> C[\"Incident du 12 juin\"]\n",[123,591,592],{"class":125,"line":144},[123,593,594],{},"    D[\"Guide d'architecture\"] -- \"EXPLIQUE\" --> B\n",[10,596,597],{},"Le système peut partir d'une entité détectée dans la question, parcourir ses relations et retrouver les passages associés.",[10,599,600,601,604,605,607],{},"Le terme porte toutefois deux sens qu'il faut distinguer. ",[14,602,603],{},"Graph RAG"," désigne le pattern d'architecture général qui utilise un graphe pour la récupération. ",[14,606,39],{}," désigne aussi l'implémentation open source de Microsoft Research, qui propose sa propre méthode d'indexation et de recherche.",[45,609,611],{"id":610},"limplémentation-graphrag-de-microsoft-va-du-local-au-global","L'implémentation GraphRAG de Microsoft va du local au global",[10,613,614],{},"Microsoft GraphRAG transforme des documents en entités, relations et communautés. Il résume ensuite ces groupes à plusieurs niveaux et crée aussi des embeddings pour certaines recherches.",[10,616,617],{},"Cette préparation permet plusieurs modes de requête.",[320,619,325,621],{"className":620},[323,324],[327,622,329,623,329,626,329,629,325],{},[331,624],{"srcSet":625,"type":334},"/img/blog/illustration/graphrag-local-global-search.avif",[331,627],{"srcSet":628,"type":338},"/img/blog/illustration/graphrag-local-global-search.webp",[340,630],{"src":631,"alt":632,"loading":344,"className":633},"/img/blog/illustration/graphrag-local-global-search.jpg","Illustration des recherches locale, globale et progressive dans un graphe de connaissances",[324],[201,635,636,642,648,654],{},[74,637,638,641],{},[14,639,640],{},"Local Search"," combine le graphe et les passages sources pour une question ciblée.",[74,643,644,647],{},[14,645,646],{},"Global Search"," synthétise les rapports de communautés pour répondre sur l'ensemble du corpus.",[74,649,650,653],{},[14,651,652],{},"DRIFT Search"," part d'une vue générale, puis explore progressivement les détails liés.",[74,655,656,659],{},[14,657,658],{},"Basic Search"," fournit une recherche vectorielle simple comme point de comparaison.",[10,661,662],{},"Cette implémentation répond donc à un problème plus précis que « rendre le RAG meilleur » : produire une synthèse guidée par une question lorsque la réponse dépend d'une grande partie du corpus.",[45,664,666],{"id":665},"comment-implémenter-une-approche-graphrag","Comment implémenter une approche GraphRAG",[10,668,669],{},"Pour illustrer, je prends l'architecture GraphRAG de Microsoft comme référence.",[63,671,673],{"id":672},"_1-vérifier-que-le-besoin-justifie-un-graphe","1. Vérifier que le besoin justifie un graphe",[10,675,676],{},"Je commencerais par préparer quelques questions auxquelles un RAG vectoriel répond mal :",[201,678,679,682,685],{},[74,680,681],{},"quels incidents partagent la même dépendance technique ?",[74,683,684],{},"quelles décisions ont affecté plusieurs produits ou équipes ?",[74,686,687],{},"quels thèmes reviennent dans l'ensemble des retours clients ?",[10,689,690],{},"Ces questions demandent de relier plusieurs informations ou de synthétiser une grande partie des documents. Si un RAG classique y répond déjà correctement, le graphe n'est peut-être pas nécessaire.",[63,692,694],{"id":693},"_2-préparer-les-documents","2. Préparer les documents",[10,696,697,698,701],{},"Comme dans un RAG classique, les documents sont découpés en passages. Microsoft les appelle des ",[14,699,700],{},"TextUnits",". Chaque passage reste lié à son document d'origine afin de pouvoir retrouver et citer la source.",[10,703,704,705,708],{},"Il faut aussi préciser les éléments importants à repérer dans ces textes. Ce sont les ",[14,706,707],{},"entités"," : par exemple des personnes, des entreprises, des produits, des services ou des incidents. Leur nature dépend du contenu et des questions auxquelles l'application doit répondre.",[10,710,711],{},"Si ces entités et leurs relations existent déjà dans les données de l'entreprise, Microsoft GraphRAG peut partir de ce graphe au lieu de les extraire des documents.",[63,713,715],{"id":714},"_3-construire-lindex-graphrag","3. Construire l'index GraphRAG",[10,717,718],{},"Un LLM lit chaque passage pour identifier les entités et décrire leurs relations. Par exemple, il peut repérer qu'un produit dépend d'un service et que ce service est mentionné dans plusieurs incidents.",[10,720,721,722,725],{},"GraphRAG regroupe ensuite les entités fortement liées en ",[14,723,724],{},"communautés",", puis génère un résumé de chaque groupe. Ces résumés donnent une vue d'ensemble du corpus, tandis que les passages d'origine conservent les détails. Des embeddings permettent enfin de retrouver les éléments proches d'une question.",[113,727,729],{"className":115,"code":728,"language":117,"meta":118,"style":118},"flowchart TB\n    A[\"Documents\"] --> B[\"Passages\"]\n    B --> C[\"Entités et relations\"]\n    C --> D[\"Groupes d'entités liées\"]\n    D --> E[\"Résumés des groupes\"]\n    B --> F[\"Index GraphRAG\"]\n    C --> F\n    E --> F\n",[120,730,731,736,741,746,751,756,761,766],{"__ignoreMap":118},[123,732,733],{"class":125,"line":126},[123,734,735],{},"flowchart TB\n",[123,737,738],{"class":125,"line":132},[123,739,740],{},"    A[\"Documents\"] --> B[\"Passages\"]\n",[123,742,743],{"class":125,"line":138},[123,744,745],{},"    B --> C[\"Entités et relations\"]\n",[123,747,748],{"class":125,"line":144},[123,749,750],{},"    C --> D[\"Groupes d'entités liées\"]\n",[123,752,753],{"class":125,"line":150},[123,754,755],{},"    D --> E[\"Résumés des groupes\"]\n",[123,757,758],{"class":125,"line":156},[123,759,760],{},"    B --> F[\"Index GraphRAG\"]\n",[123,762,763],{"class":125,"line":162},[123,764,765],{},"    C --> F\n",[123,767,768],{"class":125,"line":168},[123,769,770],{},"    E --> F\n",[10,772,773],{},"Cette préparation est plus lourde que celle d'un RAG classique, car elle demande plusieurs analyses et résumés par le LLM. Microsoft recommande donc de commencer avec un petit corpus.",[63,775,777],{"id":776},"_4-choisir-le-mode-de-recherche-adapté-à-la-question","4. Choisir le mode de recherche adapté à la question",[10,779,780],{},"Une fois l'index construit, il faut choisir la recherche adaptée à la question :",[201,782,783,788,793],{},[74,784,785,787],{},[14,786,640],{}," convient à une question ciblée sur une personne, un produit ou un autre élément précis. Il retrouve les entités proches de la question, puis rassemble leurs relations et les passages sources utiles.",[74,789,790,792],{},[14,791,646],{}," convient à une question sur l'ensemble des documents, comme « quels sont les principaux thèmes ? ». Il s'appuie sur les résumés des communautés pour construire une réponse générale.",[74,794,795,797],{},[14,796,652],{}," commence par une vue d'ensemble, puis approfondit progressivement certains points avec des recherches plus ciblées.",[10,799,800],{},"Il n'existe donc pas un unique parcours GraphRAG. Une question ciblée sur une entité n'appelle pas la même recherche qu'une demande sur les grands thèmes de toute la base.",[63,802,804],{"id":803},"_5-comparer-les-résultats-sur-un-petit-corpus","5. Comparer les résultats sur un petit corpus",[10,806,807],{},"Je testerais d'abord GraphRAG sur quelques documents dont je connais bien le contenu. Le projet inclut aussi une recherche vectorielle simple, utile pour comparer ses résultats avec les recherches locale et globale.",[10,809,810],{},"J'utiliserais les mêmes questions pour comparer la qualité des réponses, le coût de préparation des données et le temps de réponse. Je vérifierais aussi que les entités et les relations extraites correspondent bien aux documents sources. Cette comparaison permet de vérifier que le graphe apporte un gain réel avant de l'étendre à toute une base documentaire.",[45,812,814],{"id":813},"rag-ou-graphrag-comment-choisir","RAG ou GraphRAG : comment choisir ?",[225,816,817,829],{},[228,818,819],{},[231,820,821,824,827],{},[234,822,823],{},"Besoin",[234,825,826],{},"RAG vectoriel ou hybride",[234,828,39],{},[244,830,831,842,852,863,874,885,896],{},[231,832,833,836,839],{},[249,834,835],{},"Retrouver un passage qui répond directement",[249,837,838],{},"Très adapté",[249,840,841],{},"Souvent inutile",[231,843,844,847,849],{},[249,845,846],{},"Chercher avec des synonymes",[249,848,838],{},[249,850,851],{},"Possible",[231,853,854,857,860],{},[249,855,856],{},"Relier plusieurs entités ou documents",[249,858,859],{},"Limité sans orchestration",[249,861,862],{},"Adapté",[231,864,865,868,871],{},[249,866,867],{},"Répondre à une question globale sur tout le corpus",[249,869,870],{},"Difficile",[249,872,873],{},"Cas d'usage central de Microsoft GraphRAG",[231,875,876,879,882],{},[249,877,878],{},"Ajouter et mettre à jour des documents",[249,880,881],{},"Relativement simple",[249,883,884],{},"Plus coûteux à extraire et réconcilier",[231,886,887,890,893],{},[249,888,889],{},"Expliquer pourquoi une donnée est reliée à une autre",[249,891,892],{},"Peu explicite",[249,894,895],{},"Relations parcourables",[231,897,898,901,904],{},[249,899,900],{},"Coût et complexité de départ",[249,902,903],{},"Modérés",[249,905,906],{},"Élevés",[45,908,910],{"id":909},"ce-que-je-teste-maintenant-avec-graphrag","Ce que je teste maintenant avec GraphRAG",[10,912,913],{},"Le GraphRAG a attiré mon attention par sa promesse de retrouver des relations qu'une recherche vectorielle ne trouve pas. Je le teste actuellement sur un prototype, sans l'avoir encore intégré à l'un de mes projets en ligne.",[10,915,916],{},"Je veux vérifier trois points :",[71,918,919,922,925],{},[74,920,921],{},"un graphe retrouve-t-il mieux les relations dispersées dans plusieurs documents ?",[74,923,924],{},"apporte-t-il une réponse plus complète aux questions en plusieurs étapes et aux synthèses globales ?",[74,926,927],{},"ce gain compense-t-il le coût d'indexation, la complexité de mise à jour et le temps de réponse supplémentaire ?",[10,929,930],{},"Je compare ces tests à un RAG vectoriel, puis à une version avec recherche hybride et reranking. Si cette dernière répond aussi bien, le graphe n'est pas justifié.",[10,932,933,934,938],{},"C'est ma façon d'aborder le métier de ",[29,935,937],{"href":936},"/fr/blog/product-engineer-nouveau-metier-ia","Product Engineer à l'ère de l'IA"," : partir du problème, construire la plus petite version utile, mesurer, puis ajouter de la complexité seulement lorsqu'elle améliore réellement le produit.",[10,940,941],{},"Pour la plupart des chatbots documentaires, je commencerais donc par un bon RAG. GraphRAG devient intéressant lorsque les questions exigent de suivre des relations ou de synthétiser un corpus entier. La meilleure architecture reste celle qui retrouve la bonne preuve, au bon moment, avec un coût acceptable.",[10,943,944,945,429],{},"📌 Vous souhaitez connecter un chatbot ou une fonctionnalité IA aux données de votre produit ? Je peux vous accompagner pour cadrer le cas d'usage, construire le pipeline de recherche et mesurer sa qualité avec une approche complète de ",[29,946,948],{"href":947},"/fr/services/product-engineering","Product Engineering",[45,950,952],{"id":951},"questions-fréquentes-sur-rag-et-graphrag","Questions fréquentes sur RAG et GraphRAG",[954,955],"faq-accordion",{":items":956,"className":957},"[{\"question\":\"Qu'est-ce que le RAG en intelligence artificielle ?\",\"answer\":\"Le RAG, ou Retrieval-Augmented Generation, est un pattern d'architecture qui recherche des informations dans une source externe avant de les fournir à un modèle de langage. Le LLM génère ensuite sa réponse à partir de la question, des instructions et du contexte récupéré.\"},{\"question\":\"Quelle différence entre RAG et GraphRAG ?\",\"answer\":\"Un RAG classique récupère souvent des passages par similarité sémantique ou par mots-clés. L'approche GraphRAG utilise en plus un graphe pour représenter et parcourir les relations entre des entités, des concepts et des documents. Elle est surtout utile lorsque la réponse dépend de plusieurs relations ou d'une vue globale de documents.\"},{\"question\":\"Faut-il une base vectorielle pour faire du RAG ?\",\"answer\":\"Non. Une base vectorielle est un moyen fréquent d'implémenter la récupération, mais un RAG peut utiliser un moteur de recherche lexical, une base SQL, une API, un graphe ou plusieurs retrievers combinés. Le principe essentiel consiste à récupérer une information avant la génération.\"},{\"question\":\"Le GraphRAG remplace-t-il le RAG vectoriel ?\",\"answer\":\"Pas nécessairement. Les deux approches sont souvent combinées : la recherche vectorielle trouve des passages proches de la question, tandis que le graphe étend la recherche vers des entités et relations pertinentes. Les passages originaux restent utiles pour préserver les nuances et fournir les citations.\"},{\"question\":\"Quand utiliser le GraphRAG ?\",\"answer\":\"Le GraphRAG devient pertinent pour les questions relationnelles, les raisonnements en plusieurs étapes, les données déjà structurées sous forme de réseau et les synthèses qui portent sur un corpus entier. Pour une FAQ ou une documentation où chaque réponse tient dans quelques passages, un RAG hybride bien évalué reste souvent plus simple.\"},{\"question\":\"Le RAG empêche-t-il les hallucinations ?\",\"answer\":\"Non. Le RAG fournit des sources au modèle, mais celui-ci peut encore ignorer un passage, mal l'interpréter ou compléter la réponse avec une information absente. Les citations, l'abstention, les contrôles de permissions et les évaluations de récupération et de fidélité restent nécessaires.\"}]",[958],"mt-6",[45,960,962],{"id":961},"sources","Sources",[201,964,965,975,983,991,998,1005,1012,1020,1028,1036,1044,1052],{},[74,966,967,968,429],{},"Patrick Lewis et al., ",[29,969,974],{"href":970,"rel":971,"target":973},"https://arxiv.org/abs/2005.11401",[972],"nofollow","\\_blank","« Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks »",[74,976,977,978,429],{},"Microsoft Research, ",[29,979,982],{"href":980,"rel":981,"target":973},"https://www.microsoft.com/en-us/research/publication/from-local-to-global-a-graph-rag-approach-to-query-focused-summarization/",[972],"« From Local to Global: A Graph RAG Approach to Query-Focused Summarization »",[74,984,985,986,429],{},"Microsoft GraphRAG, ",[29,987,990],{"href":988,"rel":989,"target":973},"https://microsoft.github.io/graphrag/index/default_dataflow/",[972],"documentation du pipeline d'indexation",[74,992,985,993,429],{},[29,994,997],{"href":995,"rel":996,"target":973},"https://microsoft.github.io/graphrag/query/overview/",[972],"documentation des modes de recherche",[74,999,985,1000,429],{},[29,1001,1004],{"href":1002,"rel":1003,"target":973},"https://microsoft.github.io/graphrag/index/byog/",[972],"utiliser un graphe existant",[74,1006,985,1007,429],{},[29,1008,1011],{"href":1009,"rel":1010,"target":973},"https://microsoft.github.io/graphrag/get_started/",[972],"guide de démarrage et avertissement sur le coût de l'indexation",[74,1013,1014,1015,429],{},"Microsoft, ",[29,1016,1019],{"href":1017,"rel":1018,"target":973},"https://learn.microsoft.com/en-us/azure/architecture/ai-ml/guide/rag/rag-information-retrieval",[972],"guide de la phase de récupération et du reranking d'une solution RAG",[74,1021,1022,1023,429],{},"Anthropic, ",[29,1024,1027],{"href":1025,"rel":1026,"target":973},"https://www.anthropic.com/engineering/contextual-retrieval",[972],"« Contextual Retrieval »",[74,1029,1030,1031,429],{},"Sentence Transformers, ",[29,1032,1035],{"href":1033,"rel":1034,"target":973},"https://www.sbert.net/examples/sentence_transformer/applications/retrieve_rerank/README.html",[972],"guide « Retrieve & Re-Rank » avec bi-encoder et cross-encoder",[74,1037,1038,1039,429],{},"AWS, ",[29,1040,1043],{"href":1041,"rel":1042,"target":973},"https://docs.aws.amazon.com/prescriptive-guidance/latest/writing-best-practices-rag/introduction.html",[972],"bonnes pratiques de rédaction des sources pour un RAG",[74,1045,1046,1047,429],{},"Neo4j, ",[29,1048,1051],{"href":1049,"rel":1050,"target":973},"https://neo4j.com/docs/neo4j-graphrag-python/current/user_guide_rag.html",[972],"documentation du package GraphRAG pour Python",[74,1053,1054,1055,429],{},"Shahul Es et al., ",[29,1056,1059],{"href":1057,"rel":1058,"target":973},"https://arxiv.org/abs/2309.15217",[972],"« RAGAS: Automated Evaluation of Retrieval Augmented Generation »",[1061,1062,1063],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":118,"searchDepth":132,"depth":132,"links":1065},[1066,1070,1071,1078,1079,1080,1081,1082,1089,1090,1091,1092],{"id":47,"depth":132,"text":48,"children":1067},[1068,1069],{"id":65,"depth":138,"text":66},{"id":104,"depth":138,"text":105},{"id":189,"depth":132,"text":190},{"id":274,"depth":132,"text":275,"children":1072},[1073,1074,1075,1076,1077],{"id":281,"depth":138,"text":282},{"id":305,"depth":138,"text":306},{"id":348,"depth":138,"text":349},{"id":375,"depth":138,"text":376},{"id":408,"depth":138,"text":409},{"id":477,"depth":132,"text":478},{"id":501,"depth":132,"text":502},{"id":528,"depth":132,"text":529},{"id":610,"depth":132,"text":611},{"id":665,"depth":132,"text":666,"children":1083},[1084,1085,1086,1087,1088],{"id":672,"depth":138,"text":673},{"id":693,"depth":138,"text":694},{"id":714,"depth":138,"text":715},{"id":776,"depth":138,"text":777},{"id":803,"depth":138,"text":804},{"id":813,"depth":132,"text":814},{"id":909,"depth":132,"text":910},{"id":951,"depth":132,"text":952},{"id":961,"depth":132,"text":962},"25","ai","2026-08-20T07:00:00.000Z","2026-08-22T07:00:00.000Z","Le RAG (Retrieval-Augmented Generation) est un pattern d'architecture logicielle qui permet à une application d'IA, comme un chatbot IA, de rechercher dans vos propres contenus avant de répondre. Au lieu de s'appuyer seulement sur les connaissances de son modèle, il récupère les passages pertinents et les ajoute à son contexte.","md",null,"/img/blog/blog25.jpg","fr","page",{},true,"/fr/blog/rag-graphrag-connecter-ia-donnees",15,{"description":1108,"title":5},"RAG et GraphRAG expliqués simplement : recherche vectorielle, graphe de connaissances, méthode d'implémentation et retour d'expérience.",{"loc":1105,"lastmod":1110},"2026-08-22T09:00:00+02:00","fr/blog/25.rag-graphrag-connecter-ia-donnees","Nqa8snjxDjwfQ6ZOQVa5IALBvUrJRVf8TtpJrSRuYCE",[1099,1114],{"title":1115,"path":1116,"stem":1117,"children":-1},"Google Sheets Canvas : la bataille de l'IA se joue aussi sur la distribution","/fr/blog/google-sheets-canvas-distribution-ia","fr/blog/24.google-sheets-canvas-distribution-ia",[1119,1122],{"path":1120,"lang":1121},"/en/blog/rag-graphrag-connect-ai-data","en",{"path":1105,"lang":1101},1787397379516]