Torna al blog

AI per principiantiGuida

Testa il tuo prompt su 20 casi: valutazione per corrispondenza esatta in Python

Costruisci un set di test di 20 casi, valuta un prompt per corrispondenza esatta con un breve script Python e scopri se una modifica al prompt ha davvero aiutato.

Di CheapTokens TeamPubblicato il 7 min di lettura

Copertina: uno snippet di codice che confronta una risposta del modello con l'etichetta attesa, intitolato Testa il tuo prompt su 20 casi
In questa pagina
  1. Costruisci il set di test: 20 messaggi e la risposta che ti aspetti
  2. Lo script: invia ogni caso, confronta, stampa gli errori
  3. Cambia una cosa, esegui di nuovo
  4. Stesso set, un altro modello: mantiene il punteggio?
  5. Dove la corrispondenza esatta smette di funzionare

Il tuo prompt ha funzionato sui due messaggi che hai provato. Significa che funziona? Non ancora. Eseguilo su 20 messaggi reali con risposte note, conta quanti ne azzecca e leggi quelli che sbaglia. Un breve script Python fa il conteggio e, quando modifichi il prompt, lo stesso script ti dice se la modifica ha aiutato invece di lasciarlo al tuo intuito.

La documentazione di Anthropic su definire i criteri di successo e costruire le valutazioni (consultata il 7 novembre 2026) lo dice con le sue parole: rendi i test specifici per il tuo compito, includi i casi scomodi e preferisci molte domande valutate automaticamente a poche valutate a mano. Qui sotto c'è la versione più piccola di questo che puoi eseguire oggi.

Quattro passaggi: 20 casi vanno al modello, le risposte vengono confrontate per corrispondenza esatta e ottieni un punteggio di accuratezza più gli errori
L'intero metodo: casi in ingresso, un numero e un elenco di errori in uscita

Costruisci il set di test: 20 messaggi e la risposta che ti aspetti#

Supponi di ordinare i messaggi dei clienti in tre pile: positivo, negativo o misto. Apri un file chiamato cases.csv e annota 20 messaggi che potresti davvero ricevere, ciascuno con l'etichetta che tu gli daresti. Scrivi le etichette prima di eseguire qualsiasi cosa. Se copi le risposte del modello come "corrette", il test può solo essere d'accordo con il modello.

csv
text,label
"Arrived a day early and works perfectly. Thank you!",positive
"The charger stopped working after two days.",negative
"Great screen, but the battery barely lasts until lunch.",mixed
"Support answered in five minutes and fixed it.",positive
"I waited three weeks and nobody replied.",negative
"Oh great, another update that deletes my settings.",negative
"Nice design. Pity about the price.",mixed
"Exactly what I ordered.",positive
"The box was crushed, but the headphones inside are fine and sound great.",mixed
"Refund took 10 days. Never again.",negative
"Love it!!",positive
"Cheaply made, but honestly it does the job for the price.",mixed
"Worst purchase of the year.",negative
"Five stars. Would buy again.",positive
"Fast delivery, wrong colour.",mixed
"It's fine. Not amazing, not terrible.",mixed
"Zero issues in six months of daily use.",positive
"The app crashes every time I open the camera.",negative
"Thanks for nothing.",negative
"Setup was a pain, but once it ran, it's been rock solid.",mixed

Guarda la composizione: 6 positivi, 7 negativi, 7 misti. Le frasi sarcastiche ("Oh great, another update…", "Thanks for nothing.") e quella borderline ("It's fine. Not amazing, not terrible.") ci sono di proposito. Un set fatto solo di messaggi ovvi ottiene il 100% e non ti insegna nulla. Prendi quelli reali dalla tua casella di posta, dai tuoi ticket o dall'esportazione della chat; i casi limite sono quelli che sai già essere fastidiosi.

Perché 20? È una dimensione iniziale, non un numero preso dalla documentazione (il loro esempio usa 1.000 tweet). Venti sono abbastanza pochi da scriverli a mano in mezz'ora e abbastanza da far sì che una risposta fortunata non decida il punteggio.

Lo script: invia ogni caso, confronta, stampa gli errori#

Il piano ha quattro passaggi e il codice li segue riga per riga.

