La plupart des tokenizers modernes utilisent le Byte Pair Encoding (BPE) ou une variante appelée SentencePiece. Le BPE fonctionne en partant de caractères individuels (ou d'octets) et en fusionnant répétitivement la paire adjacente la plus fréquente en un nouveau token. Après des milliers de fusions, des mots courants comme « the » deviennent des tokens uniques, tandis que les mots rares sont découpés en fragments de sous-mots.
La taille du vocabulaire d'un tokenizer est un vrai compromis d'ingénierie. Les vocabulaires plus grands (100K+ tokens) compressent le texte plus efficacement — les mots et expressions courants obtiennent des tokens dédiés, donc moins de contexte est consommé. Mais les vocabulaires plus grands signifient aussi une table d'embeddings plus volumineuse aux couches d'entrée et de sortie du modèle.
Les tokenizers sont entraînés sur un corpus, et la distribution linguistique de ce corpus détermine l'efficacité. Le texte anglais se tokenise typiquement à environ 1 token par mot. Mais des langues comme le chinois, le japonais, le coréen, l'arabe et l'hindi peuvent nécessiter 2 à 4 fois plus de tokens pour un sens équivalent.
Les bizarreries de la tokenisation expliquent plusieurs comportements des LLM que les gens trouvent déroutants. Les modèles galèrent avec les tâches au niveau des caractères (compter les lettres dans « strawberry ») parce qu'ils voient des tokens, pas des caractères. Ils gèrent certains noms de variables mieux que d'autres parce que les noms courants sont des tokens uniques tandis que les noms inhabituels se fragmentent.