Voltar ao blog

IA para iniciantesGuia

Teste seu prompt em 20 casos: correção por correspondência exata em Python

Monte um conjunto de teste de 20 casos, avalie um prompt por correspondência exata com um script Python curto e veja se uma mudança no prompt realmente ajudou.

Por CheapTokens TeamPublicado em 7 min de leitura

Capa: um trecho de código comparando a resposta de um modelo com o rótulo esperado, intitulado Teste seu prompt em 20 casos
Nesta página
  1. Monte o conjunto de teste: 20 mensagens e a resposta que você espera
  2. O script: envie cada caso, compare, imprima os erros
  3. Mude uma coisa, rode de novo
  4. Mesmo conjunto, outro modelo: ele mantém a pontuação?
  5. Onde a correspondência exata para de funcionar

Seu prompt funcionou nas duas mensagens que você testou. Isso significa que ele funciona? Ainda não. Rode-o em 20 mensagens reais com respostas conhecidas, conte quantas ele acerta e leia as que ele erra. Um script Python curto faz a contagem, e quando você muda o prompt, o mesmo script diz se a mudança ajudou, em vez de deixar isso para o seu instinto.

A documentação da Anthropic sobre definir critérios de sucesso e construir avaliações (verificada em 7 de novembro de 2026) coloca isso com suas próprias palavras: faça os testes específicos para a sua tarefa, inclua os casos complicados e prefira muitas perguntas corrigidas automaticamente a poucas corrigidas à mão. Abaixo está a menor versão disso que você pode rodar hoje.

Quatro passos: 20 casos vão para o modelo, as respostas são comparadas por correspondência exata, e você obtém uma pontuação de acurácia mais os erros
O método inteiro: casos entram, um número e uma lista de erros saem

Monte o conjunto de teste: 20 mensagens e a resposta que você espera#

Digamos que você classifique mensagens de clientes em três pilhas: positiva, negativa ou mista. Abra um arquivo chamado cases.csv e anote 20 mensagens que você realmente poderia receber, cada uma com o rótulo que você daria a ela. Escreva os rótulos antes de rodar qualquer coisa. Se você copiar as respostas do modelo como "corretas", o teste só pode concordar com o modelo.

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

Observe a mistura: 6 positivas, 7 negativas, 7 mistas. As frases sarcásticas ("Oh great, another update…", "Thanks for nothing.") e a limítrofe ("It's fine. Not amazing, not terrible.") estão lá de propósito. Um conjunto feito só de mensagens óbvias acerta 100% e não ensina nada. Pegue as reais da sua própria caixa de entrada, tickets ou exportação de chat; os casos extremos são aqueles que você já sabe que são chatos.

Por que 20? É um tamanho inicial, não um número da documentação (o exemplo deles usa 1.000 tweets). Vinte é pequeno o suficiente para escrever à mão em meia hora e grande o suficiente para que uma resposta sortuda não decida a pontuação.

O script: envie cada caso, compare, imprima os erros#

O plano tem quatro passos, e o código o segue linha por linha.

Colocar em ordem

Coloque o loop de avaliação em ordem

  1. Carregue os 20 casos do CSV
  2. Envie cada mensagem ao modelo com o seu prompt
  3. Compare a resposta com o seu rótulo
  4. Imprima a acurácia e os casos que falharam

O loop só funciona quando os rótulos existem antes da primeira chamada ao modelo, e as falhas vêm por último porque são o que você lê e usa para agir.

Instale o SDK com pip install openai e mantenha a chave em uma variável de ambiente chamada CHEAPTOKENS_API_KEY. Qualquer API compatível com OpenAI funciona da mesma forma; aqui o script aponta para CheapTokens e GLM-5.3-Flash (detalhes de configuração estão na documentação).

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}')

Três detalhes merecem uma segunda olhada.

  • temperature=0 mantém as respostas o mais estáveis possível, para que uma mudança na pontuação venha do seu prompt e não dos dados.
  • max_tokens=100 é muito mais do que um rótulo de uma palavra precisa. Se alguma resposta voltar vazia ou cortada, verifique finish_reason; o guia do finish_reason "length" mostra o que aumentar.
  • A linha de correção é a receita da documentação, strip().lower() comparado com a resposta certa, mais um acréscimo: ela também remove um ponto final no fim, porque "Negative." e "negative" são a mesma resposta para você.

O que você vê quando ele roda? Uma linha de acurácia, depois uma linha por erro. Digamos que a primeira execução imprima isto:

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'
…

