Вы запустили AI-агента. Он работает. А как вы узнаете, что он работает ХОРОШО?
Сценарий знакомый: разработчики показывают демо, агент отвечает на тестовые вопросы, менеджмент доволен. Выкатываем в продакшн — через неделю пользователи жалуются, что "агент стал тупить". Проверяете — да, ответы стали длиннее, токенов тратится больше, а качество упало. Потому что вы не измеряете.
Без автоматических бенчмарков вы летите вслепую. Модели дрейфуют, промпты устаревают, цепочки выполнения ломаются после обновлений. Сегодня покажу систему, которую мы ввели после того, как наш Deep Research Agent начал выдавать фейковые цитаты.
Ключевая ошибка: тестировать AI-агентов руками. Человек проверяет 10-20 запросов в день. Автоматический бенчмарк — 10 000 в час. Разница в три порядка.
1 Зачем вам эта система сегодня, а не завтра
На 2026 год проблема усугубилась. AI-агенты стали сложнее: мультимодальность, оркестровка сабагентов, работа с реальным временем. Классические метрики вроде accuracy уже не работают. Нужны композитные показатели:
- Время ответа на сложный мультишаговый запрос
- Стоимость выполнения (токены превращаются в реальные доллары)
- Стабильность работы цепочек (сколько раз агент "сходил с рельсов")
- Качество ответов по subject-specific метрикам
Langfuse на 2026 год — не просто трейсинг. Это полноценная платформа observability с вычисляемыми метриками, дашбордами и алерт-правилами. Если раньше вы смотрели на логи вручную, теперь можете настроить автооценку каждого прогона.
2 Собираем стек: что понадобится кроме Langfuse
Одна Langfuse не спасет. Нужна экосистема:
| Компонент | Задача | Альтернативы 2026 |
|---|---|---|
| Langfuse Cloud/CE | Трейсинг, метрики, дашборды | Phidata (если работаете только с RAG), Helicone |
| Бенчмарк-раннер | Запуск тестовых сценариев | Наш кастомный на Cogitator, можно на чистом Python |
| Оценщики (evals) | Автоматическая оценка качества | DeepEval, UpTrain, кастомные LLM-оценки |
| Оркестратор | Планирование регулярных запусков | GitHub Actions, Argo Workflows, Airflow |
Важный момент: не пытайтесь сразу оценивать всё. Начните с 3-5 ключевых сценариев, которые критичны для бизнеса. Например, если у вас агент-лаборант, проверяйте, правильно ли он интерпретирует метрики экспериментов.
# docker-compose для локального стенда Langfuse (актуально на 2026)
version: '3.8'
services:
langfuse:
image: langfuse/langfuse:latest
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://postgres:postgres@db:5432/langfuse
- NEXTAUTH_SECRET=your-secret-here
- SALT=your-salt-here
depends_on:
- db
db:
image: postgres:16-alpine
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=langfuse
3 Интеграция: встраиваем трейсинг в агента
Самый болезненный этап. Многие фреймворки уже имеют интеграции с Langfuse. Но если вы используете кастомное решение вроде нашего агента на Bun, придется добавить несколько десятков строк.
Как НЕ надо делать:
// ПЛОХО: логируем только финальный ответ
async function runAgent(query) {
const start = Date.now();
const response = await llm.generate(query);
console.log(`Время: ${Date.now() - start}ms`);
return response;
}
Правильный подход — трейсить каждый шаг:
// ХОРОШО: полноценный трейсинг с таймингом и токенами
import { Langfuse } from "langfuse";
const langfuse = new Langfuse({
secretKey: process.env.LANGFUSE_SECRET_KEY,
publicKey: process.env.LANGFUSE_PUBLIC_KEY,
baseUrl: process.env.LANGFUSE_BASE_URL,
});
async function runAgentWithTracing(query) {
const trace = langfuse.trace({
name: "research_agent",
metadata: { query, version: "2.1.0" }
});
const generation = trace.generation({
name: "initial_analysis",
model: "claude-3-5-sonnet-20241022",
});
try {
const analysis = await llm.generate(query);
generation.end({
completion: analysis,
usage: { inputTokens: 150, outputTokens: 300 }
});
// Добавляем оценку сразу
trace.score({
name: "relevance",
value: await evaluateRelevance(query, analysis),
comment: "auto-evaluated"
});
return analysis;
} catch (error) {
generation.end({ level: "ERROR", statusMessage: error.message });
throw error;
}
}
Нюанс 2026 года: Langfuse поддерживает асинхронную отправку трейсов. Не нужно ждать подтверждения от сервера — данные копятся и отправляются батчами. Это критично для high-load агентов.
4 Создаем бенчмарк-сценарии: не только QA пары
Здесь большинство падает. Берут 100 вопросов и ответов, запускают, сравнивают. Это работает для чат-ботов, но не для сложных агентов.
Нам нужны:
- Функциональные тесты — агент должен выполнить конкретную задачу ("найди три последних исследования о квантовых вычислениях")
- Нагрузочные тесты — как ведет себя при 100 параллельных запросах
- Регрессионные тесты — проверяем, что новая версия не сломала старые сценарии
- Стоимостные тесты — не выросла ли цена выполнения после обновления модели
Пример конфигурации бенчмарка в YAML:
benchmarks:
- name: "research_accuracy"
description: "Проверка точности исследовательского агента"
schedule: "0 */6 * * *" # Каждые 6 часов
scenarios:
- query: "Найди последние достижения в термоядерном синтезе за 2025 год"
expected_criteria:
- "должны быть упомянуты хотя бы 2 проекта"
- "должны быть цифры (проценты, температуры, сроки)"
- "ответ должен содержать ссылки на источники"
evaluation_model: "gpt-4-turbo-eval"
- name: "multi_agent_coordination"
description: "Проверка координации сабагентов"
scenarios:
- query: "Проанализируй финансовый отчет компании X и составь прогноз на квартал"
expected_steps:
- "data_retrieval_agent"
- "financial_analysis_agent"
- "report_generation_agent"
max_allowed_time: 120 # секунд
cost_threshold: 0.50 # долларов
5 Автоматические оценки: как заставить LLM оценивать другого LLM
Самый спорный момент. Можно использовать специализированные модели-оценщики (например, Qwen2.5-72B-Instruct-Eval), но они дорогие. Или маленькие модели вроде AgentCPM-Explore, которые можно запустить локально.
Техника, которая работает у нас:
async def evaluate_agent_response(query: str, response: str, context: dict) -> dict:
"""
Мультиметрическая оценка ответа агента
Возвращает dict с scores по разным критериям
"""
evaluation_prompt = """
Ты оцениваешь ответ AI-агента. Ответь в формате JSON:
{
"relevance": 0-10, # насколько ответ соответствует вопросу
"completeness": 0-10, # насколько ответ полный
"factual_accuracy": 0-10, # фактологическая точность
"conciseness": 0-10, # лаконичность (меньше воды)
"critical_issues": ["список критических проблем"]
}
Вопрос: {query}
Ответ: {response}
Контекст: {context}
"""
# Используем небольшую модель для оценки
eval_response = await llm.complete(
model="qwen2.5-7b-instruct",
prompt=evaluation_prompt,
temperature=0.1, # низкая температура для консистентности
response_format={ "type": "json_object" }
)
scores = json.loads(eval_response)
# Логируем оценку в Langfuse
langfuse_client.score(
trace_id=context["trace_id"],
name="composite_quality",
value=sum(scores.values()) / len(scores),
comment=f"Auto-eval: {scores}"
)
return scores
Важный трюк: не оценивайте каждый ответ в продакшене. Только 10% трафика или только ответы с высоким уровнем уверенности модели. Иначе удвоите стоимость инфраструктуры.
6 Дашборды и алерты: когда бить тревогу
Langfuse предоставляет готовые дашборды, но их нужно кастомизировать. Ключевые метрики для мониторинга:
- Score degradation — падение качества оценок на 15% за 24 часа
- Cost spike — увеличение стоимости вызова на 25% без изменения трафика
- Latency p95 — 95-й процентиль времени ответа вырос в 1.5 раза
- Error rate — больше 5% ошибок в цепочках выполнения
Настройка алерта в Langfuse (через UI или API):
{
"alert_name": "quality_drop_research_agent",
"condition": {
"type": "score_degradation",
"score_name": "composite_quality",
"time_window": "24h",
"threshold": -0.15, # падение на 15%
"min_samples": 100 # минимум 100 оценок для статистики
},
"notification": {
"type": "slack",
"channel": "#ai-alerts",
"message": "🚨 Quality drop detected for research agent: {{current_value}} vs {{baseline_value}}"
}
}
Где система ломается: тонкие места
После внедрения бенчмарков в трех проектах, выделил проблемные точки:
1. Переобучение на тестовые данные — агент начинает хорошо отвечать на бенчмарк-вопросы, но плохо на реальные. Решение: регулярно обновлять тестовый набор, добавлять adversarial примеры.
2. Дрейф оценок — модель-оценщик сама меняется со временем. Сегодня ответ оценила в 8/10, через месяц тот же ответ — 6/10. Фиксируем версию модели-оценщика, калибруем раз в квартал.
3. Ложные срабатывания алертов — система кричит "качество упало!", а просто поменялось распределение запросов. Добавляем сегментацию: отдельно отслеживаем разные типы запросов.
FAQ: вопросы, которые задают после внедрения
| Вопрос | Ответ |
|---|---|
| Стоимость внедрения? | Langfuse Cloud — от $99/мес. Самописное решение — 2-3 недели работы senior engineer. Экономит тысячи на незамеченных регрессиях. |
| Как часто запускать бенчмарки? | Критические сценарии — каждые 6 часов. Полный набор — раз в сутки. После каждого деплоя — обязательно. |
| Что делать, если агент использует много сабагентов? | Трейсить каждого отдельно. В Langfuse есть иерархические трейсы — родительский трейс содержит вложенные трейсы сабагентов. |
| Как сравнивать разные версии агента? | В Langfuse добавляете тег версии (metadata.version). Потом фильтруете по тегу и сравниваете метрики в дашборде. |
Что будет дальше с бенчмарками AI-агентов
К 2027 году ожидаю два изменения:
1. Агенты начнут оценивать себя сами — не внешней моделью, а внутренним механизмом рефлексии. Уже сейчас агентная инженерия движется в эту сторону.
2. Появятся стандартизированные бенчмарки для вертикалей — медицинские агенты, юридические, финансовые. Сейчас каждый придумывает велосипед.
Совет напоследок: начните не с идеальной системы, а с минимально работающего бенчмарка на 3 сценария. Запустите его сегодня. Через неделю добавите еще 5. Через месяц у вас будет data-driven понимание, как на самом деле работает ваш агент.
Без этого вы просто гадаете на кофейной гуще. А кофейная гуща — плохой метрик для продакшн-системы.