✔️✔️ Doppie Spunte Blu Cap. 10 · Sotto il cofano: cos'è davvero un LLM

Puntata 103

Puntata 103 — Il “prossimo token più probabile”

Livello: ✔️✔️ Doppie Spunte Blu · Capitolo 10 · Sotto il cofano: cos’è davvero un LLM

Un loop. Predici. Estrai. Aggiungi. Ripeti. Tutto ciò che fa un LLM in inferenza è dentro quattro verbi.

un nastro trasportatore che scorre da sinistra a destra. Su ogni “scatola” un token. La scatola in fondo viene smontata in tante probabilità (barre verticali) e ne viene scelta una, che torna sul nastro come prossima scatola. Loop infinito fino a <|endoftext|>

La macchina è un loop

Dimentica le metafore “magiche”. Un LLM in inferenza fa una sola cosa, ripetuta token dopo token:

1. Prende il contesto (token già scritti)
2. Calcola una distribuzione P sul vocabolario
3. Sampling: sceglie un token
4. Lo appende al contesto
5. Torna a 1

Fine. Tutto quello che sembra “ragionamento”, “creatività”, “stile” è il risultato di miliardi di pesi che disegnano quella distribuzione P in ogni passo.

È il paradigma autoregressive: ogni passo dipende dai passi precedenti.


Step by step, con un esempio

Prompt: “La capitale della Francia è”

Step 1: il modello vede “La capitale della Francia è”. Calcola P sul vocabolario:

"Parigi"      → 0.94
"Lione"       → 0.018
"Marsiglia"   → 0.008
"Bordeaux"    → 0.005
"Milano"      → 0.0001

Estrae il token. A temperature bassa (≈0): quasi sempre “Parigi”.

Step 2: il contesto adesso è “La capitale della Francia è Parigi”. Calcola nuova P:

"."           → 0.6
","           → 0.2
" e"          → 0.08
" che"        → 0.05

Estrae ”.”. Continua finché esce <|endoftext|> o si raggiunge il limite.


La probabilità sotto il cofano

L’LLM produce dei logit (numeri reali non normalizzati) — uno per ogni token del vocabolario. Sono passati a un softmax:

P(token_i) = exp(logit_i / T) / Σ_j exp(logit_j / T)

Dove T è la temperature (puntata 105). A T → 0, distribuzione picco-su-uno (deterministico). A T → ∞, distribuzione uniforme.

Il sampling è il momento in cui da quella distribuzione si tira fuori un token. Vari algoritmi:

StrategiaCosa fa
Greedy (T=0)Sempre il top
Sampling (T>0)Tira a sorte secondo P
Top-kConsidera solo i k più probabili
Top-p / nucleusConsidera i token la cui P cumulata copre il p%
Beam searchEsplora k sequenze in parallelo, sceglie la migliore (raro nei chat LLM)
Min-pFiltra token sotto una soglia relativa al top (Llama 3+)

I default più diffusi nel 2026: T=0.7, top_p=0.9, top_k=40. Vedi puntata 105 per la combinazione.


Perché lo stesso prompt dà output diversi

Domanda da n00b che però è centrale: “Perché ChatGPT mi risponde diversamente ogni volta?”

Perché il sampling è stocastico se T > 0. Anche con lo stesso prompt:

  • Step 1: top token è “Parigi” al 94%, ma nel 6% dei casi si estrae altro.
  • Quel “altro” cambia tutta la sequenza successiva (effetto a cascata).

Se vuoi output riproducibile, usa T=0 (greedy) + seed fisso (alcune API lo permettono).

⚠️ Anche con T=0 non sempre è 100% deterministico in pratica: variazioni di batch size, mixed precision GPU, kernel diversi possono cambiare i risultati a pari setting. È un fastidio noto per chi fa eval (puntata 221).


”Ma quindi non pensa, indovina?”

Sì e no.

No: non c’è un “pensiero” pre-esistente che viene poi tradotto in parole. La generazione è il pensiero, token per token.

