{"id":174,"date":"2026-09-30T16:28:26","date_gmt":"2026-09-30T14:28:26","guid":{"rendered":"https:\/\/www.ranksignal.fr\/blog\/?p=174"},"modified":"2026-10-07T21:38:12","modified_gmt":"2026-10-07T19:38:12","slug":"comment-concevoir-un-systeme-d-agents-ia-couple-a-un-rag","status":"publish","type":"post","link":"https:\/\/www.ranksignal.fr\/blog\/agentic\/comment-concevoir-un-systeme-d-agents-ia-couple-a-un-rag\/","title":{"rendered":"Agent IA + RAG : concevoir un syst\u00e8me qui cherche avant d&rsquo;agir"},"content":{"rendered":"<p>Pose cette question \u00e0 un assistant branch\u00e9 sur ta base de films : \u00ab Qui a remport\u00e9 le plus d&rsquo;Oscars, et cette personne est-elle encore en vie ? \u00bb Un syst\u00e8me de recherche classique lance une seule requ\u00eate et s&rsquo;arr\u00eate. Pourtant la question en cache deux, la seconde d\u00e9pendant de la premi\u00e8re. Et dans le jeu de donn\u00e9es de films utilis\u00e9 plus bas, l&rsquo;information sur les Oscars est tout simplement absente.<\/p>\n<p>Un bon syst\u00e8me doit donc d\u00e9cider quoi chercher, o\u00f9 le chercher, v\u00e9rifier ce qu&rsquo;il a trouv\u00e9, et avoir l&rsquo;honn\u00eatet\u00e9 de dire \u00ab je ne sais pas \u00bb. \u00c0 la fin de cet article, tu sauras assembler un agent et un RAG pour obtenir ce comportement, le mesurer, et rep\u00e9rer les pi\u00e8ges avant qu&rsquo;ils ne co\u00fbtent cher.<\/p>\n<h2>L&rsquo;essentiel en 30 secondes<\/h2>\n<ul>\n<li>Un <strong>RAG<\/strong> va chercher de l&rsquo;information dans une base externe au moment de la question, puis la donne au mod\u00e8le pour qu&rsquo;il r\u00e9ponde. Il met l&rsquo;information au jour, mais ne d\u00e9cide d&rsquo;aucune action.<\/li>\n<li>Un <strong>agent<\/strong> est un syst\u00e8me qui exerce un vrai pouvoir de d\u00e9cision : il choisit ses outils, planifie, et s&rsquo;adapte \u00e0 ce qu&rsquo;il observe.<\/li>\n<li>Le <a href=\"\/blog\/rag\/qu-est-ce-qu-un-rag-agentique\/\" title=\"RAG agentique\">RAG agentique<\/a> confie \u00e0 l&rsquo;agent le choix de la source \u00e0 interroger et le jugement sur la qualit\u00e9 de ce qui revient.<\/li>\n<li>Trois briques suffisent pour d\u00e9marrer : un routeur, des retrievers sp\u00e9cialis\u00e9s, une critique de r\u00e9ponse.<\/li>\n<li>On commence simple (un seul agent, une critique), on mesure, puis on ajoute m\u00e9moire, r\u00e9flexion ou agents multiples si le besoin est prouv\u00e9.<\/li>\n<\/ul>\n<h2>L&rsquo;intuition : pourquoi coupler les deux<\/h2>\n<p>Avant de coupler quoi que ce soit, demande-toi si tu as besoin d&rsquo;un agent. Cinq niveaux existent, du plus simple au plus autonome : du code proc\u00e9dural, un flux de travail d\u00e9terministe, un chatbot classique, un RAG, puis un agent. \u00c0 chaque marche, l&rsquo;adaptabilit\u00e9 monte, mais le co\u00fbt et la latence aussi.<\/p>\n<p>Le RAG occupe une place pr\u00e9cise dans cette \u00e9chelle. Il suffit quand le besoin se r\u00e9sume \u00e0 interroger une base de connaissances : un manuel produit, une archive juridique, un wiki d&rsquo;entreprise. Ton service informatique peut r\u00e9pondre \u00e0 \u00ab Comment r\u00e9initialiser mes identifiants VPN ? \u00bb en allant chercher le dernier guide de d\u00e9pannage.<\/p>\n<p>Mais un RAG ne planifie pas de fa\u00e7on autonome. Il ne va pas ouvrir un ticket ou planifier un rappel. Et quand les entr\u00e9es deviennent tr\u00e8s variables (des courriels libres allant de \u00ab la batterie de mon portable gonfle et risque d&rsquo;exploser \u00bb \u00e0 \u00ab on me facture des services que je n&rsquo;ai jamais command\u00e9s \u00bb), il faut un agent qui comprend l&rsquo;intention, consulte une base, r\u00e9dige et escalade vers un humain si besoin.<\/p>\n<blockquote>\n<p><strong>\ud83d\udccc \u00c0 retenir<\/strong> Le test d&rsquo;un agent n&rsquo;est pas son \u00e9tiquette : l&rsquo;agentivit\u00e9 est un spectre, pas un interrupteur. Demande-toi s&rsquo;il exerce un authentique pouvoir de d\u00e9cision ou s&rsquo;il suit un script fig\u00e9.<\/p>\n<\/blockquote>\n<h3>Ce que fait le RAG, en deux pipelines<\/h3>\n<p>Un <a href=\"\/blog\/rag\/a-quoi-ressemble-un-systeme-rag\/\" title=\"syst\u00e8me RAG\">syst\u00e8me RAG<\/a> repose sur deux pipelines. Le premier, l&rsquo;indexation, tourne hors ligne : il construit la base de connaissances \u00e0 l&rsquo;avance et la met \u00e0 jour \u00e0 intervalles r\u00e9guliers. Le second, la g\u00e9n\u00e9ration, tourne en temps r\u00e9el \u00e0 chaque question.<\/p>\n<p>L&rsquo;indexation se d\u00e9roule en cinq \u00e9tapes : connexion \u00e0 la source, extraction du texte, d\u00e9coupage en fragments, conversion en embeddings, stockage dans une base vectorielle. Cette \u00e9tape est un pr\u00e9requis : avant qu&rsquo;elle ait tourn\u00e9, le pipeline de g\u00e9n\u00e9ration n&rsquo;a tout simplement rien \u00e0 chercher.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46dab569&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46dab569\" 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\/b1_ch02_pipeline_indexation-scaled.png\" alt=\"Les cinq \u00e9tapes qui construisent la base de connaissances : connexion \u00e0 la source, extraction, d\u00e9coupage, conversion en embeddings, stockage\" class=\"wp-image-164\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_pipeline_indexation-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_pipeline_indexation-300x64.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_pipeline_indexation-1024x218.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_pipeline_indexation-768x163.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_pipeline_indexation-1536x326.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_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\">Suis les fl\u00e8ches de gauche \u00e0 droite : chaque \u00e9tape pr\u00e9pare la suivante, et tout se passe avant que quiconque pose une question.<\/figcaption><\/figure>\n\n\n<p>La g\u00e9n\u00e9ration, elle, se r\u00e9sume en cinq gestes : l&rsquo;utilisateur pose sa question, le syst\u00e8me cherche l&rsquo;information pertinente, la r\u00e9cup\u00e8re, l&rsquo;ajoute \u00e0 la question dans l&rsquo;invite, puis le mod\u00e8le r\u00e9pond en s&rsquo;appuyant dessus.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46dab9cf&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46dab9cf\" 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\/b1_ch02_pipeline_generation-scaled.png\" alt=\"Les cinq \u00e9tapes du pipeline de g\u00e9n\u00e9ration : question, recherche, r\u00e9cup\u00e9ration, augmentation de l'invite, r\u00e9ponse\" class=\"wp-image-165\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_pipeline_generation-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_pipeline_generation-300x64.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_pipeline_generation-1024x218.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_pipeline_generation-768x163.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch02_pipeline_generation-1536x326.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_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\">Le RAG est donc un trajet \u00e0 sens unique et sans d\u00e9cision. C&rsquo;est exactement ce que l&rsquo;agent va venir piloter.<\/figcaption><\/figure>\n\n\n<h3>Ce qu&rsquo;ajoute l&rsquo;agent<\/h3>\n<p>Un agent <a href=\"\/blog\/inference\/qu-est-ce-qu-un-llm\/\" title=\"LLM\">LLM<\/a> repose g\u00e9n\u00e9ralement sur quatre composants. Le cerveau, un LLM, comprend la requ\u00eate et coordonne le reste. La m\u00e9moire conserve l&rsquo;historique \u00e0 court terme (la conversation) et \u00e0 long terme. La planification d\u00e9compose une t\u00e2che en sous-t\u00e2ches. Les outils permettent d&rsquo;agir sur des ressources externes : recherche web, requ\u00eate SQL, API tierce.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46dabdcd&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46dabdcd\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1585\" 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_composants_agent_llm-scaled.png\" alt=\"Un cerveau LLM au centre, reli\u00e9 \u00e0 trois blocs : m\u00e9moire, planification et outils\" class=\"wp-image-166\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_composants_agent_llm-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_composants_agent_llm-300x186.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_composants_agent_llm-1024x634.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_composants_agent_llm-768x475.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_composants_agent_llm-1536x951.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_composants_agent_llm-2048x1268.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 bien le bloc \u00ab Outils \u00bb : c&rsquo;est par lui que le RAG entre dans l&rsquo;agent. Interroger une base de connaissances devient une capacit\u00e9 parmi d&rsquo;autres.<\/figcaption><\/figure>\n\n\n<p>Le RAG agentique tire trois capacit\u00e9s de ce couplage. Le routage de requ\u00eate, d&rsquo;abord : l&rsquo;agent d\u00e9cide quelle base interroger, ou m\u00eame s&rsquo;il doit s&rsquo;en passer pour une simple salutation. L&rsquo;usage d&rsquo;outils, ensuite, qui donne acc\u00e8s \u00e0 des sources hors base de connaissances, comme une recherche web. La r\u00e9cup\u00e9ration adaptative, enfin : l&rsquo;agent juge si l&rsquo;information suffit ou si une nouvelle recherche, avec une requ\u00eate reformul\u00e9e, s&rsquo;impose.<\/p>\n<p>Pourquoi ne pas tout mettre dans un seul magasin ? Un <a href=\"\/blog\/rag\/qu-est-ce-qu-un-rag-naif\/\" title=\"RAG standard\">RAG standard<\/a> interroge une base unique pour toute requ\u00eate. Toute l&rsquo;information doit y \u00eatre index\u00e9e, et chaque question doit la parcourir en entier, m\u00eame quand seule une fraction est utile.<\/p>\n<h2>Sous le capot : trois briques<\/h2>\n<p>Un RAG agentique repose sur trois briques. Le <strong>routeur de <a href=\"\/blog\/rag\/qu-est-ce-qu-un-retriever\/\" title=\"retrievers\">retrievers<\/a><\/strong> prend la ou les questions de l&rsquo;utilisateur et retourne le ou les meilleurs retrievers \u00e0 utiliser. Les <strong>agents retrievers<\/strong> vont chercher effectivement les donn\u00e9es. La <strong>critique de r\u00e9ponse<\/strong> v\u00e9rifie que les r\u00e9ponses obtenues r\u00e9pondent bien \u00e0 la question initiale.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46dac1df&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46dac1df\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"986\" 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_architecture_agentic_rag-scaled.png\" alt=\"Une question part vers un routeur de retrievers (LLM), qui dirige vers trois retrievers (vectoriel, text2cypher, sp\u00e9cifique), dont les r\u00e9sultats convergent vers une critique de r\u00e9ponse (LLM)\" class=\"wp-image-167\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch05_architecture_agentic_rag-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch05_architecture_agentic_rag-300x116.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch05_architecture_agentic_rag-1024x394.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch05_architecture_agentic_rag-768x296.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch05_architecture_agentic_rag-1536x592.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch05_architecture_agentic_rag-2048x789.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\">Lis le sch\u00e9ma comme un aiguillage : le routeur choisit la voie, les retrievers font le travail, et la critique garde la sortie avant que la r\u00e9ponse n&rsquo;atteigne l&rsquo;utilisateur.<\/figcaption><\/figure>\n\n\n<h3>Le routeur : choisir le bon outil<\/h3>\n<p>Des retrievers, il en existe de g\u00e9n\u00e9raux et de tr\u00e8s \u00e9troits. Un retriever vectoriel est adapt\u00e9 aux sources non structur\u00e9es. Un text2cypher, qui traduit la question en requ\u00eate sur un graphe, convient aux donn\u00e9es structur\u00e9es. Mais en production, aucun des deux ne suffit toujours sur des donn\u00e9es complexes : on construit donc au fil du temps des retrievers sp\u00e9cialis\u00e9s, comme un gabarit de requ\u00eate cod\u00e9e en dur qui prend des param\u00e8tres.<\/p>\n<p>Prends deux retrievers cod\u00e9s en dur, <code>capital_by_country<\/code> et <code>country_by_capital<\/code>. Pour \u00ab What is the capital of France ? \u00bb, le routeur (un LLM) choisit le premier avec \u00ab France \u00bb comme argument : <code>capital_by_country(\"France\")<\/code>.<\/p>\n<p>Une pr\u00e9cision importante : le LLM n&rsquo;appelle jamais directement les retrievers. Il d\u00e9cide lequel utiliser et avec quels arguments, et l&rsquo;appel effectif reste \u00e0 la charge du syst\u00e8me qui l&rsquo;entoure. C&rsquo;est le principe du <em>function calling<\/em>, et il faut que le mod\u00e8le le supporte nativement, ou qu&rsquo;on s&rsquo;y prenne avec l&rsquo;approche ReAct.<\/p>\n<h3>La critique : ne pas laisser passer une mauvaise r\u00e9ponse<\/h3>\n<p>La critique est une fonction bloquante. Si la r\u00e9ponse est incorrecte ou incompl\u00e8te, elle l&#8217;emp\u00eache de continuer, g\u00e9n\u00e8re une nouvelle question qui permet de r\u00e9cup\u00e9rer l&rsquo;information manquante et relance un tour de recherche.<\/p>\n<p>Il faut cependant pr\u00e9voir une sortie de boucle. La bonne r\u00e9ponse peut simplement ne pas exister dans les donn\u00e9es, et la critique doit alors pouvoir le signaler plut\u00f4t que de tourner ind\u00e9finiment.<\/p>\n<blockquote>\n<p><strong>\ud83d\udca1 Intuition<\/strong> Le routeur r\u00e9pond \u00e0 \u00ab o\u00f9 chercher ? \u00bb, la critique \u00e0 \u00ab ai-je vraiment de quoi r\u00e9pondre ? \u00bb. Sans la seconde, l&rsquo;agent invente ; sans le premier, il cherche partout et mal.<\/p>\n<\/blockquote>\n<h3>Boucler : it\u00e9ratif, r\u00e9cursif, adaptatif<\/h3>\n<p>Quand une seule passe ne suffit pas, trois mani\u00e8res de r\u00e9p\u00e9ter la r\u00e9cup\u00e9ration existent. En mode it\u00e9ratif, on interroge plusieurs fois en affinant \u00e0 partir de ce qui est d\u00e9j\u00e0 obtenu. En mode r\u00e9cursif, on transforme la requ\u00eate \u00e0 chaque tour selon les fragments obtenus. En mode adaptatif, le LLM d\u00e9cide lui-m\u00eame quand et quoi r\u00e9cup\u00e9rer.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46dac5cf&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46dac5cf\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1371\" 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_retrieval_repete-scaled.png\" alt=\"Trois colonnes comparant les r\u00e9cup\u00e9rations it\u00e9rative, r\u00e9cursive et adaptative ; les deux premi\u00e8res s'arr\u00eatent sur un seuil fixe, la troisi\u00e8me laisse un mod\u00e8le juge d\u00e9cider\" class=\"wp-image-168\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch06_retrieval_repete-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch06_retrieval_repete-300x161.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch06_retrieval_repete-1024x549.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch06_retrieval_repete-768x411.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch06_retrieval_repete-1536x823.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch06_retrieval_repete-2048x1097.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\">Compare la derni\u00e8re colonne aux deux autres : les boucles it\u00e9rative et r\u00e9cursive sont born\u00e9es par un seuil fixe, alors que l&rsquo;adaptative confie le moment de la recherche \u00e0 un mod\u00e8le juge.<\/figcaption><\/figure>\n\n\n<h2>Le voir tourner<\/h2>\n<p>Passons \u00e0 du code r\u00e9el : un syst\u00e8me agentique volontairement simple, qui choisit un retriever et d\u00e9cide si le contexte trouv\u00e9 r\u00e9pond \u00e0 la question. Il tourne sur un jeu de donn\u00e9es de films stock\u00e9 dans une base de graphe Neo4j, avec trois outils : un gabarit de requ\u00eate par titre de film, un gabarit par acteur, et un text2cypher de repli pour tout le reste.<\/p>\n<h3>Un outil, sa description et son impl\u00e9mentation<\/h3>\n<p>Chaque outil se compose de deux morceaux. Une description au format JSON schema, que le LLM lit pour comprendre \u00e0 quoi sert l&rsquo;outil et quels param\u00e8tres passer. Et une fonction Python, qui ex\u00e9cute la requ\u00eate Cypher sur la base. Observe la requ\u00eate : elle retrouve un film par son titre, avec son casting et ses r\u00e9alisateurs.<\/p>\n<pre><code>movie_info_by_title_description = {\n    &quot;type&quot;: &quot;function&quot;,\n    &quot;function&quot;: {\n        &quot;name&quot;: &quot;movie_info_by_title&quot;,\n        &quot;description&quot;: &quot;Get information about a movie by providing the title&quot;,\n        &quot;parameters&quot;: {\n            &quot;type&quot;: &quot;object&quot;,\n            &quot;properties&quot;: {\n                &quot;title&quot;: {\n                    &quot;type&quot;: &quot;string&quot;,\n                    &quot;description&quot;: &quot;The movie title&quot;,\n                }\n            },\n            &quot;required&quot;: [&quot;title&quot;],\n        },\n    },\n}\n\ndef movie_info_by_title(title: str):\n    &quot;&quot;&quot;Return movie information by title.&quot;&quot;&quot;\n    query = &quot;&quot;&quot;\n    MATCH (m:Movie)\n    WHERE toLower(m.title) CONTAINS &#36;title\n    OPTIONAL MATCH (m)&lt;-[:ACTED_IN]-(a:Person)\n    OPTIONAL MATCH (m)&lt;-[:DIRECTED]-(d:Person)\n    RETURN m AS movie, collect(a.name) AS cast, collect(d.name) AS directors\n    &quot;&quot;&quot;\n    records, _, _ = neo4j_driver.execute_query(query, title=title.lower())\n    return [record.data() for record in records]\n<\/code><\/pre>\n<p><code>neo4j_driver<\/code> est la connexion \u00e0 la base de films. La description compte autant que le code : c&rsquo;est elle qui permet au mod\u00e8le de bien choisir l&rsquo;outil et ses param\u00e8tres. Le troisi\u00e8me outil, <code>answer_given<\/code>, sert quand la r\u00e9ponse est d\u00e9j\u00e0 dans la conversation, comme \u00ab What&rsquo;s Dave Smith&rsquo;s last name ? \u00bb : il \u00e9vite de relancer une recherche inutile.<\/p>\n<h3>Ex\u00e9cuter l&rsquo;appel d\u00e9cid\u00e9 par le LLM<\/h3>\n<p>Le mod\u00e8le a choisi un outil. Il faut maintenant faire l&rsquo;appel \u00e0 sa place. La fonction ci-dessous parcourt la liste des appels demand\u00e9s, retrouve la fonction r\u00e9elle dans le dictionnaire <code>tools<\/code>, d\u00e9code les arguments JSON et ex\u00e9cute.<\/p>\n<pre><code>def handle_tool_calls(tools: dict[str, any], llm_tool_calls: list[dict[str, any]]):\n    output = []\n    if llm_tool_calls:\n        for tool_call in llm_tool_calls:\n            function_to_call = tools[tool_call.function.name][&quot;function&quot;]\n            function_args = json.loads(tool_call.function.arguments)\n            res = function_to_call(**function_args)\n            output.append(res)\n    return output\n<\/code><\/pre>\n<p>Le mod\u00e8le peut tout \u00e0 fait d\u00e9cider d&rsquo;appeler plusieurs outils pour une seule question : d&rsquo;o\u00f9 la boucle.<\/p>\n<h3>Le routeur, en une fonction<\/h3>\n<p>Pour les questions \u00ab \u00e0 tiroirs \u00bb comme celle des Oscars, on ajoute une \u00e9tape : <code>query_update<\/code> reformule chaque question en s&rsquo;appuyant sur les r\u00e9ponses d\u00e9j\u00e0 obtenues. La question devient \u00ab Who won the most Oscars ? \u00bb puis \u00ab Is that person alive ? \u00bb, la seconde d\u00e9pendant de la premi\u00e8re. Voici maintenant le routage : le dictionnaire des outils, l&rsquo;invite qui explique au mod\u00e8le son r\u00f4le, et <code>route_question<\/code> qui l&rsquo;interroge.<\/p>\n<pre><code>tools = {\n    &quot;movie_info_by_title&quot;: {\n        &quot;description&quot;: movie_info_by_title_description,\n        &quot;function&quot;: movie_info_by_title\n    },\n    &quot;movies_info_by_actor&quot;: {\n        &quot;description&quot;: movies_info_by_actor_description,\n        &quot;function&quot;: movies_info_by_actor\n    },\n    &quot;text2cypher&quot;: {\n        &quot;description&quot;: text2cypher_description,\n        &quot;function&quot;: text2cypher\n    },\n    &quot;answer_given&quot;: {\n        &quot;description&quot;: answer_given_description,\n        &quot;function&quot;: answer_given\n    }\n}\n\ntool_picker_prompt = &quot;&quot;&quot;\n    Your job is to choose the right tool needed to respond to the user\nquestion.\n    The available tools are provided to you in the request.\n    Make sure to pass the right and complete arguments to the chosen tool.\n&quot;&quot;&quot;\n\ndef route_question(question: str, tools: dict[str, any], answers:\nlist[dict[str, str]]):\n    llm_tool_calls = tool_choice(\n        [\n            {\n                &quot;role&quot;: &quot;system&quot;,\n                &quot;content&quot;: tool_picker_prompt,\n            },\n            *answers,\n            {\n                &quot;role&quot;: &quot;user&quot;,\n                &quot;content&quot;: f&quot;The user question to find a tool to answer: '{question}'&quot;,\n            },\n        ],\n        model = &quot;gpt-4o&quot;,\n        tools=[tool[&quot;description&quot;] for tool in tools.values()],\n    )\n    return handle_tool_calls(tools, llm_tool_calls)\n<\/code><\/pre>\n<p>Chaque entr\u00e9e associe un outil \u00e0 sa description et \u00e0 sa fonction. Celle du titre est le bloc vu plus haut ; les trois autres (gabarit par acteur, text2cypher, <code>answer_given<\/code>) sont construites sur le m\u00eame mod\u00e8le : une description JSON puis une fonction. <code>tool_choice<\/code> est la fonction qui envoie ces messages au mod\u00e8le en lui passant les descriptions d&rsquo;outils. Ajouter un retriever revient \u00e0 ajouter une entr\u00e9e : le syst\u00e8me reste facilement extensible.<\/p>\n<h3>La boucle principale et la critique<\/h3>\n<p>On assemble ensuite ces briques en une fonction qui met \u00e0 jour la question, l&rsquo;aiguille vers un outil et note le r\u00e9sultat dans l&rsquo;historique.<\/p>\n<pre><code>def handle_user_input(input: str, answers: list[dict[str, str]] = []):\n    updated_question = query_update(input, answers)\n    response  = route_question(updated_question, tools, answers)\n    answers.append({&quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: f&quot;For the question: '{updated_question}', we have the\n         answer: '{json.dumps(response)}'&quot;})\n    return answers\n<\/code><\/pre>\n<p>Reste la derni\u00e8re pi\u00e8ce. <code>critique_answers<\/code> est la critique de r\u00e9ponse : elle renvoie une liste de questions compl\u00e9mentaires si la r\u00e9ponse est incompl\u00e8te ou incorrecte. Le code ci-dessous l&rsquo;appelle une seule fois, puis demande au LLM final de r\u00e9pondre en n&rsquo;utilisant que ce qui a \u00e9t\u00e9 trouv\u00e9.<\/p>\n<pre><code>main_prompt = &quot;&quot;&quot;\n    Your job is to help the user with their questions.\n    You will receive user questions and information needed to answer the\nquestions\n    If the information is missing to answer part of or the whole question,\nyou will say that the information\n    is missing. You will only use the information provided to you in the\nprompt to answer the questions.\n    You are not allowed to make anything up or use external information.\n&quot;&quot;&quot;\n\ndef main(input: str):\n    answers = handle_user_input(input)\n    critique = critique_answers(input, answers)\n    if critique:\n        answers = handle_user_input(&quot; &quot;.join(critique), answers)\n    llm_response = chat(\n        [\n            {&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: main_prompt},\n            *answers,\n            {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: f&quot;The user question to answer: {input}&quot;},\n        ],\n        model=&quot;gpt-4o&quot;,\n    )\n    return llm_response\n<\/code><\/pre>\n<p>Trois choses \u00e0 retenir de ce code. La critique n&rsquo;est appliqu\u00e9e qu&rsquo;une fois : si les r\u00e9ponses restent incompl\u00e8tes apr\u00e8s la seconde passe, elles sont quand m\u00eame renvoy\u00e9es, et le LLM final signale explicitement ce qui manque. C&rsquo;est ton crit\u00e8re de sortie de boucle. Ensuite, l&rsquo;invite finale interdit d&rsquo;inventer : le mod\u00e8le ne doit utiliser que les informations fournies. Enfin, <code>chat<\/code> est la fonction qui appelle le mod\u00e8le de conversation.<\/p>\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Si tu supprimes la borne sur la critique, la question sur les Oscars fera tourner ton syst\u00e8me en rond : la r\u00e9ponse n&rsquo;existe pas dans le jeu de donn\u00e9es, et rien ne le lui dira. La sortie \u00ab l&rsquo;information manque \u00bb est une fonctionnalit\u00e9, pas un \u00e9chec.<\/p>\n<\/blockquote>\n<h2>Mesurer que \u00e7a marche<\/h2>\n<p>Un pipeline sophistiqu\u00e9 peut se tromper de plusieurs fa\u00e7ons, alors on \u00e9value chaque \u00e9tape. Il y a le choix de l&rsquo;outil, la pertinence du contexte r\u00e9cup\u00e9r\u00e9, la qualit\u00e9 de la r\u00e9ponse, puis l&rsquo;efficacit\u00e9 de l&rsquo;ensemble.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46dac9d0&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46dac9d0\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"683\" 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_ch08_etapes_evaluation-scaled.png\" alt=\"Un pipeline en quatre \u00e9tapes : question, s\u00e9lection de l'outil, contexte r\u00e9cup\u00e9r\u00e9, r\u00e9ponse g\u00e9n\u00e9r\u00e9e\" class=\"wp-image-169\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch08_etapes_evaluation-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch08_etapes_evaluation-300x80.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch08_etapes_evaluation-1024x273.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch08_etapes_evaluation-768x205.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch08_etapes_evaluation-1536x410.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch08_etapes_evaluation-2048x546.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\">Chaque case est un point de contr\u00f4le possible. Si la r\u00e9ponse est mauvaise, c&rsquo;est en remontant les cases une \u00e0 une que tu sauras si le coupable est le routage, la recherche ou la g\u00e9n\u00e9ration.<\/figcaption><\/figure>\n\n\n<p>Isoler ces \u00e9tapes a un avantage : tu peux v\u00e9rifier si le LLM produit la bonne r\u00e9ponse quand on lui donne le bon contexte. Cela s\u00e9pare ses capacit\u00e9s de raisonnement et de synth\u00e8se de celles de la r\u00e9cup\u00e9ration.<\/p>\n<h3>\u00c9valuer les choix d&rsquo;outils<\/h3>\n<p>Pour v\u00e9rifier le routage, on ex\u00e9cute l&rsquo;agent de bout en bout et on compare ses appels d&rsquo;outils aux attentes. Trois m\u00e9triques : le rappel d&rsquo;outils (a-t-il inclus tous les appels attendus ?), la pr\u00e9cision d&rsquo;outils (a-t-il \u00e9vit\u00e9 les appels inutiles ?) et l&rsquo;exactitude des param\u00e8tres (a-t-il pass\u00e9 le bon identifiant de commande ou le bon montant ?).<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46dacdcc&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46dacdcc\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1280\" 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_ch09_precision_rappel_outils-scaled.png\" alt=\"Un outil attendu (issue_refund), deux outils appel\u00e9s (issue_refund, cancel_order) : rappel de 100 %, pr\u00e9cision de 50 %\" class=\"wp-image-170\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch09_precision_rappel_outils-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch09_precision_rappel_outils-300x150.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch09_precision_rappel_outils-1024x512.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch09_precision_rappel_outils-768x384.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch09_precision_rappel_outils-1536x768.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch09_precision_rappel_outils-2048x1024.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 calcul est simple : un outil attendu, deux appel\u00e9s. Le bon outil est bien dans la liste (rappel 1\/1), mais un appel superflu a \u00e9t\u00e9 fait (pr\u00e9cision 1\/2).<\/figcaption><\/figure>\n\n\n<h3>\u00c9valuer le RAG lui-m\u00eame<\/h3>\n<p>C\u00f4t\u00e9 RAG, trois qualit\u00e9s se d\u00e9gagent : la pertinence du contexte (l&rsquo;information r\u00e9cup\u00e9r\u00e9e est-elle utile \u00e0 la requ\u00eate ?), la fid\u00e9lit\u00e9 de la r\u00e9ponse (s&rsquo;appuie-t-elle vraiment sur ce qui a \u00e9t\u00e9 r\u00e9cup\u00e9r\u00e9 ?) et la pertinence de la r\u00e9ponse (r\u00e9pond-elle \u00e0 la question pos\u00e9e ?). La r\u00e9cup\u00e9ration et la g\u00e9n\u00e9ration sont \u00e0 \u00e9valuer en priorit\u00e9, car leurs effets sont directement mesurables.<\/p>\n<p>Il faut aussi un jeu de test. Celui de l&rsquo;exemple compte 17 cas, et sa composition d\u00e9pend des fonctionnalit\u00e9s de ton agent. Diversifie-le : une salutation, une question hors sujet (la m\u00e9t\u00e9o pour un agent d\u00e9di\u00e9 aux films), des questions d&rsquo;agr\u00e9gation qui exigent text2cypher, et des cas limites o\u00f9 la r\u00e9ponse manque dans les donn\u00e9es.<\/p>\n<blockquote>\n<p><strong>\ud83d\udccc \u00c0 retenir<\/strong> Un juge LLM peut biaiser l&rsquo;\u00e9valuation, surtout s&rsquo;il est le m\u00eame mod\u00e8le que celui qui g\u00e9n\u00e8re. Utilise plusieurs juges diff\u00e9rents du mod\u00e8le de g\u00e9n\u00e9ration, \u00e9chantillonne leurs jugements et compl\u00e8te par un retour humain.<\/p>\n<\/blockquote>\n<h2>Faire grandir le syst\u00e8me, sans se pr\u00e9cipiter<\/h2>\n<h3>La m\u00e9moire : connaissance et histoire<\/h3>\n<p>Deux notions se confondent souvent. La connaissance, mise en \u0153uvre par le RAG, apporte des contenus factuels ou propres \u00e0 un domaine. La m\u00e9moire capture l&rsquo;histoire de l&rsquo;agent : \u00e9changes pass\u00e9s, sorties d&rsquo;outils, mises \u00e0 jour d&rsquo;\u00e9tat. Elle lui donne de la continuit\u00e9 entre les tours et les sessions.<\/p>\n<p>La m\u00e9moire de base est une fen\u00eatre de contexte glissante qui perd l&rsquo;information ancienne. La recherche par mots-cl\u00e9s (BM25) retrouve des termes exacts mais pas les paraphrases. La m\u00e9moire s\u00e9mantique, elle, encode les interactions en vecteurs pour retrouver des contenus proches en sens.<\/p>\n<p>Ce dernier m\u00e9canisme est celui de la m\u00e9moire d&rsquo;exp\u00e9rience s\u00e9mantique. \u00c0 chaque entr\u00e9e de l&rsquo;utilisateur, on cherche dans les interactions pr\u00e9c\u00e9dentes stock\u00e9es. Une partie de la fen\u00eatre de contexte est r\u00e9serv\u00e9e aux meilleures correspondances ; le reste va au message syst\u00e8me, \u00e0 la derni\u00e8re entr\u00e9e et aux interactions r\u00e9centes.<\/p>\n<h3>La r\u00e9flexion : apprendre de ses \u00e9checs<\/h3>\n<p>Reflexion donne \u00e0 l&rsquo;agent une habitude d&rsquo;autocritique. Apr\u00e8s chaque tentative rat\u00e9e, il \u00e9crit une br\u00e8ve r\u00e9flexion sur ce qui n&rsquo;a pas march\u00e9, la range dans une m\u00e9moire, puis la relit avant de r\u00e9essayer. Le mod\u00e8le n&rsquo;est jamais r\u00e9entra\u00een\u00e9.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46dad201&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46dad201\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1347\" 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_ch07_boucle_reflexion-scaled.png\" alt=\"Une boucle en quatre \u00e9tapes : essai, journal de l'essai, r\u00e9flexion (\u00ab quel plan corriger ? \u00bb), m\u00e9moire des r\u00e9flexions r\u00e9centes r\u00e9inject\u00e9es dans l'invite\" class=\"wp-image-171\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch07_boucle_reflexion-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch07_boucle_reflexion-300x158.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch07_boucle_reflexion-1024x539.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch07_boucle_reflexion-768x404.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch07_boucle_reflexion-1536x808.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch07_boucle_reflexion-2048x1078.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\">Suis la fl\u00e8che qui remonte : les r\u00e9flexions retournent dans l&rsquo;invite du prochain essai, et c&rsquo;est ce retour qui change le comportement.<\/figcaption><\/figure>\n\n\n<p>Cet apprentissage n&rsquo;est pas obligatoire pour concevoir un agent : il exige davantage de conception, d&rsquo;\u00e9valuation et de supervision, et l&rsquo;investissement vaut ou non le coup selon l&rsquo;application.<\/p>\n<h3>Un agent ou plusieurs ?<\/h3>\n<p>La plupart des cas d&rsquo;usage d\u00e9marrent avec un seul agent, souvent plus rapide et moins cher, et on n&rsquo;envisage plusieurs agents que quand la complexit\u00e9 d\u00e9passe ce qu&rsquo;un seul sait faire. Le probl\u00e8me appara\u00eet avec le nombre d&rsquo;outils : dans l&rsquo;exemple de cha\u00eene logistique, un agent unique en a seize et sa performance se d\u00e9grade \u00e0 mesure qu&rsquo;il doit choisir dans un grand ensemble.<\/p>\n<p>Avant de multiplier les agents, on peut d&rsquo;abord regrouper les outils (s\u00e9lection hi\u00e9rarchique) ou utiliser une s\u00e9lection s\u00e9mantique via une base vectorielle. Si cela ne suffit pas, on scinde en agents sp\u00e9cialis\u00e9s, au prix d&rsquo;une surcharge de coordination.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46dad5f5&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46dad5f5\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1536\" 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_superviseur_specialistes-scaled.png\" alt=\"Une requ\u00eate arrive \u00e0 un superviseur qui choisit l'un de trois sp\u00e9cialistes : inventaire et entrep\u00f4t, transport, fournisseurs et conformit\u00e9\" class=\"wp-image-172\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch08_superviseur_specialistes-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch08_superviseur_specialistes-300x180.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch08_superviseur_specialistes-1024x614.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch08_superviseur_specialistes-768x461.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch08_superviseur_specialistes-1536x922.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch08_superviseur_specialistes-2048x1229.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\">Les seize outils se r\u00e9partissent en trois sp\u00e9cialistes. Un superviseur route chaque requ\u00eate vers le bon : en resserrant l&rsquo;ensemble d&rsquo;outils et l&rsquo;invite de chacun, on r\u00e9duit les erreurs de s\u00e9lection.<\/figcaption><\/figure>\n\n\n<p>Cinq principes guident chaque ajout d&rsquo;agent : d\u00e9composition, sp\u00e9cialisation, parcimonie, coordination et robustesse. P\u00e8se toujours le co\u00fbt de l&rsquo;agent suppl\u00e9mentaire : il ajoute de la communication, de la coordination et de la maintenance.<\/p>\n<h2>Pi\u00e8ges et limites<\/h2>\n<p>Le RAG agentique surpasse le RAG standard sur la r\u00e9cup\u00e9ration adaptative, les requ\u00eates complexes, l&rsquo;int\u00e9gration d&rsquo;outils et le passage \u00e0 l&rsquo;\u00e9chelle. Mais trois limites reviennent. La pr\u00e9cision de s\u00e9lection d&rsquo;outils d\u00e9cline quand un m\u00eame agent doit choisir parmi trop d&rsquo;options. Aucun agent n&rsquo;est fiable \u00e0 100 %, et les syst\u00e8mes multiagents cumulent les taux d&rsquo;erreur. Enfin, une autonomie accrue peut produire des actions non d\u00e9sir\u00e9es si aucun garde-fou explicite n&rsquo;existe.<\/p>\n<p>C\u00f4t\u00e9 co\u00fbt, les agents de recherche approfondie combinent plusieurs motifs et payent le prix : nombre d&rsquo;appels \u00e9lev\u00e9, latence, fragilit\u00e9 vis-\u00e0-vis des sources externes. Les agents ReAct offrent une cha\u00eene de pens\u00e9e qui aide au d\u00e9bogage, mais peuvent augmenter les co\u00fbts d&rsquo;API et le temps de r\u00e9ponse.<\/p>\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> L&rsquo;injection d&rsquo;invite n&rsquo;est pas th\u00e9orique. Le chatbot d&rsquo;un concessionnaire Chevrolet a \u00e9t\u00e9 manipul\u00e9 pour proposer un v\u00e9hicule de 76 000 dollars pour un dollar. Dans les flux multiagents, l&#8217;empoisonnement de m\u00e9moire fait aussi persister des donn\u00e9es contamin\u00e9es d&rsquo;un agent \u00e0 l&rsquo;autre.<\/p>\n<\/blockquote>\n<p>Les risques viennent aussi de l&rsquo;int\u00e9rieur : un agent peut mal interpr\u00e9ter un objectif ambigu, et ses sorties, probabilistes par nature, peuvent inclure des hallucinations. Il faut des limites op\u00e9rationnelles claires, des r\u00e8gles qui valident ses d\u00e9cisions avant ex\u00e9cution, et des strat\u00e9gies de repli : si une API tombe, l&rsquo;agent bascule sur des donn\u00e9es en cache ou pr\u00e9vient un op\u00e9rateur.<\/p>\n<p>Enfin, l&rsquo;humain aussi a ses failles : le biais d&rsquo;automatisation, o\u00f9 l&rsquo;on se fie trop aux recommandations de l&rsquo;agent, et la fatigue d&rsquo;alerte qui fait rater les avertissements critiques.<\/p>\n<h3>Doser l&rsquo;autonomie<\/h3>\n<p>Un outil de conception utile : le curseur d&rsquo;autonomie, qui laisse l&rsquo;utilisateur ajuster ce que l&rsquo;agent peut faire seul, du mode manuel au mode assist\u00e9 puis au mode agent. Les pr\u00e9f\u00e9rences varient avec la confiance, la familiarit\u00e9 avec la t\u00e2che, l&rsquo;enjeu et la charge de travail.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46dad9d6&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46dad9d6\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1152\" 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_curseur_autonomie-scaled.png\" alt=\"Trois \u00e9tapes d'autonomie croissante : manuel (l'humain fait tout), assist\u00e9 (l'agent propose, l'humain valide chaque action), agent (l'agent agit seul, l'humain est notifi\u00e9)\" class=\"wp-image-173\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_curseur_autonomie-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_curseur_autonomie-300x135.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_curseur_autonomie-1024x461.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_curseur_autonomie-768x346.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_curseur_autonomie-1536x691.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch03_curseur_autonomie-2048x922.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\">Observe l&rsquo;\u00e9tape du milieu : l&rsquo;agent propose, l&rsquo;humain valide chaque action. C&rsquo;est souvent le bon point de d\u00e9part pour un syst\u00e8me qui touche \u00e0 des donn\u00e9es sensibles.<\/figcaption><\/figure>\n\n\n<p>Mis en pratique, cela donne un support client \u00e0 trois vitesses : en mode assist\u00e9, l&rsquo;agent r\u00e9dige des r\u00e9ponses que l&rsquo;op\u00e9rateur relit avant envoi ; en mode agent, il traite seul les demandes courantes (mot de passe, suivi de commande, FAQ) et n&rsquo;escalade que les cas sensibles.<\/p>\n<h2>Aller plus loin<\/h2>\n<ul>\n<li><a href=\"\/blog\/rag\/qu-est-ce-qu-un-graphe-de-connaissances\/\" title=\"Graphe de connaissances\">Graphe de connaissances<\/a> : quand l&rsquo;information est structur\u00e9e (entit\u00e9s et relations), le RAG par graphe permet un raisonnement multi-sauts, mais sa construction est co\u00fbteuse. Ce n&rsquo;est pas une strat\u00e9gie par d\u00e9faut, plut\u00f4t une r\u00e9ponse cibl\u00e9e \u00e0 un besoin de raisonnement relationnel.<\/li>\n<li><strong>LangGraph<\/strong> : cadre qui mod\u00e9lise l&rsquo;application comme un graphe de n\u0153uds et d&rsquo;ar\u00eates, avec cycles, branches conditionnelles et points de contr\u00f4le pour reprendre apr\u00e8s un arr\u00eat.<\/li>\n<li><strong>Orchestration<\/strong> : le r\u00f4le de l&rsquo;orchestrateur est de composer, planifier et superviser les comp\u00e9tences, en surveillant l&rsquo;avancement et en reroutant le flux si besoin.<\/li>\n<li><strong>Syst\u00e8me multiagent<\/strong> : coordination d\u00e9mocratique, par gestionnaire, hi\u00e9rarchique ou acteur-critique, avec des protocoles comme A2A pour faire dialoguer des agents h\u00e9t\u00e9rog\u00e8nes.<\/li>\n<\/ul>\n<h2>\u00c0 retenir<\/h2>\n<ul>\n<li>Choisis la marche la plus basse de l&rsquo;\u00e9chelle qui suffit : code, workflow, RAG, puis agent. On ne met un agent que quand la variabilit\u00e9 des entr\u00e9es l&rsquo;exige.<\/li>\n<li>Le couplage tient en trois pi\u00e8ces : un routeur qui choisit l&rsquo;outil, des retrievers cibl\u00e9s qui ex\u00e9cutent, une critique qui contr\u00f4le.<\/li>\n<li>Donne \u00e0 la critique une sortie de secours : \u00ab l&rsquo;information manque \u00bb est une r\u00e9ponse valable.<\/li>\n<li>Teste chaque \u00e9tape (choix d&rsquo;outil, contexte, r\u00e9ponse) avec un jeu de cas vari\u00e9 qui inclut des questions sans r\u00e9ponse.<\/li>\n<li>N&rsquo;ajoute m\u00e9moire, r\u00e9flexion ou agents suppl\u00e9mentaires qu&rsquo;en r\u00e9ponse \u00e0 un probl\u00e8me mesur\u00e9, et pr\u00e9vois des garde-fous \u00e0 chaque niveau d&rsquo;autonomie.<\/li>\n<\/ul>\n<h2>Questions fr\u00e9quentes<\/h2>\n<p><strong>Faut-il un framework pour construire un syst\u00e8me d&rsquo;agents ?<\/strong><br \/>\nNon, ces cadres ne sont pas obligatoires : de nombreuses \u00e9quipes construisent directement sur les API des fournisseurs de mod\u00e8les. Pour des prototypes, CrewAI ou le kit d&rsquo;OpenAI d\u00e9marrent vite ; pour la production, LangGraph et AutoGen apportent plus de contr\u00f4le.<\/p>\n<p><strong>Comment valider un changement sans risquer ses utilisateurs ?<\/strong><br \/>\nLe d\u00e9ploiement fant\u00f4me envoie la requ\u00eate r\u00e9elle \u00e0 l&rsquo;agent de production et \u00e0 une version candidate dont les r\u00e9sultats sont journalis\u00e9s sans jamais \u00eatre servis. Le d\u00e9ploiement canari r\u00e9partit le trafic r\u00e9el, par exemple 95 % vers la version de r\u00e9f\u00e9rence et 5 % vers la nouvelle.<\/p>\n<p><strong>\u00c0 partir de combien d&rsquo;outils faut-il s\u00e9parer en plusieurs agents ?<\/strong><br \/>\nCe n&rsquo;est pas une affaire de chiffre magique : la performance d&rsquo;un agent se d\u00e9grade \u00e0 mesure que le nombre d&rsquo;outils possibles augmente (ils sont seize dans l&rsquo;exemple de cha\u00eene logistique). Essaie d&rsquo;abord le regroupement ou la s\u00e9lection s\u00e9mantique, puis seulement la scission en agents.<\/p>","protected":false},"excerpt":{"rendered":"<p>Un agent qui d\u00e9cide quoi chercher, un RAG qui lui fournit des faits fiables : voici comment les assembler, les tester et \u00e9viter les pi\u00e8ges.<\/p>\n","protected":false},"author":1,"featured_media":278,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-174","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\/174","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=174"}],"version-history":[{"count":4,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/174\/revisions"}],"predecessor-version":[{"id":542,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/174\/revisions\/542"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media\/278"}],"wp:attachment":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media?parent=174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/categories?post=174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/tags?post=174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}