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 (tokenizzazionetoken + 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 · hello e hello sono 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