Skip to content

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:

bash
pip install -e .          # registers the `potato_eval` pytest plugin

Sin 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:

python
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 assertion

expect(...) 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

bash
pytest tests/eval/ \
  --potato-threshold correct=0.8 \
  --potato-threshold similarity=0.7 \
  --potato-experiment agent-regression
OpciónEfecto
--potato-threshold KEY=MINHace fallar la ejecución si mean(KEY) < MIN. Se puede repetir.
--potato-experiment DATASETRegistra la ejecución como un experimento.
--potato-no-syncOmite 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