Valutazione degli LLM: dai benchmark pubblici al tuo golden set
Stesso agent, stesso task, dieci run: sette successi sembrano il 70 %, finché calcoli pass^10 e scopri che vale zero.
In questa pagina
Ecco una dimostrazione. L'agent del Capitolo 23 — lo stesso loop, due dei suoi quattro tool — viene puntato a una directory di cinque file di log e configurazione e riceve una domanda.
Q: What is the last line of errors.log about?
turn 1 -> read_file({"path": "errors.log"})
turn 2 -> "The last line of errors.log is:
ERROR worker 7 timed out after 30000 ms."Corretto, e non prova assolutamente nulla — perché quel transcript è uno dei dieci che ho eseguito, e l'ho scelto dopo averli visti tutti e dieci.
Esegui lo stesso task dieci volte, senza cambiare nulla tranne il seed di sampling, e l'agent risponde correttamente sette volte. Settanta per cento: il numero che finirebbe nella slide. Ora fai la domanda che interessa davvero a un cliente — funzionerà ogni volta? — e la risposta è un numero del tutto diverso:
t20 7/10 successes = 70 % (95 % Wilson interval: 39.7 % to 89.2 %)
pass^1 70.00 % pass^5 8.33 %
pass^2 46.67 % pass^7 0.83 %
pass^3 29.17 % pass^8 0.00 %
pass^4 16.67 % pass^10 0.00 %L'agent non ha mai risolto questo task dieci volte di fila e, sulla base di queste evidenze, non ci aspettiamo che lo faccia. Quel numero — pass^10 — è quello onesto, non viene quasi mai pubblicato e, alla fine di questo capitolo, saprai come calcolarlo, quanto costa calcolarlo e perché l'intervallo accanto al 70 % conta più del 70 %.
Mostra dettagli
Cosa serve a questo capitolo dai precedenti.
- Capitolo 4 per la statistica: l'intervallo di Wilson su una proporzione, il motivo per cui diciassette corrette su venti non distinguono nulla, e la dumb baseline come primo requisito.
- Capitolo 15 per il bench: il harness da cinquanta righe, il paired sign test sui casi in cui due sistemi non concordano, e la regola per cui un prompt si misura, non si discute.
- Capitolo 23 per la cosa misurata: il loop, le cinque vie d'uscita, la contabilità dei costi, e l'osservazione finale che un harness rende un agent governabile ma non corretto.
Due pannelli qui. TypeScript per la tua valutazione, perché appartiene alla tua continuous integration accanto al tuo codice. Python per il secondo pannello, perché i benchmark pubblici vivono lì e una delle misure qui sotto richiede i logits.
Tre progetti, tre strumenti
Link alla sezione: Tre progetti, tre strumentiQuasi ogni discussione sulla valutazione è fatta da due persone che misurano cose diverse. Ci sono tre progetti e non condividono lo stesso strumento.
| cosa stai valutando | la domanda | lo strumento | chi lo possiede |
|---|---|---|---|
| il model | questo model è migliore di quello, in generale? | benchmark pubblici, leaderboard | la community |
| la tua applicazione | il mio prompt, il mio retrieval, il mio schema funzionano sui miei input? | il tuo golden set | tu |
| il tuo agent | l'intero loop, con tool ed effetti collaterali, raggiunge l'obiettivo in modo affidabile? | successo del task più pass^k | tu |
La confusione costa cara in una direzione. Una leaderboard ti dice che un model è forte nel ragionamento di livello universitario; non può dirti se instraderà i tuoi ticket di supporto. E una valutazione applicativa che assegna un punteggio a una risposta per input non può vedere affatto un agent, perché un agent ha una distribuzione di traiettorie e una risposta è un singolo campione da quella distribuzione. Il Capitolo 22 ha dato un nome a quella terza riga e l'ha lasciata vuota: la misura di performance, l'unica parte della specifica di un agent che i team scrivono per ultima o mai.
Conta anche l'ordine, e lo dice lo stesso vendor che ti vende il model. La guida agli agent di OpenAI riduce la selezione del model a tre passaggi, in quest'ordine: «Configura evals per stabilire una baseline di performance», «Concentrati sul raggiungimento del tuo target di accuratezza con i migliori model disponibili», «Ottimizza costi e latenza sostituendo i model più grandi con model più piccoli dove possibile».1 La valutazione viene prima, perché i passaggi due e tre non significano nulla senza un numero.
Il golden set, e cosa comprano davvero venti casi
Link alla sezione: Il golden set, e cosa comprano davvero venti casiUn golden set è una lista di input, ciascuno con la risposta scritta, e un grader che decide se un output corrisponde. È noioso, è piccolo, ed è l'unico artefatto in questo capitolo che è tuo. Quello costruito qui contiene venti task su una directory di cinque file — non i tre del Capitolo 23, quindi le risposte non sono le stesse — e il grader viene scritto prima che l'agent giri:
export type Task = {
id: string;
prompt: string;
answer: string; // the fact, in words, for a human and for a judge
must: RegExp[]; // ALL must match the final answer
mustNot?: RegExp[]; // NONE may match
};
export const GOLDEN: Task[] = [
{ id: "t04", prompt: "Which file is the largest?", answer: "access.log",
must: [/access\.log/i], mustNot: [/errors\.log/i, /notes\.txt/i] },
{ id: "t12", prompt: "Which HTTP status codes appear in access.log? List all of them.",
answer: "200, 429 and 500", must: [/200/, /429/, /500/] },
// ...eighteen more
];Due proprietà reggono tutto. La lista mustNot esiste perché un model che nomina tre file includendo quello giusto non ha risposto. E answer è scritto in prosa oltre che in pattern, perché più avanti servirà sia a un umano sia a un giudice — e scrivere lo stesso fatto due volte in due notazioni è il modo in cui scopri di non essere d'accordo con te stesso su quale fosse il task.
Ora la tabella che decide. Quattro sistemi candidati, gli stessi venti task, accuratezza con il suo intervallo, e le due colonne che una tabella di sole accuratezze nasconde sempre:
| sistema | corrette | accuratezza, Wilson 95 % | costo per task risolto | latenza media |
|---|---|---|---|---|
| A — senza tool, greedy | 2/20 | 10.0 % [2.8, 30.1] | $0.004649 | 663 ms |
| B — tool, prompt asciutto | 5/20 | 25.0 % [11.2, 46.9] | $0.005576 | 1,362 ms |
| C — tool, prompt guidato | 2/20 | 10.0 % [2.8, 30.1] | $0.013071 | 930 ms |
| D — C, best of 3 a T = 0.7 | 1/20 | 5.0 % [0.9, 23.6] | $0.073532 | 2,628 ms |
Leggi gli intervalli prima del vincitore. Il braccio B va dall'11 % al 47 %; il braccio A dal 3 % al 30 %. Si sovrappongono per gran parte della loro lunghezza, cioè il risultato del Capitolo 4 che arriva esattamente dove era stato promesso: venti casi non possono classificare quattro sistemi. Il Capitolo 15 lo ha reso più preciso ponendo invece la domanda appaiata — tra i casi in cui due bracci dissentono, quanto è sbilanciata la divisione? — perché la difficoltà condivisa del set si annulla. Ecco ogni coppia:
A vs B +0 / -3 p = 0.2500 B vs C +4 / -1 p = 0.3750
A vs C +2 / -2 p = 1.0000 B vs D +4 / -0 p = 0.1250
A vs D +2 / -1 p = 1.0000 C vs D +1 / -0 p = 1.0000Nessuno dei sei confronti è stabilito. Il braccio migliore batte quello senza tool di quindici punti, e tutto poggia su tre casi discordanti. Venti casi mostrano un meccanismo e non possono scegliere un fornitore; dire il contrario in riunione è il modo in cui si compra un cattivo model.
C'è una cosa che questa tabella stabilisce, ed è la colonna che nessuno mette. Il braccio D costa tredici volte il braccio B per task risolto, perché campionare tre traiettorie e prendere la risposta modale triplica il conto, che triplichi o no l'accuratezza. Le tabelle di accuratezza che omettono il costo rendono invisibile quello scambio.
La metrica decide il numero
Link alla sezione: La metrica decide il numeroOra il risultato che cambia il modo in cui leggerai ogni benchmark che vedrai. Prendi gli stessi duecento transcript — venti task, dieci run, non un token rigenerato — e assegnagli un punteggio in tre modi:
| grader | corrette | accuratezza, Wilson 95 % |
|---|---|---|
| exact match con la risposta scritta | 0/200 | 0.0 % [0.0, 1.9] |
| la risposta scritta appare come substring | 26/200 | 13.0 % [9.0, 18.4] |
| la rubrica a keyword sopra | 52/200 | 26.0 % [20.4, 32.5] |
Zero, tredici, ventisei. Il sistema non è cambiato. È cambiato il grader. L'exact match restituisce zero non perché l'agent sia inutile, ma perché nessuna risposta free-text è mai byte-identica a un riferimento: misura la formattazione e la riporta come capacità.
Non è una curiosità, è un meccanismo, e ha un nome. Una metrica hard-cutoff valuta un task tutto-o-niente su diversi sotto-fatti, quindi li compone. Il task t12 chiede tre status code insieme. Sulle dieci run:
per-code presence 200: 9/10 429: 6/10 500: 8/10 (mean 0.77 per fact)
all three at once 5/10Ogni fatto è corretto circa tre quarti delle volte; pretendere tutti e tre insieme dimezza il punteggio, e è abbastanza vicino allo 0.50 misurato da mostrare da dove arrivi il calo. Generalizziamo:
| accuratezza per fatto | |||||
|---|---|---|---|---|---|
| 0.60 | 60.0 % | 36.0 % | 21.6 % | 7.8 % | 0.6 % |
| 0.80 | 80.0 % | 64.0 % | 51.2 % | 32.8 % | 10.7 % |
| 0.90 | 90.0 % | 81.0 % | 72.9 % | 59.0 % | 34.9 % |
| 0.95 | 95.0 % | 90.3 % | 85.7 % | 77.4 % | 59.9 % |
Leggi la riga 0.90 contro la riga 0.95 a : un miglioramento per fatto di cinque punti diventa venticinque punti sulla congiunzione. Al model non è successo nulla di discontinuo. Una curva liscia letta attraverso una metrica tutto-o-niente sembra un salto — ed è precisamente l'argomento di Schaeffer, Miranda e Koyejo sulle capacità emergenti, che il Capitolo 10 ha rimandato qui.2 Il loro audit ha trovato che al massimo 5 delle 39 metriche preferite di BIG-Bench mostrano davvero emergenza, con due metriche discontinue responsabili di oltre il 92 % dei casi dichiarati.
Quindi la disciplina, in una riga: un salto in un grafico è evidenza sulla metrica finché non si dimostra il contrario. Prima di credere che sia apparsa una capacità, traccia le stesse run con una metrica che dia credito parziale e vedi se il precipizio resta.
C'è una versione di secondo ordine che Kalai e colleghi sostengono stia facendo danni a monte: i benchmark valutati giusto-o-sbagliato premiano l'indovinare rispetto al dire «non lo so», quindi un model ottimizzato contro di essi impara a indovinare. La correzione proposta non è un altro benchmark sulle hallucination, ma «modificare il punteggio dei benchmark esistenti che sono disallineati ma dominano le leaderboard».3 Il tuo golden set ha la stessa leva, ed è una riga: decidi se un'astensione conta come fallimento o come categoria propria. La maggior parte delle persone non decide mai, quindi conta silenziosamente come fallimento, e il sistema che spediscono indovina.
pass^k, e la varianza che nessuno pubblica
Link alla sezione: pass^k, e la varianza che nessuno pubblicaFinora abbiamo valutato un tentativo per task. Un agent non è un tentativo. Il Capitolo 17 ha stabilito che non hai determinismo nemmeno a temperature zero, quindi lo stesso input produce una distribuzione di traiettorie e un benchmark che esegue ogni task una volta riporta un campione da quella distribuzione.
Il contributo di τ-bench è la metrica per questo. Il paper la definisce chiaramente: «proponiamo una nuova metrica – pass^k (pass hat k), definita come la probabilità che tutte le k prove i.i.d. di un task abbiano successo, mediata sui task».4 Esegui ogni task volte, conta i successi, e gli stimatori non distorti sono:
Il secondo è il familiare pass@k della generazione di codice: la probabilità che almeno uno di tentativi riesca. Mettili fianco a fianco sugli stessi conteggi misurati e si muovono in direzioni opposte:
pass@k — almeno uno | pass^k — tutti | |
|---|---|---|
| 1 | 26.0 % | 26.0 % |
| 2 | 37.0 % | 15.0 % |
| 3 | 43.5 % | 10.5 % |
| 5 | 51.2 % | 6.7 % |
| 8 | 57.7 % | 5.1 % |
| 10 | 60.0 % | 5.0 % |
Stesse run, stesso grader, stessi venti task. Una colonna dice che il sistema migliora con più tentativi e l'altra dice che peggiora, ed entrambe sono corrette, perché rispondono a domande diverse. pass@k è la metrica giusta quando un umano filtra l'output — generazione di codice, bozze, brainstorming — e i tentativi extra costano poco. pass^k è la metrica giusta quando l'agent agisce senza filtro, che è ciò che significa «agent». Pubblicare la prima dove vale la seconda è la sovrastima più comune in questo campo, e il titolo stesso di τ-bench è la versione onesta: gpt-4o a circa 61 % pass^1 nel retail scende a circa 25 % a pass^8.4
Ora la puntura nei miei numeri. pass^10 sui miei venti task è 5.0 %: esattamente un task su venti risolto in tutte e dieci le run. Quel task è t19, «Il deploy 42 è riuscito?», e qui ci sono due delle dieci risposte che la rubrica ha valutato corrette:
run 2 "To check if 'deploy.log' succeeded in deploying 42, I will list the file
names in the working directory using the list_files function..."
run 8 "Yes, deploy 42 has successfully deployed. Deploying was successful for 41
as well."La prima non risponde mai. La seconda aggiunge un'affermazione falsa — il deploy 41 era stato rolled back. Entrambe hanno fatto match con /succe|yes/. L'unico task che tiene pass^10 sopra zero è un artefatto del grader, quindi il valore vero è zero, e nessun aggregato me lo avrebbe mostrato. Campionare i transcript dietro al tuo task con il punteggio migliore è dove i grader vanno a morire.
E un altro numero, quello da cui prende il nome questa sezione. Dieci valutazioni identiche — stesso sistema, stessi venti task, stesso codice, nulla cambiato tranne i seed:
per-run correct: 5 2 5 5 8 5 8 5 4 5 -> 10 % .. 40 %, mean 26.0 %, sd 8.8 pointsUn intervallo di trenta punti su un sistema che non è cambiato. Se esegui la suite una volta prima di un rilascio e una volta dopo, un «miglioramento» di otto punti sta dentro quella dispersione e lo spedirai credendo di averlo causato. Ecco perché l'intervallo pooled sopra — 26.0 % [20.4, 32.5] — è troppo stretto per essere citato da solo: tratta duecento prove correlate come se fossero duecento indipendenti. Il riassunto onesto di una valutazione di un agent è una media e una dispersione tra ripetizioni, e quasi nessuno pubblica la seconda.
Il giudice, e il golden set del giudice
Link alla sezione: Il giudice, e il golden set del giudiceLe rubriche non scalano alle risposte aperte, quindi la mossa standard è far valutare l'output a un model. Funziona abbastanza bene a scala frontier da essere il default, e ha tre failure mode con nome: position bias, verbosity bias e self-enhancement bias.5
Misuralo prima di fidarti. Le stesse sessanta risposte — tre delle dieci run — sono state etichettate in tre modi. L'etichetta umana è mia: ho letto tutte e sessanta con i cinque file aperti e ho applicato una regola scritta, passa se e solo se la risposta afferma il fatto richiesto dalla domanda e non contiene nulla di contraddetto dai file.
| grader | dice pass | concorda con l'umano | false pass | false fail |
|---|---|---|---|---|
| rubrica a keyword | 17/60 | 50/60 = 83.3 % [72.0, 90.7] | 8 | 2 |
| il model come giudice | 60/60 | 11/60 = 18.3 % [10.6, 29.9] | 49 | 0 |
Il giudice ha detto PASS sessanta volte su sessanta. Avrebbe riportato questo agent al 100 % di accuratezza su un set in cui l'umano lo valuta al 18 %. Un giudice senza potere discriminativo non è uno strumento rumoroso; è una funzione costante, e una funzione costante dà lo stesso punteggio al tuo sistema migliore e al tuo peggiore.
Il prompting non l'ha salvato. Quattro varianti, stessi sessanta item:
| prompt del giudice | dice pass | accordo con l'umano |
|---|---|---|
| «Rispondi PASS o FAIL.» | 60/60 | 18.3 % |
| «Rispondi FAIL o PASS.» — etichette invertite | 56/60 | 25.0 % |
| più una lista esplicita di cosa conta come fallimento | 55/60 | 26.7 % |
più un esempio svolto FAIL e un esempio PASS | 56/60 | 25.0 % |
Invertire l'ordine delle due etichette nell'istruzione ha spostato quattro verdetti. È un effetto misurabile ed è il tipo sbagliato di effetto: il giudice risponde alla forma del prompt invece che alla risposta davanti a sé.
La dimostrazione pulita è pairwise. Venti domande, ciascuna con un candidato chiaramente corretto e uno chiaramente sbagliato, presentati in entrambi gli ordini:
picked the FIRST option 40/40 = 100.0 %
order-consistent (same winner both ways) 0/20 = 0.0 % [Wilson 0.0, 16.1]
picked the CORRECT answer 20/40 = 50.0 %Ha scelto la posizione A quaranta volte su quaranta. Il 50 % sulla correttezza non è competenza parziale — è aritmetica, perché la risposta corretta si trova in posizione A esattamente in metà delle prove. La coerenza qui è definita come in MT-Bench, «la percentuale di casi in cui un giudice dà risultati coerenti quando si scambia l'ordine di due assistant», il che rende il confronto omogeneo: GPT-4 ottiene 65.0 % su quella misura, e il few-shot prompting lo porta a 77.5 %.5 Il mio ottiene zero.
La mitigazione standard viene anch'essa da quel paper: «chiamare un giudice due volte scambiando l'ordine di due risposte e dichiarare una vittoria solo quando una risposta è preferita in entrambi gli ordini».5 Applicala qui e il giudice produce zero verdetti utilizzabili su venti coppie — che è l'esito corretto, e infinitamente meglio di venti verdetti sicuri.
Una nota metodologica che vale più del risultato. Ho eseguito anche un test di verbosity: la stessa risposta corretta, una copia riempita con una frase di 36 parole che non aggiunge nulla. Il giudice ha preferito la versione più lunga esattamente nel 50 % delle prove — cosa che sembra assenza di verbosity bias e non lo è affatto, perché un giudice che sceglie sempre la posizione A ottiene 50 % su qualunque pairing bilanciato. Non puoi misurare un secondo bias finché il primo non è controllato. Scambiare le posizioni non è una rifinitura da aggiungere dopo; è ciò che rende interpretabile ogni altra misura.
A cosa serve un giudice. Risposte aperte senza forma parseable: tono, copertura, se una citazione supporta la sua frase, se un rifiuto era appropriato. Economico, veloce, e più o meno buono quanto il suo base model.
Cosa non è un giudice. Una ground truth. È un sistema con un'accuratezza, un profilo di bias e un costo, e ha bisogno del proprio golden set di etichette umane — inclusi fallimenti noti — prima che qualsiasi numero che produce significhi qualcosa.
La cautela onesta: questo giudice è un model da mezzo miliardo di parameter, e nessuno dovrebbe usarne uno per valutare. Il punto non è che i giudici siano cattivi. È che i numeri sopra sono costati otto minuti da produrre, e senza di essi il verdetto di questo giudice su una decisione di rilascio sarebbe stato 100 %.
Secondo pannello: Python, e una sonda per la contamination
Link alla sezione: Secondo pannello: Python, e una sonda per la contaminationQuesto è il terzo e ultimo pannello Python dichiarato del corso, e il motivo è da dove arrivano i numeri pubblici. lm-evaluation-harness copre «oltre 60 benchmark accademici standard per LLMs, con centinaia di subtasks e varianti implementate» ed è «il backend della popolare Open LLM Leaderboard di Hugging Face»; HELM, SWE-bench e τ-bench sono pacchetti Python con entry point Python.6 Eseguire il tuo model contro una cifra pubblicata significa eseguire il loro codice, e il giorno in cui vuoi confrontarti con un numero citato da qualcuno, questo è l'ecosistema in cui ti trovi:
lm_eval --model hf \
--model_args pretrained=EleutherAI/gpt-j-6B \
--tasks hellaswag \
--device cuda:0 \
--batch_size 8Il secondo motivo è che una misura in questo capitolo è impossibile via HTTP. Contamination — il test set trapelato nei dati di training — è il fallimento che rende silenziosamente inutile un benchmark pubblico, e la sonda più affilata richiede la loss del model, che nessuna chat API restituisce. È la cross-entropy per token del Capitolo 8, puntata a una domanda sulla memoria:
def nll(text: str) -> float:
"""Mean negative log-likelihood per token, in nats."""
ids = tok(text, return_tensors="pt").input_ids.to(model.device)
with torch.no_grad():
out = model(ids, labels=ids)
return float(out.loss)Dieci coppie di frasi: cinque presenti in ogni crawl del web da quando esiste, cinque scritte per questo capitolo stamattina, ciascuna abbinata a una versione riformulata con lo stesso contenuto.
| set | formulazione canonica | riformulata | gap |
|---|---|---|---|
| famose, media di 5 | 1.21 | 3.03 | +1.83 |
| fresche, media di 5 | 5.02 | 5.96 | +0.93 |
Il model è quattro volte più sorpreso da una frase scritta stamattina che da una vista un milione di volte, e riformulare costa il doppio sulle frasi famose — il costo extra è la parte memorizzata invece che compresa. La loss assoluta confonde memorizzazione e normale naturalezza, quindi il gap è la statistica migliore e il test di continuazione lo è ancora di più. Dagli le prime sei parole:
famous "Permission is hereby granted, free of"
-> "charge, to any person obtaining a copy of this software and associated
documentation files (the "
famous "All human beings are born free"
-> "and equal in dignity and rights. The right to life, liberty, and security"
fresh "All evaluation harnesses are born tiny"
-> ", and the most common way to measure their size is by using a ruler."Tre delle cinque stringhe famose sono continuate parola per parola da sei parole; nessuna delle cinque fresche lo ha fatto. È un model da mezzo miliardo di parameter che recita la Licenza MIT. Se il tuo benchmark è sul web pubblico, presumi che sia nei weights. È anche l'argomento dell'intero capitolo: un golden set scritto da te sui tuoi dati, tenuto fuori da qualunque repository letto da un crawler, è l'unico test set di cui puoi essere certo che non sia mai stato usato in training.
Cosa misurano davvero i benchmark pubblici
Link alla sezione: Cosa misurano davvero i benchmark pubbliciVale comunque la pena leggerli, purché tu legga cosa misura ciascuno invece del singolo numero associato.
| benchmark | cosa misura | un numero dal paper |
|---|---|---|
| MMLU | conoscenza a scelta multipla su 57 materie | GPT-3 ha superato il caso di «quasi 20 punti percentuali in media»7 |
| HELM | molte metriche × molti scenari, standardizzati | la copertura degli scenari core è passata dal 17.9 % al 96.0 %8 |
| Chatbot Arena | preferenza umana pairwise crowdsourced | oltre 240K voti; i voti della folla sono «in buon accordo» con gli esperti9 |
| SWE-bench | risoluzione di issue GitHub reali, valutate dai test del repo | 2,294 problemi; il miglior model dell'epoca ne risolveva «appena l'1.96 %»10 |
| τ-bench | uso di tool con utente simulato e policy di dominio | gpt-4o ≈ 61 % pass^1, ≈ 25 % pass^8 nel retail4 |
| WebArena | task di lungo orizzonte su siti funzionanti | miglior agent GPT-4 al 14.41 % contro il 78.24 % degli umani11 |
| OSWorld | task desktop e OS reali tra applicazioni | 369 task; miglior model 12.24 %, umani 72.36 %12 |
| GAIA | domande facili per le persone, difficili per gli assistant | 466 domande; umani 92 %, GPT-4 con plugin 15 %13 |
| AgentBench | ragionamento da agent in 8 ambienti distinti | un grande divario tra model commerciali e open14 |
| AgentHarm | se un agent eseguirà task malevoli multi-step | 110 task malevoli su 11 categorie di danno15 |
Prendi la tabella più di qualsiasi riga. I benchmark agentic mettono tutti gli umani molto sopra i model, l'opposto dei benchmark di conoscenza e il miglior riassunto in una riga dello stato del campo; le loro cifre invecchiano in mesi, quindi citale con la data in cui le hai lette; e ognuno misura un task che non è il tuo.
Le metriche che decidono in produzione
Link alla sezione: Le metriche che decidono in produzioneL'accuratezza è la metrica su cui si discute. Queste sono quelle che decidono se la cosa viene spedita. Tutte e quattro escono dalle duecento run già misurate.
Costo per task risolto, non per call. L'agent costa $0.001345 per tentativo e $0.005172 per task effettivamente risolto — 3.85 volte di più, perché tre quarti dei tentativi non producono nulla. La latenza si comporta allo stesso modo: 1,213 ms per tentativo, 4,667 ms per task risolto. Ogni retry, ogni nuova domanda, ogni traiettoria abbandonata è nel secondo numero e invisibile nel primo.
Una diagnostica che batte l'accuratezza. In 123 tentativi su 200 l'agent ha risposto senza chiamare nemmeno un tool — ha indovinato invece di guardare. Dividendo su questo:
answered without reading anything 8/123 = 6.5 % [3.3, 12.3]
answered after reading something 44/77 = 57.1 % [46.0, 67.6]Gli intervalli non arrivano neanche vicini a toccarsi. Vale più dell'aggregato 26 %, perché nomina la cosa da sistemare — il model non sta fallendo nel ragionare, sta fallendo nel guardare — e la correzione è nel harness, non nel model. Una cautela che questo capitolo deve ai propri standard: i due gruppi sono task diversi, non gli stessi task appaiati, quindi una parte del gap può dipendere dal fatto che salti i tool proprio sulle domande che trova difficili. La divisione è una diagnostica, non un'affermazione causale.
Il tasso di intervento umano è la metrica che un acquirente chiede per prima: quale frazione di run si è fermata a un'approvazione, un guardrail o un handoff. Le interruzioni tipizzate del Capitolo 23 lo rendono contabile, e contato per tipo di task e per settimana è ciò che separa un agent che impara il proprio lavoro da uno che diventa silenziosamente una coda.
L'abbandono è quello che nessuna suite offline può vedere: l'utente che ha letto la risposta, ha chiuso la scheda e ha svolto il task da solo. La valutazione offline è un gate; la valutazione in produzione è un campione continuo di traffico reale, valutato con lo stesso grader più queste quattro.
E una regola ereditata dal Capitolo 17: non fare mai assert sull'output esatto. Fai assert su proprietà — JSON valido, schema corretto, il tool giusto chiamato, un numero entro tolleranza, una substring richiesta presente. La colonna exact-match all'inizio di questo capitolo è ciò che succede quando quella regola viene infranta.
Cosa invii a una terza parte
Link alla sezione: Cosa invii a una terza parteValutare un fornitore non riguarda solo l'accuratezza, e questa è la seconda metà dell'etica di questo corso, con un titolo proprio invece che un'appendice.
Misura il bias, non presumerlo. Qualunque cosa tu creda sul comportamento di un model su nomi, dialetti, generi o nazionalità, è una proprietà misurabile della tua pipeline, e lo strumento è quello che hai già: prendi il tuo golden set, varia solo l'attributo, confronta in modo appaiato. HELM esiste proprio perché si riportava solo l'accuratezza dove bias, tossicità, calibrazione e robustness erano anch'essi decidibili.8 La model card di un vendor è un punto di partenza, non evidenza sui tuoi input.
La contamination è anche una domanda da fornitore. La sonda sopra è il motivo per chiedere su cosa sia stato misurato un numero pubblicato, e quando siano stati tagliati i dati del model.
Retention, training e residency, letto il 7 settembre 2026. Queste cose cambiano, quindi registra la data accanto alla risposta. La pagina policy di Anthropic afferma: «Per impostazione predefinita, non useremo i tuoi input o output dai nostri prodotti commerciali (ad es. Claude for Work, Anthropic API, Claude Gov, ecc.) per addestrare i nostri model», con l'eccezione dei contenuti che invii esplicitamente come feedback, conservati «fino a 5 anni».16 La documentazione sui controlli dei dati di OpenAI afferma che «i dati inviati alla OpenAI API non sono usati per addestrare o migliorare i model OpenAI (a meno che tu scelga esplicitamente di condividere dati con noi)», descrive una retention predefinita di trenta giorni per i log di monitoraggio abusi, e offre Zero Data Retention, che «esclude i contenuti dei clienti dai log di monitoraggio abusi», più data residency configurabile in una lista di regioni.17
Quattro domande da mettere per iscritto prima della prima call di produzione, perché ognuna ha un owner diverso: i miei dati sono usati per training; per quanto tempo sono conservati e da chi; dove sono elaborati e archiviati; e cosa succede a tutto questo se uso un reseller, un gateway o un aggregatore invece del provider diretto. L'ultima è dove vive la maggior parte delle sorprese, e nessun benchmark te lo dirà.
Dove si va dopo
Link alla sezione: Dove si va dopoOra hai lo strumento: un golden set che possiedi, un intervallo su ogni numero, un test appaiato per ogni confronto, pass^k per le run che non hai mostrato a nessuno, un giudice misurato, e una sonda per capire se un punteggio pubblico significhi qualcosa. L'affermazione finale del Capitolo 23 può ora essere verificata invece che dichiarata — un harness rende un agent governabile, non corretto — e verificarla ha richiesto duecento run e otto minuti.
C'è una proprietà di un agent che nulla di tutto questo misura, ed è quella che fa licenziare le persone.
Ogni task nel golden set di questo capitolo è stato scritto da me, e ogni file letto dall'agent è stato scritto da me. Nulla in quella directory stava cercando di fare qualcosa. Cambia una riga in un file che l'agent deve leggere — una riga che finisce con un'istruzione rivolta a chiunque la legga dopo — e l'agent che ha ottenuto 26 % la seguirà con gli stessi tool, gli stessi permessi e la stessa trace pulita, e ogni numero in questo capitolo resterà esattamente dov'è. Una suite di valutazione misura quanto spesso un sistema raggiunge il tuo obiettivo. Non misura quanto facilmente qualcun altro possa sostituirlo con il proprio.
Il Capitolo 30 è questo: prompt injection, la trifecta letale di dati privati, contenuto non affidabile e comunicazione esterna, e quanto costa dare a un agent permessi reali. Si apre con l'osservazione che questo capitolo ha evitato — che lo stesso punteggio di passaggio è compatibile con un agent che fa esattamente ciò che un attaccante ha scritto in un file che gli è stato detto di leggere.
Fonti e metodo
Link alla sezione: Fonti e metodoOgni numero sopra è stato prodotto su una macchina e nessuno ha toccato un endpoint a pagamento. L'agent è il loop del Capitolo 23 con due dei suoi quattro tool su una directory di cinque file; il model dietro la porta è Qwen/Qwen2.5-0.5B-Instruct, esposto tramite un piccolo server della stessa forma di un endpoint chat completions esattamente come nel Capitolo 23, ma in half precision su una GPU consumer invece che sulla CPU di quel capitolo. I costi usano le tariffe del Capitolo 16 — $2.00 per milione di input tokens e $12.00 per milione di output — applicate ai conteggi di token misurati. Le run ripetute usano temperature 0.7 con seed fissi così l'intero set si riproduce; la tabella a quattro bracci è greedy. Gli intervalli sono Wilson al 95 %, i confronti appaiati sono sign test esatti a due code sulle coppie discordanti; l'intervallo di Wilson è quello del Capitolo 4 e il sign test appaiato esatto è quello del Capitolo 15, entrambi riusati senza modifiche. Le etichette umane sono mie, applicate a sessanta risposte secondo la regola scritta citata nel testo. Leggi ogni grandezza qui come proprietà di un model da mezzo miliardo di parameter e ogni metodo come trasferibile: un model più grande sposta tutti i numeri verso l'alto e non sposta nessuno degli strumenti.
Riferimenti
Link alla sezione: Riferimenti-
OpenAI, A practical guide to building agents (PDF), pagina 8, letto il 7 settembre 2026. Fonte dell'ordine in tre passaggi citato sopra e del consiglio associato di «costruire il prototipo del tuo agent con il model più capace per ogni task per stabilire una baseline di performance. Da lì, prova a sostituire model più piccoli per vedere se ottengono ancora risultati accettabili.» I Capitoli 22 e 25 citano le sue pagine definitorie e di orchestrazione. ↩
-
Schaeffer, R., Miranda, B. and Koyejo, S. Are Emergent Abilities of Large Language Models a Mirage? arXiv:2304.15004 (2023). L'argomento secondo cui metriche discontinue, tutto-o-niente, fabbricano salti apparenti da miglioramenti sottostanti lisci, con l'audit BIG-Bench citato nel Capitolo 10. Vale la pena ripetere la loro cautela: nulla nel paper sostiene che i model grandi non possano mostrare capacità emergenti. ↩
-
Kalai, A. T., Nachum, O., Vempala, S. S. and Zhang, E. Why Language Models Hallucinate. arXiv:2509.04664 (2025). L'argomento secondo cui i benchmark che valutano giusto-o-sbagliato premiano l'indovinare rispetto all'astensione, e il rimedio proposto di «modificare il punteggio dei benchmark esistenti che sono disallineati ma dominano le leaderboard, invece di introdurre ulteriori valutazioni sulle hallucination». Il Capitolo 19 lo cita dal lato retrieval; questo è il lato valutazione della stessa tesi. ↩
-
Yao, S., Shinn, N., Razavi, P. and Narasimhan, K. τ-bench: A Benchmark for Tool-Agent-User Interaction in Real-World Domains. arXiv:2406.12045 (2024). L'origine di
pass^k, definito come citato sopra, con entrambi gli stimatori stampati fianco a fianco nel paper; il titolo dell'abstract è che gli agent state-of-the-art con function-calling «riescono in <50 % dei task, e sono piuttosto incoerenti (pass^8 <25 % nel retail)», e la sezione 1 dà le cifre di gpt-4o di ≈61 %pass^1e ≈25 %pass^8su τ-retail. Lo stimatorepass@kcon cui lo confronta viene da Chen, M. et al., Evaluating Large Language Models Trained on Code, arXiv:2107.03374 (2021). ↩ ↩2 ↩3 -
Zheng, L. et al. Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena. arXiv:2306.05685 (2023). Fonte dei tre bias nominati, della definizione di coerenza usata sopra («la percentuale di casi in cui un giudice dà risultati coerenti quando si scambia l'ordine di due assistant»), del risultato per cui «solo GPT-4 produce risultati coerenti in più del 60 % dei casi» con 65.0 % che sale a 77.5 % few-shot, e della mitigazione swap-and-require-agreement citata alla lettera. Conta anche il suo risultato positivo: i giudici GPT-4 raggiungono «un tasso di accordo superiore all'80 %» con le valutazioni umane, «lo stesso livello dell'accordo umano-umano» — ed è il motivo per usare un giudice, e il motivo per misurare il tuo. ↩ ↩2 ↩3
-
EleutherAI, Language Model Evaluation Harness, README del progetto letto il 7 settembre 2026: «oltre 60 benchmark accademici standard per LLMs, con centinaia di subtasks e varianti implementate», e «il backend della popolare Open LLM Leaderboard di Hugging Face». L'invocazione
lm_evalcitata sopra è l'esempio del README stesso. Liang, P. et al., Holistic Evaluation of Language Models, arXiv:2211.09110 (2022), è l'altro runner standard e la lettura migliore sul design della valutazione. ↩ -
Hendrycks, D., Burns, C., Basart, S., Zou, A., Mazeika, M., Song, D. and Steinhardt, J. Measuring Massive Multitask Language Understanding. arXiv:2009.03300 (2020). 57 task; l'affermazione dell'abstract secondo cui il più grande model GPT-3 «migliora rispetto al caso di quasi 20 punti percentuali in media» è un utile promemoria di quanto sia recente la saturazione di questo benchmark. ↩
-
Liang, P. et al. Holistic Evaluation of Language Models. arXiv:2211.09110 (2022). Sette metriche — accuracy, calibration, robustness, fairness, bias, toxicity ed efficiency — su 16 scenari core e 30 model, con le cifre di copertura citate sopra. Il motivo per leggerlo è il framing: quale delle sette riporti è essa stessa una scelta. ↩ ↩2
-
Chiang, W.-L. et al. Chatbot Arena: An Open Platform for Evaluating LLMs by Human Preference. arXiv:2403.04132 (2024). Oltre 240K voti al momento della scrittura, preferenza umana pairwise crowdsourced, e l'affermazione che «i voti umani crowdsourced sono in buon accordo con quelli di valutatori esperti». ↩
-
Jimenez, C. E., Yang, J., Wettig, A., Yao, S., Pei, K., Press, O. and Narasimhan, K. SWE-bench: Can Language Models Resolve Real-World GitHub Issues? arXiv:2310.06770 (2023). 2,294 problemi da 12 repository Python, valutati dai test dei repository stessi, con il miglior model dell'epoca che risolveva «appena l'1.96 %». Il Capitolo 23 lo usa per l'altro senso della parola «harness». ↩
-
Zhou, S. et al. WebArena: A Realistic Web Environment for Building Autonomous Agents. arXiv:2307.13854 (2023). Siti funzionanti in quattro domini, con il miglior agent GPT-4 al 14.41 % contro il 78.24 % degli umani. ↩
-
Xie, T. et al. OSWorld: Benchmarking Multimodal Agents for Open-Ended Tasks in Real Computer Environments. arXiv:2404.07972 (2024). 369 task su sistemi operativi reali; umani sopra il 72.36 %, miglior model 12.24 %, con il GUI grounding indicato come gap principale. ↩
-
Mialon, G., Fourrier, C., Swift, C., Wolf, T., LeCun, Y. and Scialom, T. GAIA: A Benchmark for General AI Assistants. arXiv:2311.12983 (2023). 466 domande, umani al 92 % contro il 15 % di GPT-4 con plugin — la dichiarazione pubblicata più pulita del divario tra ciò che è facile per una persona e ciò che è facile per un assistant. ↩
-
Liu, X. et al. AgentBench: Evaluating LLMs as Agents. arXiv:2308.03688 (2023). Otto ambienti distinti, e una disparità significativa tra i migliori model commerciali e quelli open-source di dimensione comparabile. ↩
-
Andriushchenko, M. et al. AgentHarm: A Benchmark for Measuring Harmfulness of LLM Agents. arXiv:2410.09024 (2024). 110 task agent esplicitamente malevoli (440 con augmentation) su 11 categorie di danno, con il risultato che i model leader sono «sorprendentemente compiacenti con richieste agent malevole senza jailbreaking» e che semplici template di jailbreak universali si trasferiscono agli agent mantenendone le capacità. È il ponte al Capitolo 30: un capability benchmark e un harm benchmark misurano lo stesso sistema e non concordano sul fatto che sia pronto. ↩
-
Anthropic, Is my data used for model training?,
privacy.claude.com, letto il 7 settembre 2026. Citato alla lettera sopra, inclusa l'eccezione del feedback e la finestra di archiviazione di cinque anni per il feedback inviato. ↩ -
OpenAI, Your data (documentazione sui controlli dei dati API),
developers.openai.com, letto il 7 settembre 2026. Fonte della dichiarazione predefinita di non-training, della retention di trenta giorni per il monitoraggio abusi, della descrizione di Zero Data Retention e della lista degli endpoint idonei, e delle regioni di data residency. ↩