Cómo implementar evaluaciones automatizadas para agentes de IA

testing-ai-agent-evals

Testing Your AI Agent Skills

Testing Your AI Agent Skills debe ser el primer paso después de escribir un SKILL.md. Si no tienes una suite de evals automatizados, lo que hoy llamas “skill” es un prototipo frágil: funciona en local tres veces y falla en producción cuando más importa. Aquí explico cómo pasar de sensaciones a ingeniería sólida, con ejemplos prácticos, métricas y scripts que puedes integrar hoy mismo.

Tiempo estimado de lectura: 4 min

  • Automatiza evals: una skill sin evaluación automatizada es frágil; integra graders deterministas y repite trials.
  • Métricas claras: mide capacidad (pass@k), fiabilidad (pass^k) y correctitud (grader determinista con exit codes).
  • Aislamiento: usa Docker para cada trial y destruye el entorno tras la verificación.
  • Repetición: ejecuta >=5 trials para estimar estabilidad; optimiza para pass^k alto antes de producción.

Testing Your AI Agent Skills: por qué importa y qué mide un eval

Una Skill no es un prompt bonito: es documentación ejecutable que un agente usa para actuar. Cambiar una instrucción, reordenar pasos o quitar una verificación puede romper el comportamiento sin avisos. Los LLMs son no deterministas; una ejecución exitosa no prueba nada. Los evals automatizados solucionan eso midiendo tres cosas:

  • Capacidad (pass@k): ¿puede el agente resolver la tarea al menos una vez en k intentos?
  • Fiabilidad (pass^k): ¿la resuelve todas las veces en k intentos?
  • Correctitud (grader determinista): ¿el resultado cumple la condición objetiva (compila, lint pasa, tabla creada)?

Un ejemplo realista de comando que debes poder ejecutar en CI:

GEMINI_API_KEY=your-key npm run eval superlint -- --provider=docker --trials=5

Eso encapsula aislamiento (Docker), repetición estadística (trials) y la unidad de test (la skill superlint).

Repositorio de referencia: https://github.com/mgechev/skill-eval

Arquitectura mínima de un eval efectivo

Cada tarea debe ser autocontenida y reproducible. Estructura sugerida:

tasks/my_task/
├── task.toml           # timeouts, recursos, límites
├── instruction.md      # el prompt único para el agente
├── environment/Dockerfile
├── tests/test.sh       # grader determinista (shell)
├── prompts/quality.md  # grader de rúbrica (opcional)
├── solution/solve.sh   # referencia
└── skills/my_skill/
    └── SKILL.md

Principios clave:

  • El agente recibe solo instruction.md como prompt primario. Las skills viven en rutas de descubrimiento estándar (.agents/skills/ o .claude/skills/).
  • Los graders deterministas deben ser código: scripts que ejecutan eslint, npm test o consultas SQL y devuelven PASS/FAIL.
  • Usa Docker para aislar cada trial y destruir el contenedor tras la verificación. Documentación Docker: https://www.docker.com/

Ejemplo práctico: verificador determinista para superlint

Si la tarea es “arreglar errores de lint”, el grader no puede ser subjetivo. Un ejemplo de tests/test.sh:

#!/usr/bin/env bash
set -e
# Ejecuta eslint en la ruta de trabajo
npx eslint main.js --max-warnings=0
if [ $? -eq 0 ]; then
  echo "PASS"
  exit 0
else
  echo "FAIL"
  exit 1
fi

No preguntes al LLM “¿lo hiciste bien?”. Ejecuta eslint (https://eslint.org) y deja que el exit code decida.

Repetición y métricas: por qué 5 trials no es arbitrario

Los LLMs introducen variabilidad. Ejecutar 5 trials te da una muestra mínima para estimar estabilidad. Interpretación práctica:

  • pass@5 = 100% y pass^5 = 100% → listo para producción.
  • pass@5 = 100% y pass^5 = 30% → el agente puede hacerlo, pero es flaky; no desplegar.
  • pass@5 < 80% → la skill necesita rediseño (más contexto, scripts deterministas, aclaraciones en SKILL.md).

Para workflows críticos (migraciones, despliegues), fija umbral >= 90% pass^k.

Integración CI: Quality Gate para Skills

Añade un job que corra los evals en cada PR que toque skills/ o tasks/:

name: Skill Eval
on:
  pull_request:
    paths: ['skills/**', 'tasks/**']

jobs:
  eval:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
      - run: npm ci
      - run: GEMINI_API_KEY=${{ secrets.GEMINI_API_KEY }} npm run eval my_task -- --trials=5 --provider=docker

Si la tasa de éxito cae por debajo del umbral, el PR queda bloqueado con el output del eval (trials individuales, logs, grader output). Esa transparencia es crítica para debugging rápido.

Diagnóstico accionable cuando fallan trials

Un buen eval no solo marca FAIL; explica por qué. Ejemplo de salida útil:

Trial 1: FAIL - Agent ran 'eslist --lint' (typo)  
Trial 2: PASS  
Trial 3: FAIL - Agent modified src/utils.js instead of src/main.js  
Trial 4: PASS  
Trial 5: PASS

Con esa trazabilidad ajustas SKILL.md o scripts (p. ej., forzar paths absolutos, añadir checks previos, mejorar error handling en scripts).

Recomendaciones finales y checklist rápido

  • Mantén SKILL.md corto y prescriptivo; externaliza lo frágil a scripts/.
  • Usa Docker para todos los evals que toquen filesystem o red.
  • Implementa graders deterministas como contrato (stdout JSON + exit codes).
  • Ejecuta >=5 trials; optimiza para pass^k en producción.
  • Integra evals en CI como Quality Gate.
  • Mantén dataset de pruebas realistas (repos con edge-cases), no solo ejemplos sintéticos.

Testing Your AI Agent Skills no es opcional. Si confías en agentes para tocar código o infra, mide su comportamiento bajo condiciones reproductibles. Implementa evals hoy y transforma tus skills de “probablemente funcionan” a “sabemos que funcionan”.

Como continuación lógica a estos procesos y para explorar integraciones y experimentos prácticos con evaluaciones de skills y pipelines de CI, visite Dominicode Labs. Allí encontrará recursos y ejemplos orientados a equipos de ingeniería que automatizan agentes y workflows.

FAQ

¿Qué es un eval para una Skill?

Un eval es una prueba autocontenida y reproducible que ejecuta una skill contra un grader determinista para verificar comportamiento objetivo (por ejemplo, lint pasa, tests verdes, tabla creada).

¿Cuántos trials debo ejecutar?

Ejecuta al menos 5 trials para estimar estabilidad. Ese número proporciona una muestra mínima para analizar variabilidad en LLMs.

¿Por qué usar Docker en cada trial?

Docker aísla el entorno, evita efectos laterales entre trials y garantiza reproducibilidad. Además permite destruir el contenedor tras la verificación.

¿Cómo debe devolver resultados un grader?

Como código: exit codes y stdout estructurado (por ejemplo JSON). Evita evaluaciones subjetivas; usa herramientas como eslint o npm test.

¿Qué hacer si pass@k es alto pero pass^k es bajo?

No desplegar. Señala que la skill es flaky; mejora el prompt, agrega verificaciones adicionales o externaliza pasos frágiles a scripts deterministas.

¿Qué umbral usar en producción?

Para workflows críticos, fija umbral ≥ 90% en pass^k. Ajusta según riesgo y gravedad del fallo.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *