0Pricing
AI Prompt Engineering · Lezione

Come l'IA genera le risposte

Predizione dei token, probabilità e perché l'IA non ragiona come gli esseri umani

Come l'IA genera le risposte è una lezione AI Prompt Engineering gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Prompt Engineering, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Prompt Engineering include 4 lezioni in totale.

Il testo come problema probabilistico

In sostanza, un modello linguistico fa una sola cosa: predice il token successivo in base a tutti i token che lo precedono.

Un token è una piccola unità di testo, all'incirca una parola o un frammento di parola. Il modello assegna una probabilità a ogni token del proprio vocabolario e ne sceglie uno. Poi ripete il processo, un token alla volta, finché genera una risposta completa.

Che cos'è un token?

I token sono gli atomi dell'elaborazione del testo da parte degli LLM. Il testo inglese viene tokenizzato all'incirca in questo modo:

  • Parole comuni → 1 token ciascuna (the, run)
  • Parole meno comuni → suddivise in 2-3 token (running → run + ning)
  • Punteggiatura e spazi → spesso token distinti

Modelli come GPT-4o e Claude usano tokenizzatori che gestiscono oltre 100.000 voci di vocabolario, comprese sottoparole in molte lingue.

import tiktoken

encoding = tiktoken.encoding_for_model('gpt-4o')

sentence = 'The temperature parameter controls randomness in token selection.'
tokens = encoding.encode(sentence)
token_strings = [encoding.decode([t]) for t in tokens]

print(f'Sentence: {sentence}')
print(f'Token count: {len(tokens)}')
print(f'Tokens: {token_strings}')

Generazione autoregressiva

La generazione è autoregressiva: ogni nuovo token viene aggiunto all'input prima di prevedere quello successivo.

Così, generando «Il cielo è blu», il modello:

  • Vede «Il» → predice «cielo»
  • Vede «Il cielo» → predice «è»
  • Vede «Il cielo è» → predice «blu»
  • Vede «Il cielo è blu» → predice la fine della sequenza

Ecco perché la generazione rallenta per output molto lunghi: ogni token richiede un passaggio completo in avanti.

# Simulated autoregressive token-by-token output via streaming
import openai

client = openai.OpenAI(api_key='sk-your-key-here')

stream = client.chat.completions.create(
    model='gpt-4o',
    stream=True,     # receive tokens as they are generated
    messages=[{'role': 'user', 'content': 'Name five planets in our solar system.'}]
)

print('Tokens arriving one by one:')
for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end='', flush=True)
print()  # newline at end

Temperatura: controllo della casualità

La temperatura è un numero compreso tra 0 e 2 che ridimensiona la distribuzione di probabilità prima del campionamento:

  • Temperatura 0: seleziona sempre il token più probabile — deterministica, ripetitiva
  • Temperatura 1: campiona secondo le probabilità grezze — equilibrata
  • Temperatura 2: appiattisce le probabilità — molto casuale, talvolta incoerente

Usi una temperatura bassa per le attività fattuali e una più alta per il lavoro creativo.

import openai

client = openai.OpenAI(api_key='sk-your-key-here')

prompt = 'Continue this sentence with one word: The ocean is'

for temp in [0.0, 0.7, 1.5]:
    response = client.chat.completions.create(
        model='gpt-4o',
        temperature=temp,
        max_tokens=5,
        messages=[{'role': 'user', 'content': prompt}]
    )
    word = response.choices[0].message.content.strip()
    print(f'Temperature {temp}: "{word}"')

Perché le risposte variano tra un'esecuzione e l'altra

Anche con lo stesso prompt, due esecuzioni dello stesso modello possono produrre output diversi. Questo accade perché:

  • Il campionamento è probabilistico: il modello estrae da una distribuzione, non consulta una tabella di corrispondenza
  • Piccole differenze numeriche nei calcoli in virgola mobile possono propagarsi
  • Il parallelismo hardware introduce non determinismo

Imposti temperature=0 e seed (se supportato) per massimizzare la riproducibilità.

import openai

client = openai.OpenAI(api_key='sk-your-key-here')

prompt = 'Give me a one-word color that feels calm.'

