{"id":181,"date":"2026-09-30T16:49:45","date_gmt":"2026-09-30T14:49:45","guid":{"rendered":"https:\/\/www.ranksignal.fr\/blog\/?p=181"},"modified":"2026-10-14T16:58:07","modified_gmt":"2026-10-14T14:58:07","slug":"eviter-hallucination-documents-recuperes","status":"publish","type":"post","link":"https:\/\/www.ranksignal.fr\/blog\/agentic\/eviter-hallucination-documents-recuperes\/","title":{"rendered":"\u00c9viter que l&rsquo;agent hallucine sur les documents r\u00e9cup\u00e9r\u00e9s"},"content":{"rendered":"<p>Demande \u00e0 un <a href=\"\/blog\/inference\/qu-est-ce-qu-un-llm\/\" title=\"LLM\">LLM<\/a> qui a gagn\u00e9 la Coupe du monde de cricket 2023. Il peut avouer qu&rsquo;il l&rsquo;ignore, ou pire, r\u00e9pondre avec assurance que c&rsquo;est l&rsquo;Inde. C&rsquo;est faux : c&rsquo;est l&rsquo;Australie.<\/p>\n<p>On branche alors le mod\u00e8le sur une source fiable, et on respire. Sauf que le probl\u00e8me ne dispara\u00eet pas : il change de forme. Le mod\u00e8le a d\u00e9sormais le bon document sous les yeux, et il peut encore le lire de travers. \u00c0 la fin de cet article, tu sauras o\u00f9 se cachent ces erreurs de lecture et quel verrou poser \u00e0 chaque endroit.<\/p>\n<h2>L&rsquo;essentiel en 30 secondes<\/h2>\n<ul>\n<li>Un syst\u00e8me RAG hallucine pour trois raisons : la r\u00e9cup\u00e9ration rate le bon contexte ou ram\u00e8ne du hors-sujet, le mod\u00e8le ne tient pas compte du contexte fourni, ou il se fie \u00e0 des \u00e9l\u00e9ments non pertinents de ce contexte.<\/li>\n<li>Il faut donc trois verrous, un par \u00e9tage : <strong>bien chercher<\/strong> avant la lecture, <strong>contraindre la lecture<\/strong> dans le prompt, <strong>relire la r\u00e9ponse<\/strong> avant de la livrer.<\/li>\n<li>Le prompt qui interdit de sortir du contexte et autorise \u00ab Je ne sais pas \u00bb r\u00e9duit le risque quand la recherche ne trouve rien de pertinent.<\/li>\n<li>Aucun verrou n&rsquo;est gratuit : chacun ajoute du calcul, de la latence ou du stockage.<\/li>\n<li>Pour savoir si \u00e7a tient, on mesure la fid\u00e9lit\u00e9, c&rsquo;est-\u00e0-dire la part de la r\u00e9ponse qui s&rsquo;appuie r\u00e9ellement sur les documents. Mais une fid\u00e9lit\u00e9 \u00e9lev\u00e9e ne suffit pas \u00e0 garantir une r\u00e9ponse juste.<\/li>\n<\/ul>\n<h2>L&rsquo;intuition : un mod\u00e8le qui pr\u00e9dit ne consulte rien<\/h2>\n<p>Il est tentant d&rsquo;imaginer qu&rsquo;un LLM range des faits quelque part et va les chercher. Ce n&rsquo;est pas le cas : le mod\u00e8le ne m\u00e9morise ni faits ni \u00e9v\u00e9nements pr\u00e9cis, il g\u00e9n\u00e8re sa r\u00e9ponse \u00e0 partir de poids appris, exactement comme il pr\u00e9dirait le mot suivant d&rsquo;une phrase ordinaire.<\/p>\n<p>Autrement dit, produire une r\u00e9ponse fausse mais plausible est son comportement de base, pas une panne rare. Et il le fait souvent avec la m\u00eame assurance qu&rsquo;une r\u00e9ponse exacte.<\/p>\n<p>Le <a href=\"\/blog\/rag\/a-quoi-ressemble-un-systeme-rag\/\" title=\"RAG\">RAG<\/a> change l&rsquo;entr\u00e9e du mod\u00e8le, pas sa nature. Le syst\u00e8me va chercher de l&rsquo;information dans une source externe, la combine \u00e0 la question, puis laisse le LLM produire la r\u00e9ponse : c&rsquo;est le sch\u00e9ma \u00ab r\u00e9cup\u00e9rer puis lire \u00bb. Chaque \u00e9tape a sa faiblesse propre.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46edf853&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46edf853\" 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\/b1_ch06_rag_naif_limites-scaled.png\" alt=\"Pipeline na\u00eff en quatre \u00e9tapes (documents, retriever, LLM, r\u00e9ponse) avec, sous le sch\u00e9ma, deux zones de fragilit\u00e9 : la r\u00e9cup\u00e9ration, \u00e0 faible pr\u00e9cision et faible rappel, et la g\u00e9n\u00e9ration, expos\u00e9e \u00e0 l'hallucination et \u00e0 la sur-d\u00e9pendance au contexte\" class=\"wp-image-178\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch06_rag_naif_limites-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch06_rag_naif_limites-300x115.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch06_rag_naif_limites-1024x394.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch06_rag_naif_limites-768x295.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch06_rag_naif_limites-1536x591.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_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\">Regarde les deux encadr\u00e9s sous le sch\u00e9ma : l&rsquo;un pointe une r\u00e9cup\u00e9ration qui manque de pr\u00e9cision ou de rappel, l&rsquo;autre une g\u00e9n\u00e9ration qui hallucine ou s&rsquo;appuie trop sur ce qu&rsquo;on lui donne. Entre les deux, l&rsquo;\u00e9tape d&rsquo;augmentation apporte ses propres pi\u00e8ges : des documents similaires qui se r\u00e9p\u00e8tent, des sources diff\u00e9rentes qui s&rsquo;assemblent mal, une fen\u00eatre de contexte limit\u00e9e.<\/figcaption><\/figure>\n\n\n<blockquote>\n<p><strong>\ud83d\udca1 Intuition<\/strong> Quand la r\u00e9ponse d\u00e9raille, ne demande pas seulement \u00ab le mod\u00e8le est-il mauvais ? \u00bb. Demande d&rsquo;abord : a-t-il re\u00e7u le bon texte, l&rsquo;a-t-il lu correctement, et quelqu&rsquo;un a-t-il relu sa copie ?<\/p>\n<\/blockquote>\n<h2>Premier verrou : lui donner le bon texte<\/h2>\n<p>Beaucoup de \u00ab mauvaises interpr\u00e9tations \u00bb sont en r\u00e9alit\u00e9 de mauvaises lectures de mauvais documents. Un contexte non pertinent ou mal structur\u00e9 distrait le mod\u00e8le, ou d\u00e9passe le budget de jetons sans rien apporter. Premi\u00e8re r\u00e8gle : ne remonter que les informations les plus utiles, plut\u00f4t que de gros blocs de texte ajout\u00e9s sans discernement.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46edfc61&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46edfc61\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1408\" 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\/b3_ch05_assemblage_contexte-scaled.png\" alt=\"Quatre \u00e9l\u00e9ments (invite syst\u00e8me, message de l'utilisateur, connaissances r\u00e9cup\u00e9r\u00e9es, historique r\u00e9sum\u00e9) convergent vers un bloc central \u00ab contexte assembl\u00e9 dans le budget de jetons \u00bb, puis vers l'appel au mod\u00e8le\" class=\"wp-image-179\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch05_assemblage_contexte-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch05_assemblage_contexte-300x165.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch05_assemblage_contexte-1024x563.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch05_assemblage_contexte-768x422.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch05_assemblage_contexte-1536x845.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch05_assemblage_contexte-2048x1126.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 sch\u00e9ma montre pourquoi c&rsquo;est un arbitrage : les connaissances r\u00e9cup\u00e9r\u00e9es ne sont qu&rsquo;une entr\u00e9e parmi quatre, et elles se partagent un budget de jetons limit\u00e9 avec l&rsquo;invite syst\u00e8me, la question et l&rsquo;historique.<\/figcaption><\/figure>\n\n\n<p>Plusieurs leviers existent, chacun visant un d\u00e9faut pr\u00e9cis :<\/p>\n<ul>\n<li><strong>La taille des fragments.<\/strong> De grands fragments apportent du contexte mais aussi du bruit ; de petits fragments sont pr\u00e9cis mais peuvent perdre le contexte.<br \/>\nUn document juridique de 10 000 mots d\u00e9coup\u00e9 en segments de 1 000 mots m\u00e9langera plusieurs clauses. Des segments de 200 mots isoleront chaque clause, au risque de perdre le contexte des clauses voisines.<\/li>\n<li><strong>Le filtrage par m\u00e9tadonn\u00e9es.<\/strong> Restreindre la recherche par date, auteur ou cat\u00e9gorie r\u00e9duit le bruit ; filtrer par date \u00e9vite par exemple de remonter des informations obsol\u00e8tes.<\/li>\n<li><strong>La reformulation de la question.<\/strong> L&#8217;embedding d&rsquo;une question ne colle pas toujours \u00e0 celui du document qui contient la r\u00e9ponse, \u00e0 cause de diff\u00e9rences de terminologie. Le <a href=\"\/blog\/agentic\/le-step-back-prompting\/\" title=\"step-back prompting\">step-back prompting<\/a> transforme une question pr\u00e9cise en question plus g\u00e9n\u00e9rale : \u00ab Which team did Thierry Audel play for from 2007 to 2008 ? \u00bb devient \u00ab What is the career history of Thierry Audel ? \u00bb.<\/li>\n<li><strong>Le re-classement et la compression.<\/strong> Le re-classement r\u00e9ordonne les documents r\u00e9cup\u00e9r\u00e9s pour prioriser les plus pertinents ; la compression supprime les tokens peu importants d&rsquo;un contexte trop long, au prix d&rsquo;une possible perte d&rsquo;information.<\/li>\n<\/ul>\n<p>Un autre \u00e9cueil est propre aux longs prompts. M\u00eame les LLM \u00e0 grande fen\u00eatre de contexte perdent en pr\u00e9cision quand l&rsquo;information pertinente se trouve au milieu ; ne transmettre que l&rsquo;information pertinente limite ce risque, et placer le contexte le plus pertinent pr\u00e8s de la fin de l&rsquo;invite augmente les chances qu&rsquo;il soit utilis\u00e9.<\/p>\n<p>Sur la question de la Coupe du monde, c&rsquo;est ce verrou qui d\u00e9cide si le paragraphe utile arrive ou non devant le mod\u00e8le : sans lui, le reste du dispositif travaille dans le vide.<\/p>\n<h2>Deuxi\u00e8me verrou : contraindre la lecture<\/h2>\n<p>Supposons que le bon passage soit arriv\u00e9. Reste \u00e0 emp\u00eacher le mod\u00e8le de broder autour, ou de retomber sur sa m\u00e9moire interne. Cela rel\u00e8ve de l&rsquo;\u00e9tape d&rsquo;augmentation, c&rsquo;est-\u00e0-dire de l&rsquo;ing\u00e9nierie de prompt : la fa\u00e7on dont le prompt est construit influence consid\u00e9rablement la qualit\u00e9 de la r\u00e9ponse.<\/p>\n<p>Deux consignes font l&rsquo;essentiel du travail. Le prompting contextuel ajoute l&rsquo;instruction de r\u00e9pondre uniquement \u00e0 partir du contexte fourni, pour contraindre le LLM \u00e0 s&rsquo;appuyer sur l&rsquo;information donn\u00e9e plut\u00f4t que sur sa m\u00e9moire param\u00e9trique. Le prompting \u00e0 g\u00e9n\u00e9ration contr\u00f4l\u00e9e va plus loin : il demande de r\u00e9pondre \u00ab Je ne sais pas \u00bb si le contexte ne permet pas de r\u00e9pondre, ce qui r\u00e9duit le risque d&rsquo;hallucination quand le <a href=\"\/blog\/rag\/qu-est-ce-qu-un-retriever\/\" title=\"retriever\">retriever<\/a> n&rsquo;a rien trouv\u00e9 de pertinent.<\/p>\n<p>Ce second point compte plus qu&rsquo;il n&rsquo;y para\u00eet. L&rsquo;une des aptitudes qu&rsquo;un syst\u00e8me doit poss\u00e9der est le rejet n\u00e9gatif : ne pas r\u00e9pondre quand aucune information pertinente n&rsquo;existe dans la base, car un LLM, par nature, tend toujours \u00e0 g\u00e9n\u00e9rer du texte.<\/p>\n<p>Voici les deux consignes r\u00e9unies dans une fonction compl\u00e8te. Ce que tu vas observer : le contexte r\u00e9cup\u00e9r\u00e9 est coll\u00e9 dans le prompt, les deux r\u00e8gles sont pos\u00e9es en toutes lettres, et le mod\u00e8le est appel\u00e9 avec <code>temperature=0<\/code>. La fonction renvoie \u00e0 la fois le contexte utilis\u00e9 et la r\u00e9ponse, ce qui servira plus loin pour la mesure.<\/p>\n<pre><code>from langchain_community.vectorstores import FAISS\nfrom langchain_openai import OpenAIEmbeddings, ChatOpenAI\n\ndef rag_function(query, db_path, index_name):\n    embeddings = OpenAIEmbeddings(model=&quot;text-embedding-3-small&quot;)\n    db = FAISS.load_local(\n        folder_path=db_path,\n        index_name=index_name,\n        embeddings=embeddings,\n        allow_dangerous_deserialization=True\n    )\n    retrieved_docs = db.similarity_search(query, k=2)\n    retrieved_context = [retrieved_docs[0].page_content\n                          + retrieved_docs[1].page_content]\n    augmented_prompt = f&quot;&quot;&quot;\nGiven the context below, answer the question.\nQuestion: {query}\nContext : {retrieved_context}\nRemember to answer only based on the context\nprovided and not from any other source.\nIf the question cannot be answered based\non the provided context, say I don't know.\n&quot;&quot;&quot;\n    llm = ChatOpenAI(\n        model=&quot;gpt-4o-mini&quot;,\n        temperature=0,\n        max_tokens=None,\n        timeout=None,\n        max_retries=2\n    )\n    response = llm.invoke([(&quot;human&quot;, augmented_prompt)])\n    answer = response.content\n    return retrieved_context, answer\n<\/code><\/pre>\n<p>Trois choses \u00e0 retenir de ce code. La recherche par similarit\u00e9 garde les deux documents les plus proches (<code>k=2<\/code>). Le prompt contient \u00e0 la fois la consigne \u00ab uniquement \u00e0 partir du contexte \u00bb et la sortie de secours \u00ab I don&rsquo;t know \u00bb. Et la temp\u00e9rature est fix\u00e9e \u00e0 z\u00e9ro : c&rsquo;est l&rsquo;un des r\u00e9glages qui, avec l&rsquo;ancrage dans un contexte explicite et le raisonnement \u00e9tape par \u00e9tape, att\u00e9nuent le risque d&rsquo;hallucination en rendant les r\u00e9ponses plus d\u00e9terministes.<\/p>\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Ce prompt ne fait pas de miracle. Il <em>demande<\/em> au mod\u00e8le d&rsquo;\u00eatre fid\u00e8le, il ne le <em>v\u00e9rifie<\/em> pas. Un LLM peut ignorer le contexte malgr\u00e9 tout : c&rsquo;est justement l&rsquo;une des trois causes d&rsquo;hallucination.<\/p>\n<\/blockquote>\n<p>Le prompt peut aussi guider la forme de la r\u00e9ponse. Le few-shot prompting fournit des exemples de questions-r\u00e9ponses dans le prompt, et le chain-of-thought introduit des \u00e9tapes de raisonnement interm\u00e9diaires, utiles sur les t\u00e2ches complexes.<\/p>\n<h2>Troisi\u00e8me verrou : relire avant de r\u00e9pondre<\/h2>\n<p>Les deux premiers verrous agissent en amont. Le troisi\u00e8me ajoute un contr\u00f4le en aval, et c&rsquo;est l\u00e0 que l&rsquo;agent prend son sens. Les LLM \u00e9tant non d\u00e9terministes, ils peuvent se tromper \u00e0 n&rsquo;importe quelle \u00e9tape : reformulation, mise \u00e0 jour, routage. D&rsquo;o\u00f9 l&rsquo;utilit\u00e9 d&rsquo;un garde-fou final, la critique de r\u00e9ponse.<\/p>\n<p>Le principe : un second appel au mod\u00e8le re\u00e7oit la question d&rsquo;origine et les r\u00e9ponses obtenues, puis v\u00e9rifie qu&rsquo;elles r\u00e9pondent bien \u00e0 la question. S&rsquo;il manque quelque chose, il propose de nouvelles questions \u00e0 poser ; sinon, il renvoie une liste vide. Regarde surtout la consigne du prompt : les nouvelles questions doivent \u00eatre \u00ab compl\u00e8tes, atomiques et sp\u00e9cifiques \u00bb.<\/p>\n<p>Ici, <code>chat<\/code> est la fonction d&rsquo;appel au mod\u00e8le GPT-4o utilis\u00e9e dans cet exemple, et <code>answers<\/code> est la liste des r\u00e9ponses d\u00e9j\u00e0 obtenues, transmise en messages.<\/p>\n<pre><code>answer_critique_prompt = &quot;&quot;&quot;\n    You are an expert at identifying if questions have been fully answered or\nif there is an opportunity to enrich the answer.\n    The user will provide a question, and you will scan through the provided\ninformation to see if the question is answered.\n    If anything is missing from the answer, you will provide a set of new\nquestions that can be asked to gather the missing information.\n    All new questions must be complete, atomic, and specific.\n    However, if the provided information is enough to answer the original\nquestion, you will respond with an empty list.\n    JSON template to use for finding missing information:\n    {\n        &quot;questions&quot;: [&quot;question1&quot;, &quot;question2&quot;]\n    }\n&quot;&quot;&quot;\n\ndef critique_answers(question: str, answers: list[dict[str, str]]) -&gt; list[str]:\n    messages = [\n        {\n            &quot;role&quot;: &quot;system&quot;,\n            &quot;content&quot;: answer_critique_prompt,\n        },\n        *answers,\n        {\n            &quot;role&quot;: &quot;user&quot;,\n            &quot;content&quot;: f&quot;The original user question to answer: {question}&quot;,\n        },\n    ]\n    config = {&quot;response_format&quot;: {&quot;type&quot;: &quot;json_object&quot;}}\n    output = chat(messages, model=&quot;gpt-4o&quot;, config=config)\n    try:\n        return json.loads(output)[&quot;questions&quot;]\n    except json.JSONDecodeError:\n        print(&quot;Error decoding JSON&quot;)\n    return []\n<\/code><\/pre>\n<p>Ce qu&rsquo;il faut en retenir : la sortie est forc\u00e9e au format JSON, ce qui rend la critique exploitable par du code, et une liste vide signifie \u00ab rien \u00e0 ajouter \u00bb. Si la critique renvoie de nouvelles questions, on repasse par le routeur de retrievers pour r\u00e9cup\u00e9rer les informations manquantes, toujours avec un crit\u00e8re de sortie de boucle pour ne pas rester bloqu\u00e9 ind\u00e9finiment.<\/p>\n<p>Cette id\u00e9e de boucle acteur-critique est particuli\u00e8rement utile quand \u00e9valuer est plus facile que g\u00e9n\u00e9rer : si l&rsquo;on sait dire de fa\u00e7on fiable \u00ab ceci est une bonne sortie \u00bb sans savoir la produire du premier coup, une boucle simple est un outil puissant, sans apprentissage requis.<\/p>\n<p>D&rsquo;autres approches poussent l&rsquo;id\u00e9e plus loin, en contr\u00f4lant les documents eux-m\u00eames :<\/p>\n<ul>\n<li><strong>CRAG (RAG correctif).<\/strong> Un \u00e9valuateur l\u00e9ger classe chaque document r\u00e9cup\u00e9r\u00e9 comme correct, incorrect ou ambigu. Si un document est jug\u00e9 incorrect, une recherche web vient compl\u00e9ter la base ; les documents corrects sont d\u00e9compos\u00e9s en \u00ab bandes de connaissance \u00bb r\u00e9\u00e9valu\u00e9es individuellement avant la g\u00e9n\u00e9ration.<\/li>\n<li><strong><a href=\"\/blog\/rag\/qu-est-ce-qu-un-self-rag\/\" title=\"Self-RAG\">Self-RAG<\/a>.<\/strong> Le LLM est entra\u00een\u00e9 \u00e0 produire des \u00ab jetons de r\u00e9flexion \u00bb : un jeton de r\u00e9cup\u00e9ration indique si une recherche est n\u00e9cessaire, un jeton de pertinence \u00e9value un passage, un jeton de support v\u00e9rifie que la r\u00e9ponse s&rsquo;appuie bien sur le contenu r\u00e9cup\u00e9r\u00e9, un jeton d&rsquo;utilit\u00e9 note la r\u00e9ponse.<\/li>\n<\/ul>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46ee0004&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46ee0004\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"971\" 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_ch08_workflow_crag-scaled.png\" alt=\"Sch\u00e9ma du workflow CRAG : les documents r\u00e9cup\u00e9r\u00e9s passent par un \u00e9valuateur de pertinence qui d\u00e9clenche soit un raffinement en bandes de connaissance (cas correct), soit une recherche web de secours (cas incorrect), avant la g\u00e9n\u00e9ration par le LLM\" class=\"wp-image-180\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_workflow_crag-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_workflow_crag-300x114.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_workflow_crag-1024x388.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_workflow_crag-768x291.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_workflow_crag-1536x583.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_workflow_crag-2048x777.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 point \u00e0 observer est l&#8217;embranchement : l&rsquo;\u00e9valuateur ne se contente pas de noter, il <em>r\u00e9oriente<\/em> le flux. Un document jug\u00e9 correct est affin\u00e9, un document jug\u00e9 incorrect d\u00e9clenche une recherche de secours. CRAG s&rsquo;int\u00e8gre \u00e0 n&rsquo;importe quel pipeline RAG, au prix d&rsquo;une latence accrue et d&rsquo;une d\u00e9pendance \u00e0 la qualit\u00e9 de l&rsquo;\u00e9valuateur.<\/figcaption><\/figure>\n\n\n<p>Enfin, quand la relecture \u00e9choue, il vaut mieux dire les choses. Un agent bien con\u00e7u \u00e9choue avec \u00e9l\u00e9gance : reconna\u00eetre le probl\u00e8me, l&rsquo;expliquer, proposer une suite. Face \u00e0 une information introuvable, mieux vaut un message du genre \u00ab Je n&rsquo;ai pas trouv\u00e9 l&rsquo;information recherch\u00e9e ; souhaites-tu que je transmette ta demande \u00e0 un conseiller ? \u00bb qu&rsquo;une r\u00e9ponse incorrecte ou absurde.<\/p>\n<h2>Mesurer : la fid\u00e9lit\u00e9, et ce qu&rsquo;elle ne dit pas<\/h2>\n<p>Poser des verrous ne prouve pas qu&rsquo;ils tiennent. Pour le v\u00e9rifier, on regarde trois relations : la question face au contexte r\u00e9cup\u00e9r\u00e9 (pertinence du contexte), le contexte face \u00e0 la r\u00e9ponse (fid\u00e9lit\u00e9, ou <em>groundedness<\/em>), et la r\u00e9ponse face \u00e0 la question (pertinence de la r\u00e9ponse).<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46ee037b&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46ee037b\" 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\/b1_ch02_triade_evaluation-scaled.png\" alt=\"Triangle d'\u00e9valuation : la question relie le contexte r\u00e9cup\u00e9r\u00e9 (pertinence du contexte) et la r\u00e9ponse g\u00e9n\u00e9r\u00e9e (pertinence de la r\u00e9ponse), et une fl\u00e8che entre contexte et r\u00e9ponse porte la fid\u00e9lit\u00e9 (groundedness)\" class=\"wp-image-158\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_triade_evaluation-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_triade_evaluation-300x217.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_triade_evaluation-1024x739.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_triade_evaluation-768x555.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_triade_evaluation-1536x1109.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_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\">Le c\u00f4t\u00e9 qui nous int\u00e9resse ici est la fl\u00e8che horizontale, entre contexte et r\u00e9ponse : elle r\u00e9pond \u00e0 la question \u00ab le mod\u00e8le tient-il compte de toute l&rsquo;information r\u00e9cup\u00e9r\u00e9e, ou l&rsquo;ignore-t-il malgr\u00e9 tout ? \u00bb<\/figcaption><\/figure>\n\n\n<p>Le framework <a href=\"\/blog\/rag\/comment-utiliser-ragas\/\" title=\"RAGAs\">RAGAs<\/a> calcule la fid\u00e9lit\u00e9 en d\u00e9composant la r\u00e9ponse en affirmations \u00e9l\u00e9mentaires, puis en mesurant la proportion de ces affirmations que l&rsquo;on retrouve dans le contexte r\u00e9cup\u00e9r\u00e9. L&rsquo;inverse de la fid\u00e9lit\u00e9 est le taux d&rsquo;hallucination. En pratique, pour chaque affirmation, on demande au LLM si elle peut \u00eatre d\u00e9duite du contexte.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46ee071b&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46ee071b\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1240\" 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_ch08_metriques_ragas-scaled.png\" alt=\"Sch\u00e9ma d'\u00e9valuation RAGAS : \u00e0 partir du contexte r\u00e9cup\u00e9r\u00e9 et de la r\u00e9ponse g\u00e9n\u00e9r\u00e9e, trois fl\u00e8ches pointent vers le rappel de contexte, la fid\u00e9lit\u00e9 (en orange) et l'exactitude de la r\u00e9ponse\" class=\"wp-image-159\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch08_metriques_ragas-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch08_metriques_ragas-300x145.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch08_metriques_ragas-1024x496.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch08_metriques_ragas-768x372.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch08_metriques_ragas-1536x744.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch08_metriques_ragas-2048x992.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 le sch\u00e9ma, la fid\u00e9lit\u00e9 est mise en \u00e9vidence : elle compare la r\u00e9ponse au contexte, pas \u00e0 la v\u00e9rit\u00e9. Le calcul se lance en quelques lignes. Ce que fait ce code : il prend un jeu de donn\u00e9es d&rsquo;\u00e9valuation (<code>dataset_to_eval<\/code>, la liste des questions, r\u00e9ponses g\u00e9n\u00e9r\u00e9es, contextes r\u00e9cup\u00e9r\u00e9s et r\u00e9ponses de r\u00e9f\u00e9rence obtenue en faisant tourner le pipeline sur chaque question de test) et applique plusieurs m\u00e9triques dont <code>Faithfulness<\/code>.<\/figcaption><\/figure>\n\n\n<pre><code>from ragas import EvaluationDataset, evaluate\nfrom ragas.metrics import (\n    LLMContextRecall,\n    Faithfulness,\n    FactualCorrectness,\n    AnswerCorrectness,\n    ResponseRelevancy)\n\nevaluation_dataset = EvaluationDataset.from_list(dataset_to_eval)\nevaluator_llm = LangchainLLMWrapper(ChatOpenAI(model=&quot;gpt-4o-mini&quot;))\n\nresult = evaluate(\n    dataset=evaluation_dataset,\n    metrics=[LLMContextRecall(), Faithfulness(), AnswerCorrectness(),\n             ResponseRelevancy(), FactualCorrectness()],\n    llm=evaluator_llm)\n<\/code><\/pre>\n<p>Le juge est ici un LLM, <code>evaluator_llm<\/code>, envelopp\u00e9 par LangChain. Retiens que c&rsquo;est un second mod\u00e8le qui note le premier.<\/p>\n<p>Que donne ce type de mesure en pratique ? Sur un benchmark d&rsquo;agent interrogeant un graphe de connaissances, le r\u00e9sum\u00e9 donne une exactitude de r\u00e9ponse de 0,7774, un rappel de contexte de 0,7941 et une fid\u00e9lit\u00e9 de 0,9657.<\/p>\n<p>Lis ces trois chiffres ensemble. La fid\u00e9lit\u00e9 est excellente : le mod\u00e8le invente rarement et reste fid\u00e8le au contexte. Mais l&rsquo;exactitude tourne autour de 0,78, donc le mod\u00e8le se trompe encore dans pr\u00e8s d&rsquo;un quart des cas, et le rappel de contexte de 0,79 indique que la r\u00e9cup\u00e9ration ne capture pas toujours toute l&rsquo;information n\u00e9cessaire.<\/p>\n<blockquote>\n<p><strong>\ud83d\udca1 Intuition<\/strong> Un mod\u00e8le peut \u00eatre irr\u00e9prochable dans sa lecture et pourtant se tromper, tout simplement parce qu&rsquo;on ne lui a pas donn\u00e9 tout ce qu&rsquo;il fallait. Ce diagnostic revient au premier verrou : am\u00e9liorer la r\u00e9cup\u00e9ration.<\/p>\n<\/blockquote>\n<p>C&rsquo;est une bonne nouvelle pour le diagnostic. \u00c9valuer si le LLM produit la bonne r\u00e9ponse <em>quand on lui donne le bon contexte<\/em> permet de mesurer s\u00e9par\u00e9ment ses capacit\u00e9s de raisonnement et de synth\u00e8se de celles de la r\u00e9cup\u00e9ration.<\/p>\n<h2>Pi\u00e8ges et limites<\/h2>\n<p>Le premier pi\u00e8ge est de confondre fid\u00e9lit\u00e9 et justesse. Une forte pertinence du contexte am\u00e9liore g\u00e9n\u00e9ralement la fid\u00e9lit\u00e9, mais une forte fid\u00e9lit\u00e9 ne garantit pas une forte pertinence de la r\u00e9ponse : un syst\u00e8me peut reproduire fid\u00e8lement le contexte r\u00e9cup\u00e9r\u00e9 sans r\u00e9pondre directement \u00e0 la question pos\u00e9e.<\/p>\n<p>Deuxi\u00e8me pi\u00e8ge : le juge lui-m\u00eame. Sa fiabilit\u00e9 d\u00e9pend de la qualit\u00e9 du <a href=\"\/blog\/rag\/l-approche-llm-as-a-judge\/\" title=\"LLM utilis\u00e9 comme juge\">LLM utilis\u00e9 comme juge<\/a>, et il est recommand\u00e9 d&rsquo;utiliser un juge diff\u00e9rent du LLM de g\u00e9n\u00e9ration, pour \u00e9viter un biais d&rsquo;auto-r\u00e9f\u00e9rence. Sur le benchmark cit\u00e9 plus haut, le juge \u00e9tant un LLM, certains scores peuvent m\u00eame para\u00eetre incoh\u00e9rents, par exemple sur la simple entr\u00e9e \u00ab Hello \u00bb.<\/p>\n<p>Troisi\u00e8me pi\u00e8ge : le co\u00fbt. Chaque technique avanc\u00e9e introduit un surco\u00fbt de calcul, de latence ou de stockage qu&rsquo;il faut mettre en balance avec le gain attendu. CRAG ajoute de la latence ; Self-RAG demande davantage de calcul et un r\u00e9glage fin des seuils.<\/p>\n<p>Quatri\u00e8me pi\u00e8ge : croire qu&rsquo;un agent \u00e9limine le probl\u00e8me. Aucun agent n&rsquo;est fiable \u00e0 100 % ; les <a href=\"\/blog\/agentic\/qu-est-ce-qu-un-systeme-multiagent\/\" title=\"syst\u00e8mes multi-agents\">syst\u00e8mes multi-agents<\/a> cumulent les taux d&rsquo;erreur, et une autonomie de d\u00e9cision accrue peut produire des actions non d\u00e9sir\u00e9es si des garde-fous explicites manquent.<\/p>\n<p>Enfin, les m\u00e9triques ne remplacent pas le jugement humain. Il est conseill\u00e9 d&rsquo;\u00e9chantillonner r\u00e9guli\u00e8rement les jugements du LLM \u00e9valuateur, de compl\u00e9ter les m\u00e9triques g\u00e9n\u00e9riques par des crit\u00e8res m\u00e9tier, et de pr\u00e9f\u00e9rer un benchmark adapt\u00e9 \u00e0 son domaine plut\u00f4t qu&rsquo;une confiance aveugle dans un score g\u00e9n\u00e9rique.<\/p>\n<h2>Aller plus loin<\/h2>\n<ul>\n<li><strong>Fid\u00e9lit\u00e9 et pertinence du contexte<\/strong> : les deux mesures qui disent si l&rsquo;erreur vient de la lecture ou de la recherche.<\/li>\n<li><strong>Re-classement<\/strong> : r\u00e9ordonner les passages r\u00e9cup\u00e9r\u00e9s pour que les plus utiles passent en premier, y compris avec des services sp\u00e9cialis\u00e9s comme Cohere Rerank.<\/li>\n<li><a href=\"\/blog\/rag\/qu-est-ce-qu-un-rag-agentique\/\" title=\"RAG agentique\">RAG agentique<\/a> : confier \u00e0 des agents le choix de la source \u00e0 interroger et la d\u00e9cision de relancer une r\u00e9cup\u00e9ration quand l&rsquo;information ne suffit pas.<\/li>\n<li><strong>Fen\u00eatre de contexte<\/strong> : le budget de jetons dans lequel tout doit tenir, et qui impose de choisir ce que l&rsquo;on transmet au mod\u00e8le.<\/li>\n<li><strong>RAGAs<\/strong> : le framework qui automatise le calcul des m\u00e9triques et peut g\u00e9n\u00e9rer un jeu de test synth\u00e9tique \u00e0 partir de la base de connaissances.<\/li>\n<\/ul>\n<h2>Questions fr\u00e9quentes<\/h2>\n<p><strong>Faut-il simplement \u00e9crire \u00ab ne r\u00e9ponds que d&rsquo;apr\u00e8s le contexte \u00bb dans le prompt ?<\/strong><br \/>\nC&rsquo;est n\u00e9cessaire, pas suffisant. Cette consigne, associ\u00e9e au \u00ab Je ne sais pas \u00bb de secours, r\u00e9duit le risque quand la recherche ne trouve rien de pertinent, mais le mod\u00e8le peut toujours ignorer le contexte malgr\u00e9 tout.<\/p>\n<p><strong>Un contexte plus long limite-t-il les hallucinations ?<\/strong><br \/>\nPas forc\u00e9ment. Un contexte non pertinent ou mal structur\u00e9 distrait le mod\u00e8le, et l&rsquo;information plac\u00e9e au milieu d&rsquo;un long prompt est moins bien exploit\u00e9e.<\/p>\n<p><strong>Comment savoir si l&rsquo;erreur vient de la recherche ou de la lecture ?<\/strong><br \/>\nCompare le rappel de contexte, qui mesure si l&rsquo;information n\u00e9cessaire a \u00e9t\u00e9 retrouv\u00e9e, et la fid\u00e9lit\u00e9, qui mesure si la r\u00e9ponse est align\u00e9e sur le contexte. Un rappel plus faible qu&rsquo;une fid\u00e9lit\u00e9 \u00e9lev\u00e9e pointe vers la r\u00e9cup\u00e9ration.<\/p>\n<h2>\u00c0 retenir<\/h2>\n<ul>\n<li>L&rsquo;erreur de lecture d&rsquo;un agent a trois origines distinctes : mauvais passages, contexte ignor\u00e9, contexte mal exploit\u00e9. Traite-les s\u00e9par\u00e9ment.<\/li>\n<li>Sers-lui d&rsquo;abord le bon texte : fragments bien calibr\u00e9s, filtres, question reformul\u00e9e, re-classement.<\/li>\n<li>Ensuite, enferme sa r\u00e9ponse dans le contexte fourni, et donne-lui une sortie honn\u00eate quand ce contexte ne suffit pas.<\/li>\n<li>Fais relire la r\u00e9ponse avant de la livrer : une critique finale, ou un \u00e9valuateur de documents comme dans CRAG.<\/li>\n<li>Mesure la fid\u00e9lit\u00e9, mais lis-la \u00e0 c\u00f4t\u00e9 du rappel de contexte et de l&rsquo;exactitude : une r\u00e9ponse fid\u00e8le peut rester fausse.<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Un RAG hallucine par trois chemins : mauvais passages, contexte ignor\u00e9, contexte mal lu. Voici un verrou pour chacun, et comment mesurer que \u00e7a tient.<\/p>\n","protected":false},"author":1,"featured_media":270,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-181","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-agentic"],"_links":{"self":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/181","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=181"}],"version-history":[{"count":3,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/181\/revisions"}],"predecessor-version":[{"id":762,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/181\/revisions\/762"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media\/270"}],"wp:attachment":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media?parent=181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/categories?post=181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/tags?post=181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}