: le rappresentazioni interne (embedding, attivazioni — puntata 106) codificano informazioni strutturate che vanno oltre la singola statistica di superficie. Negli ultimi anni l’interpretability research (Anthropic, OpenAI, DeepMind) ha mostrato che i modelli hanno concetti, mondi, modelli causali dentro — anche se costruiti in modo molto diverso da quelli umani. Vedi puntata 284.

In pratica: dire “l’LLM sa solo predire la prossima parola” è tecnicamente vero ma fuorviante. Quella predizione richiede una rappresentazione interna ricca del mondo del linguaggio.


Il problema del “fissaggio” del primo token

Se il modello sceglie male un token all’inizio, non torna indietro. Genera token-per-token avanti. Conseguenza:

  • L’AI può “inchiodarsi” su una risposta errata e proseguirla coerentemente.
  • Una piccola variazione di prompt cambia la traiettoria iniziale → cambia tutto l’output.
  • Strategie come chain-of-thought (CoT, “ragiona passo per passo”) aiutano: il modello produce prima il ragionamento, poi la conclusione. Più token = più chance di correzione. Vedi puntata 114.

I modelli reasoning (o-series OpenAI, Claude extended thinking, DeepSeek-R1, Gemini 2.5 deep think) portano questa idea all’estremo: producono molti token “interni” (thinking) prima della risposta finale. Vedi puntata 211 e 267.


Velocità: il bottleneck dell’autoregressivo

Generare 1 token alla volta è inerentemente sequenziale. Per un output di 500 token, devi fare 500 passi, ognuno aspetta il precedente.

Tecniche per accelerare:

TecnicaIdea
KV-cacheSalva attivazioni dei token già generati per non ricalcolarle
Speculative decodingUn modello piccolo “indovina” i prossimi token, il grande verifica in parallelo
Continuous batchingRiempi GPU con più richieste contemporaneamente
QuantizationPesi a 8/4 bit per girare più veloce (puntata 227)
StreamingMostra i token all’utente uno per uno (non riduce tempo totale, ma percezione)

Provider seri (vLLM, TGI, TRT-LLM) implementano tutto questo. Vedi puntata 229.


Cosa NON è il sampling

Per evitare confusione:

❌ Il sampling non “rende il modello più intelligente”. Sceglie tra le opzioni che il modello ha già calcolato.

❌ Il sampling non “introduce creatività dall’esterno”. L’entropia c’era già nella P del modello — il sampling decide solo quanto pescare dalle code.

❌ Il sampling non “evita le allucinazioni”. Una P sbagliata produce comunque output sbagliato, qualunque sampler usi.

L’unico modo di migliorare la qualità è: migliorare la P (training migliore, modello più grande, RAG, tool use, reasoning).


Bonus: cosa fanno i modelli reasoning

Negli LLM “classici”, P(next_token | context) è calcolato in un singolo forward pass.

Nei modelli reasoning, il “context” include una sezione di thinking che il modello stesso produce prima. Concettualmente:

prompt → think_tokens (centinaia/migliaia) → answer_tokens

Per ogni answer_token, il modello ha già calcolato sé stesso un lungo thinking, riducendo errori a cascata. È il test-time compute che vale come scaling dimensionale. Vedi puntate 267-268.


TEST pratico (5 minuti)

  1. Apri OpenAI Playground (platform.openai.com/playground) o Anthropic Console.
  2. Prompt: “Quale numero ha più cifre: 9.11 o 9.9?”
  3. Lancia con T = 0 3 volte. Risposta sempre uguale? (Spesso: il modello sbaglia dicendo 9.11, è un bug noto.)
  4. Lancia con T = 1 5 volte. Vedi varianza?
  5. Aggiungi “ragiona passo per passo” al prompt e ripeti. Risultato diverso?

Bonus: prova con un modello reasoning (o4-mini, Claude 4.7 thinking, DeepSeek-R1). Risolve il problema nativamente — molti più token, risposta giusta.


Take-away in una riga

Un LLM è un loop di sampling sopra una distribuzione P. Non c’è “pensiero” magico: c’è una distribuzione, una scelta, e il loop che continua. Tutto il resto deriva dalla qualità di quella P.

➡️ Prossima puntata: Contesto e finestra di contesto — quanta memoria ha davvero.