Evaluación en CI
Ejecuta evaluaciones de Potato dentro de tu propia suite de pytest y condiciona el CI a umbrales de puntuación, de modo que un cambio de prompt o de modelo que degrade la calidad del agente haga fallar el build como un test unitario. Incluye una API de aserciones expect() y un flujo de ejemplo para GitHub Actions.
Ejecuta evaluaciones de Potato dentro de tu propia suite de pytest y condiciona el CI a umbrales sobre las puntuaciones agregadas, de modo que un cambio de prompt o de modelo que degrade la calidad haga fallar el build igual que lo haría un test unitario. Esta es la capa que "operacionaliza la evaluación" sobre los evaluadores programáticos y los datasets y experimentos.
Instalación
El plugin viene incluido con Potato y se carga automáticamente una vez instalado:
pip install -e . # registers the `potato_eval` pytest pluginSin instalarlo, puedes cargarlo de forma explícita: pytest -p potato.testing.pytest_plugin.
Escribir tests de evaluación
Marca un test con @pytest.mark.potato_eval y solicita la fixture potato_eval:
import pytest
from potato.testing import expect
@pytest.mark.potato_eval
@pytest.mark.parametrize("case", CASES, ids=[c["q"] for c in CASES])
def test_agent(case, potato_eval):
out = my_agent(case["q"])
potato_eval.log_inputs({"question": case["q"]})
potato_eval.log_outputs(out)
potato_eval.log_reference_outputs(case["expected"])
potato_eval.log_feedback("correct", 1.0 if out == case["expected"] else 0.0)
potato_eval.log_feedback("similarity", 1.0 - expect.edit_distance(out, case["expected"]).value)
expect(out).to_contain(case["expected"]) # per-case hard assertionexpect(...) ofrece .to_equal, .to_contain, .to_be_less_than, .to_be_greater_than, .to_be_between, .to_be_close_to, además de expect.edit_distance(a, b) y expect.embedding_distance(a, b). Las puntuaciones de log_feedback se agregan (media por clave) entre todos los tests de evaluación.
Condicionar el build
pytest tests/eval/ \
--potato-threshold correct=0.8 \
--potato-threshold similarity=0.7 \
--potato-experiment agent-regression| Opción | Efecto |
|---|---|
--potato-threshold KEY=MIN | Hace fallar la ejecución si mean(KEY) < MIN. Se puede repetir. |
--potato-experiment DATASET | Registra la ejecución como un experimento. |
--potato-no-sync | Omite el registro del experimento. |
Si se viola un umbral, la ejecución termina con un código distinto de cero (haciendo fallar el trabajo de CI) e imprime THRESHOLD FAILED: <key> = <actual> < <min>. Los experimentos registrados son archivos planos ($POTATO_EVAL_STORE, por defecto ./eval_store) que puedes subir como artefacto de CI.
GitHub Actions
Hay un flujo de trabajo de ejemplo en examples/agent-traces/ci-eval/ci_workflow_example.yml. Ejecuta la suite en cada PR, aplica los umbrales y sube los registros del experimento como artefacto.
Relacionado
- Referencia completa en Read the Docs — todas las opciones de pytest y variables de entorno, ajustada a cada versión
- Evaluadores programáticos
- Datasets y experimentos