Metti in ordine

Metti in ordine il ciclo di valutazione

  1. Carica i 20 casi dal CSV
  2. Invia ogni messaggio al modello con il tuo prompt
  3. Confronta la risposta con la tua etichetta
  4. Stampa l'accuratezza e i casi falliti

Il ciclo funziona solo quando le etichette esistono prima della prima chiamata al modello, e i fallimenti vengono per ultimi perché sono ciò che leggi e su cui agisci.

Installa l'SDK con pip install openai e tieni la chiave in una variabile d'ambiente chiamata CHEAPTOKENS_API_KEY. Qualsiasi API compatibile con OpenAI funziona allo stesso modo; qui lo script punta a CheapTokens e GLM-5.3-Flash (i dettagli di configurazione sono nella documentazione).

python
import csv
import os
from openai import OpenAI

client = OpenAI(
    base_url='https://api.cheaptokens.dev/v1',
    api_key=os.environ['CHEAPTOKENS_API_KEY'],
)
MODEL = 'zai-org/GLM-5.3-Flash'

PROMPT = (
    'Classify the customer message as positive, negative or mixed. '
    'Answer with one word only.'
)


def ask(text):
    r = client.chat.completions.create(
        model=MODEL,
        temperature=0,
        max_tokens=100,
        messages=[
            {'role': 'system', 'content': PROMPT},
            {'role': 'user', 'content': text},
        ],
    )
    return r.choices[0].message.content or ''


with open('cases.csv', newline='', encoding='utf-8') as f:
    cases = list(csv.DictReader(f))

correct, failed = 0, []
for case in cases:
    got = ask(case['text'])
    ok = got.strip().strip('.').lower() == case['label']
    correct += ok
    if not ok:
        failed.append((case['text'], case['label'], got.strip()))

print(f'Accuracy: {correct}/{len(cases)} = {correct / len(cases):.0%}')
for text, want, got in failed:
    print(f'- {text!r}: expected {want}, got {got!r}')

Tre dettagli meritano un secondo sguardo.

  • temperature=0 mantiene le risposte il più possibile stabili, così una variazione del punteggio deriva dal tuo prompt e non dal caso.
  • max_tokens=100 è molto più di quanto serva a un'etichetta di una parola. Se una risposta torna vuota o troncata, controlla finish_reason; la guida su finish_reason "length" mostra cosa aumentare.
  • La riga di valutazione è la ricetta della documentazione, strip().lower() confrontato con la risposta giusta, più un'aggiunta: elimina anche il punto finale, perché "Negative." e "negative" sono la stessa risposta per te.

Cosa vedi quando viene eseguito? Una riga di accuratezza, poi una riga per ogni errore. Supponi che la prima esecuzione stampi questo:

text
Accuracy: 14/20 = 70%
- 'Oh great, another update that deletes my settings.': expected negative, got 'positive'
- "It's fine. Not amazing, not terrible.": expected mixed, got 'positive'
…

(I numeri qui sono un'ipotesi per mostrare la forma dell'output; i tuoi saranno diversi.) Il sarcasmo e le formulazioni borderline sono il tipo di messaggi che un prompt breve tende a sbagliare. Il punto è che non tiri più a indovinare: hai un elenco.

Cambia una cosa, esegui di nuovo#

Ora la parte utile. Leggi gli errori, scegli una causa, modifica il prompt in un punto e riesegui. Una modifica alla volta, altrimenti non saprai quale modifica ha spostato il punteggio.

Confronta

Prompt v1 → v2: aggiungi una regola e due esempi

v1

text
Classify the customer message as positive, negative or mixed.
Answer with one word only.

v2

text
Classify the customer message as positive, negative or mixed.
Sarcasm counts as negative. Praise plus a complaint is mixed.
Answer with one word only.

Message: Lovely colour, but it arrived with a scratch.
Answer: mixed

Message: Sure, thanks a lot. Now my order is lost.
Answer: negative

I due esempi sono inventati, e questo è voluto. Non inserire mai un messaggio da cases.csv nel prompt come esempio: il modello verrebbe poi valutato su una risposta che gli hai fornito tu, e il punteggio sarebbe gonfiato. Questa è la tecnica few-shot; il set di test è ciò che ti dice se ha dato i suoi frutti. Se il tuo prompt v1 è ancora vago, come scrivere un buon prompt è il punto da cui partire prima di misurare.

