Agent Evals

Как понять, что агент «готов»: Definition of Done (DoD) + простые метрики качества (has_citations, answer_grounded, tool_called_when_needed, no_policy_violation) + набор тест-сценариев (включая edge-cases и prompt-injection). Это онлайн-оценка под свою задачу — в отличие от офлайн-бенчмарков (Benchmarks Agents).

Суть

Агент — «система принятия решений», а не «умный чат», поэтому его надо проверять как систему: воспроизводимые тест-сценарии и измеримые метрики, а не «вроде отвечает нормально».

Зачем это нужно

Без evals нельзя отличить рабочего агента от демо. DoD фиксирует минимум, ниже которого в прод нельзя; метрики ловят галлюцинации и нарушения политик (связка с Guardrails).

Как работает

Definition of Done (6 пунктов):

  1. Бот принимает запрос и отвечает либо через RAG (со ссылками), либо вызовом инструмента (с понятным «что сделал»).
  2. Два режима: «Справка» (RAG) и «Действие» (tool).
  3. Трассировка шагов (хотя бы JSONL): request_id → plan → tool_call → tool_result → final_answer.
  4. Базовая защита: tool allowlist, проверка аргументов, anti-prompt-injection для RAG, таймауты/ретраи.
  5. Минимум несколько тест-сценариев, включая edge-cases и prompt-injection.
  6. Мини-оценка качества (есть ли цитаты / основан ли ответ на контексте / нет выдуманных фактов).

Мини-метрики:

  • 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 (следующий уровень после мини-метрик)

Открытые вопросы

  • сколько тест-сценариев — необходимый минимум для своего домена