Chapitre 02 · Tokenisation · 8 min
Du texte aux tokens
Comment un texte devient des nombres. BPE, sous-mots, et pourquoi les LLMs comptent mal les lettres.
Pourquoi des tokens ?
Un modèle de langage ne peut pas manipuler du texte directement. Il manipule des nombres. La toute première étape, à chaque fois que tu parles à un LLM, c'est de transformer ton texte en une suite de nombres entiers — les token IDs.
La tokenisation, c'est le découpage qui rend cette conversion possible.
Pourquoi pas un token par mot ?
À première vue, on pourrait imaginer : un mot = un token. Simple.
Mais ça ne marche pas :
- La langue contient des millions de mots possibles (formes fléchies, néologismes, noms propres, fautes de frappe…). Avoir un token par mot exige un vocabulaire gigantesque.
- Le modèle ne peut rien faire d'un mot qu'il n'a jamais vu.
- Certaines langues (chinois, japonais) n'ont même pas d'espaces entre les mots.
La solution adoptée par presque tous les LLMs modernes : les sous-mots.
La tokenisation par sous-mots
Avec un tokeniseur de sous-mots :
- Les mots fréquents deviennent un seul token (
the,et,est) - Les mots rares sont découpés en morceaux plus petits (
tokenisation→token+isation) - Les caractères inconnus restent toujours décomposables jusqu'à la lettre
Le résultat : un vocabulaire de taille raisonnable (typiquement de 30 000 à plus de 250 000 tokens : la fourchette monte au fil du temps, parce que les tokeniseurs récents couvrent beaucoup plus de langues) qui peut représenter n'importe quel texte.
L'algorithme le plus utilisé s'appelle BPE (Byte Pair Encoding). Il fonctionne en partant des caractères individuels et en fusionnant itérativement les paires les plus fréquentes du corpus d'entraînement.
BPE en trente secondes
Imagine un mini-corpus de trois mots : low, lower, lowest. On commence par tokeniser au niveau caractère :
l o w
l o w e r
l o w e s t
À chaque itération, on cherche la paire de tokens adjacents la plus fréquente. Ici, l o apparaît trois fois — on la fusionne en lo :
lo w
lo w e r
lo w e s t
Maintenant lo w est la paire la plus fréquente. On fusionne :
low
low e r
low e s t
On continue jusqu'à atteindre la taille de vocabulaire désirée. Les morceaux qui reviennent souvent (low) deviennent un seul token. Les rares (est) restent décomposés. C'est exactement ce que fait BPE — sur des milliards de mots au lieu de trois, et sur des octets plutôt que des caractères dans les modèles modernes (byte-level BPE), ce qui garantit qu'aucune entrée n'est jamais "inconnue".
Quelques cousins à connaître : WordPiece (BERT) et Unigram LM (T5, mT5) sont, comme BPE, des algorithmes de construction du vocabulaire. Attention à une confusion courante : SentencePiece, souvent cité au même niveau, n'est pas un algorithme mais une bibliothèque — elle implémente BPE et Unigram, et c'est elle qui a servi pour T5, mT5 et les premiers Llama (1 et 2). Depuis Llama 3 (2024), Meta est passé à un BPE byte-level de 128 000 tokens, dans l'esprit de tiktoken. Tous partagent la même idée — un vocabulaire de sous-mots — avec des heuristiques différentes.
Tokens spéciaux
Au-delà des sous-mots du texte, le tokeniseur réserve quelques tokens spéciaux qui n'apparaissent jamais naturellement :
<|im_start|>,<|im_end|>(OpenAI),[INST]…[/INST](Llama 2 et Mistral),<|start_header_id|>…<|eot_id|>(Llama 3 et suivants),<|user|>/<|assistant|>— délimitent les tours d'une conversation. Chaque famille de modèles a son format, et il change d'une génération à l'autre.<|endoftext|>— fin de document.<|fim_prefix|>,<|fim_middle|>— pour le fill-in-the-middle, utilisé en complétion de code.
C'est ce qui permet de transformer un dialogue "Utilisateur a dit X, Assistant répond Y" en une séquence linéaire de tokens, exploitable par le modèle. Quand tu envoies un message à ChatGPT, ces marqueurs sont ajoutés automatiquement avant la tokenisation.
Essaie
L'éditeur fait apparaître les sous-mots à droite : chaque token est un fragment réutilisable, pas nécessairement un mot complet. Les mots fréquents tiennent en un seul token, les rares se décomposent en plusieurs morceaux.
Quelques choses à remarquer :
- Les mots courts et fréquents sont rarement coupés.
- Les mots longs ou rares se retrouvent souvent en plusieurs morceaux.
- L'espace précédant un mot fait partie du token (c'est pour ça que
· helloethellosont des tokens différents). - En français, le ratio tokens/mot est typiquement plus élevé qu'en anglais (1.4–1.8 vs 1.2–1.4 sur les tokeniseurs de la génération GPT-3/GPT-4) — les modèles ont vu plus d'anglais pendant l'entraînement. Les tokeniseurs récents, avec leurs vocabulaires bien plus grands et plus multilingues, ont resserré l'écart. Ils ne l'ont pas effacé : le français reste plus cher que l'anglais.
Conséquences pratiques
Cette histoire de tokens a plein d'implications inattendues :
- Les LLMs comptent mal les lettres. "Combien de R dans strawberry ?" est resté le piège célèbre de 2024 : beaucoup de modèles répondaient 2 au lieu de 3, parce que le mot leur arrive en quelques tokens, pas en lettres séparées. Aujourd'hui, les grands modèles tombent juste — mais la cause structurelle n'a pas bougé d'un pouce. Ils ont appris à contourner, en épelant le mot lettre par lettre avant de compter. Si tu poses la question à un modèle récent, regarde son raisonnement : cette étape d'épellation est souvent là. C'est l'aveu que le comptage direct, lui, ne marche toujours pas.
- Les prix d'API se calculent en tokens, pas en mots. Le français coûte donc un peu plus cher à traiter que l'anglais.
- Les fenêtres de contexte (
128k tokens,200k tokens…) se mesurent aussi en tokens. Un livre de 100 000 mots français représente environ 150 000 tokens.
Pour le modèle, "tokenisation" et "tok·en·isa·tion" sont la même chose. Il ne voit que les morceaux.
La suite
Maintenant que ton texte est devenu une suite d'entiers, ces entiers vont entrer dans le modèle. Première étape à l'intérieur du modèle : ils sont transformés en vecteurs, dans un espace de plusieurs centaines de dimensions où le sens devient une position géométrique.
C'est le sujet du chapitre suivant.
Mis à jour le