Incolla v2 in PROMPT (le virgolette triple funzionano per più righe) ed esegui di nuovo lo script. Supponi che stampi Accuracy: 17/20 = 85%. Tre casi in più sono corretti, quindi v2 sembra migliore. Quanto fidarti? Ogni caso vale 5 punti in un set di 20, quindi 70% → 85% sono tre messaggi. È un buon indizio, non una prova. Se il punteggio scende, hai imparato qualcosa di altrettanto prezioso e ti sei risparmiato di pubblicare un prompt peggiore.

Stesso set, un altro modello: mantiene il punteggio?#

Lo stesso file risponde a una seconda domanda: stai pagando per un modello più potente di quanto serva a questo compito? Cambia una riga ed esegui di nuovo:

python
MODEL = 'deepseek-ai/DeepSeek-V4-Flash-0731'

Se l'accuratezza sui tuoi 20 casi coincide, hai la tua risposta per questo compito, dai tuoi dati anziché da una classifica. Se scende, guarda quali messaggi si sono rotti prima di decidere qualsiasi cosa.

Quanto costa tutto questo? Supponi circa 150 token di input per caso (l'istruzione più il messaggio) e circa 5 token di output per un'etichetta di una parola. Sono 3.000 token di input e 100 di output per esecuzione di 20 casi, che equivalgono a $0.000064 su GLM-5.3-Flash. Dieci riesecuzioni del set sono 200 richieste; la tabella qui sotto mostra quel carico di lavoro per ogni modello, con OpenRouter accanto. A questo carico di lavoro, contando insieme input e output, ogni modello della tabella costa meno del prezzo di riferimento di OpenRouter.

Modello Per richiesta 200 richieste OpenRouter, 200 richieste
GLM-5.3-Flash $0.0000032 $0.00064 $0.0011
DeepSeek-V4-Flash $0.0000028 $0.00055 $0.0022
MiniMax-M2.7 $0.0000083 $0.0017 $0.0198

150 token di input e 5 token di output per richiesta. I prezzi per 1M di token sono attuali e cambiano insieme alle nostre tariffe; la colonna OpenRouter mostra i prezzi di riferimento per lo stesso carico di lavoro.

Due di essi sono usati in questo articolo: GLM-5.3-Flash ha una finestra di contesto di 390K e fino a 8.192 token di output per risposta; DeepSeek-V4-Flash ha una finestra di contesto di 380K e fino a 32.768 token di output, un unico prezzo a qualsiasi ora del giorno e lo stesso saldo di ogni altro modello. I prezzi attuali sono sulla pagina dei prezzi, l'elenco completo è in modelli.

Dove la corrispondenza esatta smette di funzionare#

La corrispondenza esatta funziona perché la risposta giusta è una parola da un elenco fisso. Per output aperti come riassunti, riscritture o spiegazioni, non c'è un'unica stringa con cui confrontare. La documentazione descrive un'altra via, la valutazione tramite un modello, e consiglia di usare come valutatore un modello diverso da quello che ha scritto la risposta. Inizia comunque con la corrispondenza esatta: ovunque tu possa forzare una risposta breve e fissa, è il test più economico e chiaro che puoi eseguire. La regola empirica della documentazione è che più domande valutate automaticamente battono meno domande valutate a mano.

Un'altra abitudine: quando v2 smette di migliorare, non continuare a rifinire sugli stessi 20 messaggi. Aggiungine 5–10 nuovi, idealmente errori reali dalla produzione, ed esegui di nuovo.

Verifica rapida

v2 ottiene 17/20 e v1 ha ottenuto 15/20 sugli stessi casi. Qual è la conclusione più sicura?

Mostra risposta

Risposta: v2 sembra migliore, ma due casi su 20 sono un divario piccolo: aggiungi nuovi casi e riesegui

Ogni caso vale 5 punti, quindi un divario di due casi è un segnale per guardare più da vicino, non un verdetto. Nuovi casi che v2 non ha mai visto sono il controllo successivo.