{"id":478,"date":"2026-10-07T16:03:56","date_gmt":"2026-10-07T14:03:56","guid":{"rendered":"https:\/\/www.ranksignal.fr\/blog\/?p=478"},"modified":"2026-10-14T17:35:49","modified_gmt":"2026-10-14T15:35:49","slug":"qu-est-ce-qu-une-memoire-non-parametrique","status":"publish","type":"post","link":"https:\/\/www.ranksignal.fr\/blog\/inference\/qu-est-ce-qu-une-memoire-non-parametrique\/","title":{"rendered":"M\u00e9moire non param\u00e9trique : le savoir qui vit hors des poids"},"content":{"rendered":"<p><\/p>\n<p>Ton agent de d\u00e9bogage bute sur un type d&rsquo;erreur. Tu ajoutes dans son invite un exemple de la bonne solution : le changement prend effet instantan\u00e9ment, et l&rsquo;agent s&rsquo;en sort. Mais il n&rsquo;a v\u00e9cu que le temps de la session : tu la fermes, et tout ce qu&rsquo;il vient d&rsquo;apprendre dispara\u00eet. Rien n&rsquo;a boug\u00e9 dans le mod\u00e8le, et rien n&rsquo;a \u00e9t\u00e9 rang\u00e9 quelque part. Ce qui manquait \u00e0 cet agent, c&rsquo;est une m\u00e9moire non param\u00e9trique : \u00e0 la fin de cet article, tu sauras la d\u00e9finir, comprendre comment elle s&rsquo;\u00e9crit, se relit et se r\u00e9\u00e9crit, et rep\u00e9rer les cas o\u00f9 elle d\u00e9raille.<\/p>\n<p><strong>Sommaire<\/strong><\/p>\n<ul>\n<li><a href=\"#l-essentiel-en-30-secondes\">L&rsquo;essentiel en 30 secondes<\/a><\/li>\n<li><a href=\"#un-savoir-qu-on-change-sans-toucher-au-modele\">Un savoir qu&rsquo;on change sans toucher au mod\u00e8le<\/a><\/li>\n<li><a href=\"#pourquoi-les-poids-ne-suffisent-pas\">Pourquoi les poids ne suffisent pas<\/a><\/li>\n<li><a href=\"#ecrire-un-souvenir-puis-le-retrouver\">\u00c9crire un souvenir, puis le retrouver<\/a><\/li>\n<li><a href=\"#quand-la-memoire-se-reecrit-elle-meme\">Quand la m\u00e9moire se r\u00e9\u00e9crit elle-m\u00eame<\/a><\/li>\n<li><a href=\"#entre-le-prompt-et-les-poids\">Entre le prompt et les poids<\/a><\/li>\n<li><a href=\"#ce-que-cette-memoire-ne-regle-pas\">Ce que cette m\u00e9moire ne r\u00e8gle pas<\/a><\/li>\n<\/ul>\n<h2 id=\"l-essentiel-en-30-secondes\">L&rsquo;essentiel en 30 secondes<\/h2>\n<ul>\n<li>Une m\u00e9moire non param\u00e9trique, c&rsquo;est <strong>un savoir rang\u00e9 hors des poids<\/strong> : on l&rsquo;enrichit sans modifier un seul param\u00e8tre du mod\u00e8le.<\/li>\n<li>Elle compense ce que le mod\u00e8le ne sait pas faire seul : <strong>apprendre apr\u00e8s son entra\u00eenement<\/strong>.<\/li>\n<li>Elle se manie en trois gestes : <strong>\u00e9crire un souvenir, le retrouver par similarit\u00e9<\/strong>, le remettre sous les yeux du mod\u00e8le.<\/li>\n<li>Elle peut m\u00eame <strong>se r\u00e9\u00e9crire elle-m\u00eame<\/strong>, en distillant des r\u00e8gles \u00e0 partir des exp\u00e9riences accumul\u00e9es.<\/li>\n<li>Elle a ses propres pannes : <strong>des souvenirs p\u00e9rim\u00e9s, hors sujet ou trop nombreux<\/strong>.<\/li>\n<\/ul>\n<h2 id=\"un-savoir-qu-on-change-sans-toucher-au-modele\">Un savoir qu&rsquo;on change sans toucher au mod\u00e8le<\/h2>\n<p>Un mod\u00e8le de fondation se d\u00e9finit par ses param\u00e8tres, et il existe deux mani\u00e8res de le faire progresser. La premi\u00e8re entra\u00eene ou affine ces param\u00e8tres. La seconde am\u00e9liore automatiquement la performance du syst\u00e8me en les laissant tels quels : c&rsquo;est l&rsquo;<strong>apprentissage non param\u00e9trique<\/strong>, et la m\u00e9moire qui lui sert de support est la m\u00e9moire non param\u00e9trique.<\/p>\n<p>Le mot d\u00e9route. Il ne dit pas que le mod\u00e8le n&rsquo;a pas de param\u00e8tres : il garde les siens, simplement intacts. Ce qui \u00e9volue, c&rsquo;est ce qui se trouve \u00e0 c\u00f4t\u00e9 de lui, dans un stockage persistant o\u00f9 l&rsquo;on consigne des exemples, des enseignements ou des documents.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef47145009&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef47145009\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1122\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch01_memoire_parametrique-scaled.png\" alt=\"Deux m\u00e9moires pour un m\u00eame mod\u00e8le : les poids appris \u00e0 l'entra\u00eenement d'un c\u00f4t\u00e9, une source externe consult\u00e9e \u00e0 la demande de l'autre\" class=\"wp-image-115\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch01_memoire_parametrique-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch01_memoire_parametrique-300x131.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch01_memoire_parametrique-1024x449.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch01_memoire_parametrique-768x336.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch01_memoire_parametrique-1536x673.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/09\/b2_ch01_memoire_parametrique-2048x897.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Lis l&rsquo;\u00e9tiquette de la branche de droite : la source est externe, et c&rsquo;est \u00e0 la demande qu&rsquo;on va la chercher. La branche de gauche, elle, ne contient que ce que l&rsquo;entra\u00eenement a grav\u00e9 dans les poids.<\/figcaption><\/figure>\n\n\n<blockquote>\n<p><strong>\ud83d\udca1 Intuition<\/strong> Les poids, c&rsquo;est ce que le mod\u00e8le est devenu. La m\u00e9moire non param\u00e9trique, c&rsquo;est ce qu&rsquo;il a sous la main au moment de r\u00e9pondre.<\/p>\n<\/blockquote>\n<h2 id=\"pourquoi-les-poids-ne-suffisent-pas\">Pourquoi les poids ne suffisent pas<\/h2>\n<p>Une fois son pr\u00e9-entra\u00eenement termin\u00e9, un mod\u00e8le n&rsquo;apprend plus. Le r\u00e9ajuster co\u00fbte cher et ne se r\u00e9p\u00e8te pas \u00e0 volont\u00e9 : l&rsquo;<strong>apprentissage continu<\/strong> reste un probl\u00e8me ouvert. Un humain, lui, se souvient des strat\u00e9gies employ\u00e9es sur des probl\u00e8mes semblables, et en forge de nouvelles face \u00e0 l&rsquo;inconnu.<\/p>\n<p>Revenons \u00e0 ton agent de d\u00e9bogage. Glisser un exemple dans l&rsquo;invite est la premi\u00e8re parade, et elle a de vraies forces : elle personnalise les r\u00e9ponses aux pr\u00e9f\u00e9rences d&rsquo;un utilisateur, int\u00e8gre ses corrections en temps r\u00e9el et guide le raisonnement par des \u00e9tapes explicites. Sa limite tient en un mot : <strong>l&rsquo;adaptation est \u00e9ph\u00e9m\u00e8re<\/strong>. Pour garder ce qui a march\u00e9, il faut le promouvoir vers un m\u00e9canisme plus durable.<\/p>\n<p>C&rsquo;est pr\u00e9cis\u00e9ment la place d&rsquo;une m\u00e9moire non param\u00e9trique. Elle permet \u00e0 l&rsquo;agent d&rsquo;apprendre de son interaction avec l&rsquo;environnement, de s&rsquo;adapter \u00e0 des conditions qui changent et d&rsquo;affiner ses strat\u00e9gies. On y gagne en simplicit\u00e9, en rapidit\u00e9 et en r\u00e9activit\u00e9 au monde r\u00e9el.<\/p>\n<p>Un dernier avantage se voit en regardant l&rsquo;autre c\u00f4t\u00e9. Corriger ou retirer un savoir pr\u00e9cis dans les poids exige d&rsquo;intervenir \u00ab de fa\u00e7on chirurgicale \u00bb sur les param\u00e8tres sans d\u00e9truire d&rsquo;autres connaissances, et l&rsquo;\u00e9dition est plus d\u00e9licate encore que le d\u00e9sapprentissage. Dans une m\u00e9moire externe, tu travailles sur un stockage : s&rsquo;il g\u00e8re les op\u00e9rations de base (cr\u00e9er, lire, modifier, supprimer), tu as <strong>une prise directe sur le contenu<\/strong>.<\/p>\n<h2 id=\"ecrire-un-souvenir-puis-le-retrouver\">\u00c9crire un souvenir, puis le retrouver<\/h2>\n<p>Une m\u00e9moire non param\u00e9trique se manie en deux gestes. Pour \u00e9crire, on consigne les d\u00e9tails de chaque interaction : le contexte, les actions entreprises, les r\u00e9sultats et les retours re\u00e7us. Pour lire, l&rsquo;agent cherche dans sa banque les cas semblables \u00e0 la situation pr\u00e9sente, regarde les solutions qui ont servi et les adapte si besoin.<\/p>\n<h3>Quels souvenirs remettre sous les yeux du mod\u00e8le ?<\/h3>\n<p>La version la plus simple \u00e9crit les exemples en dur dans l&rsquo;invite, o\u00f9 ils ne changent plus. D\u00e8s que les exemples se multiplient, l&rsquo;invite gonfle : le co\u00fbt et la latence montent, et tous les exemples ne sont pas utiles pour toutes les entr\u00e9es. La solution courante consiste \u00e0 <strong>s\u00e9lectionner dynamiquement<\/strong> ceux qui comptent.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef471454b3&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef471454b3\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1164\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch07_exemples_fixes_dynamiques-scaled.png\" alt=\"Deux fa\u00e7ons d'alimenter l'invite : des exemples \u00e9crits en dur, ou des exemples r\u00e9ussis retrouv\u00e9s dans une base vectorielle d'apr\u00e8s la requ\u00eate\" class=\"wp-image-476\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch07_exemples_fixes_dynamiques-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch07_exemples_fixes_dynamiques-300x136.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch07_exemples_fixes_dynamiques-1024x465.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch07_exemples_fixes_dynamiques-768x349.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch07_exemples_fixes_dynamiques-1536x698.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch07_exemples_fixes_dynamiques-2048x931.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 les deux rang\u00e9es. En haut, l&rsquo;invite est la m\u00eame quelle que soit la question. En bas, la requ\u00eate interroge d&rsquo;abord une base d&rsquo;exemples r\u00e9ussis, et seuls les exemples pertinents rejoignent l&rsquo;invite avant l&rsquo;appel au mod\u00e8le.<\/figcaption><\/figure>\n\n\n<p>\u00c0 mesure que les exemples r\u00e9ussis s&rsquo;accumulent, on les retrouve par type, par recherche textuelle ou par recherche s\u00e9mantique.<\/p>\n<h3>Comment la m\u00e9moire sait ce qui se ressemble<\/h3>\n<p>La <a href=\"\/blog\/rag\/qu-est-ce-qu-une-recherche-vectorielle\/\" title=\"recherche s\u00e9mantique\">recherche s\u00e9mantique<\/a> repose sur des vecteurs. On encode d&rsquo;abord chaque texte \u00e0 retenir en un vecteur dense, avec un mod\u00e8le de fondation ou une autre technique de traitement du langage, puis on range ces vecteurs dans une base vectorielle con\u00e7ue pour manier de grandes dimensions. Quand une requ\u00eate arrive, on l&rsquo;encode de la m\u00eame fa\u00e7on et on cherche les vecteurs les plus proches : c&rsquo;est la m\u00e9thode dominante pour ce type de m\u00e9moire.<\/p>\n<p>Reste \u00e0 mesurer la proximit\u00e9. Le plus courant est la similarit\u00e9 cosinus entre le vecteur de la requ\u00eate <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-ac7da57d7f507262338bb5168feb3e06_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#113;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"8\" style=\"vertical-align: -4px;\"\/> et celui d&rsquo;un souvenir <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-4e8716946f6a868f015e0d62f28bc540_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#100;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"10\" style=\"vertical-align: 0px;\"\/> :<\/p>\n<p><p class=\"ql-center-displayed-equation\" style=\"line-height: 41px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-56e337dadde0b44d30dd18ee9a81fd3b_l3.png\" height=\"41\" width=\"135\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91; &#92;&#99;&#111;&#115;&#40;&#113;&#44;&#100;&#41;&#61;&#92;&#102;&#114;&#97;&#99;&#123;&#113;&#92;&#99;&#100;&#111;&#116;&#32;&#100;&#125;&#123;&#124;&#113;&#124;&#92;&#44;&#124;&#100;&#124;&#125;&#46;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n<p>Au num\u00e9rateur, le produit scalaire des deux vecteurs ; au d\u00e9nominateur, le produit de leurs longueurs. Le r\u00e9sultat mesure l&rsquo;angle entre eux : proche de 1 pour des textes tr\u00e8s semblables, proche de 0 pour des textes sans rapport, proche de \u22121 pour des sens oppos\u00e9s. Un souvenir qui dit la m\u00eame chose avec d&rsquo;autres mots reste donc proche de la question, l\u00e0 o\u00f9 une recherche par mots exacts passerait \u00e0 c\u00f4t\u00e9.<\/p>\n<h3>Le voir tourner en quelques lignes<\/h3>\n<p>Comment un agent retrouve-t-il, parmi deux textes enregistr\u00e9s, celui qui \u00e9claire la relation entre intelligence artificielle et apprentissage automatique ? Le code ci-dessous cr\u00e9e une m\u00e9moire vectorielle avec la biblioth\u00e8que <code>vectordb<\/code>, qui d\u00e9coupe chaque texte en fen\u00eatres glissantes de <strong>128 jetons avec un recouvrement de 16<\/strong>. Il y range deux textes avec leurs m\u00e9tadonn\u00e9es (titre, URL), puis retrouve les trois meilleures correspondances.<\/p>\n<pre><code>from vectordb import Memory\nmemory = Memory(chunking_strategy={'mode':'sliding_window', 'window_size': 128,\n'overlap': 16})\ntext = &quot;&quot;&quot;\nMachine learning is a method of data analysis that automates analytical\nmodel building. It is a branch of artificial intelligence based on the\nidea that systems can learn from data, identify patterns and make\ndecisions with minimal human intervention. Machine learning algorithms\nare trained on datasets that contain examples of the desired output.\nFor example, a machine learning algorithm that is used to classify\nimages might be trained on a dataset that contains images of cats\nand dogs. Once an algorithm is trained, it can be used to make\npredictions on new data. For example, the machine learning algorithm\nthat is used to classify images could be used to predict whether a new\nimage contains a cat or a dog.\n&quot;&quot;&quot;\nmetadata = {&quot;title&quot;: &quot;Introduction to Machine Learning&quot;, &quot;url&quot;:\n&quot;https:\/\/learn.microsoft.com\/en-us\/training\/modules\/&quot; +\n    &quot;introduction-to-machine-learning&quot;}\nmemory.save(text, metadata)\ntext2 = &quot;&quot;&quot;\nArtificial intelligence (AI) is the simulation of human intelligence in machines\nthat are programmed to think like humans and mimic their actions.\nThe term may also be applied to any machine that exhibits traits associated with\na human mind such as learning and problem-solving.\nAI research has been highly successful in developing effective techniques for\nsolving a wide range of problems, from game playing to medical diagnosis.\n&quot;&quot;&quot;\nmetadata2 = {&quot;title&quot;: &quot;Artificial Intelligence for Beginners&quot;, &quot;url&quot;:\n&quot;https:\/\/microsoft.github.io\/AI-for-Beginners&quot;}\nmemory.save(text2, metadata2)\nquery = &quot;What is the relationship between AI and machine learning?&quot;\nresults = memory.search(query, top_n=3)\n<\/code><\/pre>\n<p>Trois appels portent toute la logique. <code>Memory(...)<\/code> r\u00e8gle la fa\u00e7on de d\u00e9couper les textes, <code>memory.save(text, metadata)<\/code> \u00e9crit un souvenir avec ses m\u00e9tadonn\u00e9es, et <code>memory.search(query, top_n=3)<\/code> relit les trois plus proches de la question. Les m\u00e9tadonn\u00e9es servent \u00e0 garder la trace d&rsquo;o\u00f9 vient chaque souvenir.<\/p>\n<h2 id=\"quand-la-memoire-se-reecrit-elle-meme\">Quand la m\u00e9moire se r\u00e9\u00e9crit elle-m\u00eame<\/h2>\n<p>Garder chaque exp\u00e9rience brute a un d\u00e9faut : elles s&#8217;empilent. Une autre voie les <strong>distille<\/strong> : l&rsquo;apprentissage exp\u00e9rientiel part d&rsquo;une r\u00e9serve d&rsquo;exp\u00e9riences, en tire des enseignements, puis les condense en une courte liste de r\u00e8gles gr\u00e2ce \u00e0 quatre op\u00e9rations : ajouter, modifier, retirer, approuver.<\/p>\n<p>Le point de d\u00e9part est simple : on demande au mod\u00e8le de fondation de r\u00e9fl\u00e9chir aux observations renvoy\u00e9es par l&rsquo;environnement, pour y rep\u00e9rer des enseignements qui am\u00e9lioreraient la performance future. \u00c0 quoi cela ressemble-t-il dans le code ?<\/p>\n<pre><code>class InsightAgent:\n   def __init__(self):\n       self.insights = []\n       self.promoted_insights = []\n       self.demoted_insights = []\n       self.reflections = []\n\n   def generate_insight(self, observation):\n       # Use the LLM to generate an insight based on the observation\n       messages = [HumanMessage(content=f'''Generate an insightful analysis based\n           on the following observation: '{observation}'''')]\n       # Build the state graph\n       builder = StateGraph(MessagesState)\n       builder.add_node(&quot;generate_insight&quot;, call_model)\n       builder.add_edge(START, &quot;generate_insight&quot;)\n       graph = builder.compile()\n\n       # Invoke the graph with the messages\n       result = graph.invoke({&quot;messages&quot;: messages})\n       # Extract the generated insight\n       generated_insight = result[&quot;messages&quot;][-1].content\n       self.insights.append(generated_insight)\n       print(f&quot;Generated: {generated_insight}&quot;)\n       return generated_insight\n<\/code><\/pre>\n<p>La classe tient quatre listes : les enseignements, ceux qu&rsquo;on promeut, ceux qu&rsquo;on r\u00e9trograde, et les r\u00e9flexions. La m\u00e9thode <code>generate_insight<\/code> construit une invite \u00e0 partir d&rsquo;une observation, la fait passer par un petit graphe d&rsquo;\u00e9tat, puis stocke le r\u00e9sultat. <code>StateGraph<\/code>, <code>MessagesState<\/code> et <code>START<\/code> appartiennent au cadre LangGraph, et <code>call_model<\/code> est l&rsquo;enveloppe qui isole l&rsquo;appel au mod\u00e8le, pour que chaque n\u0153ud du graphe reste cibl\u00e9.<\/p>\n<p>Avec assez de retours, ce proc\u00e9d\u00e9 apprend des interactions avec l&rsquo;environnement et am\u00e9liore la performance dans le temps. Il permet aussi de <strong>s&rsquo;adapter \u00e0 un environnement qui change<\/strong> : si l&rsquo;agent doit ajuster sa politique, il le peut. Ces approches restent pratiques, abordables et faciles \u00e0 mettre en \u0153uvre, parfois en quelques lignes de code. Une variante, Reflexion, enregistre et r\u00e9injecte des r\u00e9flexions sur les \u00e9checs.<\/p>\n<blockquote>\n<p><strong>\ud83d\udca1 Intuition<\/strong> Les exp\u00e9riences sont les notes brutes d&rsquo;un carnet ; les r\u00e8gles, la fiche de r\u00e9vision qu&rsquo;on en tire. Une r\u00e8gle qui a fait ses preuves se promeut, une r\u00e8gle qui ne sert plus se retire.<\/p>\n<\/blockquote>\n<h2 id=\"entre-le-prompt-et-les-poids\">Entre le prompt et les poids<\/h2>\n<p>Ce qu&rsquo;un agent apprend se range \u00e0 trois niveaux, du plus fugace au plus durable. L&rsquo;invite d&rsquo;une session, d&rsquo;abord. La m\u00e9moire non param\u00e9trique, ensuite, qui persiste et se consulte. Au-dessus, des m\u00e9canismes plus permanents : ing\u00e9nierie d&rsquo;invite, mises \u00e0 jour de flux, ou r\u00e9entra\u00eenement complet du mod\u00e8le.<\/p>\n<p>L&rsquo;apprentissage en contexte sert souvent de premi\u00e8re ligne : il permet de tester vite et \u00e0 faible risque des am\u00e9liorations dans des interactions r\u00e9elles, avant de les codifier. En production, la boucle se referme ainsi : les retours de terrain font remonter les probl\u00e8mes, l&rsquo;exp\u00e9rimentation valide les correctifs, et l&rsquo;apprentissage continu les inscrit pour un effet imm\u00e9diat ou durable.<\/p>\n<p>O\u00f9 sont les poids dans cet escalier ? <strong>Tout en haut, en dernier recours.<\/strong> On commence par les approches non param\u00e9triques, plus simples et plus rapides ; quand on dispose de nombreux \u00e9chantillons, l&rsquo;<a href=\"\/blog\/inference\/le-finetuning-d-un-modele\/\" title=\"affinage\">affinage<\/a> devient une option \u00e0 consid\u00e9rer.<\/p>\n<h2 id=\"ce-que-cette-memoire-ne-regle-pas\">Ce que cette m\u00e9moire ne r\u00e8gle pas<\/h2>\n<p><strong>\u00ab Non param\u00e9trique veut dire sans param\u00e8tres. \u00bb<\/strong> Le mod\u00e8le garde les siens, seulement intacts : c&rsquo;est la m\u00e9moire autour de lui qui \u00e9volue.<\/p>\n<p><strong>\u00ab Plus de souvenirs, c&rsquo;est mieux. \u00bb<\/strong> Ajouter des exemples fait monter le co\u00fbt et la latence, et tous ne servent pas \u00e0 toutes les entr\u00e9es. M\u00eame quand les bons documents sont trouv\u00e9s, ils peuvent \u00eatre trop nombreux pour tenir dans le contexte du mod\u00e8le.<\/p>\n<p><strong>\u00ab Ce qu&rsquo;on retrouve est toujours juste. \u00bb<\/strong> Il faut tester qu&rsquo;une pr\u00e9f\u00e9rence obsol\u00e8te ou erron\u00e9e ne remonte pas \u00e0 cause d&rsquo;une fuite de donn\u00e9es ou d&rsquo;une erreur d&rsquo;indexation. Il faut aussi v\u00e9rifier qu&rsquo;une donn\u00e9e voisine mais hors sujet ne soit pas retrouv\u00e9e sur une simple ressemblance de formulation. La base elle-m\u00eame peut \u00eatre p\u00e9rim\u00e9e, ou mal index\u00e9e.<\/p>\n<p><strong>\u00ab On peut \u00e9crire dans n&rsquo;importe quel index. \u00bb<\/strong> Certaines biblioth\u00e8ques vectorielles sont statiques : leurs donn\u00e9es d&rsquo;index sont immuables, ce qui complique l&rsquo;ajout d&rsquo;informations nouvelles. FAISS n&rsquo;a pas \u00e9t\u00e9 con\u00e7u pour les op\u00e9rations de cr\u00e9ation, lecture, modification et suppression ; il convient quand la base est immuable et qu&rsquo;on se contente d&rsquo;y lire. Un syst\u00e8me dont la m\u00e9moire doit \u00e9voluer demande donc un stockage choisi pour cela.<\/p>\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Plus la m\u00e9moire couvre large, plus elle est sensible. Un agent d&rsquo;\u00e9quipe qui se rappelle une chose dite dans une conversation priv\u00e9e, ou un agent de d\u00e9partement qui fait remonter des donn\u00e9es confidentielles d&rsquo;une unit\u00e9 \u00e0 l&rsquo;autre, provoque une rupture de confiance ou de conformit\u00e9. Les fronti\u00e8res de confidentialit\u00e9 doivent \u00eatre respect\u00e9es, auditables et applicables.<\/p>\n<\/blockquote>\n<p>Reste \u00e0 savoir si la m\u00e9moire tient debout : on teste ses temps de r\u00e9cup\u00e9ration sous charge croissante, et on simule l&rsquo;indisponibilit\u00e9 de la base, la corruption de donn\u00e9es ou une migration de version pour v\u00e9rifier que l&rsquo;agent se r\u00e9tablit proprement.<\/p>\n<blockquote>\n<p><strong>\ud83d\udccc \u00c0 retenir<\/strong> Tu peux voir la m\u00e9moire non param\u00e9trique comme un carnet que l&rsquo;agent \u00e9crit, relit et r\u00e9vise : ses poids restent les m\u00eames, c&rsquo;est le carnet qui grandit. \u00c0 toi d&rsquo;en soigner le contenu, car ce que l&rsquo;agent retrouve conditionne tout ce qu&rsquo;il fera ensuite.<\/p>\n<\/blockquote>","protected":false},"excerpt":{"rendered":"<p>Une m\u00e9moire non param\u00e9trique garde le savoir d&rsquo;un agent hors de ses poids : on l&rsquo;\u00e9crit, on la relit, on la corrige. Comment elle marche, et o\u00f9 elle s&rsquo;arr\u00eate.<\/p>\n","protected":false},"author":1,"featured_media":477,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[],"class_list":["post-478","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-inference"],"_links":{"self":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/478","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=478"}],"version-history":[{"count":3,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/478\/revisions"}],"predecessor-version":[{"id":806,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/478\/revisions\/806"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media\/477"}],"wp:attachment":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media?parent=478"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/categories?post=478"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/tags?post=478"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}