Avaliação em CI
Execute avaliações do Potato dentro da sua própria suíte pytest e condicione o CI a limiares de pontuação, para que uma mudança de prompt ou de modelo que degrade a qualidade do agente quebre o build como um teste unitário. Inclui uma API de asserções expect() e um exemplo de workflow do GitHub Actions.
Execute avaliações do Potato dentro da sua própria suíte pytest e condicione o CI a limiares de pontuação agregada, para que uma mudança de prompt ou de modelo que degrade a qualidade quebre o build da mesma forma que um teste unitário. Esta é a camada de "operacionalizar a avaliação" sobre os avaliadores programáticos e os conjuntos de dados e experimentos.
Instalação
O plugin é distribuído com o Potato e carrega automaticamente após a instalação:
pip install -e . # registers the `potato_eval` pytest pluginSem instalar, carregue-o explicitamente: pytest -p potato.testing.pytest_plugin.
Escrevendo testes de avaliação
Marque um teste com @pytest.mark.potato_eval e solicite a 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(...) oferece .to_equal, .to_contain, .to_be_less_than, .to_be_greater_than, .to_be_between, .to_be_close_to, além de expect.edit_distance(a, b) e expect.embedding_distance(a, b). As pontuações de log_feedback são agregadas (média por chave) em todos os testes de avaliação.
Condicionando o build
pytest tests/eval/ \
--potato-threshold correct=0.8 \
--potato-threshold similarity=0.7 \
--potato-experiment agent-regression| Opção | Efeito |
|---|---|
--potato-threshold KEY=MIN | Falha a execução se mean(KEY) < MIN. Pode repetir. |
--potato-experiment DATASET | Registra a execução como um Experimento. |
--potato-no-sync | Não registra o experimento. |
Se um limiar for violado, a execução termina com código diferente de zero (fazendo o job de CI falhar) e imprime THRESHOLD FAILED: <key> = <actual> < <min>. Os experimentos registrados são arquivos simples ($POTATO_EVAL_STORE, padrão ./eval_store) que você pode enviar como artefato de CI.
GitHub Actions
Um workflow de exemplo está em examples/agent-traces/ci-eval/ci_workflow_example.yml. Ele executa a suíte em cada PR, aplica os limiares e envia os registros de experimento como artefato.
Relacionados
- Referência completa no Read the Docs — todas as opções do pytest e variáveis de ambiente, na versão correspondente
- Avaliadores programáticos
- Conjuntos de dados e experimentos