Volver al blog

IA para principiantesGuía

Prueba tu prompt en 20 casos: calificación por coincidencia exacta en Python

Construye un conjunto de prueba de 20 casos, califica un prompt por coincidencia exacta con un script corto de Python y comprueba si un cambio de prompt realmente ayudó.

Por CheapTokens TeamPublicado el 7 min de lectura

Portada: un fragmento de código que compara una respuesta del modelo con la etiqueta esperada, titulado Prueba tu prompt en 20 casos
En esta página
  1. Construye el conjunto de prueba: 20 mensajes y la respuesta que esperas
  2. El script: envía cada caso, compara, imprime los fallos
  3. Cambia una cosa, ejecuta de nuevo
  4. El mismo conjunto, otro modelo: ¿mantiene la puntuación?
  5. Dónde deja de funcionar la coincidencia exacta

Tu prompt funcionó en los dos mensajes que probaste. ¿Significa eso que funciona? Todavía no. Ejecútalo sobre 20 mensajes reales con respuestas conocidas, cuenta cuántos acierta y lee los que falla. Un script corto de Python hace el conteo, y cuando cambias el prompt, el mismo script te dice si el cambio ayudó en lugar de dejarlo a tu intuición.

La documentación de Anthropic sobre definir criterios de éxito y construir evaluaciones (consultada el 7 de noviembre de 2026) lo expresa con sus propias palabras: haz que las pruebas sean específicas para tu tarea, incluye los casos incómodos y prefiere muchas preguntas calificadas automáticamente a unas pocas calificadas a mano. Abajo está la versión más pequeña de eso que puedes ejecutar hoy.

Cuatro pasos: 20 casos van al modelo, las respuestas se comparan por coincidencia exacta, y obtienes una puntuación de precisión más los fallos
El método completo: casos de entrada, un número y una lista de fallos de salida

Construye el conjunto de prueba: 20 mensajes y la respuesta que esperas#

Supón que clasificas mensajes de clientes en tres montones: positivo, negativo o mixto. Abre un archivo llamado cases.csv y anota 20 mensajes que realmente podrías recibir, cada uno con la etiqueta que tú le darías. Escribe las etiquetas antes de ejecutar nada. Si copias las respuestas del modelo como "correctas", la prueba solo puede estar de acuerdo con el 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

Mira la mezcla: 6 positivos, 7 negativos, 7 mixtos. Las líneas sarcásticas ("Oh great, another update…", "Thanks for nothing.") y la limítrofe ("It's fine. Not amazing, not terrible.") están ahí a propósito. Un conjunto formado solo por mensajes obvios puntúa 100% y no te enseña nada. Toma los reales de tu propia bandeja de entrada, tickets o exportación de chat; los casos límite son los que ya sabes que son molestos.

¿Por qué 20? Es un tamaño inicial, no un número de la documentación (su ejemplo usa 1.000 tuits). Veinte es lo bastante pequeño para escribirlo a mano en media hora y lo bastante grande para que una respuesta afortunada no decida la puntuación.

El script: envía cada caso, compara, imprime los fallos#

El plan tiene cuatro pasos, y el código lo sigue línea por línea.

Poner en orden

Ordena el bucle de evaluación

  1. Carga los 20 casos desde el CSV
  2. Envía cada mensaje al modelo con tu prompt
  3. Compara la respuesta con tu etiqueta
  4. Imprime la precisión y los casos que fallaron

El bucle solo funciona cuando las etiquetas existen antes de la primera llamada al modelo, y los fallos van al final porque son lo que lees y sobre lo que actúas.

Instala el SDK con pip install openai y guarda la clave en una variable de entorno llamada CHEAPTOKENS_API_KEY. Cualquier API compatible con OpenAI funciona igual; aquí el script apunta a CheapTokens y GLM-5.3-Flash (los detalles de configuración están en la documentación).

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

Tres detalles merecen una segunda mirada.

  • temperature=0 mantiene las respuestas lo más estables posible, para que un cambio en la puntuación provenga de tu prompt y no de los dados.
  • max_tokens=100 es mucho más de lo que necesita una etiqueta de una palabra. Si alguna vez una respuesta vuelve vacía o cortada, revisa finish_reason; la guía sobre finish_reason "length" muestra qué aumentar.
  • La línea de calificación es la receta de la documentación, strip().lower() comparado con la respuesta correcta, más un añadido: también elimina un punto final, porque "Negative." y "negative" son la misma respuesta para ti.

¿Qué ves cuando se ejecuta? Una línea de precisión, luego una línea por cada fallo. Digamos que la primera ejecución imprime esto:

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