(Os números aqui são uma suposição para mostrar o formato da saída; os seus serão diferentes.) Sarcasmo e redação limítrofe são o tipo de mensagem que um prompt curto tende a errar. O ponto é que você não adivinha mais: você tem uma lista.

Mude uma coisa, rode de novo#

Agora a parte útil. Leia os erros, escolha uma causa, mude o prompt em um lugar e rode de novo. Uma mudança por vez, senão você não saberá qual edição moveu a pontuação.

Comparar

Prompt v1 → v2: adicione uma regra e dois exemplos

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

Os dois exemplos são inventados, e isso é deliberado. Nunca coloque uma mensagem de cases.csv no prompt como exemplo: o modelo seria então avaliado em uma resposta que você entregou a ele, e a pontuação seria inflada. Esta é a técnica few-shot; o conjunto de teste é o que diz se ela valeu a pena. Se o seu prompt v1 ainda está vago, como escrever um bom prompt é o lugar para começar antes de medir.

Cole o v2 em PROMPT (aspas triplas funcionam para várias linhas) e rode o script de novo. Digamos que ele imprima Accuracy: 17/20 = 85%. Mais três casos estão certos, então o v2 parece melhor. Quanto confiar nisso? Cada caso vale 5 pontos em um conjunto de 20, então 70% → 85% são três mensagens. Isso é uma boa dica, não uma prova. Se a pontuação cair, você aprendeu algo igualmente valioso e se poupou de enviar um prompt pior.

Mesmo conjunto, outro modelo: ele mantém a pontuação?#

O mesmo arquivo responde a uma segunda pergunta: você está pagando por mais modelo do que esta tarefa precisa? Mude uma linha e rode de novo:

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

Se a acurácia nos seus 20 casos for a mesma, você tem sua resposta para esta tarefa, a partir dos seus próprios dados em vez de um ranking. Se cair, veja quais mensagens quebraram antes de decidir qualquer coisa.

Quanto tudo isso custa? Suponha cerca de 150 tokens de entrada por caso (a instrução mais a mensagem) e cerca de 5 tokens de saída para um rótulo de uma palavra. Isso dá 3.000 tokens de entrada e 100 de saída por execução de 20 casos, o que resulta em $0.000064 no GLM-5.3-Flash. Dez reexecuções do conjunto são 200 requisições; a tabela abaixo mostra essa carga de trabalho para cada modelo, com o OpenRouter ao lado. Nesta carga de trabalho, com entrada e saída contadas juntas, todo modelo da tabela custa menos que o preço de referência do OpenRouter.

Modelo Por solicitação 200 solicitações OpenRouter, 200 solicitações
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 tokens de entrada e 5 tokens de saída por solicitação. Os preços por 1M de tokens são atuais e mudam junto com nossas tarifas; a coluna OpenRouter mostra preços de referência para a mesma carga de trabalho.

Dois deles são usados neste artigo: o GLM-5.3-Flash tem contexto de 390K e até 8.192 tokens de saída por resposta; o DeepSeek-V4-Flash tem contexto de 380K e até 32.768 tokens de saída, um preço a qualquer hora do dia, e o mesmo saldo que todos os outros modelos. Os preços atuais estão na página de preços, a lista completa está em modelos.

Onde a correspondência exata para de funcionar#

A correspondência exata funciona porque a resposta certa é uma palavra de uma lista fixa. Para saídas abertas como resumos, reescritas ou explicações, não há uma única string para comparar. A documentação descreve outra rota, a correção por um modelo, e recomenda usar um modelo diferente como corretor do que o que escreveu a resposta. Comece com a correspondência exata de qualquer forma: onde você puder forçar uma resposta curta e fixa, é o teste mais barato e claro que você pode rodar. A regra prática da documentação é que mais perguntas corrigidas automaticamente superam menos perguntas corrigidas à mão.

Mais um hábito: quando o v2 parar de melhorar, não continue polindo contra as mesmas 20 mensagens. Adicione 5–10 novas, de preferência erros reais da produção, e rode de novo.

Verificação rápida

o v2 pontua 17/20 e o v1 pontuou 15/20 nos mesmos casos. Qual é a conclusão mais segura?

Mostrar resposta

Resposta: o v2 parece melhor, mas dois casos em 20 é uma diferença pequena: adicione novos casos e rode de novo

Cada caso vale 5 pontos, então uma diferença de dois casos é um sinal para olhar mais de perto, não um veredito. Novos casos que o v2 nunca viu são a próxima verificação.