Суть
Агент — «система принятия решений», а не «умный чат», поэтому его надо проверять как систему: воспроизводимые тест-сценарии и измеримые метрики, а не «вроде отвечает нормально».
Зачем это нужно
Без evals нельзя отличить рабочего агента от демо. DoD фиксирует минимум, ниже которого в прод нельзя; метрики ловят галлюцинации и нарушения политик (связка с Guardrails).
Как работает
Definition of Done (6 пунктов):
- Бот принимает запрос и отвечает либо через RAG (со ссылками), либо вызовом инструмента (с понятным «что сделал»).
- Два режима: «Справка» (RAG) и «Действие» (tool).
- Трассировка шагов (хотя бы JSONL):
request_id → plan → tool_call → tool_result → final_answer. - Базовая защита: tool allowlist, проверка аргументов, anti-prompt-injection для RAG, таймауты/ретраи.
- Минимум несколько тест-сценариев, включая edge-cases и prompt-injection.
- Мини-оценка качества (есть ли цитаты / основан ли ответ на контексте / нет выдуманных фактов).
Мини-метрики:
has_citations— есть ссылки на источники (для RAG).answer_grounded— эвристика: доля n-грамм ответа из контекста / наличие «не знаю».tool_called_when_needed— инструмент вызван по ожидаемому сценарию.no_policy_violation— инструмент НЕ вызван при инъекции.
Debugging (частые ошибки): LLM выдумывает → ужесточить промпт («только из контекста»); tool не вовремя → усилить правила planner / ввести «clarify first»; RAG возвращает мусор → проверить chunking/top_k, добавить dedup; injection прошёл → allowlist + фильтр контента + правило «docs not instructions».
Масштабирование для RAG-проектов: эти мини-метрики — стартовый уровень для первого агента. Для продакшен-RAG их сменяет полноценный дашборд RAG Metrics (Hit Rate, MRR, NDCG, Faithfulness, Noise Robustness, P95 Latency) с автоматизацией через RAGAS (LLM-as-judge без ground truth, автогенерация eval-датасета) и DeepEval/RAGChecker. Именно RAGAS/LLM-судья — практический ответ на вопрос «как автоматизировать answer_grounded».
Метрики типизированного агента (PydanticAI): для агентов со структурным выводом (Structured Output) и циклами валидации (Validation Loops) добавляют свой набор: validation_errors_per_run, retry_count_per_run (аномалия >1), retry_overhead_tokens (токены, потраченные на исправления) и unexpected_behavior_rate (доля случаев, где лимит ретраев исчерпан, а валидный ответ не достигнут). Алерт при fallback_rate >5%.
Trust Gate / Executable Spec Layer: где есть объективная проверка, оценка = автотесты (Pytest), которые агент не может изменить; при провале он получает лог ошибки и переписывает решение. Это усиливает DoD: модели не верят «на слово», потому что при самооценке агенты «уверенно хвалят свою работу, даже посредственную». Поэтому верификатор делают внешним и сильным — подробнее в Generator Evaluator.
Пример
Trust Gate / executable spec: вывод агента проверяется не самооценкой, а реальным запуском кода в песочнице. Успех → возвращаем результат; ошибка → traceback уходит обратно модели на самоисправление (self-correction).
def code_execution_loop(question, max_attempts=3):
repl = PythonREPL() # песочница для exec()
history = [{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": question}]
for _ in range(max_attempts):
reply = client.chat.completions.create(
model=MODEL_FAST, messages=history).choices[0].message.content
history.append({"role": "assistant", "content": reply})
result = repl.run(extract_code(reply)) # объективная проверка: запускаем код
if result["success"]:
return result["output"]
# ошибка -> traceback обратно модели на самоисправление
history.append({"role": "user", "content": f"Код упал:\n{result['error']}\nИсправь."})
return None
Связано с
- Benchmarks Agents — офлайн-бенчмарки vs свои онлайн-evals
- Guardrails —
no_policy_violationпроверяет именно guardrails - RAG —
has_citations/answer_groundedоценивают RAG-ответы - RAG Metrics — продакшен-дашборд метрик RAG (следующий уровень после мини-метрик)
Открытые вопросы
- сколько тест-сценариев — необходимый минимум для своего домена