Atto 3 · Pagina 6

Il tuo testo diventa pezzi

Il modello non legge né lettere né parole intere: prima di ogni altra cosa, smonta il testo in pezzetti chiamati token.

📖 Livello di lettura
🧱 Come i mattoncini LEGO: una frase non entra "intera", viene smontata in mattoncini standard che il modello sa maneggiare. A volte un mattoncino è una parola intera, a volte mezza parola, a volte un solo segno.
Mini-BPE italiano: 0
Gemini: in attesa…
parola intera pezzo di parola cifra segno emoji · = inizio di parola
Premi il bottone: le lettere partono separate e si uniscono a coppie, nell'ordine in cui il vocabolario le ha imparate.

I due conteggi non coincidono quasi mai, ed è il punto: il vocabolario di questa pagina ha imparato 240 fusioni da un migliaio di parole italiane che ho scritto io, quello di Gemini ne ha 256.000 ricavate da corpora enormi e in larga parte inglesi. Stesso algoritmo, letture diverse. Il numero blu esce da una chiamata vera al modello, e il chip accanto ti dice se è arrivato: quando non è verde, quel conteggio non c'è e resta solo il mio.

Il vocabolario che vedi all'opera non l'ho scelto a mano: l'ho fatto imparare a un programmino. Gli ho dato da leggere un testo italiano di circa mille parole — frasi di scuola, di casa, di tutti i giorni — e gli ho chiesto di ripetere duecentoquaranta volte un gesto solo: trova la coppia di caratteri più frequente e incollala insieme. Quel che resta alla fine è il vocabolario.

Premi «Guarda il BPE fondere» e lo vedi succedere sul tuo testo: le lettere partono separate e si uniscono a due a due, nell'ordine in cui sono state imparate. Le prime coppie sono le più banali dell'italiano — la, an, on — e non le ha decise nessuno: sono uscite dal conteggio. Poi arrivano i pezzi più lunghi, e alla fine parole intere come casa o giorno. Se vuoi confrontare con i vocabolari veri dei modelli di oggi, il posto giusto è tiktokenizer; se vuoi l'esempio numerico passo passo, c'è la voce di Wikipedia sul Byte Pair Encoding.

Il pezzo che vedi colorato ha un nome tecnico, token, e il procedimento che lo produce si chiama tokenizzazione sub-lessicale. L'algoritmo più diffuso è il Byte Pair Encoding, nato nel 1994 come metodo di compressione e portato dentro il trattamento del linguaggio da Rico Sennrich, Barry Haddow e Alexandra Birch nel 2016. Funziona per fusioni successive: si parte dai singoli caratteri e, contando su un corpus quali coppie di simboli ricorrono più spesso, si fonde la più frequente in un simbolo nuovo, si riconta, si fonde di nuovo, per decine di migliaia di giri. L'ordine in cui le fusioni sono state imparate diventa il loro rango, e in lettura è l'unica regola che conta: davanti a una parola qualsiasi l'algoritmo applica sempre la fusione di rango più basso fra quelle possibili, poi la successiva, finché non ne resta nessuna. Il bottone «Guarda il BPE fondere» esegue esattamente questo, un rango alla volta, e ti mostra il numero accanto a ogni coppia.

Quello che gira qui sopra non è una segmentazione finta: sono 240 fusioni vere, che ho fatto imparare a uno script Python su un mini-corpus italiano di circa mille parole scritto da me, e poi incorporate nella pagina. Il puntino grigio davanti a certi pezzi è il marcatore , che segna l'inizio di parola: è la convenzione di SentencePiece, il tokenizer di Taku Kudo e John Richardson (EMNLP 2018), che tratta lo spazio come un carattere qualunque e aggiunge un prefisso fittizio all'inizio del testo, così la prima parola non diventa un caso speciale. Da qui discende un fatto che puoi verificare in due secondi: insegnante esce come ▁insegn + ante, insegnanti come ▁insegn + anti. Stesso numero di pezzi, pezzi diversi. E gatto ne prende tre mentre gatti ne prende quattro: la differenza non è grammaticale, è statistica.