for run in range(3):
    response = client.chat.completions.create(
        model='gpt-4o',
        temperature=1.0,   # randomness ON
        max_tokens=5,
        messages=[{'role': 'user', 'content': prompt}]
    )
    print(f'Run {run + 1}: {response.choices[0].message.content.strip()}')

# For reproducible outputs use seed + temperature=0
response = client.chat.completions.create(
    model='gpt-4o',
    temperature=0,
    seed=42,
    max_tokens=5,
    messages=[{'role': 'user', 'content': prompt}]
)
print(f'Deterministic: {response.choices[0].message.content.strip()}')

Campionamento top-p

Top-p (nucleus sampling) è un altro modo per controllare la casualità. Invece di ridimensionare tutte le probabilità, limita il campionamento al più piccolo insieme di token la cui probabilità cumulativa supera p.

  • top_p=0.1: solo i token ai vertici (conservativo)
  • top_p=0.9: insieme più ampio (creativo)
  • top_p=1.0: tutti i token (distribuzione completa)

In pratica, la maggior parte dei team regola la temperatura e lascia top-p a 1.0.

import openai

client = openai.OpenAI(api_key='sk-your-key-here')

# Conservative generation: top_p=0.1 restricts to high-confidence tokens
response_conservative = client.chat.completions.create(
    model='gpt-4o',
    top_p=0.1,
    max_tokens=30,
    messages=[{'role': 'user', 'content': 'What is the capital of Japan?'}]
)

# Creative generation: top_p=0.95 allows broader token pool
response_creative = client.chat.completions.create(
    model='gpt-4o',
    top_p=0.95,
    max_tokens=30,
    messages=[{'role': 'user', 'content': 'Write a poetic one-liner about the moon.'}]
)

print('Conservative:', response_conservative.choices[0].message.content)
print('Creative:    ', response_creative.choices[0].message.content)

Nessuna vera comprensione — pattern matching

Gli LLM non comprendono il linguaggio come gli esseri umani. Sono sofisticatissimi sistemi di riconoscimento di pattern, addestrati su enormi corpora testuali.

Quando il modello risponde a «Che cos'è la fotosintesi?», non recupera un fatto memorizzato: genera la sequenza di token che, statisticamente, segue il pattern della domanda, sulla base dei milioni di documenti simili visti durante il training.

# Demonstration: the model can produce plausible-sounding but wrong answers
import anthropic

client = anthropic.Anthropic(api_key='sk-ant-your-key-here')

# Asking about something nonsensical — model may still try to answer
response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=128,
    messages=[{
        'role': 'user',
        'content': (
            'What is the boiling point of happiness in degrees Celsius? '
            'Please just say "I cannot answer this" if the question makes no sense.'
        )
    }]
)
print(response.content[0].text)

Training e inferenza

La «conoscenza» del modello è stata congelata durante il training su un ampio corpus testuale. Durante l'inferenza (quando si invia un prompt), il modello genera testo sulla base di quella conoscenza congelata: non sta imparando né cercando su Internet.

Ciò significa che non può sapere nulla degli eventi successivi alla data limite del training, accedere agli URL o verificare se un fatto sia cambiato dopo il training.

import anthropic

client = anthropic.Anthropic(api_key='sk-ant-your-key-here')

# Asking the model about its own knowledge cutoff
response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=128,
    messages=[{
        'role': 'user',
        'content': (
            'What is your knowledge cutoff date? '
            'And can you access the internet right now to look up today\'s news?'
        )
    }]
)
print(response.content[0].text)

Che cosa avviene durante un forward pass

A livello generale, ogni previsione di un token prevede:

  1. La conversione di tutti i token di input in embedding numerici
  2. Il passaggio attraverso molti layer transformer (attention + feed-forward)
  3. La produzione di una distribuzione di probabilità sull'intero vocabolario
  4. Il campionamento di un token da quella distribuzione

I modelli moderni hanno miliardi di parametri che determinano questa trasformazione, tutti appresi durante il training a partire da testi scritti da esseri umani.

# You can inspect logprobs (token probabilities) to see the model's confidence
import openai

client = openai.OpenAI(api_key='sk-your-key-here')

response = client.chat.completions.create(
    model='gpt-4o',
    max_tokens=5,
    logprobs=True,
    top_logprobs=3,
    messages=[{'role': 'user', 'content': 'The opposite of hot is'}]
)

