{"id":198,"date":"2026-09-30T17:19:32","date_gmt":"2026-09-30T15:19:32","guid":{"rendered":"https:\/\/www.ranksignal.fr\/blog\/?p=198"},"modified":"2026-10-14T16:58:45","modified_gmt":"2026-10-14T14:58:45","slug":"limiter-facture-tokens-agent-boucles","status":"publish","type":"post","link":"https:\/\/www.ranksignal.fr\/blog\/agentic\/limiter-facture-tokens-agent-boucles\/","title":{"rendered":"Agents IA : stopper l&rsquo;explosion de la facture de tokens"},"content":{"rendered":"<p>Un agent re\u00e7oit une mission banale : trouver un paquet de chips sans produits laitiers, vari\u00e9t\u00e9 pomme, \u00e0 moins de 30 dollars. Il cherche, clique, relit, cherche encore, \u00e9choue \u2014 puis \u00e9crit une r\u00e9flexion sur son \u00e9chec et repart de z\u00e9ro. \u00c0 chaque tour de cette boucle, quelqu&rsquo;un paie. Voici comment garder un agent capable sans laisser la facture de tokens lui \u00e9chapper.<\/p>\n<h2>L&rsquo;essentiel en 30 secondes<\/h2>\n<ul>\n<li>Un mod\u00e8le est factur\u00e9 au <strong>nombre de jetons (tokens)<\/strong> qu&rsquo;il lit et qu&rsquo;il \u00e9crit : une boucle qui tourne \u00ab autant que n\u00e9cessaire \u00bb n&rsquo;a donc aucun plafond de d\u00e9pense naturel.<\/li>\n<li>Le premier r\u00e9flexe d&rsquo;\u00e9conomie consiste <strong>\u00e0 ne pas ouvrir de boucle<\/strong> quand un r\u00e9flexe ou un flux fixe suffit, puis \u00e0 donner \u00e0 chaque boucle restante une condition de sortie.<\/li>\n<li>La r\u00e9flexion et le contexte se gardent courts : peu de souvenirs r\u00e9inject\u00e9s, un historique r\u00e9sum\u00e9 ou glissant, un budget de jetons par appel.<\/li>\n<li>La recherche se d\u00e9clenche \u00e0 la demande et ram\u00e8ne peu de documents, au lieu de tourner \u00e0 chaque tour.<\/li>\n<li>Le <strong>mod\u00e8le se choisit \u00e0 la t\u00e2che<\/strong> : les gros pour planifier, les petits pour ex\u00e9cuter.<\/li>\n<\/ul>\n<h2>L&rsquo;intuition : une boucle, c&rsquo;est un compteur qui tourne<\/h2>\n<p>Un <a href=\"\/blog\/inference\/qu-est-ce-qu-un-llm\/\" title=\"mod\u00e8le de langage\">mod\u00e8le de langage<\/a> ne se facture pas \u00e0 la dur\u00e9e mais \u00e0 la quantit\u00e9 de texte : les \u00e9diteurs comptent s\u00e9par\u00e9ment les jetons d&rsquo;entr\u00e9e et les jetons de sortie. Une r\u00e9ponse unique co\u00fbte donc une fois ce prix. Un agent, lui, encha\u00eene les appels.<\/p>\n<p>La boucle ReAct est l&rsquo;exemple type : le mod\u00e8le produit une pens\u00e9e, choisit et invoque un outil, observe le r\u00e9sultat, puis recommence \u00ab autant que n\u00e9cessaire \u00bb. Son avantage est la souplesse et la transparence d&rsquo;une cha\u00eene de pens\u00e9e lisible ; son prix est une hausse des co\u00fbts d&rsquo;API et du temps de r\u00e9ponse.<\/p>\n<p>Le pi\u00e8ge tient \u00e0 ce que chaque tour relit ce qui pr\u00e9c\u00e8de. Les r\u00e9sultats d&rsquo;outils sont int\u00e9gr\u00e9s dans l&rsquo;invite pour nourrir le cycle de raisonnement suivant, et dans les exemples de code d&rsquo;agents \u00e0 outils, le second appel au mod\u00e8le re\u00e7oit de nouveau toute la conversation augment\u00e9e du r\u00e9sultat de l&rsquo;outil. Plus l&rsquo;agent travaille, plus chaque appel embarque de texte.<\/p>\n<blockquote>\n<p><strong>\ud83d\udca1 Intuition<\/strong> Le co\u00fbt d&rsquo;une boucle d\u00e9pend de trois choses : le nombre de tours, la taille de ce qu&rsquo;on relit \u00e0 chaque tour, et le prix du jeton. Les six leviers qui suivent s&rsquo;attaquent chacun \u00e0 l&rsquo;un des trois.<\/p>\n<\/blockquote>\n<h2>Levier 1 : ne pas ouvrir de boucle quand un r\u00e9flexe suffit<\/h2>\n<p>Avant d&rsquo;optimiser un agent, demande-toi s&rsquo;il en faut un. Si les entr\u00e9es sont pr\u00e9visibles et chaque sortie descriptible \u00e0 l&rsquo;avance, quelques lignes de code proc\u00e9dural sont plus rapides, moins ch\u00e8res et bien plus faciles \u00e0 tester qu&rsquo;un mod\u00e8le. Pour quelques branches connues, un moteur de workflow offre un meilleur contr\u00f4le des erreurs qu&rsquo;un mod\u00e8le de langage.<\/p>\n<p>Entre les deux, les agents r\u00e9flexes associent directement entr\u00e9e et action, sans trace de raisonnement : latence minimale, performances pr\u00e9visibles, id\u00e9al pour un routage par mots-cl\u00e9s ou une recherche en une \u00e9tape. Les agents \u00e0 boucle, eux, sont puissants mais exigeants en calcul et en efforts d&rsquo;ing\u00e9nierie pour les surveiller et les r\u00e9gler.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef471eef08&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef471eef08\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1047\" 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_ch05_topologies_outils-scaled.png\" alt=\"Quatre topologies d'outils de la plus simple (outil unique) \u00e0 la plus expressive (graphe), avec une fl\u00e8che indiquant complexit\u00e9, latence et co\u00fbt croissants\" class=\"wp-image-193\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch05_topologies_outils-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch05_topologies_outils-300x123.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch05_topologies_outils-1024x419.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch05_topologies_outils-768x314.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch05_topologies_outils-1536x628.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch05_topologies_outils-2048x838.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 la fl\u00e8che sous les quatre cadres : plus tu passes de \u00ab requ\u00eate, outil, r\u00e9ponse \u00bb \u00e0 une cha\u00eene puis \u00e0 un graphe, plus la complexit\u00e9, la latence et le co\u00fbt montent. Si ton sc\u00e9nario tient dans l&rsquo;outil unique, arr\u00eate-toi l\u00e0.<\/figcaption><\/figure>\n\n\n<p>Le nombre d&rsquo;agents compte aussi : chaque agent suppl\u00e9mentaire ajoute de la communication, de la coordination et des besoins en ressources. Commence par un seul agent, qui invoque des outils jusqu&rsquo;\u00e0 une limite avant de r\u00e9pondre.<\/p>\n<p>M\u00eame le choix d&rsquo;un outil peut co\u00fbter : la s\u00e9lection \u00ab standard \u00bb demande un appel suppl\u00e9mentaire \u00e0 un mod\u00e8le de fondation. Avant de multiplier les agents face \u00e0 un grand catalogue, on regroupe les outils (s\u00e9lection hi\u00e9rarchique) ou on choisit l&rsquo;outil par recherche s\u00e9mantique dans une base vectorielle.<\/p>\n<h2>Levier 2 : donner une sortie \u00e0 chaque boucle<\/h2>\n<p>Une boucle sans condition de sortie est un robinet ouvert. Les consignes de conception vont toutes dans le m\u00eame sens : appeler des outils jusqu&rsquo;\u00e0 une limite avant de r\u00e9pondre, plafonner la profondeur et la ramification des plans, et pr\u00e9voir un crit\u00e8re de sortie.<\/p>\n<p>Ce dernier point m\u00e9rite un exemple. Une critique de r\u00e9ponse est une fonction bloquante : si la r\u00e9ponse est incorrecte ou incompl\u00e8te, elle g\u00e9n\u00e8re une nouvelle question et relance un tour de r\u00e9cup\u00e9ration. Mais la bonne r\u00e9ponse peut simplement ne pas exister dans les donn\u00e9es ; la critique doit alors pouvoir le signaler \u00e0 l&rsquo;utilisateur plut\u00f4t que de boucler ind\u00e9finiment.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef471ef406&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef471ef406\" 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\/b3_ch06_retrieval_repete-scaled.png\" alt=\"Trois fa\u00e7ons de r\u00e9p\u00e9ter la r\u00e9cup\u00e9ration : it\u00e9rative et r\u00e9cursive, born\u00e9es par un seuil fixe, et adaptative, o\u00f9 un mod\u00e8le juge d\u00e9cide dynamiquement\" class=\"wp-image-194\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch06_retrieval_repete-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch06_retrieval_repete-300x161.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch06_retrieval_repete-1024x549.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch06_retrieval_repete-768x411.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_ch06_retrieval_repete-1536x823.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b3_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\">Sur ce sch\u00e9ma, compare la colonne de gauche et celle de droite. Les boucles it\u00e9rative et r\u00e9cursive s&rsquo;arr\u00eatent sur un seuil fixe (on relance au plus n fois) ; la boucle adaptative laisse un mod\u00e8le juge d\u00e9cider, sans limite fixe. Avec un juge, c&rsquo;est donc \u00e0 toi d&rsquo;ajouter le plafond.<\/figcaption><\/figure>\n\n\n<p>La boucle acteur-critique illustre bien le risque. L&rsquo;acteur produit des plans candidats, le critique les note, et on recommence tant que le seuil n&rsquo;est pas atteint. L&rsquo;approche est une forme de calcul au moment du test : elle co\u00fbte plus cher, en \u00e9change de r\u00e9sultats souvent nettement meilleurs, et elle vaut surtout quand on dispose d&rsquo;une grille d&rsquo;\u00e9valuation claire et que le surco\u00fbt reste acceptable.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef4720bf99&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef4720bf99\" 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\/b1_ch08_boucle_acteur_critique-scaled.png\" alt=\"Boucle acteur-critique : l'acteur propose des plans, le critique les note, le plan est valid\u00e9 si le score d\u00e9passe 8, sinon on r\u00e9g\u00e9n\u00e8re avec les retours\" class=\"wp-image-195\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_boucle_acteur_critique-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_boucle_acteur_critique-300x150.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_boucle_acteur_critique-1024x512.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_boucle_acteur_critique-768x384.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_boucle_acteur_critique-1536x768.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch08_boucle_acteur_critique-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\">Voici comment la boucle se referme dans le code. <code>actor_node<\/code> et <code>critic_node<\/code> sont les deux fonctions qui appellent le mod\u00e8le (l&rsquo;une g\u00e9n\u00e8re trois plans candidats \u00e0 chaque passage, l&rsquo;autre les note), et <code>AgentState<\/code> est l&rsquo;\u00e9tat partag\u00e9 que le graphe se transmet. Un seul arc renvoie vers l&rsquo;acteur, d\u00e9cid\u00e9 par le critique.<\/figcaption><\/figure>\n\n\n<pre><code>def construct_actor_critic_graph():\n   g = StateGraph(AgentState)\n   g.add_node(&quot;actor&quot;, actor_node)\n   g.add_node(&quot;critic&quot;, critic_node)\n\n   g.set_entry_point(&quot;actor&quot;)\n   g.add_edge(&quot;actor&quot;, &quot;critic&quot;)\n   # Loop back if not approved (conditional)\n   g.add_conditional_edges(&quot;critic&quot;, lambda s: &quot;actor&quot;\n    if &quot;regenerate&quot; in s[&quot;messages&quot;][-1].content.lower() else\n    END)\n\n   return g.compile()\n<\/code><\/pre>\n<p>Lis la ligne <code>add_conditional_edges<\/code> : tant que le message du critique contient \u00ab regenerate \u00bb, le graphe retourne \u00e0 l&rsquo;acteur, et rien d&rsquo;autre dans cette fonction ne compte les tours. Un plafond de tours, ajout\u00e9 ici, transforme une boucle potentiellement infinie en d\u00e9pense born\u00e9e.<\/p>\n<blockquote>\n<p><strong>\ud83d\udccc \u00c0 retenir<\/strong> Une boucle bien con\u00e7ue a deux sorties : le succ\u00e8s (seuil atteint) et l&rsquo;aveu (\u00ab je n&rsquo;ai rien trouv\u00e9 \u00bb). Sans la seconde, l&rsquo;agent peut d\u00e9penser sans fin pour une r\u00e9ponse qui n&rsquo;existe pas.<\/p>\n<\/blockquote>\n<h2>Levier 3 : garder la r\u00e9flexion courte<\/h2>\n<p>Revenons \u00e0 notre agent des chips. Apr\u00e8s un \u00e9chec, la technique Reflexion lui fait \u00e9crire une br\u00e8ve r\u00e9flexion sur ce qui n&rsquo;a pas march\u00e9 ; ces r\u00e9flexions s&rsquo;accumulent dans une m\u00e9moire et sont relues avant la tentative suivante, sans jamais r\u00e9entra\u00eener le mod\u00e8le.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef4720c519&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef4720c519\" 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\/b1_ch07_boucle_reflexion-scaled.png\" alt=\"Boucle Reflexion : essai, journal de l'essai, r\u00e9flexion, m\u00e9moire des r\u00e9flexions r\u00e9inject\u00e9es dans l'invite pour relancer le cycle\" class=\"wp-image-196\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch07_boucle_reflexion-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch07_boucle_reflexion-300x158.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch07_boucle_reflexion-1024x539.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch07_boucle_reflexion-768x404.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch07_boucle_reflexion-1536x808.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_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 les quatre \u00e9tapes sur le sch\u00e9ma : l&rsquo;essai, son journal, la r\u00e9flexion, puis la m\u00e9moire qui revient dans l&rsquo;invite. Chaque passage par la case \u00ab r\u00e9flexion \u00bb est un appel de plus, dont l&rsquo;entr\u00e9e contient l&rsquo;instruction d&rsquo;origine, la transcription compl\u00e8te Action\/Observation de l&rsquo;essai rat\u00e9, et se termine par \u00ab Plan: \u00bb pour obtenir des recommandations cibl\u00e9es. Le cadrage demande aussi une r\u00e9ponse concise, ce qui garde la sortie courte.<\/figcaption><\/figure>\n\n\n<p>Le code de l&rsquo;exemple montre deux garde-fous de co\u00fbt. Commence par lire, avant les fonctions, ce qu&rsquo;elles font : <code>get_completion<\/code> envoie un prompt au mod\u00e8le (<code>llm<\/code>, configur\u00e9 en amont), <code>_generate_reflection_query<\/code> assemble l&rsquo;historique des r\u00e9flexions et le journal de l&rsquo;essai, et <code>update_memory<\/code> lit le fichier de journaux d&rsquo;essais (<code>full_log<\/code>, d\u00e9coup\u00e9 en un journal par environnement dans <code>env_logs<\/code>) puis ajoute une r\u00e9flexion \u00e0 chaque environnement en \u00e9chec.<\/p>\n<pre><code>def get_completion(prompt: str) -&gt; str:\n    # Wraps our `call_model` helper for one-off text completions\n\n    result = llm.invoke([{&quot;role&quot;:&quot;user&quot;,&quot;content&quot;:prompt}])\n    return result[0].content\n\ndef _generate_reflection_query(trial_log: str, recent_reflections: List[str]):\n    history = &quot;\\n\\n&quot;.join(recent_reflections)\n    return f'''{history}\n        {trial_log}\n        Based on the above, what plan would you follow next? Plan:'''\n\ndef update_memory(trial_log_path: str, env_configs: List[Dict[str, Any]]):\n    &quot;&quot;&quot;Updates the given env_config with the appropriate reflections.&quot;&quot;&quot;\n    with open(trial_log_path, 'r') as f:\n        full_log: str = f.read()\n\n    env_logs: List[str] = full_log.split('#####\\n\\n#####')\n    assert len(env_logs) == len(env_configs), print(f'bad: {env_logs}')\n    for i, env in enumerate(env_configs):\n        # if unsolved, get reflection and update env config\n        if not env['is_success'] and not env['skip']:\n            if len(env['memory']) &gt; 3:\n                memory: List[str] = env['memory'][-3:]\n            else:\n                memory: List[str] = env['memory']\n            reflection_query = _generate_reflection_query(env_logs[i], memory)\n            reflection = get_completion(reflection_query)\n            env_configs[i]['memory'] += [reflection]\n<\/code><\/pre>\n<p>Deux lignes travaillent pour ta facture. La condition <code>if not env['is_success'] and not env['skip']<\/code> ne d\u00e9clenche une r\u00e9flexion que pour un \u00e9chec non ignor\u00e9. Et <code>env['memory'][-3:]<\/code> ne r\u00e9injecte que les trois derni\u00e8res r\u00e9flexions, donc la part \u00ab historique \u00bb du prompt de r\u00e9flexion ne grandit pas avec le nombre d&rsquo;essais.<\/p>\n<p>La r\u00e9flexion syst\u00e9matique, elle, a un prix assum\u00e9 : le m\u00e9taraisonnement ajoute latence et calcul. On le r\u00e9serve aux flux \u00e0 fort enjeu, o\u00f9 une erreur pr\u00e9coce peut se propager en \u00e9chec co\u00fbteux (transactions financi\u00e8res, diagnostic m\u00e9dical, incident critique).<\/p>\n<h2>Levier 4 : tenir le contexte dans un budget<\/h2>\n<p>Tout ce que l&rsquo;agent relit \u00e0 chaque tour forme son contexte. L&rsquo;ing\u00e9nierie de contexte consiste \u00e0 assembler dynamiquement messages de l&rsquo;utilisateur, connaissances r\u00e9cup\u00e9r\u00e9es, \u00e9tat du flux et invite syst\u00e8me en une fen\u00eatre structur\u00e9e et \u00e9conome en jetons. Il s&rsquo;agit de d\u00e9cider quoi inclure, comment le structurer et comment le faire tenir dans les limites de jetons.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef4720c9ba&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef4720c9ba\" 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\/b1_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) assembl\u00e9s dans un budget de jetons avant l'appel au mod\u00e8le\" class=\"wp-image-197\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch05_assemblage_contexte-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch05_assemblage_contexte-300x165.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch05_assemblage_contexte-1024x563.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch05_assemblage_contexte-768x422.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_ch05_assemblage_contexte-1536x845.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b1_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\">Remarque que l&rsquo;historique arrive r\u00e9sum\u00e9, pas brut : c&rsquo;est la place qu&rsquo;on lui alloue dans le budget qui emp\u00eache la conversation de tout avaler. Un agent de support peut ainsi composer son contexte avec son invite syst\u00e8me, le message courant, un r\u00e9sum\u00e9 de la fiche de commande et les extraits de politique applicables.<\/figcaption><\/figure>\n\n\n<p>Trois techniques donnent du contr\u00f4le. La fen\u00eatre glissante garde les informations r\u00e9centes et \u00e9carte les plus anciennes. La compression supprime les tokens peu importants, via un mod\u00e8le, ce qui r\u00e9duit le co\u00fbt et le risque de d\u00e9passer la fen\u00eatre. Et on peut retirer ou compresser les d\u00e9tails p\u00e9rim\u00e9s, ou r\u00e9cup\u00e9rer en m\u00e9moire vectorielle seulement ce qui est pertinent.<\/p>\n<p>Un grand contexte n&rsquo;est pas une excuse pour tout y mettre. M\u00eame les mod\u00e8les \u00e0 grande fen\u00eatre (jusqu&rsquo;\u00e0 200 000 tokens pour Claude 3) perdent en pr\u00e9cision quand l&rsquo;information utile se trouve au milieu d&rsquo;un long prompt : c&rsquo;est le probl\u00e8me du \u00ab perdu au milieu \u00bb. Ne transmettre que l&rsquo;information pertinente limite ce risque.<\/p>\n<h2>Levier 5 : chercher \u00e0 la demande, et peu<\/h2>\n<p>Une recherche documentaire \u00e0 chaque tour est une d\u00e9pense silencieuse. Un syst\u00e8me standard interroge une base unique pour toute requ\u00eate et la parcourt enti\u00e8rement, m\u00eame quand seule une fraction est pertinente.<\/p>\n<p>La <a href=\"\/blog\/rag\/qu-est-ce-qu-un-rag-agentique\/\" title=\"r\u00e9cup\u00e9ration agentique\">r\u00e9cup\u00e9ration agentique<\/a> confie la d\u00e9cision \u00e0 l&rsquo;agent : il choisit quelle source interroger, peut m\u00eame contourner la r\u00e9cup\u00e9ration pour une simple salutation, et juge si l&rsquo;information obtenue suffit ou si une nouvelle it\u00e9ration avec une requ\u00eate reformul\u00e9e s&rsquo;impose. C&rsquo;est la r\u00e9cup\u00e9ration adaptative.<\/p>\n<p>D&rsquo;autres m\u00e9canismes visent le m\u00eame but. Un module de m\u00e9moire s&rsquo;appuie sur la connaissance interne du mod\u00e8le pour d\u00e9cider quand une r\u00e9cup\u00e9ration suppl\u00e9mentaire est r\u00e9ellement n\u00e9cessaire, ce qui r\u00e9duit les r\u00e9cup\u00e9rations superflues. <a href=\"\/blog\/rag\/qu-est-ce-qu-un-self-rag\/\" title=\"Self-RAG\">Self-RAG<\/a> entra\u00eene le mod\u00e8le \u00e0 utiliser des \u00ab jetons de r\u00e9flexion \u00bb dont l&rsquo;un indique si une r\u00e9cup\u00e9ration est n\u00e9cessaire, au prix d&rsquo;une demande de calcul plus \u00e9lev\u00e9e et d&rsquo;un r\u00e9glage fin des seuils.<\/p>\n<p>Reste le nombre de documents ramen\u00e9s. Voici une recherche par similarit\u00e9 dans un index charg\u00e9 depuis le disque, o\u00f9 le param\u00e8tre <code>k=2<\/code> demande les deux documents les plus proches de la question.<\/p>\n<pre><code>from langchain_community.vectorstores import FAISS\nfrom langchain_openai import OpenAIEmbeddings\nimport os\nos.environ[&quot;OPENAI_API_KEY&quot;] = &quot;&lt;YOUR_API_KEY&gt;&quot;\n\nembeddings = OpenAIEmbeddings(model=&quot;text-embedding-3-small&quot;)\nvector_store = FAISS.load_local(\n    folder_path=&quot;..\/..\/Assets\/Data&quot;,\n    index_name=&quot;CWC_index&quot;,\n    embeddings=embeddings,\n    allow_dangerous_deserialization=True\n)\nquery = &quot;Who won the 2023 Cricket World Cup?&quot;\nretrieved_docs = vector_store.similarity_search(query, k=2)\n<\/code><\/pre>\n<p>Ce <code>k<\/code> est un r\u00e9glage \u00e0 toi : moins de documents, moins de texte r\u00e9inject\u00e9 dans l&rsquo;invite. Tu peux aussi r\u00e9duire le bruit avant m\u00eame la recherche, par un filtrage sur les m\u00e9tadonn\u00e9es (date, auteur, cat\u00e9gorie) qui restreint la recherche par similarit\u00e9 aux fragments pertinents.<\/p>\n<p>Enfin, le meilleur appel reste celui qu&rsquo;on ne fait pas. Un cache s\u00e9mantique retrouve la r\u00e9ponse d\u00e9j\u00e0 g\u00e9n\u00e9r\u00e9e quand une question similaire revient, au lieu de traverser tout le pipeline : on gagne du temps de r\u00e9ponse et du co\u00fbt d&rsquo;inf\u00e9rence, et on soulage le service du mod\u00e8le.<\/p>\n<h2>Levier 6 : payer le bon mod\u00e8le au bon moment<\/h2>\n<p>Le prix d&rsquo;un jeton varie \u00e9norm\u00e9ment d&rsquo;un mod\u00e8le \u00e0 l&rsquo;autre, et pas forc\u00e9ment avec la qualit\u00e9. Le tableau prend Llama 3.1 comme r\u00e9f\u00e9rence (0,20 &#36; par million de jetons d&rsquo;entr\u00e9e, 0,60 &#36; en sortie) ; la qualit\u00e9 est mesur\u00e9e par le score MMLU.<\/p>\n<table>\n<thead>\n<tr>\n<th>Mod\u00e8le<\/th>\n<th>MMLU<\/th>\n<th>Prix relatif entr\u00e9e<\/th>\n<th>Prix relatif sortie<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>DeepSeek-v3<\/td>\n<td>87,2<\/td>\n<td>2,75<\/td>\n<td>3,65<\/td>\n<\/tr>\n<tr>\n<td>Claude 4 Opus, r\u00e9flexion \u00e9tendue<\/td>\n<td>86,5<\/td>\n<td>75<\/td>\n<td>125<\/td>\n<\/tr>\n<tr>\n<td>Gemini 2.5 Pro<\/td>\n<td>86,2<\/td>\n<td>12,5<\/td>\n<td>25<\/td>\n<\/tr>\n<tr>\n<td>Llama 3.1 Instruct Turbo 405B<\/td>\n<td>84,5<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>o4-mini<\/td>\n<td>83,2<\/td>\n<td>5,5<\/td>\n<td>7,33<\/td>\n<\/tr>\n<tr>\n<td>Nova Pro<\/td>\n<td>82,0<\/td>\n<td>4<\/td>\n<td>5,33<\/td>\n<\/tr>\n<tr>\n<td>Mistral Large 2<\/td>\n<td>80,0<\/td>\n<td>10<\/td>\n<td>10<\/td>\n<\/tr>\n<tr>\n<td>Grok 3<\/td>\n<td>79,9<\/td>\n<td>15<\/td>\n<td>25<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Lis les deux premi\u00e8res lignes : des scores MMLU voisins (87,2 et 86,5) pour des prix relatifs en entr\u00e9e de 2,75 contre 75. La performance n&rsquo;est pas directement corr\u00e9l\u00e9e au prix, et ces scores ne donnent qu&rsquo;une indication : compare les mod\u00e8les sur ta propre t\u00e2che.<\/p>\n<p>L&rsquo;architecture peut faire le tri \u00e0 ta place. Dans un agent planificateur-ex\u00e9cuteur, le planificateur se concentre sur le raisonnement \u00e0 long horizon tandis que les ex\u00e9cuteurs n&rsquo;invoquent que les outils n\u00e9cessaires, ce qui r\u00e9duit les appels redondants ; des mod\u00e8les plus petits peuvent g\u00e9rer l&rsquo;ex\u00e9cution, en r\u00e9servant les gros \u00e0 la planification.<\/p>\n<p>Beaucoup d&rsquo;\u00e9quipes adoptent des strat\u00e9gies hybrides : un mod\u00e8le puissant pour les requ\u00eates complexes, un mod\u00e8le l\u00e9ger pour les t\u00e2ches routini\u00e8res, ou un routage dynamique qui envoie chaque requ\u00eate vers le mod\u00e8le adapt\u00e9. Des plateformes automatisent ce tri (s\u00e9lection automatique de mod\u00e8le).<\/p>\n<h2>Pi\u00e8ges et limites<\/h2>\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Chaque \u00e9conomie a son propre co\u00fbt. Re-classement, compression et les autres techniques avanc\u00e9es introduisent un surco\u00fbt de calcul, de latence et de stockage, \u00e0 mettre en balance avec le gain attendu ; la compression peut en plus faire perdre de l&rsquo;information.<\/p>\n<\/blockquote>\n<p>Ne sur-optimise pas trop t\u00f4t : on peut d\u00e9penser une \u00e9nergie consid\u00e9rable \u00e0 optimiser le choix du mod\u00e8le pour des gains marginaux, et sauf contrainte d&rsquo;\u00e9chelle, d\u00e9marrer simplement suffit.<\/p>\n<p>Enfin, l&rsquo;affinage d&rsquo;un mod\u00e8le peut r\u00e9duire le co\u00fbt par appel \u00e0 fort trafic, mais il demande donn\u00e9es, calcul et maintenance. La recommandation est de commencer par l&rsquo;appel de fonctions int\u00e9gr\u00e9 des mod\u00e8les pr\u00e9entra\u00een\u00e9s, et en cas de doute de ne pas affiner : il existe souvent des actions moins co\u00fbteuses et \u00e0 plus fort levier.<\/p>\n<h2>Aller plus loin<\/h2>\n<ul>\n<li><strong>ReAct<\/strong> : la boucle pens\u00e9e-action-observation qui explique pourquoi un agent peut tourner longtemps.<\/li>\n<li><strong>Re-classement<\/strong> : r\u00e9ordonner les documents r\u00e9cup\u00e9r\u00e9s pour prioriser les plus pertinents avant de les donner au mod\u00e8le.<\/li>\n<li><strong>S\u00e9lection automatique de mod\u00e8le<\/strong> : l&rsquo;envoi des requ\u00eates simples vers de petits mod\u00e8les rapides, des requ\u00eates complexes vers les gros.<\/li>\n<li><strong>R\u00e9cup\u00e9ration agentique<\/strong> : l&rsquo;agent choisit quand et o\u00f9 chercher, au lieu d&rsquo;interroger une base unique \u00e0 chaque fois.<\/li>\n<\/ul>\n<h2>\u00c0 retenir<\/h2>\n<ul>\n<li>La facture suit le nombre de tours, le texte relu \u00e0 chaque tour et le prix du jeton : mesure-les s\u00e9par\u00e9ment pour savoir o\u00f9 agir.<\/li>\n<li>Un agent n&rsquo;est pas toujours n\u00e9cessaire : du code ou un flux fixe co\u00fbte moins, et un agent unique co\u00fbte moins qu&rsquo;une \u00e9quipe.<\/li>\n<li>Toute boucle m\u00e9rite une limite, un seuil et une sortie \u00ab introuvable \u00bb.<\/li>\n<li>R\u00e9flexion et contexte se plafonnent : peu de souvenirs r\u00e9inject\u00e9s, historique r\u00e9sum\u00e9, budget de jetons.<\/li>\n<li>Recherche \u00e0 la demande et choix du mod\u00e8le par t\u00e2che sont les deux derniers gisements d&rsquo;\u00e9conomie.<\/li>\n<\/ul>\n<h2>Questions fr\u00e9quentes<\/h2>\n<p><strong>Faut-il toujours limiter le nombre d&rsquo;\u00e9tapes d&rsquo;un agent ?<\/strong><br \/>\nLes consignes vont dans ce sens : appeler des outils jusqu&rsquo;\u00e0 une limite avant de r\u00e9pondre, plafonner profondeur et ramification, et pr\u00e9voir un crit\u00e8re de sortie pour les boucles de critique.<\/p>\n<p><strong>La r\u00e9flexion vaut-elle son co\u00fbt ?<\/strong><br \/>\nElle ajoute latence et calcul ; elle se justifie dans les flux \u00e0 fort enjeu, o\u00f9 une erreur pr\u00e9coce peut se propager en \u00e9chec co\u00fbteux.<\/p>\n<p><strong>Un petit mod\u00e8le peut-il suffire ?<\/strong><br \/>\nPour des t\u00e2ches bien d\u00e9finies, sensibles \u00e0 la latence ou au co\u00fbt, un mod\u00e8le beaucoup plus petit offre des r\u00e9sultats quasi \u00e9quivalents pour une fraction du prix.<\/p>","protected":false},"excerpt":{"rendered":"<p>Ton agent boucle, r\u00e9fl\u00e9chit, cherche\u2026 et ta facture de tokens s&rsquo;envole. Six leviers concrets pour borner les boucles sans rendre l&rsquo;agent b\u00eate.<\/p>\n","protected":false},"author":1,"featured_media":272,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-198","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\/198","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=198"}],"version-history":[{"count":4,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/198\/revisions"}],"predecessor-version":[{"id":763,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/198\/revisions\/763"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media\/272"}],"wp:attachment":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media?parent=198"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/categories?post=198"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/tags?post=198"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}