Skip to content
PПромтбук
RUEN
03Эвалюация

Eval-фреймворк для LLM

Как мерить качество промтов и агентов: test set, метрики, автоматизация.

Построй 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
К подразделу «Эвалюация»
Похожие промты