{"id":501,"date":"2026-10-07T17:20:47","date_gmt":"2026-10-07T15:20:47","guid":{"rendered":"https:\/\/www.ranksignal.fr\/blog\/?p=501"},"modified":"2026-10-14T17:30:36","modified_gmt":"2026-10-14T15:30:36","slug":"qu-est-ce-qu-un-rag-avance","status":"publish","type":"post","link":"https:\/\/www.ranksignal.fr\/blog\/rag\/qu-est-ce-qu-un-rag-avance\/","title":{"rendered":"Qu&rsquo;est-ce qu&rsquo;un RAG avanc\u00e9 ? Ce qu&rsquo;on ajoute, et ce que \u00e7a co\u00fbte"},"content":{"rendered":"<p>Un client d&rsquo;un groupe qui vend de la banque, de l&rsquo;assurance et des placements demande \u00e0 son chatbot o\u00f9 en est son sinistre. Si le syst\u00e8me fouille toutes les bases \u00e0 chaque question, il perd du temps, remonte du hors-sujet et risque de toucher aux donn\u00e9es d&rsquo;un autre service. Rien, dans un <a href=\"\/blog\/rag\/qu-est-ce-qu-un-rag-naif\/\" title=\"RAG de base\">RAG de base<\/a>, n&rsquo;aiguille la question.<\/p>\n<p>Le RAG avanc\u00e9 r\u00e9pond \u00e0 ce genre de situation, et \u00e0 quelques autres. Tu trouveras ici de quoi le d\u00e9finir, situer chacune de ses briques, juger lesquelles valent leur prix et savoir ce qui change quand le syst\u00e8me grossit.<\/p>\n<p><strong>Sommaire<\/strong><\/p>\n<ul>\n<li><a href=\"#l-essentiel-en-30-secondes\">L&rsquo;essentiel en 30 secondes<\/a><\/li>\n<li><a href=\"#du-rag-de-base-au-rag-avance-trois-moments-pas-une-liste-d-outils\">Du RAG de base au RAG avanc\u00e9 : trois moments, pas une liste d&rsquo;outils<\/a><\/li>\n<li><a href=\"#chercher-petit-lire-grand-le-grain-de-l-index\">Chercher petit, lire grand : le grain de l&rsquo;index<\/a><\/li>\n<li><a href=\"#aiguiller-chaque-question-vers-la-bonne-base\">Aiguiller chaque question vers la bonne base<\/a><\/li>\n<li><a href=\"#apres-la-recherche-le-contexte-est-un-budget\">Apr\u00e8s la recherche : le contexte est un budget<\/a><\/li>\n<li><a href=\"#empiler-les-techniques-l-idee-recue-qui-coute-cher\">Empiler les techniques : l&rsquo;id\u00e9e re\u00e7ue qui co\u00fbte cher<\/a><\/li>\n<li><a href=\"#passer-a-l-echelle-volume-doublons-et-parallelisme\">Passer \u00e0 l&rsquo;\u00e9chelle : volume, doublons et parall\u00e9lisme<\/a><\/li>\n<li><a href=\"#un-vecteur-n-est-pas-un-coffre-fort\">Un vecteur n&rsquo;est pas un coffre-fort<\/a><\/li>\n<\/ul>\n<h2 id=\"l-essentiel-en-30-secondes\">L&rsquo;essentiel en 30 secondes<\/h2>\n<ul>\n<li>Un RAG avanc\u00e9, c&rsquo;est le RAG de base auquel on ajoute <strong>des modules avant et apr\u00e8s la r\u00e9cup\u00e9ration<\/strong>.<\/li>\n<li>Il sert \u00e0 passer du prototype \u00e0 la production, o\u00f9 <strong>la pr\u00e9cision ne suffit plus<\/strong> : la latence et le co\u00fbt comptent aussi.<\/li>\n<li>Avant la recherche, on r\u00e8gle <strong>le grain de l&rsquo;index<\/strong> et on aiguille les questions ; apr\u00e8s, on trie, on ordonne et on comprime le contexte.<\/li>\n<li>Chaque module a un prix : dans une \u00e9tude de 2024, <strong>sans reranking la baisse est sensible<\/strong>, alors que HyDE co\u00fbte plus qu&rsquo;il ne rapporte.<\/li>\n<li>En production, il faut aussi <strong>prot\u00e9ger les vecteurs<\/strong> : ils peuvent \u00eatre d\u00e9cod\u00e9s en texte, et les doublons comme le volume p\u00e8sent sur la qualit\u00e9.<\/li>\n<\/ul>\n<h2 id=\"du-rag-de-base-au-rag-avance-trois-moments-pas-une-liste-d-outils\">Du RAG de base au RAG avanc\u00e9 : trois moments, pas une liste d&rsquo;outils<\/h2>\n<p>Un <strong>RAG avanc\u00e9<\/strong> est un RAG dont on a modifi\u00e9 ou am\u00e9lior\u00e9 les \u00e9tapes pour r\u00e9soudre une partie des probl\u00e8mes de la version de base, et pour garder plus de contr\u00f4le sur l&rsquo;ensemble. On conserve les modules de base et on y ajoute des modules de pr\u00e9-r\u00e9cup\u00e9ration et de post-r\u00e9cup\u00e9ration ; le RAG de base devient alors un cas particulier du RAG avanc\u00e9.<\/p>\n<p>Ces ajouts se rangent selon le moment o\u00f9 ils interviennent. Avant la recherche, on optimise l&rsquo;indexation et la requ\u00eate. Pendant, on emploie des strat\u00e9gies de r\u00e9cup\u00e9ration plus fines que les algorithmes de base. Apr\u00e8s, on pr\u00e9pare le contexte avant de le confier au LLM.<\/p>\n<p>Pourquoi s&rsquo;en soucier ? Parce que pour des applications industrielles, m\u00e9dicales, juridiques ou financi\u00e8res, la version de base ne suffit pas. Et la r\u00e8gle du jeu change : pendant le d\u00e9veloppement, la pr\u00e9cision est peut-\u00eatre la m\u00e9trique la plus importante ; en production, il faut <strong>\u00e9quilibrer performance et co\u00fbt<\/strong>.<\/p>\n<p>Voici la carte que suivra cet article. Elle retient les cinq compl\u00e9ments les plus courants : un reranker, une transformation de requ\u00eate simple, un routage, une recherche hybride et un r\u00e9sum\u00e9 du contexte.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46e8111e&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46e8111e\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2340\" height=\"1500\" 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\/10\/b2_ch06_pipeline_avance.png\" alt=\"Pipeline avanc\u00e9 de bout en bout : avant la r\u00e9cup\u00e9ration, la question passe par une transformation puis un routage ; recherche hybride, reranking et compression par r\u00e9sum\u00e9 forment le bloc central ; la g\u00e9n\u00e9ration re\u00e7oit un prompt strict avec le contexte et rend une r\u00e9ponse accompagn\u00e9e de ses sources\" class=\"wp-image-496\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_pipeline_avance.png 2340w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_pipeline_avance-300x192.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_pipeline_avance-1024x656.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_pipeline_avance-768x492.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_pipeline_avance-1536x985.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_pipeline_avance-2048x1313.png 2048w\" sizes=\"auto, (max-width: 2340px) 100vw, 2340px\" \/><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\">Lis le sch\u00e9ma de gauche \u00e0 droite et compte les blocs : trois \u00e9tages, et seul le dernier ressemble \u00e0 ce que fait un RAG de base. Les deux premiers sont les nouveaux venus, et ils occupent le reste de l&rsquo;article.<\/figcaption><\/figure>\n\n\n<h2 id=\"chercher-petit-lire-grand-le-grain-de-l-index\">Chercher petit, lire grand : le grain de l&rsquo;index<\/h2>\n<p>Un petit fragment se retrouve avec pr\u00e9cision, mais il n&rsquo;explique plus grand-chose au <a href=\"\/blog\/inference\/qu-est-ce-qu-un-llm\/\" title=\"LLM\">LLM<\/a>. Un gros fragment l&rsquo;\u00e9claire, mais il noie la recherche. Les techniques qui suivent cherchent \u00e0 avoir les deux.<\/p>\n<h3>Chercher \u00e0 la phrase, lire autour<\/h3>\n<p>La <strong>r\u00e9cup\u00e9ration par fen\u00eatre de phrases<\/strong> plonge chaque phrase s\u00e9par\u00e9ment. L&rsquo;unit\u00e9 est plus petite, donc la recherche plus pr\u00e9cise, mais le LLM risque de manquer de contexte pour raisonner. Le rem\u00e8de : une fois la phrase <em>x<\/em> trouv\u00e9e, on prend aussi les <em>k<\/em> phrases qui l&rsquo;entourent, avant et apr\u00e8s.<\/p>\n<p>Le r\u00e9cup\u00e9rateur de document parent fait le chemin inverse. On d\u00e9coupe en petits fragments \u00ab enfants \u00bb tout en gardant le lien avec leurs documents \u00ab parents \u00bb ; on plonge les enfants, qui r\u00e9pondent pr\u00e9cis\u00e9ment \u00e0 la requ\u00eate, puis on donne au LLM les parents, pour la profondeur. Pour ne pas ramener trop de parents, on n&rsquo;ajoute un document que si <strong>plus de <em>n<\/em> fragments parmi les <em>k<\/em> meilleurs<\/strong> en proviennent.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46e816bd&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46e816bd\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1827\" height=\"753\" 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\/10\/b2_ch06_enrichissement_contexte.png\" alt=\"Deux fa\u00e7ons de rendre du contexte autour d'un petit r\u00e9sultat : en haut, la phrase trouv\u00e9e p6 arrive avec ses voisines p5 et p7 ; en bas, de petits fragments trouv\u00e9s renvoient chacun vers leur document parent complet\" class=\"wp-image-497\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_enrichissement_contexte.png 1827w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_enrichissement_contexte-300x124.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_enrichissement_contexte-1024x422.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_enrichissement_contexte-768x317.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_enrichissement_contexte-1536x633.png 1536w\" sizes=\"auto, (max-width: 1827px) 100vw, 1827px\" \/><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\">Dans la rang\u00e9e du haut, une seule phrase a \u00e9t\u00e9 retrouv\u00e9e et sa fen\u00eatre l&rsquo;accompagne ; dans celle du bas, ce sont des documents entiers qui sont mis en \u00e9vidence, alors que la recherche s&rsquo;est faite sur de petits morceaux.<\/figcaption><\/figure>\n\n\n<h3>Chercher dans un arbre de r\u00e9sum\u00e9s<\/h3>\n<p>Imagine un document d\u00e9coup\u00e9 en grandes parties, elles-m\u00eames d\u00e9coup\u00e9es en sections. Plonger une grande partie telle quelle donne un <a href=\"\/blog\/rag\/que-sont-les-embeddings\/\" title=\"embedding\">embedding<\/a> bruit\u00e9, qui repr\u00e9sente mal son sens. L&rsquo;<strong>index hi\u00e9rarchique<\/strong> cr\u00e9e donc un r\u00e9sum\u00e9 \u00e0 chaque niveau : au sommet, les points cl\u00e9s de grands segments ; plus bas, des r\u00e9sum\u00e9s de plus en plus proches de la section utile.<\/p>\n<p>\u00c0 la question, on compare la requ\u00eate aux embeddings des r\u00e9sum\u00e9s, puis les m\u00e9tadonn\u00e9es associ\u00e9es permettent de retrouver les fragments qui correspondent au r\u00e9sum\u00e9 retenu. Les r\u00e9sum\u00e9s s&rsquo;\u00e9crivent \u00e0 la main ou avec un LLM.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46e81b84&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46e81b84\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2340\" height=\"1320\" 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\/10\/b2_ch06_indexation_hierarchique.png\" alt=\"Index hi\u00e9rarchique : un r\u00e9sum\u00e9 du document \u00e0 la racine, un r\u00e9sum\u00e9 par partie au niveau suivant, puis les fragments en feuilles ; la recherche descend du plus g\u00e9n\u00e9ral au plus pr\u00e9cis\" class=\"wp-image-498\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_indexation_hierarchique.png 2340w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_indexation_hierarchique-300x169.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_indexation_hierarchique-1024x578.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_indexation_hierarchique-768x433.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_indexation_hierarchique-1536x866.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_indexation_hierarchique-2048x1155.png 2048w\" sizes=\"auto, (max-width: 2340px) 100vw, 2340px\" \/><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\">Lis l&rsquo;arbre de haut en bas : c&rsquo;est le chemin que suit la recherche, de la racine jusqu&rsquo;aux fragments.<\/figcaption><\/figure>\n\n\n<blockquote>\n<p><strong>\ud83d\udca1 Intuition<\/strong> C&rsquo;est le zoom d&rsquo;une carte : on rep\u00e8re d&rsquo;abord le pays, puis la ville, puis la rue. Chaque r\u00e9sum\u00e9 est un niveau de zoom, et les m\u00e9tadonn\u00e9es sont les liens qui permettent de descendre d&rsquo;un niveau \u00e0 l&rsquo;autre.<\/p>\n<\/blockquote>\n<p>Trois variantes existent. On peut rendre le r\u00e9sum\u00e9 sp\u00e9cifique au type de fichier (HTML, PDF, d\u00e9p\u00f4t de code). Quand le document d\u00e9passe ce que le LLM r\u00e9sumeur peut lire, le <em>map-reduce<\/em> r\u00e9sume d&rsquo;abord les parties, puis r\u00e9sume les r\u00e9sum\u00e9s. Et si le document brasse trop de sujets, on \u00e9crit <strong>plusieurs r\u00e9sum\u00e9s par document<\/strong>, par exemple un par tranche de 10 000 jetons ou de 10 pages.<\/p>\n<h3>Indexer des questions plut\u00f4t que des r\u00e9ponses<\/h3>\n<p>Derni\u00e8re id\u00e9e : rapprocher les fragments des questions qu&rsquo;on va poser. Un LLM g\u00e9n\u00e8re une ou plusieurs questions hypoth\u00e9tiques pour chaque fragment ; on plonge ces questions, pas les fragments. \u00c0 l&rsquo;arriv\u00e9e d&rsquo;une vraie requ\u00eate, on cherche les questions les plus proches, puis on remonte au fragment d&rsquo;origine gr\u00e2ce aux m\u00e9tadonn\u00e9es.<\/p>\n<p>Le r\u00e9glage est simple : davantage de questions par fragment, c&rsquo;est plus de pr\u00e9cision et plus de calcul. Et tu n&rsquo;as pas besoin de garder le texte des questions, seulement leurs vecteurs, pourvu qu&rsquo;on puisse les rattacher \u00e0 leur fragment.<\/p>\n<h2 id=\"aiguiller-chaque-question-vers-la-bonne-base\">Aiguiller chaque question vers la bonne base<\/h2>\n<p>Reviens au chatbot du groupe. Ses utilisateurs l&rsquo;interrogent sur leurs comptes et transactions (banque), leurs polices et sinistres (assurance), leurs conseils et placements (finance). Chercher dans toutes les bases \u00e0 chaque requ\u00eate serait inefficace et cr\u00e9erait de la latence et des r\u00e9sultats hors sujet.<\/p>\n<p>Il y a plus grave : pour des raisons de r\u00e9glementation et de vie priv\u00e9e, on veut emp\u00eacher le chatbot de chercher dans les d\u00e9tails d&rsquo;un client d&rsquo;un autre service. Un <strong>routeur<\/strong> r\u00e8gle les deux probl\u00e8mes en d\u00e9cidant, avant toute recherche, vers quelle base partira la question.<\/p>\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Ici, la route ne sert pas seulement \u00e0 aller plus vite : elle d\u00e9cide aussi de ce que le syst\u00e8me a le droit de lire. Un routeur mal r\u00e9gl\u00e9 est donc un d\u00e9faut de confidentialit\u00e9 autant que de performance.<\/p>\n<\/blockquote>\n<p>Comment le routeur choisit-il ? Il existe plusieurs m\u00e9canismes : des r\u00e8gles logiques, des mots-cl\u00e9s, une classification <em>zero-shot<\/em>, un appel de fonction ou un routeur s\u00e9mantique. Ce dernier garde une liste de requ\u00eates d&rsquo;exemple, chacune avec sa route ; ces exemples sont plong\u00e9s et rang\u00e9s dans une base. D\u00e8s qu&rsquo;une question arrive, on retient la route de l&rsquo;exemple qui lui ressemble le plus.<\/p>\n<h2 id=\"apres-la-recherche-le-contexte-est-un-budget\">Apr\u00e8s la recherche : le contexte est un budget<\/h2>\n<p>Quand les fragments reviennent, le travail n&rsquo;est pas fini. Le LLM a une fen\u00eatre limit\u00e9e et g\u00e8re mal une grande quantit\u00e9 d&rsquo;information ; il faut donc d\u00e9cider quoi lui donner, dans quel ordre et sous quelle forme.<\/p>\n<h3>Trier : un mod\u00e8le qui lit la question et le fragment ensemble<\/h3>\n<p>Le re-classement r\u00e9ordonne les fragments retrouv\u00e9s avant de les passer au LLM. Voici une version compl\u00e8te, avec un <a href=\"\/blog\/deep-learning\/le-modele-bert\/\" title=\"mod\u00e8le BERT\">mod\u00e8le BERT<\/a> pr\u00e9-entra\u00een\u00e9.<\/p>\n<pre><code>def rerank_documents(query, documents):\n    &quot;&quot;&quot;\n    Reranks the retrieved documents based on their relevance to the\nquery using a pre-trained\n    BERT model.\n    Args:\n        query (str): The user's query.\n        documents (list): A list of documents retrieved from the\nsearch.\n    Returns:\n        list: A list of reranked documents, sorted by relevance.\n    &quot;&quot;&quot;\n    inputs = [rerank_tokenizer.encode_plus(query, doc, return_\ntensors='pt', truncation=True, padding=True) for doc in documents]\n    scores = []\n    for input in inputs:\n        outputs = rerank_model(**input)\n        logits = outputs.logits\n        probabilities = F.softmax(logits, dim=1)\n        positive_class_probability = probabilities[:, 1].item()\n        scores.append(positive_class_probability)\n    ranked_docs = sorted(zip(documents, scores), key=lambda x: x[1],\nreverse=True)\n    return [doc for doc, score in ranked_docs]\n<\/code><\/pre>\n<p><code>rerank_tokenizer<\/code> et <code>rerank_model<\/code> sont le tokenizer et le mod\u00e8le BERT, charg\u00e9s avant l&rsquo;appel. Pour chaque document, <code>encode_plus<\/code> fabrique <strong>une seule entr\u00e9e : requ\u00eate et document<\/strong>, tronqu\u00e9e si elle est trop longue. Le mod\u00e8le en tire des scores bruts, que <code>softmax<\/code> transforme en probabilit\u00e9s ; celle de la classe positive devient le score de pertinence. <code>sorted<\/code> range les documents du plus au moins pertinent, et la fonction rend les documents seuls.<\/p>\n<h3>Ordonner : le milieu du contexte est mal exploit\u00e9<\/h3>\n<p>Une \u00e9tude de 2023 montre que le LLM donne ses meilleurs r\u00e9sultats quand l&rsquo;information importante se situe au d\u00e9but ou \u00e0 la fin du contexte. Au milieu, la performance baisse, surtout si le contexte est long.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46e82178&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46e82178\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1565\" height=\"1082\" 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\/10\/b2_ch06_position_contexte.png\" alt=\"Courbe illustrative en U : l'exactitude de la r\u00e9ponse est \u00e9lev\u00e9e, autour de 0,9, quand l'information utile est au d\u00e9but ou \u00e0 la fin du contexte, et tombe autour de 0,55 quand elle est au milieu\" class=\"wp-image-499\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_position_contexte.png 1565w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_position_contexte-300x207.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_position_contexte-1024x708.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_position_contexte-768x531.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_position_contexte-1536x1062.png 1536w\" sizes=\"auto, (max-width: 1565px) 100vw, 1565px\" \/><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\">Regarde le creux de la courbe : c&rsquo;est la zone \u00e0 ne pas confier aux fragments d\u00e9cisifs.<\/figcaption><\/figure>\n\n\n<p>D&rsquo;o\u00f9 l&rsquo;id\u00e9e de r\u00e9ordonner, soit par ordre de pertinence, soit en <strong>motif altern\u00e9<\/strong> : les fragments d&rsquo;indice pair en t\u00eate de liste, ceux d&rsquo;indice impair en queue. Les plus pertinents se retrouvent aux deux extr\u00e9mit\u00e9s, les moins pertinents au milieu, ce qui sert surtout avec un grand top-k.<\/p>\n<h3>Comprimer : retirer ce que le mod\u00e8le devinerait<\/h3>\n<p>Le contexte contient souvent des informations sans rapport avec la requ\u00eate, voire des r\u00e9p\u00e9titions. Et la plupart des mots d&rsquo;une phrase pourraient \u00eatre pr\u00e9dits par ce qui les entoure : ils n&rsquo;apportent rien au LLM. La compression contextuelle garde l&rsquo;utile et \u00e9conomise du calcul, ou de l&rsquo;argent si tu passes par une API.<\/p>\n<p>Trois strat\u00e9gies :<\/p>\n<ul>\n<li><strong>le filtrage du contexte<\/strong> : un LLM attribue une valeur d&rsquo;information \u00e0 chaque jeton (dans quelle mesure il s&rsquo;attendait \u00e0 le voir), on les classe par ordre d\u00e9croissant et l&rsquo;on ne garde que ceux du premier centile <em>p<\/em> ;<\/li>\n<li>LongLLMLingua, fond\u00e9 sur la m\u00eame id\u00e9e d&rsquo;entropie, mais attentif \u00e0 la question pos\u00e9e : il comprime dynamiquement et r\u00e9ordonne les documents ;<\/li>\n<li>les <strong>autocompresseurs<\/strong>, qui r\u00e9sument un long texte en vecteurs de r\u00e9sum\u00e9 servant de <em>soft prompts<\/em> ; les poids du LLM restent gel\u00e9s et seuls des jetons entra\u00eenables sont ajout\u00e9s au prompt.<\/li>\n<\/ul>\n<p>La version la plus simple demande \u00e0 un LLM de r\u00e9sumer chaque fragment, avec une longueur maximale pour ne pas perdre trop d&rsquo;information.<\/p>\n<h3>Prouver et synth\u00e9tiser<\/h3>\n<p>Garder la trace des sources n&rsquo;est pas une technique d&rsquo;am\u00e9lioration, mais c&rsquo;est fortement recommand\u00e9, surtout quand la r\u00e9ponse m\u00eale plusieurs sources. Il suffit de conserver les documents associ\u00e9s aux fragments utilis\u00e9s, ou de les mentionner dans le prompt. Plus sophistiqu\u00e9 : le moteur de requ\u00eate \u00e0 citation floue, qui apparie la r\u00e9ponse g\u00e9n\u00e9r\u00e9e aux fragments retrouv\u00e9s par correspondance floue (n-grammes puis TF-IDF).<\/p>\n<p>Reste la derni\u00e8re marche, le synth\u00e9tiseur de r\u00e9ponse. Sa version de base concat\u00e8ne prompt, contexte et requ\u00eate. Les versions plus fines multiplient les appels au LLM : raffiner la r\u00e9ponse fragment apr\u00e8s fragment, fusionner plusieurs r\u00e9ponses issues de fragments diff\u00e9rents, ou r\u00e9sumer hi\u00e9rarchiquement jusqu&rsquo;\u00e0 une r\u00e9ponse unique. La qualit\u00e9 monte, mais <strong>elles exigent bien plus d&rsquo;appels au LLM<\/strong> : c&rsquo;est co\u00fbteux en calcul comme en argent.<\/p>\n<h2 id=\"empiler-les-techniques-l-idee-recue-qui-coute-cher\">Empiler les techniques : l&rsquo;id\u00e9e re\u00e7ue qui co\u00fbte cher<\/h2>\n<p>Face \u00e0 cette liste, la tentation est de tout brancher. Or peu d&rsquo;\u00e9tudes de r\u00e9f\u00e9rence ont mesur\u00e9 avec rigueur le rapport entre performance et co\u00fbt de calcul. L&rsquo;une des plus r\u00e9centes, de 2024, sign\u00e9e Wang, donne tout de m\u00eame des rep\u00e8res.<\/p>\n<table>\n<thead>\n<tr>\n<th>Module<\/th>\n<th>Ce que l&rsquo;\u00e9tude observe<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Reranking<\/td>\n<td>Il augmente le co\u00fbt, mais son absence entra\u00eene une baisse sensible<\/td>\n<\/tr>\n<tr>\n<td>R\u00e9sum\u00e9 du contexte<\/td>\n<td>Il aide \u00e0 atteindre l&rsquo;exactitude optimale ; son co\u00fbt se justifie si la latence n&rsquo;est pas un probl\u00e8me<\/td>\n<\/tr>\n<tr>\n<td>HyDE<\/td>\n<td>Meilleur score de performance, mais un co\u00fbt de calcul notable qui ne justifie pas l&rsquo;am\u00e9lioration<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La meilleure performance vient d&rsquo;une combinaison : classification des requ\u00eates, HyDE, reranking, reconditionnement du contexte et r\u00e9sum\u00e9. Si c&rsquo;est trop lourd en calcul ou en latence, <strong>mieux vaut \u00e9carter HyDE<\/strong> et garder les autres modules, en choisissant des variantes moins ch\u00e8res, par exemple un reranker avec moins de param\u00e8tres.<\/p>\n<p>Le co\u00fbt varie aussi d&rsquo;une variante \u00e0 l&rsquo;autre pour un m\u00eame module. Parmi les rerankers, les multi-vecteurs ont le co\u00fbt de calcul le plus faible et une performance discr\u00e8te ; ceux qui s&rsquo;appuient sur un LLM peuvent \u00eatre les meilleurs, mais \u00e0 un co\u00fbt \u00e9lev\u00e9.<\/p>\n<blockquote>\n<p><strong>\ud83d\udccc \u00c0 retenir<\/strong> Un module ne se juge pas \u00e0 ce qu&rsquo;il promet, mais \u00e0 ce qu&rsquo;il rapporte pour ce qu&rsquo;il co\u00fbte. Comme certaines de ces techniques sont complexes, teste-les et mesure-les avant la mise en production.<\/p>\n<\/blockquote>\n<h2 id=\"passer-a-l-echelle-volume-doublons-et-parallelisme\">Passer \u00e0 l&rsquo;\u00e9chelle : volume, doublons et parall\u00e9lisme<\/h2>\n<p>Un prototype indexe quelques documents. Une organisation qui veut appliquer le RAG \u00e0 de grandes masses de donn\u00e9es se heurte au volume, \u00e0 la vitesse et \u00e0 la vari\u00e9t\u00e9.<\/p>\n<p>La vari\u00e9t\u00e9 d&rsquo;abord. Dans un PDF, le d\u00e9coupage peut s\u00e9parer un tableau en plusieurs fragments, ce qui rend la r\u00e9cup\u00e9ration inefficace, et les tableaux compliquent la recherche de similarit\u00e9. Une alternative : extraire les tableaux pour les transformer en texte, ou les ranger dans une base compatible, comme une base SQL.<\/p>\n<p>Le volume ensuite. Plus la base grossit, plus les doublons s&rsquo;y multiplient : le risque de duplication <strong>augmente lin\u00e9airement avec le volume<\/strong>. Trouv\u00e9s au moment de la g\u00e9n\u00e9ration, ils risquent de produire des sorties inexactes, biais\u00e9es ou de mauvaise qualit\u00e9 ; la correspondance floue et la d\u00e9duplication par hachage permettent de les \u00e9liminer.<\/p>\n<p>Reste la vitesse. Pour les gros volumes, on s&rsquo;appuie sur des m\u00e9thodes d&rsquo;indexation sp\u00e9cialis\u00e9es (Apache Lucene, Elasticsearch), on met en cache les donn\u00e9es les plus utilis\u00e9es et l&rsquo;on distribue la r\u00e9cup\u00e9ration pour r\u00e9duire les goulots d&rsquo;\u00e9tranglement quand les utilisateurs sont nombreux.<\/p>\n<p>Le traitement parall\u00e8le r\u00e9duit notablement la latence, m\u00eame avec de grands jeux de donn\u00e9es ; Apache Spark et Dask comptent parmi les solutions les plus utilis\u00e9es. Il touche trois \u00e9tapes. Au stockage, chaque n\u0153ud peut ex\u00e9cuter tout le pipeline de pr\u00e9traitement, jusqu&rsquo;\u00e0 l&#8217;embedding, sur une partie des donn\u00e9es. \u00c0 la r\u00e9cup\u00e9ration, moins intuitif, on peut <strong>r\u00e9partir le jeu de donn\u00e9es entre les n\u0153uds<\/strong>, chacun cherchant dans sa partition. La g\u00e9n\u00e9ration se parall\u00e9lise aussi, parce que le Transformer a \u00e9t\u00e9 con\u00e7u pour parall\u00e9liser l&rsquo;entra\u00eenement comme l&rsquo;inf\u00e9rence.<\/p>\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Parall\u00e9liser a ses propres difficult\u00e9s et un risque d&rsquo;erreurs. Il faut superviser le syst\u00e8me, pr\u00e9voir une tol\u00e9rance aux pannes (points de sauvegarde) et un ordonnancement dynamique des t\u00e2ches, et surveiller non seulement l&rsquo;exactitude, mais aussi la m\u00e9moire, les co\u00fbts et l&rsquo;usage du r\u00e9seau.<\/p>\n<\/blockquote>\n<p>Avec des API externes, les erreurs d&rsquo;ex\u00e9cution arrivent : il est bon de pr\u00e9voir des <strong>mod\u00e8les de repli<\/strong>. Un routeur de LLM peut m\u00eame diriger chaque requ\u00eate vers le mod\u00e8le qui convient le mieux \u00e0 un prompt donn\u00e9, selon la pr\u00e9cision attendue ou le co\u00fbt.<\/p>\n<h2 id=\"un-vecteur-n-est-pas-un-coffre-fort\">Un vecteur n&rsquo;est pas un coffre-fort<\/h2>\n<p>Derni\u00e8re id\u00e9e re\u00e7ue, et la plus dangereuse : les vecteurs ressemblent \u00e0 de simples nombres, donc ils ne garderaient que le sens du texte et prot\u00e9geraient les donn\u00e9es sensibles. C&rsquo;est faux. L&#8217;embedding est une compression avec perte, ce qui n&#8217;emp\u00eache pas de le d\u00e9coder : dans certaines \u00e9tudes, on a retrouv\u00e9 <strong>plus de 70 % des mots<\/strong> du texte d&rsquo;origine, sans technique extr\u00eamement sophistiqu\u00e9e.<\/p>\n<p>Dans une attaque par inversion d&#8217;embedding, on acquiert les vecteurs, puis on les d\u00e9code. Les vecteurs se prot\u00e8gent donc comme le texte lui-m\u00eame. D&rsquo;autres attaques visent le reste du syst\u00e8me :<\/p>\n<ul>\n<li>l&rsquo;<strong>injection de prompt<\/strong> glisse des instructions malveillantes dans ce qui ressemble \u00e0 un prompt l\u00e9gitime ;<\/li>\n<li>l&#8217;empoisonnement introduit des donn\u00e9es erron\u00e9es que le LLM utilisera ensuite pour g\u00e9n\u00e9rer des sorties fauss\u00e9es ;<\/li>\n<li>l&rsquo;<strong>inf\u00e9rence d&rsquo;appartenance<\/strong> cherche \u00e0 savoir si une donn\u00e9e figure dans la base : si elle y est, elle sera probablement retrouv\u00e9e pour une requ\u00eate donn\u00e9e, puis ins\u00e9r\u00e9e dans le contexte, d&rsquo;o\u00f9 l&rsquo;on peut tenter de l&rsquo;extraire.<\/li>\n<\/ul>\n<p>Les protections existent : chiffrement (AES-256, TLS\/SSL), gestion rigoureuse des cl\u00e9s, authentification multifacteur, supervision des intrusions, respect du RGPD et du CCPA, confidentialit\u00e9 diff\u00e9rentielle, calcul multipartite s\u00e9curis\u00e9, tests de robustesse avant d\u00e9ploiement. Mais de nouvelles m\u00e9thodes d&rsquo;attaque sont d\u00e9crites en permanence, et les pr\u00e9cautions deviennent vite obsol\u00e8tes.<\/p>\n<blockquote>\n<p><strong>\ud83d\udccc \u00c0 retenir<\/strong> Un RAG avanc\u00e9 n&rsquo;est pas un RAG qu&rsquo;on charge de modules : c&rsquo;est un RAG dont chaque ajout r\u00e9pond \u00e0 une panne pr\u00e9cise et \u00e0 un budget de latence et de co\u00fbt. Devant chaque brique, demande-toi quelle \u00e9tape elle r\u00e9pare et ce qu&rsquo;elle te prend en \u00e9change.<\/p>\n<\/blockquote>","protected":false},"excerpt":{"rendered":"<p>Un RAG avanc\u00e9 garde le pipeline de base et ajoute des \u00e9tapes avant et apr\u00e8s la recherche. Ce que chaque ajout apporte, ce qu&rsquo;il co\u00fbte, et quand s&rsquo;en passer.<\/p>\n","protected":false},"author":1,"featured_media":500,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-501","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\/501","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=501"}],"version-history":[{"count":3,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/501\/revisions"}],"predecessor-version":[{"id":798,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/501\/revisions\/798"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media\/500"}],"wp:attachment":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media?parent=501"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/categories?post=501"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/tags?post=501"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}