Как измерить качество AI-агента: от академических бенчмарков (SWE-bench, GAIA, WebArena) до production-метрик (latency, точность, стоимость). Фреймворки для тестирования: AgentEval, LangSmith, Braintrust.
Три слоя оценки AI-агента: бенчмарки → task-specific тесты → production-мониторинг с обратной связью
В 2026 году оценка AI-агента — это не просто запуск бенчмарка. Это три независимых слоя, каждый из которых отвечает на свой вопрос. Академический бенчмарк говорит «насколько модель умна вообще», task-specific тест — «решает ли агент МОЮ задачу», а production-мониторинг — «не сломалось ли оно сегодня».
SWE-bench Verified, GAIA, WebArena, BFCL, MMLU-Pro. Запускаются разово при выборе модели. Отвечают на вопрос «какая модель лучше как основа».
Custom eval-сеты из реальных задач. Например: «сгенерируй SQL по вопросу» → assert на результате. Запуск при каждом изменении промпта или модели.
Непрерывный мониторинг: latency, токены, стоимость, % успешных вызовов, дрейф качества. Тулзы: LangSmith, Braintrust, OpenInference.
SWE-bench Verified — золотой стандарт для оценки coding-агентов. 500 реальных GitHub issues из Python-репозиториев (Django, Flask, SymPy). Агент получает описание бага и должен предложить patch. Метрика — resolve rate: доля issues, для которых patch проходит тесты.
# Установка SWE-bench git clone https://github.com/swe-bench/SWE-bench.git cd SWE-bench pip install -e . # Запуск evaluation для вашего агента python -m swebench.harness.run_evaluation \ --dataset_name princeton-nlp/SWE-bench_Verified \ --predictions_path ./my_agent_predictions.json \ --max_workers 8 \ --run_id my_agent_v1 \ --timeout 900 # Формат predictions.json: [ { "instance_id": "django__django-11333", "model_patch": "diff --git a/django/...", "model_name_or_path": "claude-sonnet-4" } ] # Результаты июля 2026 (SWE-bench Verified resolve rate): # Claude Sonnet 4: 64.2% # GPT-5: 58.7% # DeepSeek-v4: 49.1% # Gemini 2.5 Pro: 51.3% # Open-source SOTA: 38.5%
Бенчмарки хороши для baseline, но реальный бизнес требует своих сценариев. Соберём eval-раннер на Python, который прогоняет агента через набор тестовых кейсов и считает accuracy, latency и стоимость.
# agent_eval.py — production-grade eval framework import time, json from dataclasses import dataclass, field from typing import Callable @dataclass class EvalCase: name: str input: str expected_output: str # или Callable для fuzzy match expected_tools: list = None # проверка что агент вызвал правильные tools max_tokens: int = 4000 @dataclass class EvalResult: case_name: str passed: bool output: str latency_ms: float tokens_used: int cost_usd: float tool_calls: list = field(default_factory=list) class AgentEval: """Прогоняет агента через eval-сет и считает метрики.""" def __init__(self, agent_fn: Callable, cases: list): self.agent_fn = agent_fn self.cases = cases def run(self) -> dict: results = [] for case in self.cases: t0 = time.perf_counter() output = self.agent_fn(case.input) lat = (time.perf_counter() - t0) * 1000 passed = self._check(output, case.expected_output) results.append(EvalResult( case_name=case.name, passed=passed, output=output[:200], latency_ms=lat, tokens_used=0, cost_usd=0.0 )) passed = sum(1 for r in results if r.passed) return { "accuracy": passed / len(results), "avg_latency_ms": sum(r.latency_ms for r in results) / len(results), "total_cost": sum(r.cost_usd for r in results), "details": [r.__dict__ for r in results] } def _check(self, output: str, expected: str) -> bool: if callable(expected): return expected(output) # Fuzzy match: expected содержится в output return expected.lower() in output.lower() # === Использование === def my_agent(query: str) -> str: # ваш агент — вызов LLM, RAG, tool calling from openai import OpenAI client = OpenAI(base_url="https://api.deepseek.com/v1") r = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": query}] ) return r.choices[0].message.content cases = [ EvalCase("sql-simple", "Напиши SQL: все пользователи с email на gmail", "LIKE '%@gmail.com%'"), EvalCase("api-json", "Верни JSON с полями name, age", lambda x: "name" in x and "age" in x), EvalCase("datetime-parse", "Распарси дату: 2026-07-30T14:00:00Z", "2026"), ] evaluator = AgentEval(my_agent, cases) report = evaluator.run() print(json.dumps(report, indent=2, ensure_ascii=False))
LangSmith (от создателей LangChain) — де-факто стандарт для observability LLM-приложений. Трейсит каждый вызов, считает latency и стоимость, позволяет сравнивать разные конфигурации агента и настраивать алерты.
# pip install langsmith openai import os from langsmith import Client, traceable from openai import OpenAI os.environ["LANGSMITH_API_KEY"] = "lsv2_..." os.environ["LANGSMITH_PROJECT"] = "my-agent-prod" client = Client() llm = OpenAI() # Оборачиваем агента в @traceable — каждый вызов логируется @traceable(run_type="chain", name="support-agent") def support_agent(user_query: str) -> str: resp = llm.chat.completions.create( model="gpt-5", messages=[ {"role": "system", "content": "Ты — агент поддержки."}, {"role": "user", "content": user_query} ] ) return resp.choices[0].message.content # Production use answer = support_agent("Как сбросить пароль?") # Чтение метрик из LangSmith (дашборд или API) stats = client.read_project( project_name="my-agent-prod", ).get_stats() print(f"Avg latency: {stats['latency_p50']:.0f}ms") print(f"Error rate: {stats['error_rate']:.1%}") print(f"Token usage: {stats['total_tokens']:,}")
Самая частая оптимизация агента — подбор промпта. Вместо ручного перебора напишем A/B-раннер, который сравнит две версии промпта на одном eval-сете и выдаст статистически значимый результат.
# prompt_ab.py — A/B тест двух версий промпта from openai import OpenAI from statistics import mean, stdev PROMPT_A = "Ты — полезный ассистент. Отвечай кратко." PROMPT_B = "Ты — senior-разработчик. Отвечай развёрнуто, с примерами кода на Python." eval_set = [ {"q": "Как отсортировать список словарей по ключу?", "expect": "key=lambda"}, {"q": "Как обработать ошибку в Python?", "expect": "try"}, {"q": "Создай декоратор для измерения времени", "expect": "def"}, {"q": "Как прочитать CSV в pandas?", "expect": "read_csv"}, {"q": "Напиши async HTTP клиент на aiohttp", "expect": "async"}, {"q": "Как подключиться к PostgreSQL из Python?", "expect": "psycopg2"}, ] def test_prompt(system_prompt, eval_data): scores = [] for item in eval_data: r = client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": item["q"]} ], temperature=0.0 ) output = r.choices[0].message.content score = 1.0 if item["expect"].lower() in output.lower() else 0.0 scores.append(score) return scores client = OpenAI(base_url="https://api.deepseek.com/v1") scores_a = test_prompt(PROMPT_A, eval_set) scores_b = test_prompt(PROMPT_B, eval_set) print(f"Prompt A: {mean(scores_a):.1%} ± {stdev(scores_a):.1%}") print(f"Prompt B: {mean(scores_b):.1%} ± {stdev(scores_b):.1%}") delta = mean(scores_b) - mean(scores_a) if delta > 0.05: print(f"✅ Prompt B лучше на {delta:.1%} — деплоим!") elif delta < -0.05: print(f"❌ Prompt A лучше — оставляем текущий") else: print("↔ Разница статистически незначима — нужен больше семплов")
Что мониторить в продакшене, чтобы не узнать о проблемах от пользователей. На основе опыта команд, запускающих AI-агентов на >10K запросов в день.
| Метрика | Что измеряет | Здоровый порог | Алерт при |
|---|---|---|---|
| Success Rate | % запросов без ошибок и таймаутов | >95% | <92% |
| Latency P95 | 95-й перцентиль времени ответа | <3s | >5s |
| Cost/1K req | Стоимость 1000 запросов | <$3 | +30% день-к-дню |
| Hallucination Rate | % ответов с вымышленными фактами | <5% | >8% |
| Refusal Rate | % отказов отвечать (безопасность) | <2% | >5% |
| User Feedback | 👍/👎 от пользователей | >80% 👍 | <70% 👍 |
| Quality Drift | Падение accuracy на eval-сете | <2% | >5% неделя-к-неделе |
Оценка AI-агента — непрерывный процесс, а не разовая акция. Три слоя (бенчмарк → task-specific eval → production monitoring) дают полную картину. Практический минимум для любой команды: 15-минутный eval-раннер на Python (секция 3), подключенный LangSmith/Braintrust (секция 4) и 7 production-метрик с алертами (секция 6). Стоимость инструментов: $0 для open-source eval + $0-50/мес для observability на объемах до 10K запросов. Начинайте с малого: напишите 10 eval-кейсов для своего агента сегодня — это займёт час и спасёт от деградации качества через месяц.