Il numero accanto a «Gemini» arriva invece da una chiamata vera all'endpoint countTokens, ed è quasi sempre diverso dal mio. Non è un difetto della demo: è la dimostrazione più diretta che il vocabolario è una scelta di progetto, non una proprietà della lingua. Il mio ha 240 fusioni imparate da mille parole italiane; quello di Gemini conta 256.000 voci ricavate da corpora enormi e in larga parte inglesi — la cifra è dichiarata nel rapporto tecnico di Gemma, che eredita il tokenizer di Gemini. Lo stesso documento aggiunge un dettaglio che spiega il comportamento della demo sui numeri: quel tokenizer splits digits, stacca cioè ogni cifra per conto suo. Non è una legge di natura, è una decisione: nei vocabolari cl100k_base e o200k_base di OpenAI il pattern di pre-segmentazione contiene \p{N}{1,3} (tiktoken, openai_public.py), cioè le cifre vengono prese a gruppi di al massimo tre, e 1250 diventa 125 + 0.

Da questa scelta discendono conseguenze che incontri ogni giorno senza riconoscerle. La prima è economica: i modelli si pagano a token, e poiché i vocabolari nascono da corpora in larga parte inglesi, la stessa frase costa un po' di più in italiano e molto di più in birmano, in amarico o in hindi. Aleksandar Petrov e colleghi hanno misurato lo scarto fra le lingue e trovato differenze fino a quindici volte il numero di token per lo stesso testo tradotto (NeurIPS 2023); Orevaoghene Ahia e colleghi hanno mostrato, su 22 lingue, che il sovrapprezzo colpisce proprio chi ottiene in cambio i risultati peggiori (EMNLP 2023). La seconda conseguenza è cognitiva: se chiedi a un modello quante «r» ci sono in ferrovia, la domanda gli arriva già smontata — nel mio mini-vocabolario diventa ▁f | er | ro | v | ia — e le due «r» stanno sepolte dentro simboli che il modello maneggia interi, senza guardarci dentro. Deve ricostruire un'informazione che il suo occhio non ha mai visto. Non è stupidità: è il prezzo della lente attraverso cui guarda.

Il caso limite più istruttivo è quello dei glitch token: stringhe finite nel vocabolario perché frequenti nei dati grezzi su cui è stato costruito, ma quasi assenti dai testi su cui il modello è stato poi addestrato. Nel 2023 un gruppo di ricercatori documentò il caso «SolidGoldMagikarp», un nome utente di Reddit diventato un token unico: chiesto di ripeterlo, GPT-3 rispondeva con evasioni, insulti o parole senza rapporto. Il vettore corrispondente non era mai stato addestrato sul serio e restava dove l'inizializzazione casuale l'aveva messo: una casella vuota nel dizionario interno, che si comporta come un'asse marcia in un pavimento per il resto solido. Non era un caso isolato: Sander Land e Max Bartolo hanno poi costruito un metodo per stanare automaticamente questi token sotto-addestrati e ne hanno trovati in una lunga serie di modelli diversi (EMNLP 2024).

