{"id":124,"date":"2026-09-28T20:00:53","date_gmt":"2026-09-28T18:00:53","guid":{"rendered":"https:\/\/www.ranksignal.fr\/blog\/?p=124"},"modified":"2026-10-07T20:23:03","modified_gmt":"2026-10-07T18:23:03","slug":"a-quoi-ressemble-un-systeme-rag","status":"publish","type":"post","link":"https:\/\/www.ranksignal.fr\/blog\/rag\/a-quoi-ressemble-un-systeme-rag\/","title":{"rendered":"Un syst\u00e8me RAG en clair : deux pipelines, cinq \u00e9tapes"},"content":{"rendered":"<p>Demandez \u00e0 un assistant IA qui a remport\u00e9 la Coupe du monde masculine de cricket 2023. Deux issues sont possibles : soit il admet qu&rsquo;il ne sait pas, soit \u2014 pire \u2014 il r\u00e9pond avec aplomb que c&rsquo;est l&rsquo;Inde. C&rsquo;est faux, c&rsquo;est l&rsquo;Australie.<\/p>\n<p>Pourtant, la bonne r\u00e9ponse tient dans un paragraphe de Wikip\u00e9dia. Il suffirait de le glisser dans la conversation, \u00e0 c\u00f4t\u00e9 de la question. Un syst\u00e8me RAG, c&rsquo;est exactement cette id\u00e9e, automatis\u00e9e : \u00e0 la fin de cet article, vous saurez de quelles pi\u00e8ces il est fait, dans quel ordre elles travaillent, et \u00e0 quels endroits il peut se tromper.<\/p>\n<h2>L&rsquo;essentiel en 30 secondes<\/h2>\n<ul>\n<li>Le RAG (g\u00e9n\u00e9ration augment\u00e9e par r\u00e9cup\u00e9ration) va chercher, au moment de la question, l&rsquo;information utile dans une source externe, l&rsquo;ajoute \u00e0 la question, puis laisse le LLM r\u00e9pondre \u00e0 partir de l\u00e0.<\/li>\n<li>Un syst\u00e8me RAG repose sur <strong>deux pipelines<\/strong> : l&rsquo;indexation, qui pr\u00e9pare la base de connaissances \u00e0 l&rsquo;avance, et la g\u00e9n\u00e9ration, qui r\u00e9pond en temps r\u00e9el.<\/li>\n<li>L&rsquo;indexation encha\u00eene quatre gestes : charger les donn\u00e9es, les d\u00e9couper, les convertir en vecteurs de nombres (des <em>embeddings<\/em>), les stocker.<\/li>\n<li>Le composant le plus critique est le <a href=\"\/blog\/rag\/qu-est-ce-qu-un-retriever\/\" title=\"retriever\">retriever<\/a>, celui qui retrouve les bons passages : la qualit\u00e9 de toute la r\u00e9ponse en d\u00e9pend.<\/li>\n<li>Le RAG r\u00e9duit consid\u00e9rablement les <a href=\"\/blog\/agentic\/eviter-hallucination-documents-recuperes\/\" title=\"hallucinations\">hallucinations<\/a>, mais ne les supprime pas.<\/li>\n<\/ul>\n<h2>Pourquoi un LLM seul ne suffit pas<\/h2>\n<p>On imagine volontiers qu&rsquo;un LLM consulte une r\u00e9serve de faits pour r\u00e9pondre. Ce n&rsquo;est pas le cas : il ne m\u00e9morise ni faits ni \u00e9v\u00e9nements pr\u00e9cis. Il a appris des poids dans un r\u00e9seau de neurones, et quand vous l&rsquo;interrogez, il <em>g\u00e9n\u00e8re<\/em> une r\u00e9ponse \u00e0 partir de ces poids, exactement comme il pr\u00e9dit le mot suivant d&rsquo;une phrase.<\/p>\n<p>De l\u00e0 d\u00e9coulent trois limites. La premi\u00e8re est la <strong>date de coupure<\/strong> : entra\u00eener un mod\u00e8le prend des semaines, voire des mois, si bien que son savoir n&rsquo;est jamais parfaitement \u00e0 jour (GPT-4.1, sorti en avril 2025, ne conna\u00eet le monde que jusqu&rsquo;au 1er juin 2024). La deuxi\u00e8me est l&rsquo;<strong>hallucination<\/strong> : des avocats am\u00e9ricains ont ainsi soumis \u00e0 un tribunal des citations juridiques enti\u00e8rement fictives, g\u00e9n\u00e9r\u00e9es par ChatGPT. La troisi\u00e8me est l&rsquo;<strong>absence d&rsquo;acc\u00e8s aux donn\u00e9es priv\u00e9es<\/strong> : documents internes, dossiers clients, tout ce qui n&rsquo;a jamais fait partie de l&rsquo;entra\u00eenement.<\/p>\n<p>On pourrait r\u00e9entra\u00eener un mod\u00e8le, ou l&rsquo;affiner avec de nouvelles donn\u00e9es. Mais ces deux voies exigent des volumes de donn\u00e9es et des ressources de calcul consid\u00e9rables, et le remettre \u00e0 jour r\u00e9guli\u00e8rement reste prohibitivement co\u00fbteux.<\/p>\n<h2>L&rsquo;intuition : un examen \u00e0 livre ouvert<\/h2>\n<p>Un LLM seul passe un examen de m\u00e9moire. Un syst\u00e8me RAG lui autorise le livre ouvert : avant qu&rsquo;il r\u00e9ponde, on lui glisse les pages qui comptent.<\/p>\n<p>Les chercheurs distinguent deux m\u00e9moires. La <a href=\"\/blog\/inference\/qu-est-ce-qu-une-memoire-parametrique\/\" title=\"m\u00e9moire param\u00e9trique\">m\u00e9moire param\u00e9trique<\/a> est ce que le mod\u00e8le a appris pendant l&rsquo;entra\u00eenement, stock\u00e9 dans ses poids : elle est n\u00e9cessairement limit\u00e9e. La <a href=\"\/blog\/inference\/qu-est-ce-qu-une-memoire-non-parametrique\/\" title=\"m\u00e9moire non param\u00e9trique\">m\u00e9moire non param\u00e9trique<\/a> est l&rsquo;information qu&rsquo;on lui fournit de l&rsquo;ext\u00e9rieur, et qu&rsquo;on peut \u00e9tendre autant qu&rsquo;on veut. Dans l&rsquo;article fondateur du RAG, Patrick Lewis et ses coauteurs ont stock\u00e9 des donn\u00e9es Wikip\u00e9dia, y ont donn\u00e9 acc\u00e8s au mod\u00e8le gr\u00e2ce \u00e0 un retriever, et obtenu un langage plus pr\u00e9cis, plus vari\u00e9 et plus factuel qu&rsquo;avec un mod\u00e8le purement param\u00e9trique.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46b55f03&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46b55f03\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1122\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch01_memoire_parametrique-scaled.png\" alt=\"Un LLM et ses deux m\u00e9moires : la m\u00e9moire param\u00e9trique, faite des poids appris \u00e0 l'entra\u00eenement, et la m\u00e9moire non param\u00e9trique, une source externe r\u00e9cup\u00e9r\u00e9e \u00e0 la demande\" class=\"wp-image-115\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch01_memoire_parametrique-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch01_memoire_parametrique-300x131.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch01_memoire_parametrique-1024x449.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch01_memoire_parametrique-768x336.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch01_memoire_parametrique-1536x673.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch01_memoire_parametrique-2048x897.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Regardez la branche de droite : c&rsquo;est elle qui change tout. La branche de gauche, on ne peut la modifier qu&rsquo;en r\u00e9entra\u00eenant le mod\u00e8le ; celle de droite se remplace \u00e0 volont\u00e9, sans toucher aux poids.<\/figcaption><\/figure>\n\n\n<blockquote>\n<p><strong>\ud83d\udca1 Intuition<\/strong> Le RAG ne rend pas le mod\u00e8le plus savant : il lui apporte, \u00e0 chaque question, la documentation qui lui manque. Trois b\u00e9n\u00e9fices concrets : des r\u00e9ponses ancr\u00e9es dans l&rsquo;information fournie, des sources qu&rsquo;on peut citer et v\u00e9rifier, et moins d&rsquo;hallucinations.<\/p>\n<\/blockquote>\n<p>Concr\u00e8tement, le syst\u00e8me fait \u00e0 votre place ce que vous feriez \u00e0 la main dans l&rsquo;exemple du cricket : il comprend la question, cherche l&rsquo;information pertinente, identifie une source, et la transmet au LLM avec la question d&rsquo;origine. Vous n&rsquo;avez rien \u00e0 faire, tout est invisible pour l&rsquo;utilisateur.<\/p>\n<h2>Sous le capot : deux pipelines<\/h2>\n<p>C\u00f4t\u00e9 question, cela donne cinq \u00e9tapes : l&rsquo;utilisateur pose sa question, le syst\u00e8me cherche l&rsquo;information pertinente, la r\u00e9cup\u00e8re, l&rsquo;ajoute \u00e0 la question (on dit qu&rsquo;il <em>augmente<\/em> le prompt), et le LLM r\u00e9pond de fa\u00e7on contextuelle. Ce parcours s&rsquo;appelle le <strong>pipeline de g\u00e9n\u00e9ration<\/strong>.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46b56422&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46b56422\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"544\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_pipeline_generation-scaled.png\" alt=\"Le pipeline de g\u00e9n\u00e9ration en cinq \u00e9tapes : question de l'utilisateur, recherche, r\u00e9cup\u00e9ration de l'information pertinente, augmentation du prompt, g\u00e9n\u00e9ration de la r\u00e9ponse\" class=\"wp-image-116\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_pipeline_generation-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_pipeline_generation-300x64.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_pipeline_generation-1024x218.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_pipeline_generation-768x163.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_pipeline_generation-1536x326.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_pipeline_generation-2048x435.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Cette cha\u00eene suppose pourtant qu&rsquo;il y ait quelque chose \u00e0 chercher. Si vos donn\u00e9es se trouvent dans plusieurs sources (le web, un espace de stockage interne, des PDF, des r\u00e9ponses d&rsquo;API), refaire \u00e0 chaque question la connexion, l&rsquo;extraction et l&rsquo;analyse serait extr\u00eamement inefficace. Un syst\u00e8me RAG fonctionne mieux quand toute l&rsquo;information est rassembl\u00e9e en un seul endroit, dans un format unique, et d\u00e9coup\u00e9e en petits fragments.<\/figcaption><\/figure>\n\n\n<p>D&rsquo;o\u00f9 le second pipeline, celui de l&rsquo;ombre.<\/p>\n<h3>Le pipeline d&rsquo;indexation : pr\u00e9parer le terrain<\/h3>\n<p>Le <strong>pipeline d&rsquo;indexation<\/strong> construit la base de connaissances \u00e0 l&rsquo;avance et la met \u00e0 jour \u00e0 intervalles r\u00e9guliers. Il ne s&rsquo;active pas quand l&rsquo;utilisateur pose sa question : il tourne hors ligne, ou de fa\u00e7on asynchrone.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46b56994&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46b56994\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"544\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_pipeline_indexation-scaled.png\" alt=\"Le pipeline d'indexation en cinq \u00e9tapes : connexion \u00e0 la source, extraction et parsing, d\u00e9coupage, conversion en embeddings, stockage\" class=\"wp-image-117\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_pipeline_indexation-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_pipeline_indexation-300x64.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_pipeline_indexation-1024x218.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_pipeline_indexation-768x163.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_pipeline_indexation-1536x326.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_pipeline_indexation-2048x435.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Lisez le sch\u00e9ma de gauche \u00e0 droite : chaque fl\u00e8che est une transformation. On part de fichiers h\u00e9t\u00e9rog\u00e8nes (PDF, Word, JSON, HTML) et on aboutit \u00e0 une base o\u00f9 chaque fragment de texte est accompagn\u00e9 de son vecteur. Sans cette base, le pipeline de g\u00e9n\u00e9ration n&rsquo;a tout simplement rien \u00e0 chercher.<\/figcaption><\/figure>\n\n\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Tous les syst\u00e8mes n&rsquo;ont pas besoin de ce pipeline. Une application de conseil de voyage qui interroge une API m\u00e9t\u00e9o d\u00e9l\u00e8gue enti\u00e8rement la recherche \u00e0 cette API : aucune base de connaissances \u00e0 construire.<\/p>\n<\/blockquote>\n<p>Voyons les quatre gestes un par un.<\/p>\n<p><strong>1. Charger.<\/strong> On se connecte aux sources, on lit les fichiers et on en extrait le texte. Ce composant fait aussi un pr\u00e9traitement essentiel : suppression de l&rsquo;information non pertinente, masquage des donn\u00e9es confidentielles, gestion des m\u00e9tadonn\u00e9es \u2014 ces derni\u00e8res aideront plus tard \u00e0 trancher entre plusieurs informations concurrentes selon leur origine ou leur anciennet\u00e9.<\/p>\n<p><strong>2. D\u00e9couper.<\/strong> Une page Wikip\u00e9dia de plus de 8 000 mots est trop longue \u00e0 traiter telle quelle. <a href=\"\/blog\/agentic\/quelle-methode-de-decoupage-chunking-choisir-pour-que-l-agen\/\" title=\"D\u00e9couper en fragments\">D\u00e9couper en fragments<\/a> apporte trois avantages : respecter la fen\u00eatre de contexte du LLM (tout texte qui la d\u00e9passe est simplement ignor\u00e9), att\u00e9nuer le probl\u00e8me du \u00ab perdu au milieu \u00bb (la pr\u00e9cision baisse quand l&rsquo;information utile est noy\u00e9e au milieu d&rsquo;un long prompt), et faciliter la recherche, plus efficace sur de petits textes.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46b56ed9&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46b56ed9\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"768\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_processus_chunking-scaled.png\" alt=\"Le d\u00e9coupage en trois \u00e9tapes : diviser le texte en unit\u00e9s compactes, les fusionner jusqu'\u00e0 une taille cible, puis chevaucher chaque fragment avec le pr\u00e9c\u00e9dent\" class=\"wp-image-118\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_processus_chunking-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_processus_chunking-300x90.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_processus_chunking-1024x307.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_processus_chunking-768x230.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_processus_chunking-1536x461.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_processus_chunking-2048x614.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Le chevauchement de l&rsquo;\u00e9tape 3 est ce qui pr\u00e9serve la continuit\u00e9 : chaque nouveau fragment reprend un bout du pr\u00e9c\u00e9dent, pour qu&rsquo;une id\u00e9e coup\u00e9e en deux ne disparaisse pas.<\/figcaption><\/figure>\n\n\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> La taille des fragments est un arbitrage sans r\u00e9ponse universelle. Un contrat de 10 000 mots d\u00e9coup\u00e9 en segments de 1 000 mots m\u00e9langera plusieurs clauses ; en segments de 200 mots, chaque clause sera isol\u00e9e, au risque de perdre le contexte des clauses voisines. Il faut exp\u00e9rimenter selon vos donn\u00e9es.<\/p>\n<\/blockquote>\n<p><strong>3. Convertir en embeddings.<\/strong> Un ordinateur ne traite que des nombres. Un <em>embedding<\/em> est une liste de nombres qui repr\u00e9sente un mot, une phrase ou un document, construite pour que les textes proches en signification soient proches dans l&rsquo;espace vectoriel. Plus la liste est longue (on parle de dimension), plus elle peut porter d&rsquo;information, au prix d&rsquo;un calcul plus co\u00fbteux.<\/p>\n<p>Pour mesurer cette proximit\u00e9, on utilise le plus souvent la <strong>similarit\u00e9 cosinus<\/strong> : le cosinus de l&rsquo;angle entre deux vecteurs. Des vecteurs parall\u00e8les donnent 1 (sens tr\u00e8s proches), un angle droit donne 0 (termes non reli\u00e9s), un angle de 180\u00b0 donne \u22121 (sens oppos\u00e9s).<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46b573d0&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46b573d0\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1950\" height=\"1950\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_similarite_cosinus.png\" alt=\"Similarit\u00e9 cosinus entre vecteurs : le document B, presque align\u00e9 sur le document de r\u00e9f\u00e9rence A, a une similarit\u00e9 proche de 1 ; le document C, orient\u00e9 \u00e0 l'oppos\u00e9, une similarit\u00e9 n\u00e9gative\" class=\"wp-image-119\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_similarite_cosinus.png 1950w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_similarite_cosinus-300x300.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_similarite_cosinus-1024x1024.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_similarite_cosinus-150x150.png 150w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_similarite_cosinus-768x768.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_similarite_cosinus-1536x1536.png 1536w\" sizes=\"auto, (max-width: 1950px) 100vw, 1950px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Sur le sch\u00e9ma, comparez les angles plut\u00f4t que les longueurs de fl\u00e8ches : B est quasiment coll\u00e9 \u00e0 A, C part dans la direction inverse. C&rsquo;est cette lecture g\u00e9om\u00e9trique qui permet \u00e0 un syst\u00e8me de retrouver un passage m\u00eame s&rsquo;il n&#8217;emploie pas les m\u00eames mots que la question.<\/figcaption><\/figure>\n\n\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Le mod\u00e8le d&#8217;embeddings doit rester strictement le m\u00eame dans toute l&rsquo;application, pour les fragments comme pour les questions. En changer implique de recalculer tout l&rsquo;index.<\/p>\n<\/blockquote>\n<p><strong>4. Stocker.<\/strong> Les vecteurs sont conserv\u00e9s dans une base de donn\u00e9es vectorielle, con\u00e7ue pour rechercher efficacement des vecteurs de grande dimension. On y trouve des index purs (FAISS), des bases sp\u00e9cialis\u00e9es (Pinecone, ChromaDB, Milvus, Qdrant\u2026), mais aussi des bases SQL, NoSQL ou de graphes qui ont ajout\u00e9 cette capacit\u00e9. L&rsquo;index retrouve un voisin tr\u00e8s proche plut\u00f4t que le voisin exact : un compromis entre vitesse et pr\u00e9cision.<\/p>\n<h3>Le pipeline de g\u00e9n\u00e9ration : r\u00e9pondre en direct<\/h3>\n<p>Une fois la base pr\u00eate, le pipeline de g\u00e9n\u00e9ration prend le relais, et son c\u0153ur est le retriever. Il convertit la question en embedding avec le m\u00eame mod\u00e8le que celui des fragments, puis retrouve les embeddings les plus proches. C&rsquo;est sans doute le composant le plus critique de tout le syst\u00e8me ; comme la recherche co\u00fbte cher en calcul, il p\u00e8se aussi lourd dans la latence.<\/p>\n<p>Vient ensuite l&rsquo;<strong>augmentation<\/strong> : combiner la question et l&rsquo;information r\u00e9cup\u00e9r\u00e9e dans un prompt. Cela para\u00eet trivial, mais c&rsquo;est de l&rsquo;ing\u00e9nierie de prompt, et la fa\u00e7on de construire ce texte influence consid\u00e9rablement la r\u00e9ponse. Le <em>prompting contextuel<\/em> ajoute une consigne du type \u00ab r\u00e9pondez uniquement \u00e0 partir du contexte fourni ci-dessous \u00bb. Le <em>prompting \u00e0 g\u00e9n\u00e9ration contr\u00f4l\u00e9e<\/em> va plus loin : il demande au mod\u00e8le de r\u00e9pondre \u00ab Je ne sais pas \u00bb si le contexte ne suffit pas.<\/p>\n<p>Reste la <strong>g\u00e9n\u00e9ration<\/strong>. Puisque le retriever a d\u00e9j\u00e0 trouv\u00e9 l&rsquo;information, le LLM n&rsquo;a plus qu&rsquo;\u00e0 s&rsquo;en servir pour r\u00e9diger : c&rsquo;est une t\u00e2che bien plus l\u00e9g\u00e8re que de tout savoir par c\u0153ur. On peut donc employer des mod\u00e8les plus petits, plus rapides et moins co\u00fbteux, tout en gagnant en fiabilit\u00e9.<\/p>\n<h2>Le voir tourner<\/h2>\n<p>Reprenons notre question sur le cricket, avec LangChain, un framework open source lanc\u00e9 en octobre 2022 par Harrison Chase pour construire des applications \u00e0 base de LLM. Premi\u00e8re \u00e9tape : au lieu de copier le paragraphe \u00e0 la main, on se connecte \u00e0 la page Wikip\u00e9dia du tournoi et on en extrait les donn\u00e9es par programmation.<\/p>\n<pre><code class=\"language-python\">%pip install langchain==0.3.19\n%pip install langchain-community\n%pip install bs4==0.0.2 --quiet\n\nfrom langchain_community.document_loaders import AsyncHtmlLoader\n\nurl = &quot;https:\/\/en.wikipedia.org\/wiki\/2023_Cricket_World_Cup&quot;\nloader = AsyncHtmlLoader(url)\nhtml_data = loader.load()\n<\/code><\/pre>\n<p>On obtient une liste de documents, chacun avec deux \u00e9l\u00e9ments : <code>page_content<\/code>, le texte brut (encore charg\u00e9 de balises HTML), et <code>metadata<\/code>, qui contient la source, le titre, la langue. Une fois le HTML nettoy\u00e9, il faut d\u00e9couper. Ici, un d\u00e9coupage par caract\u00e8re, en morceaux de 1 000 caract\u00e8res qui se recouvrent sur 200.<\/p>\n<pre><code class=\"language-python\">from langchain.text_splitters import CharacterTextSplitter\n\ntext_splitter = CharacterTextSplitter(\n    separator=&quot;\\n&quot;,  # caractere utilise pour le decoupage\n    chunk_size=1000,  # nombre de caracteres par chunk\n    chunk_overlap=200,  # nombre de caracteres de chevauchement\n)\nchunks = text_splitter.create_documents(\n    [html_data_transformed[0].page_content]\n)\nprint(f&quot;Nombre de chunks crees : {len(chunks)}&quot;)\n<\/code><\/pre>\n<p>Sur cette page, on obtient 67 fragments, et l&rsquo;on peut v\u00e9rifier que les 200 derniers caract\u00e8res de l&rsquo;un recoupent les 200 premiers du suivant. Pour les textes g\u00e9n\u00e9riques, on recommande plut\u00f4t <code>RecursiveCharacterTextSplitter<\/code>, qui retente le d\u00e9coupage avec un s\u00e9parateur de repli tant que la taille voulue n&rsquo;est pas atteinte.<\/p>\n<p>Place aux embeddings. Ici, avec un mod\u00e8le open source h\u00e9berg\u00e9 sur Hugging Face.<\/p>\n<pre><code class=\"language-python\">from langchain_huggingface import HuggingFaceEmbeddings\n\nembeddings = HuggingFaceEmbeddings(\n    model_name=&quot;sentence-transformers\/all-mpnet-base-v2&quot;\n)\nhf_embeddings = embeddings.embed_documents(\n    [chunk.page_content for chunk in final_chunks]\n)\nlen(hf_embeddings[0])\n<\/code><\/pre>\n<p>Ce mod\u00e8le produit des embeddings de 768 dimensions : la liste contient 285 listes de 768 nombres, une par fragment. Avec <code>text-embedding-3-small<\/code> d&rsquo;OpenAI, ce serait 1 536 dimensions. Le choix se fait selon le cas d&rsquo;usage, le classement MTEB et le co\u00fbt : cr\u00e9er des embeddings pour des milliers de documents peut repr\u00e9senter des millions de tokens factur\u00e9s.<\/p>\n<p>Une fois les vecteurs stock\u00e9s dans un index FAISS et sauvegard\u00e9s, le pipeline de g\u00e9n\u00e9ration peut les recharger et interroger la base. Le param\u00e8tre <code>k=2<\/code> demande les deux fragments les plus proches.<\/p>\n<pre><code class=\"language-python\">from langchain_community.vectorstores import FAISS\nfrom langchain_openai import OpenAIEmbeddings\nimport os\nos.environ[&quot;OPENAI_API_KEY&quot;] = &quot;&lt;YOUR_API_KEY&gt;&quot;\n\nembeddings = OpenAIEmbeddings(model=&quot;text-embedding-3-small&quot;)\nvector_store = FAISS.load_local(\n    folder_path=&quot;..\/..\/Assets\/Data&quot;,\n    index_name=&quot;CWC_index&quot;,\n    embeddings=embeddings,\n    allow_dangerous_deserialization=True\n)\nquery = &quot;Who won the 2023 Cricket World Cup?&quot;\nretrieved_docs = vector_store.similarity_search(query, k=2)\n<\/code><\/pre>\n<p>Interrog\u00e9 ainsi, l&rsquo;index renvoie les fragments class\u00e9s par similarit\u00e9 d\u00e9croissante, et celui qui parle de la finale arrive en t\u00eate. Le vector store joue ici lui-m\u00eame le r\u00f4le de retriever : c&rsquo;est l&rsquo;impl\u00e9mentation la plus simple possible.<\/p>\n<p>Derni\u00e8re pi\u00e8ce, l&rsquo;augmentation. Voici comment se construit un prompt qui contraint le mod\u00e8le \u00e0 s&rsquo;en tenir aux documents r\u00e9cup\u00e9r\u00e9s (l&rsquo;exemple vient d&rsquo;un corpus sur Einstein).<\/p>\n<pre><code class=\"language-python\">system_message = &quot;You're an Einstein expert, but can only use the provided documents to respond to the\n    questions.&quot;\nuser_message = f&quot;&quot;&quot;\nUse the following documents to answer the question that will follow:\n{[doc[&quot;text&quot;] for doc in similar_records]}\n---\nThe question to answer using information only from the above documents:\n{question}\n&quot;&quot;&quot;\n<\/code><\/pre>\n<p>Le message syst\u00e8me fixe la r\u00e8gle du jeu ; le message utilisateur ins\u00e8re les fragments retrouv\u00e9s, puis la question. Envoy\u00e9 \u00e0 GPT-4, ce prompt renvoie la r\u00e9ponse attendue : le retriever a fait son travail, et le g\u00e9n\u00e9rateur s&rsquo;est content\u00e9 d&rsquo;en tirer la conclusion.<\/p>\n<h2>Lire les r\u00e9sultats : comment savoir si \u00e7a marche ?<\/h2>\n<p>Sans mesure, impossible de dire si le syst\u00e8me fonctionne ou s&rsquo;il hallucine encore. Les chercheurs retiennent trois relations \u00e0 examiner, la \u00ab triade \u00bb propos\u00e9e par TruEra : entre la question et le contexte r\u00e9cup\u00e9r\u00e9 (l&rsquo;information est-elle la plus pertinente ?), entre le contexte et la r\u00e9ponse (le mod\u00e8le s&rsquo;appuie-t-il vraiment dessus ?), entre la r\u00e9ponse et la question (r\u00e9pond-elle \u00e0 ce qui \u00e9tait demand\u00e9 ?).<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46b577dd&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46b577dd\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1849\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_triade_evaluation-scaled.png\" alt=\"La triade d'\u00e9valuation d'un syst\u00e8me RAG : pertinence du contexte entre la question et le contexte r\u00e9cup\u00e9r\u00e9, fid\u00e9lit\u00e9 entre le contexte et la r\u00e9ponse, pertinence de la r\u00e9ponse entre la question et la r\u00e9ponse\" class=\"wp-image-120\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_triade_evaluation-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_triade_evaluation-300x217.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_triade_evaluation-1024x739.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_triade_evaluation-768x555.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_triade_evaluation-1536x1109.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch02_triade_evaluation-2048x1479.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Suivez les trois c\u00f4t\u00e9s du triangle : la question est reli\u00e9e au contexte r\u00e9cup\u00e9r\u00e9 par la pertinence du contexte, \u00e0 la r\u00e9ponse g\u00e9n\u00e9r\u00e9e par la pertinence de la r\u00e9ponse, et le contexte est reli\u00e9 \u00e0 la r\u00e9ponse par la fid\u00e9lit\u00e9 (<em>groundedness<\/em>). Chaque relation se mesure s\u00e9par\u00e9ment, ce qui permet de savoir o\u00f9 chercher la panne : c\u00f4t\u00e9 retriever ou c\u00f4t\u00e9 LLM.<\/figcaption><\/figure>\n\n\n<p>C\u00f4t\u00e9 r\u00e9cup\u00e9ration, deux questions simples. La <strong>pr\u00e9cision<\/strong> : parmi les documents r\u00e9cup\u00e9r\u00e9s, combien \u00e9taient pertinents ? Le <strong>rappel<\/strong> : parmi tous les documents pertinents, combien ont \u00e9t\u00e9 r\u00e9cup\u00e9r\u00e9s ? Un rappel parfait s&rsquo;obtient trivialement en r\u00e9cup\u00e9rant toute la base, ce qui montre pourquoi on ne le lit jamais seul.<\/p>\n<p>Pour se faire une id\u00e9e des ordres de grandeur, un benchmark sur un syst\u00e8me \u00e0 base de graphe a donn\u00e9 une fid\u00e9lit\u00e9 de 0,97, un rappel de contexte de 0,79 et une exactitude de 0,78. Lecture : le mod\u00e8le invente rarement, mais la r\u00e9cup\u00e9ration ne capture pas toujours toute l&rsquo;information n\u00e9cessaire, et c&rsquo;est l\u00e0 qu&rsquo;il faut travailler.<\/p>\n<h2>Pi\u00e8ges et limites<\/h2>\n<p>Un syst\u00e8me RAG peut lui-m\u00eame halluciner, pour trois raisons : le retriever ne ram\u00e8ne pas tout le contexte pertinent (ou ram\u00e8ne du hors-sujet), le LLM ne tient pas compte du contexte fourni, ou il puise dans les \u00e9l\u00e9ments non pertinents du contexte plut\u00f4t que de r\u00e9pondre \u00e0 la question.<\/p>\n<p>Le <a href=\"\/blog\/rag\/qu-est-ce-qu-un-rag-naif\/\" title=\"RAG \u00ab na\u00eff \u00bb\">RAG \u00ab na\u00eff \u00bb<\/a>, qui se contente de r\u00e9cup\u00e9rer puis de lire, souffre \u00e0 chaque \u00e9tape. \u00c0 la r\u00e9cup\u00e9ration, la pr\u00e9cision et le rappel sont souvent faibles. \u00c0 l&rsquo;augmentation, des documents similaires cr\u00e9ent de la redondance et des contextes venus de sources diff\u00e9rentes deviennent d\u00e9cousus. \u00c0 la g\u00e9n\u00e9ration, ces insuffisances se traduisent par des hallucinations, un manque d&rsquo;ancrage, ou une d\u00e9pendance excessive au contexte.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46b57b98&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46b57b98\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"985\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch06_rag_naif_limites-scaled.png\" alt=\"Le RAG na\u00eff en quatre \u00e9tapes (documents, retriever, LLM, r\u00e9ponse) et ses deux zones de faiblesse : faible pr\u00e9cision et faible rappel \u00e0 la r\u00e9cup\u00e9ration, hallucination, biais et sur-d\u00e9pendance au contexte \u00e0 la g\u00e9n\u00e9ration\" class=\"wp-image-121\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch06_rag_naif_limites-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch06_rag_naif_limites-300x115.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch06_rag_naif_limites-1024x394.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch06_rag_naif_limites-768x295.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch06_rag_naif_limites-1536x591.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch06_rag_naif_limites-2048x788.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Ce sch\u00e9ma montre pourquoi les d\u00e9fauts s&rsquo;encha\u00eenent : une r\u00e9cup\u00e9ration m\u00e9diocre en amont fabrique m\u00e9caniquement une g\u00e9n\u00e9ration m\u00e9diocre en aval.<\/figcaption><\/figure>\n\n\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Les embeddings sont faits pour retrouver du contenu <em>s\u00e9mantiquement proche<\/em>, pas pour filtrer, trier ou compter. Demandez les conditions de paiement d&rsquo;un contrat pr\u00e9cis : les fragments les plus similaires peuvent venir de contrats diff\u00e9rents, et le mod\u00e8le en tire une r\u00e9ponse fragment\u00e9e, voire trompeuse. Demandez \u00ab combien de contrats actifs avons-nous avec ACME Inc. ? \u00bb : l&rsquo;approche par embeddings \u00e9choue, faute de pouvoir filtrer puis compter.<\/p>\n<\/blockquote>\n<p>Certaines requ\u00eates restent des points faibles r\u00e9currents : celles qui demandent un raisonnement en plusieurs \u00e9tapes, les requ\u00eates g\u00e9n\u00e9rales ou vagues (difficiles \u00e0 faire correspondre \u00e0 un fragment pr\u00e9cis), les requ\u00eates longues ou complexes, et les requ\u00eates implicites, qui exigent une compr\u00e9hension que le RAG seul ne fournit pas.<\/p>\n<p>Enfin, chaque \u00e9tape ajoute du temps de calcul : r\u00e9cup\u00e9ration, re-classement et g\u00e9n\u00e9ration s&rsquo;additionnent, ce qui peut d\u00e9grader l&rsquo;exp\u00e9rience dans les applications temps r\u00e9el.<\/p>\n<h2>Aller plus loin<\/h2>\n<p>Le RAG na\u00eff suffit rarement en production. Le <a href=\"\/blog\/rag\/qu-est-ce-qu-un-rag-avance\/\" title=\"RAG avanc\u00e9\">RAG avanc\u00e9<\/a> y ajoute des techniques avant la r\u00e9cup\u00e9ration (r\u00e9\u00e9crire la requ\u00eate, optimiser l&rsquo;index) et apr\u00e8s (compresser ou re-classer le contexte) ; le RAG <em>modulaire<\/em> d\u00e9coupe le tout en composants interchangeables. Ce ne sont pas des concurrents mais une progression : le RAG na\u00eff est un cas particulier du RAG avanc\u00e9, lui-m\u00eame un cas particulier du modulaire.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46b57fbb&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46b57fbb\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1113\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch06_progression_rag-scaled.png\" alt=\"La progression des architectures : le RAG na\u00eff (indexation, r\u00e9cup\u00e9ration, g\u00e9n\u00e9ration), le RAG avanc\u00e9 (ajout d'\u00e9tapes avant et apr\u00e8s la r\u00e9cup\u00e9ration) et le RAG modulaire (ajout de routage, fusion, m\u00e9moire et adaptateur de t\u00e2che)\" class=\"wp-image-122\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch06_progression_rag-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch06_progression_rag-300x130.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch06_progression_rag-1024x445.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch06_progression_rag-768x334.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch06_progression_rag-1536x668.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch06_progression_rag-2048x890.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Quelques pistes pour la suite, chacune ciblant une faiblesse vue plus haut :<\/figcaption><\/figure>\n\n\n<ul>\n<li>\n<p><strong>La <a href=\"\/blog\/rag\/qu-est-ce-qu-une-recherche-hybride\/\" title=\"recherche hybride\">recherche hybride<\/a><\/strong> combine recherche par mots-cl\u00e9s et recherche s\u00e9mantique, puis fusionne les r\u00e9sultats selon une pond\u00e9ration adapt\u00e9e.<\/p>\n<\/li>\n<li>\n<p><strong>Le re-classement<\/strong> r\u00e9ordonne les documents r\u00e9cup\u00e9r\u00e9s pour prioriser les plus pertinents avant la g\u00e9n\u00e9ration, surtout utile quand plusieurs m\u00e9thodes de recherche doivent \u00eatre arbitr\u00e9es.<\/p>\n<\/li>\n<li>\n<p><strong>Le RAG par <a href=\"\/blog\/rag\/qu-est-ce-qu-un-graphe-de-connaissances\/\" title=\"graphe de connaissances\">graphe de connaissances<\/a><\/strong> repr\u00e9sente l&rsquo;information en entit\u00e9s et relations, pour les questions dont la r\u00e9ponse n&rsquo;est dans aucun fragment isol\u00e9 (\u00ab quels sont les th\u00e8mes principaux de ce rapport ? \u00bb).<\/p>\n<\/li>\n<li>\n<p><strong>Le <a href=\"\/blog\/agentic\/comment-concevoir-un-systeme-d-agents-ia-couple-a-un-rag\/\" title=\"RAG agentique\">RAG agentique<\/a><\/strong> confie \u00e0 un ou plusieurs agents LLM la d\u00e9cision de quelle source interroger, et si l&rsquo;information trouv\u00e9e suffit.<\/p>\n<\/li>\n<li>\n<p><a href=\"\/blog\/rag\/qu-est-ce-qu-un-self-rag\/\" title=\"Self-RAG\">Self-RAG<\/a> entra\u00eene le mod\u00e8le \u00e0 \u00e9mettre des \u00ab jetons de r\u00e9flexion \u00bb qui d\u00e9cident s&rsquo;il faut r\u00e9cup\u00e9rer davantage, jugent un passage, ou v\u00e9rifient que la r\u00e9ponse s&rsquo;appuie bien sur lui.<\/p>\n<\/li>\n<\/ul>\n<p>La recherche hybride, par exemple, lance une recherche vectorielle et une recherche plein texte en parall\u00e8le, normalise leurs scores, puis fusionne les r\u00e9sultats.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46b5838d&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46b5838d\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1132\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_recherche_hybride-scaled.png\" alt=\"La recherche hybride : la question part en parall\u00e8le vers une recherche vectorielle par cosinus et une recherche plein texte, dont les scores normalis\u00e9s sont ensuite fusionn\u00e9s\" class=\"wp-image-123\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_recherche_hybride-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_recherche_hybride-300x133.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_recherche_hybride-1024x453.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_recherche_hybride-768x340.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_recherche_hybride-1536x679.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_recherche_hybride-2048x905.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Sur l&rsquo;exemple d&rsquo;Einstein d\u00e9j\u00e0 rencontr\u00e9, le premier r\u00e9sultat reste identique, mais le deuxi\u00e8me change : la recherche plein texte a trouv\u00e9 un passage plus pertinent que la seule recherche vectorielle.<\/figcaption><\/figure>\n\n\n<h2>\u00c0 retenir<\/h2>\n<ul>\n<li>Un syst\u00e8me RAG, ce sont deux temps : une base de connaissances pr\u00e9par\u00e9e hors ligne, puis une cha\u00eene de r\u00e9ponse en direct.<\/li>\n<li>Le LLM ne \u00ab sait \u00bb pas : il g\u00e9n\u00e8re \u00e0 partir de ses poids. Le RAG lui apporte, question par question, la documentation qui lui manque.<\/li>\n<li>Tout se joue \u00e0 la r\u00e9cup\u00e9ration : fragments bien d\u00e9coup\u00e9s, m\u00eame mod\u00e8le d&#8217;embeddings partout, et retriever \u00e9valu\u00e9 s\u00e9par\u00e9ment du LLM.<\/li>\n<li>Mesurez trois relations (question\u2013contexte, contexte\u2013r\u00e9ponse, r\u00e9ponse\u2013question) plut\u00f4t qu&rsquo;un score global.<\/li>\n<li>Commencez simple : on peut partir d&rsquo;une impl\u00e9mentation na\u00efve et \u00e9voluer vers une architecture modulaire \u00e0 mesure que les besoins se pr\u00e9cisent.<\/li>\n<\/ul>\n<h2>Questions fr\u00e9quentes<\/h2>\n<p><strong>Le RAG remplace-t-il l&rsquo;<a href=\"\/blog\/inference\/le-finetuning-d-un-modele\/\" title=\"affinage (finetuning)\">affinage (finetuning)<\/a> d&rsquo;un mod\u00e8le ?<\/strong> Non, les deux sont compl\u00e9mentaires. Le RAG enrichit la m\u00e9moire non param\u00e9trique sans modifier les poids ; l&rsquo;affinage supervis\u00e9 modifie la m\u00e9moire param\u00e9trique, et convient surtout pour ajuster le style, le ton ou le vocabulaire des r\u00e9ponses. On peut aussi les combiner.<\/p>\n<p><strong>Avec des fen\u00eatres de contexte g\u00e9antes, \u00e0 quoi sert encore le RAG ?<\/strong> Pour une base de connaissances modeste, on peut transmettre tout le document dans le prompt, sans d\u00e9coupage ni indexation. Des \u00e9tudes montrent que les LLM \u00e0 contexte long d\u00e9passent souvent le RAG en exactitude, mais \u00e0 un co\u00fbt de calcul nettement sup\u00e9rieur : le RAG reste plus \u00e9conomique car il traite des entr\u00e9es plus courtes. Une approche hybride, SELF-ROUTE, laisse le mod\u00e8le d\u00e9cider s&rsquo;il peut r\u00e9pondre avec les fragments r\u00e9cup\u00e9r\u00e9s ou s&rsquo;il a besoin du document complet.<\/p>\n<p><strong>Faut-il forc\u00e9ment construire sa propre infrastructure ?<\/strong> Non : des solutions g\u00e9r\u00e9es se multiplient (Amazon Bedrock Knowledge Bases, Azure AI Search, Google Vertex AI RAG Engine), au prix des arbitrages habituels entre co\u00fbt, flexibilit\u00e9 et contr\u00f4le.<\/p>","protected":false},"excerpt":{"rendered":"<p>Comment un syst\u00e8me RAG donne \u00e0 un LLM les bons documents au bon moment : indexation, r\u00e9cup\u00e9ration, prompt et g\u00e9n\u00e9ration, avec du code pour le voir tourner.<\/p>\n","protected":false},"author":1,"featured_media":280,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-124","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-rag"],"_links":{"self":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/124","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/comments?post=124"}],"version-history":[{"count":6,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/124\/revisions"}],"predecessor-version":[{"id":539,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/124\/revisions\/539"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media\/280"}],"wp:attachment":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media?parent=124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/categories?post=124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/tags?post=124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}