📊

Оценка и тестирование AI-агентов 2026: метрики, бенчмарки, production-мониторинг

Как измерить качество AI-агента: от академических бенчмарков (SWE-bench, GAIA, WebArena) до production-метрик (latency, точность, стоимость). Фреймворки для тестирования: AgentEval, LangSmith, Braintrust.

pro ⏱ 16 мин
AI Agent Evaluation Pipeline Академические бенчмарки SWE-bench / GAIA / WebArena HumanEval / MMLU / BFCL → сравнительный baseline Task-specific eval custom тесты / сценарии assert на output / tool calls → domain-specific accuracy Production Monitoring LangSmith / Braintrust латентность / стоимость / дрейф → continuous eval Feedback → Fine-tune человеческие оценки → улучшение улучшение модели / промпта Ключевые метрики Accuracy: 0.82 Latency P95: 2.1s Cost/1K: $0.47 Success Rate: 94%

Три слоя оценки AI-агента: бенчмарки → task-specific тесты → production-мониторинг с обратной связью

# 1. Три слоя оценки: от бенчмарка до продакшена

В 2026 году оценка AI-агента — это не просто запуск бенчмарка. Это три независимых слоя, каждый из которых отвечает на свой вопрос. Академический бенчмарк говорит «насколько модель умна вообще», task-specific тест — «решает ли агент МОЮ задачу», а production-мониторинг — «не сломалось ли оно сегодня».

🧪 Слой 1: Бенчмарки

SWE-bench Verified, GAIA, WebArena, BFCL, MMLU-Pro. Запускаются разово при выборе модели. Отвечают на вопрос «какая модель лучше как основа».

🎯 Слой 2: Task-specific

Custom eval-сеты из реальных задач. Например: «сгенерируй SQL по вопросу» → assert на результате. Запуск при каждом изменении промпта или модели.

📡 Слой 3: Production

Непрерывный мониторинг: latency, токены, стоимость, % успешных вызовов, дрейф качества. Тулзы: LangSmith, Braintrust, OpenInference.

# 2. SWE-bench: как запустить и интерпретировать

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%
  

# 3. Свой eval-фреймворк на Python: AgentEval

Бенчмарки хороши для 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))
  

# 4. LangSmith для production-мониторинга

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']:,}")
  

# 5. Автоматический A/B-тест промптов

Самая частая оптимизация агента — подбор промпта. Вместо ручного перебора напишем 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("↔ Разница статистически незначима — нужен больше семплов")
  

# 6. Чек-лист: метрики здорового агента в проде

Что мониторить в продакшене, чтобы не узнать о проблемах от пользователей. На основе опыта команд, запускающих AI-агентов на >10K запросов в день.

Метрика Что измеряет Здоровый порог Алерт при
Success Rate% запросов без ошибок и таймаутов>95%<92%
Latency P9595-й перцентиль времени ответа<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-кейсов для своего агента сегодня — это займёт час и спасёт от деградации качества через месяц.