Konrad Kowalski (rootsher)Principal Platform & Reliability Architect000101011011100000101110011011001010101000010011

Evals i quality gates

data
kategoria
AI Agents
także w
AI Engineering · Engineering Practices
czytanie
4 min / 762 słów

Po dodaniu observability wiemy już bardzo dużo.

Dla jednego taska widzimy:

text
9 model calls
4 tool calls
1 RAG query
37 sekund
31k tokenów
PR created

To nadal nie odpowiada na pytanie:

Czy agent wykonał task dobrze?

Do tego potrzebujemy evals.

Gdzie definiujemy evals

Najprościej: obok agenta.

text
engineering-agents/
└── implementer/
    ├── agent.py
    ├── workflow.py
    └── evals/
        ├── cases.yaml
        ├── rubrics.yaml
        └── datasets/

Tak samo jak kod ma tests/, agent może mieć evals/.

Kiedy uruchamiamy evals

Nie tylko przy zmianie wersji modelu.

Evals warto traktować jak testy regresyjne zachowania agenta.

1. Przy zmianie modelu

text
GPT X -> GPT Y
Claude X -> Claude Y

Ten sam prompt i te same tools mogą zacząć dawać inne zachowanie.

To najbardziej oczywisty przypadek.

2. Przy zmianie system promptu lub instrukcji agenta

Zmiana kilku zdań może zmienić:

  • kolejność działań,
  • wybór tools,
  • skłonność do używania RAG,
  • sposób interpretacji ticketu.

Dlatego prompt jest częścią wersjonowanej konfiguracji agenta.

3. Przy zmianie toola albo jego opisu

Jeżeli zmienimy:

text
github.create_pr

albo nawet tylko jego description, model może zacząć wybierać go w innych sytuacjach.

To również wymaga regresji.

4. Przy zmianie RAG

Na przykład:

  • nowy indeks,
  • nowy embedding model,
  • inne chunking,
  • inne top-k,
  • nowe źródło dokumentów,
  • zmienione permissions.

Kod agenta się nie zmienił, ale context, który dostaje, już tak.

5. Przy zmianie workflow agenta

Na przykład:

text
wcześniej:
implement -> test -> PR

teraz:
plan -> implement -> test -> self-review -> PR

To oczywisty kandydat do pełnego eval suite.

6. Przed releasem nowej wersji agenta

Najprostsza zasada organizacyjna:

text
PR / release agenta
|
v
eval suite
|
v
porównanie z baseline
|
v
quality gate
|
v
deploy

Nie każda zmiana musi uruchamiać cały kosztowny dataset.

Można mieć:

text
small eval suite
-> każdy PR

full regression
-> release / większa zmiana

7. Cyklicznie, nawet gdy nic nie zmieniliśmy

To ważne, bo zmienić może się coś poza repo agenta:

  • model provider może zaktualizować backend,
  • RAG może dostać nowe dokumenty,
  • Jira / GitHub tool może zwracać trochę inne dane,
  • charakter realnych tasków może się zmienić.

Dlatego warto okresowo uruchamiać regression suite, np.:

text
daily / weekly

w zależności od krytyczności i kosztu.

Nie ma jednej poprawnej częstotliwości.

Dla coding agenta sensowny start to:

text
mały zestaw -> każdy PR
pełny zestaw -> przed release
production sample -> codziennie lub co tydzień

8. Na realnych taskach produkcyjnych

Observability daje traces rzeczywistych wykonań.

Możemy pobrać np. próbkę:

text
5% zakończonych tasków

i automatycznie ocenić:

  • task completion,
  • adherence,
  • tool use,
  • groundedness.

To pozwala wykryć regresję, której nie było w testowym datasecie.

Przykładowy eval case

yaml
name: retry-policy

task:
  issue: PAY-123
  repository: test/payments-service

expected:
  tests_pass: true
  pull_request_created: true
  public_api_changed: false

rubric:
  - uses_company_retry_standard
  - adds_tests
  - uses_correct_rag_source

Co mierzymy deterministycznie

Normalnym kodem:

text
czy testy przeszły?
czy PR powstał?
czy zmieniono zabroniony plik?
czy agent użył właściwego repo?
czy wywołał niedozwolony tool?

Co może oceniać evaluator AI

Rzeczy trudniejsze do zapisania jako assert:

  • czy task został rzeczywiście wykonany,
  • czy agent przestrzegał instrukcji,
  • czy użył właściwych tools,
  • czy poprawnie wykorzystał RAG,
  • czy nie wykonał zbędnych kroków,
  • czy finalny output jest zgodny z oczekiwaniem.

Przykładowe metryki

PytanieMetryka
Czy skończył task?task completion
Czy przestrzegał zasad?task adherence
Czy poprawnie użył tools?tool accuracy
Czy output opierał się na context?groundedness
Czy flow był sensowny?trajectory / navigation quality
Ile kosztował task?cost / tokens / latency

Jak często naprawdę?

Nie ma sensu oceniać 100% wszystkiego zawsze.

Praktyczny model:

MomentZakres
każdy PR do repo agentamały, szybki regression suite
zmiana modelu / promptu / RAG / toolsrozszerzony suite
release nowej wersjipełny suite + porównanie do baseline
produkcjasampling realnych traces
okresowopełna regresja nawet bez zmian

Evals w CI

Flow może wyglądać znajomo:

text
PR do repo agenta
|
v
CI
|
v
run eval dataset
|
v
compare with baseline
|
v
quality gate

Przykład:

Metrykav1v2
Task completion89%95%
Tool accuracy96%97%
Groundedness4.34.6
Avg. cost / task$0.20$0.34
Avg. duration32s41s

Nowa wersja jest jakościowo lepsza, ale droższa i wolniejsza.

To pozwala podjąć świadomą decyzję.

Narzędzia na rynku

NarzędzieCloud / typRola
Microsoft Foundry EvaluationsAzuretask/adherence/tool/output evaluation, także trace evaluation
Amazon Bedrock / AgentCore EvaluationsAWSagent i model evaluation, built-in i custom evaluators
Vertex AI Gen AI EvaluationGCPfinal response, trajectory i tool evaluation
LangSmithniezależnedatasets, experiments, traces, evals
Langfuseopen source / managedtracing + evals + prompt management
Arize Phoenixopen source / managedtracing, RAG i agent evals

Co standaryzuje organizacja

Nie każdy agent musi mieć identyczny dataset.

Wspólne mogą być:

  • minimalne wymagane metryki,
  • sposób uruchamiania evals,
  • standardowy mały i pełny suite,
  • progi jakości,
  • evaluator/judge,
  • sampling produkcyjnych traces,
  • dashboard,
  • wymaganie przejścia quality gate przed rolloutem.

Zespół nadal definiuje przypadki specyficzne dla swojej roli.

Materiały

do góry