Capitolo 07 · Generazione · 7 min

Scegliere la parola successiva

Temperature, top-k, top-p. L'arte di trasformare una distribuzione di probabilità in testo.

La distribuzione è calcolata. E poi?

A questo punto del libro, il modello sa calcolare una distribuzione di probabilità sul prossimo token. Per generare testo bisogna ora sceglierne uno. Questo è il passaggio di sampling (campionamento).

Abbiamo già intravisto questo meccanismo nel capitolo 01. Ora vale la pena tornarci con attenzione: è ciò che distingue un modello prudente da uno creativo, un assistente affidabile da un pappagallo ripetitivo.

Perché non sempre il più probabile?

La strategia più semplice — greedy decoding — consiste nel prendere sempre il token di probabilità massima. Rapida, deterministica, riproducibile.

Eppure, quasi mai usata da sola. Perché?

Perché il greedy decoding produce testo stranamente piatto. Si chiude in loop ("molto molto molto interessante interessante interessante…"). Sceglie sempre la parola più convenzionale. Genera frasi tecnicamente corrette, ma senza rilievo. Il modello è stato addestrato su testo umano, che contiene sempre una quota di imprevedibilità: e questa imprevedibilità deve ritrovarsi nella generazione.

Da qui il campionamento stocastico: si estrae un token a caso secondo la distribuzione. Più un token è probabile, più ha possibilità di essere scelto — ma anche gli altri hanno una possibilità.

Tre leve

Questo campionamento stocastico grezzo sarebbe troppo rumoroso. Di solito applichiamo tre filtri prima di estrarre:

Temperatura

La temperatura T divide i logits prima del softmax. È il controllo più potente.

  • T = 1.0 — distribuzione così come esce dal modello (riferimento)
  • T < 1.0 — distribuzione più appuntita: gli alti diventano più alti, i bassi più bassi. Il modello diventa più prevedibile.
  • T → 0 — equivale al greedy decoding (un solo token possibile).
  • T > 1.0 — distribuzione appiattita: le opzioni poco probabili risalgono. Il modello diventa creativo, persino strano.
  • T → ∞ — uniforme, il modello tira completamente a caso.

La temperatura è un cursore tra prevedibilità e immaginazione.

Top-k

Invece di autorizzare tutti i token del vocabolario (spesso 100.000 o più), manteniamo i k più probabili e azzeriamo il resto, poi rinormalizziamo. k = 40 è un valore classico per la creatività, k = 1 riporta al greedy.

Vantaggio: elimina subito i token assurdi (quelli allo 0,0001%) che potrebbero essere estratti per caso. Svantaggio: il valore ottimale di k dipende da ogni passo — a volte bastano 5 candidati, a volte 100 sono tutti plausibili.

Top-p (nucleus sampling)

Più furbo di top-k. Manteniamo il più piccolo insieme la cui massa cumulata supera p, poi rinormalizziamo.

  • In un passo in cui il modello esita tra 30 opzioni vicine → top-p mantiene tutte le opzioni la cui somma raggiunge p.
  • In un passo in cui il modello è sicuro al 95% → top-p mantiene un solo token.

In pratica, top-p ≈ 0.9 è il valore che viene raccomandato più spesso, ed è il default di molte configurazioni open source. Attenzione: le grandi API in genere lo lasciano a 1.0 e ti fanno pilotare con la temperatura — se vuoi l'effetto top-p, devi chiederlo esplicitamente. Il suo interesse resta lo stesso: si adatta da solo alla fiducia del modello.

Manipola di nuovo

Abbiamo già visto questa visualizzazione nel capitolo 01: la riprendiamo qui perché è esattamente il tema:

Gioca con la temperature: a 0, il modello è deterministico e ripetitivo; a 1.5, diventa creativo fino a diventare incoerente. Top-k e top-p tagliano la coda dei candidati improbabili senza toccare quelli probabili.

Questa volta osserva:

  • Su Capitale, il modello è così sicuro (10.0 contro 5.0 per il successivo) che serve una temperatura molto alta (>1.5) per fargli produrre qualcosa di diverso da Roma. È tipico dei prompt in cui la risposta è nota.
  • Su Il cielo al secondo passo, diverse continuazioni sono semanticamente plausibili. Con temperature = 1.5, si può ottenere diffusione o atmosfera invece di luce. Il senso resta corretto, ma il testo diventa meno prevedibile.
  • A top-k = 1, qualunque altro parametro diventa inutile: siamo in greedy.
  • A top-p = 0.5 sul prompt Capitale, sopravvive solo Roma (perché da sola raggiunge già il 50%).

Alcune impostazioni culturali

Impostazioni tipiche a seconda del caso d'uso:

CasoTemperatureTop-p
Codice, dati strutturati0.0-0.21.0
Risposta fattuale0.3-0.50.9
Conversazione generica0.70.9
Brainstorming, scrittura creativa0.9-1.20.95
Generazione di varianti1.2-1.50.95

Non sono regole rigide. Ma è l'ordine di grandezza che ritroverai nella maggior parte dei prodotti che usano un LLM.

Tre altre leve da conoscere

Oltre a temperatura / top-k / top-p, qualche parametro torna ovunque nelle API.

Le penalità di ripetizione. Tutte penalizzano i token già comparsi nell'output, per spezzare i loop senza dover alzare la temperatura — ma non confondere le due famiglie, le loro scale non hanno nulla in comune. La repetition penalty dell'ecosistema open source (HuggingFace, llama.cpp) divide i punteggi dei token già visti: vale 1 quando è disattivata, e la si regola tipicamente tra 1.05 e 1.2. La frequency penalty e la presence penalty di OpenAI, invece, sottraggono un valore: vanno da −2 a +2, valgono 0 di default, e raramente si supera 1. Impostare una frequency penalty a 1.2 credendo di applicare una repetition penalty dà un risultato molto diverso da quello atteso.

Stop sequences. Una lista di stringhe che, se compaiono nell'output, fermano la generazione immediatamente. Indispensabile per gli usi strutturati: in un dialogo formattato, ci si ferma su <|im_end|> o \n\nUser: per impedire al modello di continuare la conversazione da solo.

Beam search. Invece di campionare in modo stocastico, si tengono in parallelo le k migliori sequenze parziali a ogni passo, e si sceglie quella che massimizza la probabilità complessiva alla fine. Il risultato è più "liscio" ma spesso meno naturale. Usato in traduzione automatica e riconoscimento vocale, molto meno nella generazione creativa.

Il determinismo illusorio

Un'ultima sottigliezza. Anche con temperature = 0, due chiamate allo stesso modello possono dare risultati diversi in pratica:

  • Quantizzazione non deterministica (i calcoli in INT8/FP8 hanno margini d'errore).
  • Batching dinamico lato server (a seconda delle altre richieste, cambiano gli ordini delle operazioni floating point).
  • Versioni del modello che cambiano silenziosamente presso il provider.

Se scrivi test che dipendono dall'uscita esatta di un LLM, soffrirai.

Il seguito

A questo punto sai come un LLM:

  • taglia il testo in token,
  • li trasforma in vettori,
  • li fa guardare tra loro tramite l'attenzione,
  • impila blocchi Transformer per raffinare la rappresentazione,
  • predice una distribuzione sul prossimo token,
  • ne estrae uno con una strategia di campionamento.

Eppure ciò che chiamiamo "un assistente" — qualcosa come ChatGPT o Claude — non è solo questo. Un modello di base a questo punto sarebbe un completatore di testo, non un assistente. Come passiamo dall'uno all'altro? È il tema del capitolo successivo: l'allineamento.

Aggiornato il