Darkwood Blog Blog
  • Articles
  • Auto
  • Releases
fr
  • de
  • en
Connexion
  • Blog
  • Articles
  • Auto
  • Releases

💳 Flow Tokens - Pourquoi l’optimisation des tokens est un problùme de flux, pas de vocabulaire

le 21 juin 2026

Connectez-vous pour réagir à cet article

🚀 1

L’essor des agents IA a remis un sujet au centre de nombreuses architectures logicielles : le coĂ»t du contexte.

Lorsqu’un agent exĂ©cute un workflow, il ne consomme pas uniquement un prompt utilisateur. Il consomme Ă©galement une grande quantitĂ© de donnĂ©es annexes :

  • logs d’exĂ©cution
  • sorties de commandes CLI
  • rĂ©sultats d’outils
  • traces de debugging
  • chunks issus de RAG
  • fichiers bruts ou semi-structurĂ©s

Dans la pratique, ce contexte représente souvent le coût principal du workflow, bien avant la phase de raisonnement du modÚle.

La question devient alors :

Comment réduire la consommation de tokens sans dégrader la qualité du signal transmis au modÚle ?

Une intuition fréquente consiste à optimiser le vocabulaire : raccourcir des mots, abréger certains concepts métier, condenser artificiellement les textes.

Cette intuition est généralement mauvaise.

L’optimisation des tokens n’est pas un problùme lexical.

C’est un problùme de flux.

Le vrai problÚme : un contexte non maßtrisé

Dans de nombreux systĂšmes, les donnĂ©es entrent dans la chaĂźne IA sous la forme d’une immense chaĂźne de caractĂšres.

Prenons un exemple classique.

Un agent doit analyser le rĂ©sultat d’une commande Symfony ou Composer.

La sortie peut contenir :

  • des lignes de debug rĂ©pĂ©titives
  • des timestamps
  • des sĂ©quences ANSI
  • des stack traces
  • des lignes de progression
  • des informations rĂ©ellement utiles

Pour un humain, la séparation entre bruit et signal est immédiate.

Pour un LLM, tout est initialement équivalent.

Chaque caractĂšre peut devenir un token.

Chaque token a un coût.

Chaque coĂ»t consomme une partie de la fenĂȘtre de contexte.

Le problùme n’est donc pas seulement la taille du texte.

Le problĂšme est l’absence de structure dans la maniĂšre dont les donnĂ©es circulent.

Token optimization is stream discipline

La thĂšse de cet article est simple :

Token optimization is not word shortening. Token optimization is stream discipline.

Autrement dit :

ce qui compte n’est pas la maniĂšre dont les mots sont orthographiĂ©s, mais la maniĂšre dont les donnĂ©es se dĂ©placent dans le systĂšme.

Une architecture orientée flux permet de :

  • nettoyer les donnĂ©es
  • segmenter les donnĂ©es
  • mesurer leur coĂ»t
  • compresser les rĂ©pĂ©titions
  • appliquer un budget explicite

Ce changement de perspective est important.

Nous ne cherchons plus Ă  compresser des mots.

Nous cherchons Ă  contrĂŽler un flux.

Flow comme modùle d’orchestration

C’est prĂ©cisĂ©ment l’angle explorĂ© avec Flow.

Flow n’est pas seulement un moteur d’exĂ©cution de tĂąches.

Flow peut ĂȘtre vu comme une couche d’orchestration du mouvement de la donnĂ©e.

Les données peuvent circuler :

  • comme un pipe
  • comme un stream
  • comme des chunks
  • comme un contexte mesurable
  • comme un contexte budgetĂ©

Ce modÚle est particuliÚrement intéressant pour les workflows agentiques, car un agent consomme rarement des objets métier fortement typés.

Il consomme essentiellement du texte.

Ce texte devient alors une ressource qu’il faut piloter.

Démonstration : flow-pipe

Pour explorer cette idĂ©e, j’ai construit une dĂ©monstration Symfony disponible ici :

flow-pipe repository

Le projet expose une commande console :

php bin/console app:flow-token-demo \
  --input=flow-engine-log --show-chunks

Le but n’est pas d’appeler un LLM.

Le but est de simuler localement une pipeline de traitement de contexte.

Le pipeline suit huit étapes :

  1. Charger une source
  2. Retirer les séquences ANSI
  3. Supprimer le bruit
  4. Normaliser les espaces
  5. Découper en chunks
  6. Compresser
  7. Appliquer un budget
  8. Produire une sortie exploitable

