Evaluaciones

Cambias un prompt, lo pruebas una vez, la respuesta se ve mejor, y lo despliegas, luego una semana después los usuarios encuentran los casos que silenciosamente empeoraste. Una evaluación (abreviado eval) es la solución: una prueba repetible de si tu función de IA funciona, un conjunto de entradas emparejadas con lo que se parece a una buena salida, calificadas de la misma manera cada vez para que puedas saber si un cambio realmente ayudó. Un modelo es una caja negra probabilística que responde la misma pregunta de manera diferente en cada ejecución, por lo que medir es la única forma de saber, y esa disciplina es gran parte de lo que separa una demostración de un producto.
Por qué inspeccionar a simple vista falla
Verificar las respuestas de tu IA a mano se siente bien al principio. Ejecutas un prompt, lees la respuesta, y se ve bien, así que continúas. El problema es que tres cosas silenciosamente trabajan en tu contra, y ya las has conocido a todas.
Aquí están las tres:
- La salida varía. El mismo prompt puede dar diferentes respuestas en cada ejecución, así que un buen resultado no promete que el siguiente también será bueno.
- Los cambios causan regresiones. Una edición de prompt que arregla un caso a menudo rompe otro en el que no estabas mirando.
- No escala. Puedes leer cinco respuestas. No puedes leer quinientas cada vez que cambias una línea.
Nada de esto significa que hiciste algo mal. Significa que inspeccionar a simple vista es la herramienta equivocada para un trabajo de este tamaño, y hay una forma más tranquila de hacerlo.
Construye un conjunto de evaluación
Un conjunto de evaluación es una lista de casos de prueba. Cada caso tiene una entrada y lo que se parece a una buena salida para ella. Empieza pequeño. Diez a veinte casos que cubran tus situaciones comunes más algunos casos límite complicados son mucho más útiles que ninguno, y puedes crecer el conjunto mientras encuentras nuevas fallas en la realidad.
eval_set = [
{"input": "La comida estaba fría y llegó tarde.", "expected": "NEGATIVA"},
{"input": "¡La mejor comida de mi vida!", "expected": "POSITIVA"},
{"input": "Estuvo bien, nada especial.", "expected": "NEUTRA"},
# ...agrega casos reales y casos límite mientras los descubres
]Cuando un usuario reporta una respuesta mala, agrégala al conjunto con la salida que debería haber dado. Tu conjunto de evaluación luego se convierte en una memoria creciente de cada error que nunca quieres cometer de nuevo, de la misma manera que un bug que arreglas se convierte en una prueba que mantienes.
Cómo calificar
Diferentes tareas necesitan diferentes calificaciones, así que el primer paso es emparejar la verificación con el tipo de respuesta que esperas.
- Coincidencia exacta funciona cuando hay una respuesta correcta: una etiqueta de clasificación, un campo extraído, un sí o no. Comparas la salida con el valor esperado directamente.
- Calificación basada en criterios funciona cuando no hay una respuesta única correcta, como un resumen o una respuesta. Verificas si la salida cumple con las condiciones: ¿El resumen menciona el hecho clave? ¿Está bajo 50 palabras? ¿Es el tono educado?
- LLM como juez usa una segunda llamada de modelo para calificar la salida contra tus criterios. Escala a preguntas de calidad borrosa que una verificación simple no puede capturar, pero el juez en sí es un modelo, así que puede estar equivocado, y lo verificas contra el juicio humano de vez en cuando.
# calificación de coincidencia exacta sobre el conjunto de evaluación
def run_evals(eval_set, classify):
passed = 0
for test in eval_set:
output = classify(test["input"])
if output == test["expected"]:
passed += 1
else:
print(f'FAIL: "{test["input"]}" -> got {output}, wanted {test["expected"]}')
print(f"{passed}/{len(eval_set)} passed")Coincidencia exacta es el lugar más amigable para comenzar, y se ajusta al trabajo de clasificación y extracción de capítulos anteriores perfectamente. La idea de LLM como juez funciona porque detectar si una respuesta cumple un estándar a menudo es una predicción más fácil de lo que fue producir la respuesta, de la misma manera que revisar un ensayo es más fácil que escribir uno. Pero el juez es otro predictor con los mismos defectos, así que trata sus puntuaciones como una estimación útil, dale una rúbrica clara, y verifica sus calificaciones contra las tuyas en una muestra de vez en cuando.
Ejecútalas en cada cambio
Un conjunto de evaluación es solo útil si realmente lo ejecutas. Trata tus prompts como código: antes de desplegar un cambio a un prompt, un modelo, o tu recuperación, ejecuta las evaluaciones y compara la puntuación con lo que era antes. Si el número bajó, causaste una regresión, incluso si tu única prueba manual sucedió a verse bien.
Esto es lo que convierte la ingeniería de prompts de adivinanza en algo que puedes iterar con confianza. Cambia algo, mídelo, mantén lo que puntúa más alto, y desecha lo que puntúa más bajo. Es el mismo bucle que hace que el software ordinario sea confiable, ahora aplicado a las partes borrosas de una característica de IA.
Si la puntuación bajó, causaste una regresión. Una única prueba manual afortunada no anula el conjunto, así que deja que el número sea el desempatador cada vez.
En la práctica
La función run_evals de la sección anterior es un arnés de evaluación completo, si pequeño. Lo apuntas a tu clasificador y tu conjunto de evaluación, y te dice cuántos casos pasan y te muestra exactamente cuáles fallan:
run_evals(eval_set, classify_review)
# FAIL: "Estuvo bien, nada especial." -> got POSITIVA, wanted NEUTRA
# 2/3 passedEsa una línea fallida vale más que una docena de pruebas manuales exitosas, porque apunta a una debilidad real que ahora puedes arreglar y re-medir. El capítulo final, Seguridad y límites, cubre los riesgos para diseñar contra antes de que pongas algo de esto frente a usuarios reales.
run_evals ya se paga por sí solo: te da una puntuación y los casos exactos que se rompieron. Arregla uno, ejecútalo de nuevo, mira cómo se mueve el número. A continuación, Seguridad y límites cubre qué guardar contra antes de que lleguen usuarios reales. 
