Il modello non legge né lettere né parole intere: prima di ogni altra cosa, smonta il testo in pezzetti chiamati token.
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).
▁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.
▁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.
Complessità della fonte: divulgativa approfondimento tecnica o accademica
▁, lo spazio trattato come un carattere e il prefisso fittizio a inizio testo: le convenzioni che usa anche questa demo. arxiv.org