Une pipeline déclarative

La pipeline peut ĂȘtre exprimĂ©e sous forme dĂ©clarative :

source |> strip_ansi |> remove_noise |> normalize_whitespace
  |> chunk:300 |> compress |> budget:1000 |> sink

Cette notation permet de lire le pipeline de gauche Ă  droite.

Chaque étape transforme la précédente.

L’intĂ©rĂȘt est double :

  • meilleure lisibilitĂ©
  • meilleure extensibilitĂ©

L’ajout d’une nouvelle opĂ©ration ne nĂ©cessite pas de modifier une structure conditionnelle centrale.

Chaque opération devient un composant autonome.

Trois sens du pipe

Dans cette démonstration, le symbole |> apparaßt à trois niveaux.

1. DSL d’expression

Premier niveau : le pipe reprĂ©sente un langage dĂ©claratif lisible par l’humain.

source |> compress |> sink

2. Pipe operator de PHP 8.5

PHP 8.5 introduit nativement l’opĂ©rateur pipe.

Il permet une composition de callables plus explicite.

Exemple :

yield $step |> (fn ($step) => new ClosureJob(...));

Le code devient plus proche de la lecture du DSL.

3. Composition runtime avec Flow

TroisiĂšme niveau : la composition effective des jobs dans Flow.

Chaque transformation devient un job appliqué sur un contexte partagé.

C’est cette couche qui exĂ©cute rĂ©ellement la pipeline.

Inspiration : Pratt parsing

La partie parsing du DSL.

Au lieu d’avoir un parseur monolithique, chaque opĂ©ration possĂšde :

  • son nom
  • sa logique de parsing
  • sa logique d’exĂ©cution

Cette approche permet d’éviter un parser central surchargĂ©.

La pipeline devient extensible par design.

Résultat

Prenons la fixture flow-engine-log.

Avant transformation :

  • 17 398 caractĂšres
  • ~ 4 488 tokens estimĂ©s

AprĂšs pipeline :

  • 334 caractĂšres
  • ~ 88 tokens estimĂ©s

Soit environ :

98 % de réduction

Le point important n’est pas seulement le ratio.

Le point important est que le vocabulaire métier reste intact.

Les concepts :

  • flow
  • stream
  • pipeline
  • source
  • sink

n’ont pas Ă©tĂ© raccourcis.

Ce qui a disparu, c’est :

  • le bruit
  • les rĂ©pĂ©titions
  • les lignes sans valeur

Autrement dit :

le signal est resté.

Le bruit a disparu.

Signal vs bruit

Une deuxiĂšme fixture, flow-lexicon, est volontairement peu compressible.

La réduction observée est faible.

Et c’est une bonne chose.

Cela signifie que le contenu contient déjà majoritairement du signal.

Un bon pipeline ne cherche pas Ă  tout compresser.

Il cherche à supprimer uniquement ce qui n’apporte rien.

Et aprĂšs ?

Cette démonstration est volontairement synchrone et locale.

Mais elle ouvre une direction intéressante.

Une Ă©volution naturelle serait d’aller vers :

  • des streams non bloquants
  • stream_select()
  • des fibers
  • des process pipes
  • des PTY / TTY
  • un event loop

Cela permettrait de traiter les flux au moment oĂč ils apparaissent, et non aprĂšs coup.

Autrement dit :

ne plus attendre la fin d’un process pour analyser sa sortie.

Lire et transformer le flux en temps réel.

Conclusion

Le coĂ»t des workflows agentiques n’est pas seulement un problĂšme de modĂšle.

C’est un problùme d’orchestration.

Un agent performant n’est pas celui qui lit tout.

C’est celui qui reçoit un contexte propre, structurĂ© et contraint.

La vraie optimisation ne consiste donc pas Ă  raccourcir les mots.

Elle consiste Ă  contrĂŽler le flux.

Control the stream, not the spelling.

Ressources

  • Guillaume Moigneu about tokeniser context discipline
  • flow-pipe
  • slidewire presentation
  • PHP 8.5 pipe operator

Connectez-vous pour réagir à cet article

🚀 1

Site

  • Plan du Site
  • Contact
  • Mentions lĂ©gales

Network

  • Hello
  • Blog
  • Apps
  • Photos

Social

Darkwood 2026, tous droits réservés