Capitolo 02 · Tokenizzazione · 8 min
Dal testo ai token
Come il testo diventa numeri. BPE, sottoparole, e perché gli LLM faticano a contare le lettere.
Perché i token?
Un modello linguistico non può manipolare direttamente il testo. Manipola numeri. Il primissimo passo, ogni volta che parli con un LLM, è trasformare il testo in una sequenza di numeri interi: i token IDs.
La tokenizzazione è il taglio che rende possibile questa conversione.
Perché non un token per parola?
A prima vista potremmo immaginare: una parola = un token. Semplice.
Ma non funziona:
- La lingua contiene milioni di parole possibili (flessioni, neologismi, nomi propri, errori di battitura…). Avere un token per parola richiede un vocabolario gigantesco.
- Il modello non può fare nulla con una parola che non ha mai visto.
- Alcune lingue (cinese, giapponese) non hanno nemmeno spazi tra le parole.
La soluzione adottata da quasi tutti gli LLM moderni: le sottoparole.
Tokenizzazione per sottoparole
Con un tokenizer a sottoparole:
- Le parole frequenti diventano un solo token (
the,e,sono) - Le parole rare vengono spezzate in pezzi più piccoli (
tokenizzazione→token+izzazione) - I caratteri sconosciuti restano sempre decomponibili fino alla lettera
Il risultato: un vocabolario di dimensione ragionevole (tipicamente da 30.000 a oltre 250.000 token: la forbice si alza col tempo, perché i tokenizer recenti coprono molte più lingue) che può rappresentare qualsiasi testo.
L'algoritmo più usato si chiama BPE (Byte Pair Encoding). Parte dai singoli caratteri e fonde iterativamente le coppie più frequenti nel corpus di addestramento.
BPE in trenta secondi
Immagina un mini-corpus di tre parole: low, lower, lowest. Si comincia tokenizzando a livello di carattere:
l o w
l o w e r
l o w e s t
A ogni iterazione, si cerca la coppia di token adiacenti più frequente. Qui l o compare tre volte: la fondiamo in lo:
lo w
lo w e r
lo w e s t
Ora lo w è la coppia più frequente. La fondiamo:
low
low e r
low e s t
Si continua fino a raggiungere la dimensione di vocabolario desiderata. I pezzi che ricorrono spesso (low) diventano un solo token. Quelli rari (est) restano decomposti. È esattamente ciò che fa BPE — su miliardi di parole invece di tre, e su byte invece che caratteri nei modelli moderni (byte-level BPE), il che garantisce che nessun input sia mai "sconosciuto".
Qualche cugino da conoscere: WordPiece (BERT) e Unigram LM (T5, mT5) sono, come BPE, algoritmi di costruzione del vocabolario. Attenzione a una confusione frequente: SentencePiece, spesso citato allo stesso livello, non è un algoritmo ma una libreria — implementa BPE e Unigram, ed è quella usata per T5, mT5 e i primi Llama (1 e 2). Da Llama 3 (2024), Meta è passata a un BPE byte-level da 128.000 token, nello spirito di tiktoken. Tutti condividono la stessa idea — un vocabolario di sottoparole — con euristiche diverse.
Token speciali
Oltre alle sottoparole del testo, il tokenizer riserva alcuni token speciali che non compaiono mai naturalmente:
<|im_start|>,<|im_end|>(OpenAI),[INST]…[/INST](Llama 2 e Mistral),<|start_header_id|>…<|eot_id|>(Llama 3 e successivi),<|user|>/<|assistant|>— delimitano i turni di una conversazione. Ogni famiglia di modelli ha il suo formato, e cambia da una generazione all'altra.<|endoftext|>— fine del documento.<|fim_prefix|>,<|fim_middle|>— per il fill-in-the-middle, usato nel completamento di codice.
È ciò che permette di trasformare un dialogo "Utente ha detto X, Assistente risponde Y" in una sequenza lineare di token, utilizzabile dal modello. Quando invii un messaggio a ChatGPT, questi marcatori vengono aggiunti automaticamente prima della tokenizzazione.
Prova
Sulla destra appaiono le sottoparole: ogni token è un frammento riutilizzabile, non necessariamente una parola intera. Le parole frequenti stanno in un singolo token, quelle rare si scompongono in più pezzi.
Alcune cose da notare:
- Le parole corte e frequenti vengono raramente tagliate.
- Le parole lunghe o rare spesso finiscono in più pezzi.
- Lo spazio prima di una parola fa parte del token (per questo
· helloehellosono token diversi). - In italiano, il rapporto token/parola è spesso più alto che in inglese (circa 1.3-1.7 contro 1.2-1.4 sui tokenizer della generazione GPT-3/GPT-4), anche perché i modelli hanno visto più inglese durante l'addestramento. I tokenizer recenti, con vocabolari molto più ampi e più multilingue, hanno ridotto il divario. Non l'hanno cancellato: l'italiano resta più caro dell'inglese.
Conseguenze pratiche
Questa storia dei token ha molte implicazioni inattese:
- Gli LLM contano male le lettere. "Quante R ci sono in strawberry?" è rimasto il tranello celebre del 2024: molti modelli rispondevano 2 invece di 3, perché la parola arriva loro in pochi token, non come lettere separate. Oggi i grandi modelli ci azzeccano — ma la causa strutturale non si è spostata di un millimetro. Hanno imparato ad aggirarla, compitando la parola lettera per lettera prima di contare. Se poni la domanda a un modello recente, guarda il suo ragionamento: quel passaggio di compitazione spesso c'è. È la prova che il conteggio diretto, invece, continua a non funzionare.
- I prezzi delle API si calcolano in token, non in parole. L'italiano può quindi costare un po' di più da elaborare rispetto all'inglese.
- Le finestre di contesto (
128k tokens,200k tokens…) si misurano anch'esse in token. Un libro di 100.000 parole italiane può rappresentare circa 140.000 token.
Per il modello, "tokenizzazione" e "tok·en·iz·za·zione" sono la stessa cosa. Vede solo i pezzi.
Il seguito
Ora che il tuo testo è diventato una sequenza di interi, quegli interi entrano nel modello. Primo passo all'interno: vengono trasformati in vettori, in uno spazio di centinaia di dimensioni dove il significato diventa una posizione geometrica.
Questo è il tema del capitolo successivo.
Aggiornato il