[{"id":9725,"date":"2026-10-06T18:00:00","date_gmt":"2026-10-06T16:00:00","guid":{"rendered":"https:\/\/www.gridpak.com\/?p=9725"},"modified":"2026-09-26T15:32:16","modified_gmt":"2026-09-26T13:32:16","slug":"lexique-streaming-llm","status":"publish","type":"post","link":"https:\/\/www.gridpak.com\/lexique-streaming-llm\/","title":{"rendered":"Streaming LLM : d\u00e9finition, frames et marqueur de fin"},"content":{"rendered":"<p><strong>Le streaming LLM<\/strong> consiste \u00e0 recevoir une r\u00e9ponse de mod\u00e8le petit \u00e0 petit au lieu d\u2019attendre la fin compl\u00e8te. C\u2019est utile pour afficher rapidement le d\u00e9but d\u2019une r\u00e9ponse ou alimenter une interface de chat. Ollama documente le streaming de son API et indique aussi comment le d\u00e9sactiver.<\/p><h2>Frame, token et texte<\/h2><p>Ne confondez pas les niveaux. Une frame HTTP ou SSE est un morceau transport\u00e9. Elle peut contenir un fragment de texte, un token, plusieurs tokens ou une m\u00e9tadonn\u00e9e. Votre code doit assembler le contenu utile et attendre le marqueur de fin avant de consid\u00e9rer la r\u00e9ponse termin\u00e9e.<\/p><h2>Pourquoi c\u2019est pratique<\/h2><p>L\u2019utilisateur voit que le mod\u00e8le travaille. Pour un long texte, cela am\u00e9liore l\u2019exp\u00e9rience. Pour un traitement machine strict, le streaming complique parfois la validation JSON. Dans ce cas, d\u00e9sactivez-le ou validez seulement apr\u00e8s r\u00e9ception compl\u00e8te.<\/p><h2>Erreur fr\u00e9quente<\/h2><p>Beaucoup de scripts d\u00e9clenchent une action d\u00e8s qu\u2019un morceau contient un mot attendu. C\u2019est risqu\u00e9 : le mod\u00e8le peut corriger la phrase ensuite. Attendez le signal de fin, puis parsez la r\u00e9ponse finale.<\/p><h2>Bon usage<\/h2><p>Chat humain : streaming activ\u00e9. Extraction structur\u00e9e : streaming d\u00e9sactiv\u00e9 ou buffer complet. Logs : conservez la r\u00e9ponse finale plut\u00f4t que chaque fragment si vous voulez rejouer ou auditer.<\/p><h2>Impl\u00e9mentation robuste<\/h2><p>Le client doit accumuler les fragments dans un buffer, g\u00e9rer les lignes vides, ignorer les \u00e9v\u00e9nements non textuels si l\u2019API en envoie, puis fermer proprement au marqueur final. Si la connexion coupe au milieu, marquez la r\u00e9ponse comme incompl\u00e8te. Ne sauvegardez pas une r\u00e9ponse partielle comme si elle \u00e9tait valid\u00e9e.<\/p><h2>Interface utilisateur<\/h2><p>Dans une interface, affichez le flux pour rassurer l\u2019utilisateur, mais gardez les boutons d\u2019action sensibles d\u00e9sactiv\u00e9s tant que la r\u00e9ponse n\u2019est pas termin\u00e9e. Pour un agent qui d\u00e9clenche des outils, le streaming doit rester visuel : la d\u00e9cision d\u2019action doit se faire sur une r\u00e9ponse compl\u00e8te et valid\u00e9e.<\/p><h2>Stockage<\/h2><p>Pour l\u2019audit, stockez la r\u00e9ponse finale et les m\u00e9tadonn\u00e9es utiles : mod\u00e8le, heure, prompt, statut termin\u00e9 ou interrompu. Stocker chaque fragment est rarement utile hors debug et peut rendre les logs illisibles.<\/p><h2>Cas JSON<\/h2><p>Pour du JSON strict, demandez une r\u00e9ponse non stream\u00e9e quand c\u2019est possible. Sinon, bufferisez toute la r\u00e9ponse, retirez les marqueurs \u00e9ventuels, puis parsez une seule fois. Parser fragment par fragment cr\u00e9e des faux \u00e9checs.<\/p><h2>D\u00e9coupage r\u00e9seau et d\u00e9coupage du message<\/h2><p>Un morceau re\u00e7u sur le r\u00e9seau peut s&rsquo;arr\u00eater au milieu d&rsquo;une ligne JSON. \u00c0 l&rsquo;inverse, une lecture r\u00e9seau peut contenir plusieurs \u00e9v\u00e9nements. Le parseur doit reconstituer les messages selon le protocole annonc\u00e9 par l&rsquo;API, par exemple des objets JSON s\u00e9par\u00e9s par des retours \u00e0 la ligne, et non supposer qu&rsquo;une lecture \u00e9gale un token.<\/p><p>La pr\u00e9sence d&rsquo;un d\u00e9but de r\u00e9ponse r\u00e9duit l&rsquo;attente per\u00e7ue, pas n\u00e9cessairement le temps total de calcul. Mesurez s\u00e9par\u00e9ment le d\u00e9lai jusqu&rsquo;au premier fragment et celui jusqu&rsquo;\u00e0 la fin si vous comparez des configurations. Un flux interrompu reste incomplet m\u00eame si le texte affich\u00e9 para\u00eet grammaticalement termin\u00e9.<\/p><h2>Sources<\/h2><ul><li><a href=\"https:\/\/docs.ollama.com\/api\/streaming\" target=\"_blank\" rel=\"noopener\">docs.ollama.com\/api\/streaming<\/a><\/li><li><a href=\"https:\/\/docs.ollama.com\/api\/introduction\" target=\"_blank\" rel=\"noopener\">docs.ollama.com\/api\/introduction<\/a><\/li><\/ul>","protected":false},"excerpt":{"rendered":"Le streaming LLM envoie la r\u00e9ponse progressivement. Une frame r\u00e9seau n\u2019est pas forc\u00e9ment un token complet.","protected":false},"author":4,"featured_media":9724,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"nm_site":"","nm_pricing_link":"","nm_aff_link":"","nm_aff_status":"","nm_aff_platform":"","nm_aff_commission":"","nm_aff_cookie":0,"nm_code":"","nm_code_discount":"","nm_code_plans":"","nm_code_tested":"","nm_code_state":"","nm_button_label":"","nm_price_display":"","nm_entry_price":"","nm_price":"","nm_price_unit":"","nm_price_checked":"","nm_price_source_url":"","nm_price_source_kind":"","nm_price_note":"","nm_verdict":"","nm_pros":"","nm_cons":"","nm_rating":"","nm_criteria":"","nm_faq":"","nm_tool_slug":"","nm_tool_name":"","nm_tool_category":"","nm_guide_checked":"","nm_job_title":"","nm_meta_title":"","nm_canonical":"","nm_source_provenance":"","nm_deal_main":"","nm_deal_titre":"","nm_deal_meta_titre":"","nm_deal_meta":"","_nm_source":"","gp_robots":"","footnotes":""},"categories":[200,199],"tags":[],"class_list":["post-9725","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-archives","category-lexique"],"_links":{"self":[{"href":"https:\/\/www.gridpak.com\/wp-json\/wp\/v2\/posts\/9725","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gridpak.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gridpak.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gridpak.com\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gridpak.com\/wp-json\/wp\/v2\/comments?post=9725"}],"version-history":[{"count":1,"href":"https:\/\/www.gridpak.com\/wp-json\/wp\/v2\/posts\/9725\/revisions"}],"predecessor-version":[{"id":10679,"href":"https:\/\/www.gridpak.com\/wp-json\/wp\/v2\/posts\/9725\/revisions\/10679"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gridpak.com\/wp-json\/wp\/v2\/media\/9724"}],"wp:attachment":[{"href":"https:\/\/www.gridpak.com\/wp-json\/wp\/v2\/media?parent=9725"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gridpak.com\/wp-json\/wp\/v2\/categories?post=9725"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gridpak.com\/wp-json\/wp\/v2\/tags?post=9725"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}]