Il mito: «il tokenizer riconosce la radice e la desinenza». È la lettura che viene spontanea guardando ▁insegn + ante: sembra analisi grammaticale fatta bene. Non lo è. Il BPE non ha mai visto una regola di morfologia: conta coppie di caratteri e fonde le più frequenti, punto. La prova sta nella demo qui sopra: gatto esce come ▁g | a | tto e gatti come ▁g | a | t | ti, e nessun grammatico segmenterebbe così. Kaj Bostrom e Greg Durrett hanno mostrato (Findings of EMNLP 2020) che i pezzi prodotti da un modello unigram si allineano alla morfologia meglio di quelli del BPE, che soffre della propria costruzione avida, e che i modelli pre-addestrati sulla segmentazione unigram vanno altrettanto bene o meglio. Quando una macchina sembra aver capito la grammatica, conviene sempre chiedersi se non stia soltanto contando.
Provalo sul serio. Se vuoi la tokenizzazione dei vocabolari veri, e non il mini-BPE di questa pagina, apri tiktokenizer: mostra la segmentazione dei modelli in produzione, con il numero identificativo di ogni token. Incolla la stessa frase in italiano e in inglese e confronta i conteggi: quella differenza è il motivo per cui, a parità di contenuto, una conversazione in italiano consuma più contesto e costa di più. Poi incolla la stessa frase qui sopra: hai tre segmentazioni diverse dello stesso testo, ottenute con lo stesso algoritmo e tre corpora differenti.
💡 La sorpresa: il modello non vede le parole come te. «insegnante» e «insegnanti» finiscono in pezzi diversi (▁insegn+ante contro ▁insegn+anti); gli spazi contano e viaggiano attaccati alla parola che segue; i numeri si spezzano in modi che non somigliano a come li leggi tu; un'emoji è un token come una parola. Per questo, a volte, sbaglia a contare le lettere.

Qui sopra gira un Byte Pair Encoding vero, ma piccolissimo: 240 fusioni imparate da un testo italiano di circa mille parole scritto da me. Un tokenizer di produzione ne ha centinaia di migliaia, ricavate da miliardi di parole. Il meccanismo che vedi è quello giusto; la scala, no — ed è per questo che il conteggio di Gemini è diverso.

Fonti Per approfondire

Complessità della fonte: divulgativa approfondimento tecnica o accademica

  • Paper R. Sennrich, B. Haddow, A. Birch, «Neural Machine Translation of Rare Words with Subword Units», ACL 2016 — il paper che porta il Byte Pair Encoding dentro i modelli linguistici. arxiv.org
  • Paper T. Kudo, J. Richardson, «SentencePiece», EMNLP 2018 (system demonstrations) — il marcatore , lo spazio trattato come un carattere e il prefisso fittizio a inizio testo: le convenzioni che usa anche questa demo. arxiv.org
  • Paper A. Petrov, E. La Malfa, P. Torr, A. Bibi, «Language Model Tokenizers Introduce Unfairness Between Languages», NeurIPS 2023 — lo stesso testo tradotto può costare fino a quindici volte più token a seconda della lingua. arxiv.org
  • Paper K. Bostrom, G. Durrett, «Byte Pair Encoding is Suboptimal for Language Model Pretraining», Findings of EMNLP 2020 — il BPE segmenta peggio della morfologia: i pezzi non sono radici e desinenze. arxiv.org
  • Paper Gemma Team, «Gemma: Open Models Based on Gemini Research and Technology», 2024 — il rapporto tecnico che dichiara il vocabolario da 256.000 voci ereditato da Gemini e il fatto che stacchi le cifre una a una. arxiv.org
  • Lezione S. Raschka, «Building LLMs from the Ground Up: A 3-hour Coding Workshop» — workshop gratuito con notebook: il tokenizer costruito da zero è la prima ora. In inglese. magazine.sebastianraschka.com
  • Lezione A. Karpathy, «Let’s build the GPT Tokenizer» — due ore per costruire un tokenizer da zero, in inglese con sottotitoli. youtube.com
  • Fonte «SolidGoldMagikarp (plus, prompt generation)», LessWrong, 2023 — la scoperta dei glitch token e il metodo con cui sono stati stanati; il seguito accademico è S. Land, M. Bartolo, «Fishing for Magikarp», EMNLP 2024. lesswrong.com · arxiv.org
  • Gioco Tiktokenizer — la tokenizzazione vera dei modelli attuali, incollando qualunque testo. tiktokenizer.vercel.app
  • Wiki Byte pair encoding — la voce inglese di Wikipedia, con l’esempio numerico delle fusioni. wikipedia.org