Skip to content

Évaluation en CI

Exécutez les évaluations Potato dans votre propre suite pytest et conditionnez la CI à des seuils de score, afin qu'un changement de prompt ou de modèle qui dégrade la qualité de l'agent fasse échouer le build comme un test unitaire. Inclut une API d'assertions expect() et un exemple de workflow GitHub Actions.

Exécutez les évaluations Potato dans votre propre suite pytest et conditionnez la CI à des seuils de score agrégés, de sorte qu'un changement de prompt ou de modèle qui dégrade la qualité fasse échouer le build exactement comme un test unitaire. C'est la couche « opérationnalisation de l'éval » au-dessus des évaluateurs programmatiques et des jeux de données et expériences.

Installation

Le plugin est livré avec Potato et se charge automatiquement une fois installé :

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

Sans installation, chargez-le explicitement : pytest -p potato.testing.pytest_plugin.

Écrire des tests d'évaluation

Marquez un test @pytest.mark.potato_eval et demandez 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(...) propose .to_equal, .to_contain, .to_be_less_than, .to_be_greater_than, .to_be_between, .to_be_close_to, ainsi que expect.edit_distance(a, b) et expect.embedding_distance(a, b). Les scores de log_feedback sont agrégés (moyenne par clé) sur l'ensemble des tests d'évaluation.

Conditionner le build

bash
pytest tests/eval/ \
  --potato-threshold correct=0.8 \
  --potato-threshold similarity=0.7 \
  --potato-experiment agent-regression
OptionEffet
--potato-threshold KEY=MINFait échouer l'exécution si mean(KEY) < MIN. Répétable.
--potato-experiment DATASETEnregistre l'exécution comme une expérience.
--potato-no-syncDésactive l'enregistrement de l'expérience.

Si un seuil est franchi, l'exécution se termine avec un code non nul (ce qui fait échouer le job CI) et affiche THRESHOLD FAILED: <key> = <actual> < <min>. Les expériences enregistrées sont de simples fichiers ($POTATO_EVAL_STORE, par défaut ./eval_store) que vous pouvez téléverser comme artefact de CI.

GitHub Actions

Un exemple de workflow se trouve dans examples/agent-traces/ci-eval/ci_workflow_example.yml. Il exécute la suite sur chaque PR, applique les seuils et téléverse les enregistrements d'expérience comme artefact.

Pages liées