đł Flow Tokens - Pourquoi lâoptimisation des tokens est un problĂšme de flux, pas de vocabulaire
le 21 juin 2026
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 :
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 :
- Charger une source
- Retirer les séquences ANSI
- Supprimer le bruit
- Normaliser les espaces
- Découper en chunks
- Compresser
- Appliquer un budget
- 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 sâinspire directement des nouveaux expression parsers de Twig 4.
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