Построй eval-фреймворк.
Зачем
Без эвалов меняешь промт → "стало лучше или хуже?" — не знаешь. С эвалами — измеряешь impact.
Структура
1. Eval dataset (input → expected behavior)
2. Метрики (что меряем)
3. Test runner (запускает агента на dataset, считает метрики)
4. Reporting (дашборд с trend)
1. Eval dataset
Собирай из реальных кейсов:
- Production логи (с разрешением)
- Customer support тикеты
- Edge cases которые находишь
- Synthetic cases (для coverage)
Размер
- Старт: 20-50 кейсов
- Зрелый: 200-500
- Big: 1000+
Каждый кейс:
- id: case-001
category: typical
input:
user_message: "..."
context: "..."
expected:
- has_section: "Answer"
- max_length: 300
- factuality: high
notes: "Original ticket #12345"
Покрытие категорий
- Typical (60%)
- Edge cases (20%)
- Adversarial (10%)
- Out-of-scope (10%)
2. Метрики
Разные задачи — разные метрики:
Classification (категоризация)
- Accuracy, precision, recall, F1
- Confusion matrix
Generation (text/code)
- Exact match — для коротких ответов
- BLEU / ROUGE — для текста
- Code execution — для кода (тест прошёл?)
- LLM-as-judge — для качества
Agents
- Task completion rate
- Tool selection accuracy
- Steps to completion
- Cost per task
Safety
- Refusal rate (правильно отказывается?)
- Hallucination rate
- Jailbreak success rate (% когда взломали)
3. LLM-as-judge
Для семантических оценок:
Judge prompt:
"Compare these two responses against the question.
Score 1-5 for: factuality, completeness, helpfulness.
Question: {{question}}
Response: {{response}}
"
Best practices:
- Используй сильнее модель чем оцениваемая
- Калибруй на human-labeled subset (20-50 кейсов)
- Несколько вызовов с reasoning — стабильнее
4. Test runner
def run_evals(model, dataset):
results = []
for case in dataset:
response = model.complete(case.input)
scores = {}
for assertion in case.expected:
scores[assertion.name] = check(assertion, response)
results.append({
'case_id': case.id,
'pass': all(scores.values()),
'scores': scores,
'response': response,
'tokens': response.tokens,
'cost': response.cost,
})
return results
5. CI integration
Запускай evals на каждое изменение промта:
# .github/workflows/evals.yml
on: pull_request
jobs:
evals:
- run: pytest evals/
- run: python evals/report.py
- if: regression_detected
run: comment_on_pr
Сравнивай с baseline:
- Pass rate >= baseline
- Latency не вырос > 20%
- Cost не вырос > 20%
6. Reporting
Дашборд с:
- Trend pass rate за время
- Breakdown по категориям
- Failed cases с примерами
- Cost / latency tracking
7. Iterate
Каждый production-баг → новый eval case. Каждый PR с promptом → запуск evals. Раз в месяц — audit dataset (всё ли актуально).
Анти-паттерны
- ❌ Eval на 5 кейсах — слишком мало
- ❌ Только happy path — не ловишь edge
- ❌ Human-only review (медленно, не масштабируется)
- ❌ Не отслеживать стоимость
- ❌ Менять и promt и dataset одновременно
Инструменты
- LangSmith
- Promptfoo
- Anthropic Workbench (для Claude)
- Свой стек (Python + pytest + dashboard)
В конце
- Dataset (минимум 50 кейсов)
- Метрики
- Test runner script
- CI integration
- Baseline numbers
Похожие промты
site / analytics
Измерение воронок: настройка
Какие воронки строить, как считать, на каких сегментах смотреть.
analyticsfunnelmetrics
Открыть
Средний30-60 мин
site / analytics
North-Star метрика и input-метрики
Одна главная метрика которая отражает успех продукта + 3-5 драйверов под неё.
analyticsmetricsstrategy
Открыть
Продвинутый30-60 мин
site / analytics
Cohort-анализ retention
Weekly/monthly cohort: что измерять, как читать heatmap, какие действия следуют из паттернов.
analyticsretentioncohort
Открыть
Средний1-2 часа