{"id":578,"date":"2026-10-09T11:44:51","date_gmt":"2026-10-09T09:44:51","guid":{"rendered":"https:\/\/www.ranksignal.fr\/blog\/?p=578"},"modified":"2026-10-14T17:02:21","modified_gmt":"2026-10-14T15:02:21","slug":"l-etape-du-prefill-d-un-llm","status":"publish","type":"post","link":"https:\/\/www.ranksignal.fr\/blog\/inference\/l-etape-du-prefill-d-un-llm\/","title":{"rendered":"Le prefill d&rsquo;un LLM : la lecture qui pr\u00e9c\u00e8de le premier mot"},"content":{"rendered":"<p><\/p>\n<p>Tu poses ta question \u00e0 un assistant, et pendant un court instant, rien ne s&rsquo;affiche. Puis le premier mot appara\u00eet, et la suite d\u00e9file. Ce silence n&rsquo;est pas une panne : c&rsquo;est le mod\u00e8le qui lit, d&rsquo;un coup, tout ce que tu lui as envoy\u00e9. Tu vas voir ce qu&rsquo;il calcule pendant cette lecture, ce qu&rsquo;il en garde, et pourquoi elle p\u00e8se de plus en plus lourd quand le prompt s&rsquo;allonge.<\/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=\"#ce-que-le-modele-recoit-avant-d-ecrire-un-mot\">Ce que le mod\u00e8le re\u00e7oit avant d&rsquo;\u00e9crire un mot<\/a><\/li>\n<li><a href=\"#le-prefill-en-une-phrase-lire-d-un-coup-puis-ecrire\">Le prefill en une phrase : lire d&rsquo;un coup, puis \u00e9crire<\/a><\/li>\n<li><a href=\"#ce-que-calcule-le-modele-pour-chaque-token\">Ce que calcule le mod\u00e8le pour chaque token<\/a><\/li>\n<li><a href=\"#le-cache-kv-la-trace-que-laisse-la-lecture\">Le cache KV : la trace que laisse la lecture<\/a><\/li>\n<li><a href=\"#pourquoi-un-prompt-long-coute-plus-qu-un-prompt-court\">Pourquoi un prompt long co\u00fbte plus qu&rsquo;un prompt court<\/a><\/li>\n<li><a href=\"#trois-idees-recues-sur-le-prefill\">Trois id\u00e9es re\u00e7ues sur le prefill<\/a><\/li>\n<li><a href=\"#quand-le-prefill-devient-le-poste-qui-pese\">Quand le prefill devient le poste qui p\u00e8se<\/a><\/li>\n<\/ul>\n<h2 id=\"l-essentiel-en-30-secondes\">L&rsquo;essentiel en 30 secondes<\/h2>\n<ul>\n<li>Le <strong>prefill est la premi\u00e8re phase<\/strong> de l&rsquo;inf\u00e9rence : le mod\u00e8le traite d&rsquo;un coup toute la s\u00e9quence d&rsquo;entr\u00e9e.<\/li>\n<li>Il laisse deux produits : <strong>le cache KV et le premier token<\/strong>.<\/li>\n<li>Chaque token d&rsquo;entr\u00e9e re\u00e7oit sa requ\u00eate, sa cl\u00e9 et sa valeur : <strong>des calculs parall\u00e8les<\/strong>, que les GPU dig\u00e8rent bien.<\/li>\n<li>Le co\u00fbt de l&rsquo;attention cro\u00eet avec <strong>le carr\u00e9 de la longueur du prompt<\/strong>.<\/li>\n<li>Le prefill ne domine la charge que si <strong>les entr\u00e9es sont longues et le trafic massif<\/strong>.<\/li>\n<\/ul>\n<h2 id=\"ce-que-le-modele-recoit-avant-d-ecrire-un-mot\">Ce que le mod\u00e8le re\u00e7oit avant d&rsquo;\u00e9crire un mot<\/h2>\n<p>Imagine que tu construis un assistant cens\u00e9 r\u00e9pondre \u00e0 \u00ab Who won the 2023 Cricket World Cup? \u00bb en s&rsquo;appuyant sur des documents. Il n&rsquo;envoie pas la question seule au mod\u00e8le : il va d&rsquo;abord chercher un passage pertinent dans une base, puis colle question, passage et consignes dans un seul texte.<\/p>\n<pre><code>query = &quot;Who won the 2023 Cricket World Cup?&quot;\nretrieved_docs = vector_store.similarity_search(query, k=2)\nretrieved_context = retrieved_docs[0].page_content\n\naugmented_prompt = f&quot;&quot;&quot;\nGiven the context below, answer the question.\nQuestion: {query}\nContext : {retrieved_context}\nRemember to answer only based on the context provided and not from any other\nsource.\nIf the question cannot be answered based on the provided context, say I don't\nknow.\n&quot;&quot;&quot;\n<\/code><\/pre>\n<p>Ici, <code>vector_store<\/code> est la base de passages d\u00e9j\u00e0 index\u00e9s, et <code>similarity_search<\/code> en ram\u00e8ne les <code>k=2<\/code> plus proches de la question. Le code garde le premier, l&rsquo;ins\u00e8re dans le texte avec une consigne stricte (r\u00e9pondre uniquement d&rsquo;apr\u00e8s ce contexte), et range le tout dans <code>augmented_prompt<\/code>.<\/p>\n<p>C&rsquo;est ce texte entier, converti en tokens, que le mod\u00e8le re\u00e7oit. La question tient en une ligne ; le passage r\u00e9cup\u00e9r\u00e9, lui, peut \u00eatre bien plus long. Or <strong>la latence augmente beaucoup avec un long prompt<\/strong>, et le co\u00fbt par requ\u00eate aussi.<\/p>\n<p>Avant qu&rsquo;un seul mot de r\u00e9ponse ne sorte, tout ce texte doit donc \u00eatre lu. Cette lecture a un nom : le prefill.<\/p>\n<h2 id=\"le-prefill-en-une-phrase-lire-d-un-coup-puis-ecrire\">Le prefill en une phrase : lire d&rsquo;un coup, puis \u00e9crire<\/h2>\n<p>Le <strong>prefill<\/strong> est la phase o\u00f9 le moteur traite la s\u00e9quence d&rsquo;entr\u00e9e pour calculer l&rsquo;attention de chaque token d&rsquo;entr\u00e9e et ranger le r\u00e9sultat dans un cache KV. Contrairement \u00e0 ce que l&rsquo;on pourrait croire, il ne lit pas token apr\u00e8s token : son attention parcourt <strong>toute la s\u00e9quence d&rsquo;entr\u00e9e d&rsquo;un coup<\/strong>.<\/p>\n<p>Il se termine par le calcul du premier token. Le moteur de prefill produit alors le cache KV et ce premier token, puis passe la main \u00e0 la phase de g\u00e9n\u00e9ration, le <a href=\"\/blog\/inference\/l-etape-du-decode-d-un-llm\/\" title=\"decode\">decode<\/a>, qui calcule tous les suivants.<\/p>\n<blockquote>\n<p><strong>\ud83d\udca1 Intuition<\/strong> Pense \u00e0 un traducteur qui lit tout le paragraphe avant de poser le premier mot de sa traduction. Le prefill est cette lecture ; le decode, la r\u00e9daction qui s&rsquo;appuie sur elle.<\/p>\n<\/blockquote>\n<p>\u00c0 quoi sert de lire avant d&rsquo;\u00e9crire ? \u00c0 ne pas relire. Le cache KV garde les paires cl\u00e9-valeur de chaque token pr\u00e9c\u00e9dent : au lieu de <strong>les recalculer \u00e0 chaque fois<\/strong>, on les lit en m\u00e9moire.<\/p>\n<h2 id=\"ce-que-calcule-le-modele-pour-chaque-token\">Ce que calcule le mod\u00e8le pour chaque token<\/h2>\n<p>Place-toi \u00e0 l&rsquo;entr\u00e9e du mod\u00e8le. Ton prompt est un tableau <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-d4ee28752517d6062a3ca0314890342d_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#88;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"16\" style=\"vertical-align: 0px;\"\/> : une ligne par token, chaque ligne \u00e9tant le vecteur qui le repr\u00e9sente. Trois matrices de poids apprises, <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-7fccbd0094f3f2e5ddc2c992d4c746ff_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#87;&#95;&#81;\" title=\"Rendered by QuickLaTeX.com\" height=\"18\" width=\"28\" style=\"vertical-align: -6px;\"\/>, <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-524fd3133c66387f8df55c37c833cf78_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#87;&#95;&#75;\" title=\"Rendered by QuickLaTeX.com\" height=\"15\" width=\"30\" style=\"vertical-align: -3px;\"\/> et <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-a73c8e79b62237676f09765c314f8bcf_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#87;&#95;&#86;\" title=\"Rendered by QuickLaTeX.com\" height=\"15\" width=\"28\" style=\"vertical-align: -3px;\"\/>, le transforment en trois nouveaux tableaux.<\/p>\n<p><p class=\"ql-center-displayed-equation\" style=\"line-height: 17px;\"><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-60b1b8c99c0762f15118e803bf414627_l3.png\" height=\"17\" width=\"341\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91; &#81;&#61;&#88;&#87;&#95;&#81;&#44;&#92;&#113;&#113;&#117;&#97;&#100;&#32;&#75;&#61;&#88;&#87;&#95;&#75;&#44;&#92;&#113;&#113;&#117;&#97;&#100;&#32;&#86;&#61;&#88;&#87;&#95;&#86;&#46;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n<p>Lis ces trois produits comme trois r\u00f4les. <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-2c758bec4c272382411b95fc0e7ee250_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#81;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"14\" style=\"vertical-align: -4px;\"\/>, la requ\u00eate, est le centre d&rsquo;attention du moment ; <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-ea9c87a513e4a72624155d392fae86e2_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#75;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"16\" style=\"vertical-align: 0px;\"\/>, les cl\u00e9s, renseignent le mod\u00e8le sur les entr\u00e9es pr\u00e9c\u00e9dentes ; <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-63ada879859a9e41fd935f035b7313bc_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#86;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/>, les valeurs, servent \u00e0 en extraire l&rsquo;information finale. Comme <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-d4ee28752517d6062a3ca0314890342d_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#88;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"16\" style=\"vertical-align: 0px;\"\/> contient tous les tokens du prompt, <strong>un seul produit de matrices<\/strong> donne <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-2c758bec4c272382411b95fc0e7ee250_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#81;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"14\" style=\"vertical-align: -4px;\"\/>, <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-ea9c87a513e4a72624155d392fae86e2_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#75;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"16\" style=\"vertical-align: 0px;\"\/> et <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-63ada879859a9e41fd935f035b7313bc_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#86;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/> pour chacun d&rsquo;eux.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef4736f7a6&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef4736f7a6\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2340\" height=\"1320\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch02_auto_attention_qkv.png\" alt=\"Auto-attention : l'entr\u00e9e X est projet\u00e9e en Q, K et V, le produit de Q par K donne des poids entre 0 et 1, et la sortie est une somme pond\u00e9r\u00e9e des V\" class=\"wp-image-574\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch02_auto_attention_qkv.png 2340w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch02_auto_attention_qkv-300x169.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch02_auto_attention_qkv-1024x578.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch02_auto_attention_qkv-768x433.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch02_auto_attention_qkv-1536x866.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch02_auto_attention_qkv-2048x1155.png 2048w\" sizes=\"auto, (max-width: 2340px) 100vw, 2340px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n<p>Les poids viennent de la formule d&rsquo;attention proprement dite :<\/p>\n<p><p class=\"ql-center-displayed-equation\" style=\"line-height: 45px;\"><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-b4a0c8ab6def29e3f6029fce3672b97c_l3.png\" height=\"45\" width=\"321\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91; &#92;&#109;&#97;&#116;&#104;&#114;&#109;&#123;&#65;&#116;&#116;&#101;&#110;&#116;&#105;&#111;&#110;&#125;&#40;&#81;&#44;&#75;&#44;&#86;&#41;&#61;&#92;&#109;&#97;&#116;&#104;&#114;&#109;&#123;&#115;&#111;&#102;&#116;&#109;&#97;&#120;&#125;&#92;&#33;&#92;&#108;&#101;&#102;&#116;&#40;&#92;&#102;&#114;&#97;&#99;&#123;&#81;&#75;&#94;&#123;&#84;&#125;&#125;&#123;&#92;&#115;&#113;&#114;&#116;&#123;&#100;&#95;&#107;&#125;&#125;&#92;&#114;&#105;&#103;&#104;&#116;&#41;&#86;&#46;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n<p>Dans cette expression, chaque requ\u00eate est mise face \u00e0 chaque cl\u00e9 par <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-b73f56284f1a0b59708c7dbc60f522ed_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#81;&#75;&#94;&#123;&#84;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"40\" style=\"vertical-align: -4px;\"\/>, et la softmax convertit ces scores en poids entre 0 et 1, qui dosent ensuite les valeurs <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-63ada879859a9e41fd935f035b7313bc_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#86;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/>. Quant \u00e0 <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-0887ac312e8d3a39ae4869b2e0e0c478_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#115;&#113;&#114;&#116;&#123;&#100;&#95;&#107;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"18\" width=\"32\" style=\"vertical-align: -3px;\"\/>, la racine de la dimension des cl\u00e9s, il emp\u00eache des produits scalaires trop grands de concentrer toute la masse sur quelques \u00e9l\u00e9ments.<\/p>\n<p>Deux d\u00e9tails distinguent le cas d&rsquo;un <a href=\"\/blog\/inference\/qu-est-ce-qu-un-llm\/\" title=\"LLM\">LLM<\/a>. D&rsquo;abord, un <strong>masque causal<\/strong> emp\u00eache chaque token de regarder ceux qui le suivent : m\u00eame si tout est calcul\u00e9 en une fois, un token ne voit que son pass\u00e9. Ensuite, l&rsquo;attention est multi-t\u00eates : chaque t\u00eate est une op\u00e9ration d&rsquo;attention, les t\u00eates tournent en parall\u00e8le, et chacune peut s&rsquo;occuper d&rsquo;une relation diff\u00e9rente, comme l&rsquo;accord sujet-verbe.<\/p>\n<p>Cette organisation explique pourquoi le prefill convient si bien au mat\u00e9riel. Tous les calculs peuvent se faire en parall\u00e8le, donc sur GPU, chaque t\u00eate \u00e9tant ind\u00e9pendante. Et l&rsquo;on relie des mots \u00e9loign\u00e9s <strong>sans attendre les pas de temps successifs<\/strong> qu&rsquo;imposaient les <a href=\"\/blog\/deep-learning\/que-sont-les-reseaux-recurrents\/\" title=\"r\u00e9seaux r\u00e9currents\">r\u00e9seaux r\u00e9currents<\/a>.<\/p>\n<h2 id=\"le-cache-kv-la-trace-que-laisse-la-lecture\">Le cache KV : la trace que laisse la lecture<\/h2>\n<p>\u00c0 la fin de cette lecture, il reste quelque chose : les cl\u00e9s et les valeurs de chaque token du prompt. C&rsquo;est le cache KV, un composant standard de l&rsquo;attention. Il est construit pendant le prefill, utilis\u00e9 et mis \u00e0 jour pendant le decode, et vit par d\u00e9faut dans la m\u00e9moire du GPU.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef4736fbfd&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef4736fbfd\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2249\" height=\"981\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch10_cache_kv.png\" alt=\"Cache KV : sans cache, K et V de tous les tokens pr\u00e9c\u00e9dents sont recalcul\u00e9s \u00e0 chaque \u00e9tape ; avec cache, ils sont relus et seul le nouveau token est calcul\u00e9\" class=\"wp-image-575\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch10_cache_kv.png 2249w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch10_cache_kv-300x131.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch10_cache_kv-1024x447.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch10_cache_kv-768x335.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch10_cache_kv-1536x670.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch10_cache_kv-2048x893.png 2048w\" sizes=\"auto, (max-width: 2249px) 100vw, 2249px\" \/><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 panneaux : \u00e0 gauche, les cases orange s&#8217;empilent en escalier, car chaque \u00e9tape recalcule tout ; \u00e0 droite, les cases bleues sont de simples relectures et il ne reste qu&rsquo;une case orange par \u00e9tape. Cette case orange, c&rsquo;est le travail minimal de chaque nouveau token.<\/figcaption><\/figure>\n\n\n<p>Cette trace n&rsquo;est pas gratuite. Une s\u00e9quence devient \u00ab long contexte \u00bb quand elle produit un cache KV assez grand pour poser probl\u00e8me pendant l&rsquo;inf\u00e9rence. Selon le mod\u00e8le, le mat\u00e9riel, le moteur et le trafic, cela arrive au-del\u00e0 de seuils comme 32 000, 64 000 ou 128 000 tokens.<\/p>\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Avec de longues s\u00e9quences, le cache peut devenir <strong>le principal consommateur de VRAM<\/strong>, la ressource m\u00eame qui limite le decode. Un prefill qui avale un tr\u00e8s long prompt pr\u00e9pare donc, sans bruit, un decode \u00e0 l&rsquo;\u00e9troit.<\/p>\n<\/blockquote>\n<h2 id=\"pourquoi-un-prompt-long-coute-plus-qu-un-prompt-court\">Pourquoi un prompt long co\u00fbte plus qu&rsquo;un prompt court<\/h2>\n<p>Revenons \u00e0 la formule d&rsquo;attention. Chaque token y d\u00e9pend des cl\u00e9s et des valeurs de tous les tokens qui le pr\u00e9c\u00e8dent : le co\u00fbt de l&rsquo;attention cro\u00eet donc <strong>de fa\u00e7on quadratique avec la longueur d&rsquo;entr\u00e9e<\/strong>. Pour une s\u00e9quence de longueur <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-f9ed275b0bf1633b7ee83b78fcc28273_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#84;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"13\" style=\"vertical-align: 0px;\"\/> et une dimension <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;\"\/>, le temps et l&rsquo;espace s&rsquo;\u00e9crivent :<\/p>\n<p><p class=\"ql-center-displayed-equation\" style=\"line-height: 22px;\"><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-e2c136abde298d9d57ba0befe906c784_l3.png\" height=\"22\" width=\"361\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91; &#92;&#116;&#101;&#120;&#116;&#123;&#116;&#101;&#109;&#112;&#115;&#125;&#61;&#79;&#40;&#84;&#94;&#123;&#50;&#125;&#43;&#100;&#41;&#44;&#92;&#113;&#113;&#117;&#97;&#100;&#32;&#92;&#116;&#101;&#120;&#116;&#123;&#101;&#115;&#112;&#97;&#99;&#101;&#125;&#61;&#79;&#40;&#84;&#94;&#123;&#50;&#125;&#43;&#84;&#100;&#41;&#46;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n<p>Le terme en <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-e346eb8d0577026f5f8b94f4bdaf8317_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#84;&#94;&#123;&#50;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"15\" width=\"20\" style=\"vertical-align: 0px;\"\/> domine d\u00e8s que le prompt s&rsquo;allonge, et le produit scalaire en est le coupable. Mesure ce que cela signifie : doubler <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-f9ed275b0bf1633b7ee83b78fcc28273_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#84;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"13\" style=\"vertical-align: 0px;\"\/> multiplie ce terme par quatre. Dans notre assistant, passer d&rsquo;un passage r\u00e9cup\u00e9r\u00e9 \u00e0 deux fait presque doubler le prompt, donc presque quadrupler la part quadratique de la lecture.<\/p>\n<p>Heureusement, la note n&rsquo;est pas pay\u00e9e \u00e0 chaque token. Pendant la g\u00e9n\u00e9ration, gr\u00e2ce au cache KV, l&rsquo;attention redevient <strong>lin\u00e9aire en pratique<\/strong>. Elle reste malgr\u00e9 tout l&rsquo;une des parties les plus ch\u00e8res de l&rsquo;inf\u00e9rence, quels que soient le mod\u00e8le et l&rsquo;architecture, et de nombreuses variantes ont \u00e9t\u00e9 propos\u00e9es pour la r\u00e9duire.<\/p>\n<h2 id=\"trois-idees-recues-sur-le-prefill\">Trois id\u00e9es re\u00e7ues sur le prefill<\/h2>\n<h3>\u00ab Le prefill, c&rsquo;est le d\u00e9but de la r\u00e9ponse \u00bb<\/h3>\n<p>\u00c0 moiti\u00e9 vrai. Il produit bien le premier token, mais le reste de la r\u00e9ponse rel\u00e8ve du decode, un autre moteur dans les syst\u00e8mes qui s\u00e9parent les deux phases. Ce que le prefill fait pour l&rsquo;essentiel, c&rsquo;est <strong>lire et m\u00e9moriser<\/strong>, pas r\u00e9diger.<\/p>\n<h3>\u00ab Il avance token par token, comme la g\u00e9n\u00e9ration \u00bb<\/h3>\n<p>Non. Le prefill traite le prompt en parall\u00e8le, alors que la g\u00e9n\u00e9ration produit ses tokens l&rsquo;un apr\u00e8s l&rsquo;autre. C&rsquo;est pour cela que la lecture d&rsquo;un long prompt se fait en une passe massive plut\u00f4t qu&rsquo;en milliers de petits pas.<\/p>\n<h3>\u00ab Seuls les mod\u00e8les de texte ont un prefill \u00bb<\/h3>\n<p>Ce n&rsquo;est pas si simple. Les mod\u00e8les d&rsquo;images et de vid\u00e9os g\u00e9n\u00e8rent par d\u00e9bruitage it\u00e9ratif, non par g\u00e9n\u00e9ration autor\u00e9gressive, mais leur attention doit consid\u00e9rer l&rsquo;objet entier d&rsquo;un coup, et leur inf\u00e9rence est limit\u00e9e par le calcul, comme le prefill.<\/p>\n<p>Pour un mod\u00e8le qui lit des images avec du texte, l&rsquo;effet est direct : images et vid\u00e9os sont converties en tokens visuels, et une repr\u00e9sentation haute r\u00e9solution demande <strong>environ quatre fois plus de tokens<\/strong> qu&rsquo;une basse r\u00e9solution. Quatre fois plus de tokens \u00e0 lire, c&rsquo;est un prefill nettement plus lourd.<\/p>\n<h2 id=\"quand-le-prefill-devient-le-poste-qui-pese\">Quand le prefill devient le poste qui p\u00e8se<\/h2>\n<p>Le prefill m\u00e9rite des GPU \u00e0 part dans un cas pr\u00e9cis : quand on s\u00e9pare la lecture de la r\u00e9daction, c&rsquo;est-\u00e0-dire quand on d\u00e9sagr\u00e8ge les deux phases. Cette d\u00e9sagr\u00e9gation n&rsquo;a de sens que si trois conditions se r\u00e9unissent.<\/p>\n<ul>\n<li>Un <strong>grand volume de trafic<\/strong>, de cent millions \u00e0 un milliard de tokens par jour selon la taille du mod\u00e8le.<\/li>\n<li>Un mod\u00e8le d&rsquo;au moins cent milliards de param\u00e8tres.<\/li>\n<li>Un trafic lourd en prefill, c&rsquo;est-\u00e0-dire de <strong>longues s\u00e9quences d&rsquo;entr\u00e9e<\/strong>.<\/li>\n<\/ul>\n<p>Si l&rsquo;une des deux premi\u00e8res conditions manque, tu gaspilles probablement du mat\u00e9riel pour un gain minime. Si c&rsquo;est la troisi\u00e8me, mieux vaut ajouter des r\u00e9plicas : les moteurs de decode sont plus efficaces pour de courtes s\u00e9quences ou quand le cache de pr\u00e9fixe r\u00e9ussit.<\/p>\n<p>Le cas d&rsquo;\u00e9cole est un \u00e9diteur de code : de nombreux d\u00e9veloppeurs y envoient en m\u00eame temps de gros morceaux de code vari\u00e9s comme contexte, ce qui donne des quantit\u00e9s de tokens, surtout de prefill, sur un LLM de mille milliards de param\u00e8tres.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef4736ffd9&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef4736ffd9\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"981\" 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_ch09_desagregation_prefill_decode-scaled.png\" alt=\"D\u00e9sagr\u00e9gation : une requ\u00eate arrive au moteur de prefill, qui produit le cache KV et le premier token, transmis par l'interconnexion au moteur de decode ; en mode conditionnel, le decode fait lui-m\u00eame le prefill d'une entr\u00e9e courte ou d\u00e9j\u00e0 en cache\" class=\"wp-image-576\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch09_desagregation_prefill_decode-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch09_desagregation_prefill_decode-300x115.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch09_desagregation_prefill_decode-1024x392.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch09_desagregation_prefill_decode-768x294.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch09_desagregation_prefill_decode-1536x589.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch09_desagregation_prefill_decode-2048x785.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\">Rep\u00e8re ce que transporte la liaison entre les deux moteurs : le cache KV et le premier token, du prefill vers le decode. Et lis la remarque sur le mode conditionnel, plus proche du trafic r\u00e9el : la requ\u00eate arrive d&rsquo;abord au moteur de decode, qui traite seul le prefill si l&rsquo;entr\u00e9e est courte ou d\u00e9j\u00e0 en cache, et ne transf\u00e8re \u00e0 un moteur de prefill que le reste.<\/figcaption><\/figure>\n\n\n<p>Un avantage de cette s\u00e9paration : chaque moteur s&rsquo;optimise pour son travail. Le moteur de prefill, limit\u00e9 par le calcul, demande par exemple un parall\u00e9lisme tensoriel plus bas que le moteur de decode, limit\u00e9 par la m\u00e9moire.<\/p>\n<p>Pour d\u00e9cider si cela te concerne, regarde ton propre trafic. Si tes prompts ressemblent \u00e0 celui de notre assistant, avec beaucoup de tokens en entr\u00e9e, le prefill est ton poste principal. Si les entr\u00e9es sont courtes, ton temps se joue ailleurs, et le prefill restera, pour toi, une simple lecture rapide avant le premier mot.<\/p>","protected":false},"excerpt":{"rendered":"<p>Avant d&rsquo;\u00e9crire, un LLM lit tout ton prompt d&rsquo;un coup. Ce que calcule le prefill, ce qu&rsquo;il laisse derri\u00e8re lui, et pourquoi un prompt long co\u00fbte plus cher.<\/p>\n","protected":false},"author":1,"featured_media":577,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[],"class_list":["post-578","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\/578","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=578"}],"version-history":[{"count":4,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/578\/revisions"}],"predecessor-version":[{"id":768,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/578\/revisions\/768"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media\/577"}],"wp:attachment":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media?parent=578"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/categories?post=578"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/tags?post=578"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}