(Los números aquí son una suposición para mostrar la forma de la salida; los tuyos serán distintos.) El sarcasmo y la redacción limítrofe son el tipo de mensajes que un prompt corto tiende a fallar. La cuestión es que ya no adivinas: tienes una lista.

Cambia una cosa, ejecuta de nuevo#

Ahora la parte útil. Lee los fallos, elige una causa, cambia el prompt en un solo lugar y vuelve a ejecutar. Un cambio a la vez, de lo contrario no sabrás qué edición movió la puntuación.

Comparar

Prompt v1 → v2: añade una regla y dos ejemplos

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

Los dos ejemplos son inventados, y eso es deliberado. Nunca pongas un mensaje de cases.csv en el prompt como ejemplo: entonces el modelo sería calificado con una respuesta que tú le entregaste, y la puntuación quedaría inflada. Esta es la técnica few-shot; el conjunto de prueba es lo que te dice si valió la pena. Si tu prompt v1 sigue siendo vago, cómo escribir un buen prompt es el lugar por donde empezar antes de medir.

Pega v2 en PROMPT (las comillas triples sirven para varias líneas) y ejecuta el script de nuevo. Digamos que imprime Accuracy: 17/20 = 85%. Tres casos más son correctos, así que v2 parece mejor. ¿Cuánto confiar en eso? Cada caso vale 5 puntos en un conjunto de 20, así que 70% → 85% son tres mensajes. Es una buena pista, no una prueba. Si la puntuación baja, has aprendido algo igual de valioso y te has ahorrado enviar un prompt peor.

El mismo conjunto, otro modelo: ¿mantiene la puntuación?#

El mismo archivo responde una segunda pregunta: ¿estás pagando por más modelo del que esta tarea necesita? Cambia una línea y ejecuta de nuevo:

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

Si la precisión en tus 20 casos coincide, tienes tu respuesta para esta tarea, a partir de tus propios datos en lugar de una tabla de clasificación. Si baja, mira qué mensajes se rompieron antes de decidir nada.

¿Cuánto cuesta todo esto? Supón unos 150 tokens de entrada por caso (la instrucción más el mensaje) y unos 5 tokens de salida para una etiqueta de una palabra. Eso son 3.000 tokens de entrada y 100 de salida por ejecución de 20 casos, lo que suma $0.000064 en GLM-5.3-Flash. Diez re-ejecuciones del conjunto son 200 solicitudes; la tabla de abajo muestra esa carga de trabajo para cada modelo, con OpenRouter al lado. Con esta carga de trabajo, contando entrada y salida juntas, todos los modelos de la tabla cuestan menos que el precio de referencia de OpenRouter.

Modelo Por solicitud 200 solicitudes OpenRouter, 200 solicitudes
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 y 5 tokens de salida por solicitud. Los precios por 1M de tokens son actuales y cambian junto con nuestras tarifas; la columna de OpenRouter muestra precios de referencia para la misma carga de trabajo.

Dos de ellos se usan en este artículo: GLM-5.3-Flash tiene un contexto de 390K y hasta 8.192 tokens de salida por respuesta; DeepSeek-V4-Flash tiene un contexto de 380K y hasta 32.768 tokens de salida, un solo precio a cualquier hora del día, y el mismo saldo que todos los demás modelos. Los precios actuales están en la página de precios, la lista completa está en modelos.

Dónde deja de funcionar la coincidencia exacta#

La coincidencia exacta funciona porque la respuesta correcta es una palabra de una lista fija. Para salidas abiertas como resúmenes, reescrituras o explicaciones, no hay una única cadena con la que comparar. La documentación describe otra ruta, la calificación por un modelo, y recomienda usar un modelo distinto como calificador del que escribió la respuesta. Empieza con la coincidencia exacta de todos modos: dondequiera que puedas forzar una respuesta corta y fija, es la prueba más barata y clara que puedes ejecutar. La regla general de la documentación es que más preguntas calificadas automáticamente superan a menos calificadas a mano.

Un hábito más: cuando v2 deje de mejorar, no sigas puliendo contra los mismos 20 mensajes. Añade 5–10 nuevos, idealmente fallos reales de producción, y ejecuta de nuevo.

Verificación rápida

v2 puntúa 17/20 y v1 puntuó 15/20 en los mismos casos. ¿Cuál es la conclusión más segura?

Mostrar respuesta

Respuesta: v2 parece mejor, pero dos casos de 20 es una diferencia pequeña: añade casos nuevos y vuelve a ejecutar

Cada caso vale 5 puntos, así que una diferencia de dos casos es una señal para mirar más de cerca, no un veredicto. Los casos nuevos que v2 nunca ha visto son la siguiente comprobación.