for token_info in response.choices[0].logprobs.content:
    print(f'Chosen token: "{token_info.token}"')
    for alt in token_info.top_logprobs:
        import math
        prob = round(math.exp(alt.logprob) * 100, 1)
        print(f'  Option "{alt.token}": {prob}% probability')

Sequenze di stop

Le sequenze di stop indicano al modello di interrompere la generazione quando produce una stringa specifica. Sono utili per:

  • Impedire al modello di generare più di una risposta in un elenco
  • Fermarsi davanti a un delimitatore come ### o ---END---
  • Forzare output su una sola riga

Senza sequenze di stop, il modello genera testo finché non raggiunge max_tokens o non prevede un token di fine sequenza.

import openai

client = openai.OpenAI(api_key='sk-your-key-here')

# Stop after the first item in a numbered list
response = client.chat.completions.create(
    model='gpt-4o',
    max_tokens=64,
    stop=['2.'],   # halt as soon as '2.' appears
    messages=[{
        'role': 'user',
        'content': 'List 5 programming languages, numbered 1 through 5.'
    }]
)
print(response.choices[0].message.content)
print('Stop reason:', response.choices[0].finish_reason)

Implicazioni pratiche per chi scrive prompt

Comprendere i meccanismi della generazione aiuta a scrivere prompt migliori:

  • Utilizzi temperature 0 per le attività che richiedono un output coerente e basato sui fatti
  • Utilizzi temperature 0.7-1.0 per la scrittura creativa
  • Verifichi i fatti: il modello genera testo plausibile, non verità garantite
  • Utilizzi sequenze di stop per controllare con precisione la lunghezza dell'output
  • Prompt brevi → output più creativo ma meno controllabile
  • Prompt dettagliati → output più vincolato e focalizzato
import anthropic

client = anthropic.Anthropic(api_key='sk-ant-your-key-here')

# Low temperature for factual classification
fact_response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=8,
    temperature=0,   # deterministic
    messages=[{'role': 'user', 'content': 'Is Paris the capital of France? Answer YES or NO only.'}]
)
print('Factual (temp=0):', fact_response.content[0].text.strip())

# Higher temperature for creative tasks
creative_response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=64,
    temperature=1.0,
    messages=[{'role': 'user', 'content': 'Write a surprising one-line poem about code.'}]
)
print('Creative (temp=1):', creative_response.content[0].text.strip())

Verifica delle conoscenze

Ha imparato come gli LLM generano testo un token alla volta. Verifichiamo la sua comprensione di temperature.

Uno sviluppatore sta creando un chatbot per l'assistenza clienti che deve fornire risposte coerenti e accurate alle domande sulla fatturazione. Quale impostazione di temperature è più appropriata?

Come l'IA genera le risposte — riepilogo

Ora comprende i meccanismi alla base di ogni risposta dell'IA:

  • I modelli prevedono il token successivo uno alla volta: generazione autoregressiva
  • Temperature controlla la quantità di casualità introdotta nella selezione dei token
  • Top-p limita il campionamento a un insieme ristretto di token ad alta probabilità
  • Il modello non comprende: esegue il pattern matching su una scala enorme
  • La conoscenza è congelata durante il training: niente dati in tempo reale, nessun accesso a Internet
  • Le sequenze di stop consentono di controllare esattamente dove termina l'output

Domande Frequenti

La lezione «Come l'IA genera le risposte» è gratuita?

Sì — il testo completo di «Come l'IA genera le risposte» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Prompt Engineering, passa a CoddyKit PRO. Il corso AI Prompt Engineering include 4 lezioni in totale.

Cosa imparerò in «Come l'IA genera le risposte»?

Predizione dei token, probabilità e perché l'IA non ragiona come gli esseri umani Eserciti AI Prompt Engineering con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare AI Prompt Engineering?

Non è richiesta alcuna esperienza precedente. AI Prompt Engineering su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Come l'IA genera le risposte»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione AI Prompt Engineering?

Sì. Ogni lezione AI Prompt Engineering include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Comprendere l'interfaccia di chat
  2. Tipi di richieste che l'IA può gestire
  3. Come l'IA genera le risposte
  4. Cosa non può fare l'IA
← Torna a AI Prompt Engineering