← AI evals engineering: testing systems that never repeat themselves
07 / 07 · 60 min

Capstone: catch the planted regression

Assemble the eval harness end to end — dataset, calibrated judge, statistical gate, CI — and verify it with a mutation test of planted regressions.

Lesson content is currently available in Russian.

What you will learn

  • →Собирать eval-harness end-to-end: датасет, judge, статистический гейт, CI.
  • →Проверять harness мутационным тестированием с подсаженными регрессиями.
  • →Измерять качество самого harness: catch rate, ложные тревоги, время и стоимость.

Контракт капстоуна и архитектура harness

Задача капстоуна: собрать eval-harness для своего LLM-приложения (или учебного RAG-бота над документацией любого проекта) и доказать, что он работает, — то есть ловит регрессии, которые в него подсадили намеренно. Компоненты, каждый из которых вы уже строили в курсе:

  • Golden-датасет: ≥ 50 кейсов в JSONL, версионирован, стратифицирован по сегментам, включает регрессионные кейсы и happy path (урок 2).
  • Раннер: promptfoo или свой скрипт; temperature 0, пиненая версия модели, кэш.
  • Три слоя проверок: детерминированные ассерты (формат, обязательные и запрещённые элементы); калиброванный judge с бинарной рубрикой и κ ≥ 0.6 против ваших меток (урок 3); статистический гейт — непрегрессия против baseline-прогона с бутстрап-CI разности (урок 6).
  • CI-workflow: smoke на PR (≤ 10 минут), full по требованию; гейты: 100% на регрессионных кейсах, непрегрессия по сегментам (урок 4).
  • Отчёт: pass rate по сегментам с SEM, список перевернувшихся кейсов с диффами, стоимость прогона.

Контракт: любой PR, меняющий промпт, модель, параметры или retrieval, блокируется при срабатывании гейта. Формулировка «harness работает» отныне означает не «он запускается», а «он ловит то, что должен ловить, и молчит, когда ломать нечего». Это и будем измерять.

Подсадка регрессий: мутационное тестирование эвалов

Как проверяют тесты в классической разработке? Мутационным тестированием: вносят в код заведомые поломки и смотрят, покраснеют ли тесты. Тот же приём — единственный честный способ проверить eval-harness. Напарник (или вы сами через неделю, в отдельной ветке, не подглядывая) подсаживает 5 регрессий из каталога:

1. Формат: удалить из промпта инструкцию о формате дат/валюты/структуры ответа.
2. Edge-case: сломать обработку граничного входа (пустой запрос, другой язык,
   вопрос вне домена — там, где промпт содержал специальную ветку).
3. Модель: подменить на заметно более слабую/дешёвую в конфиге.
4. Retrieval: top_k с 5 до 1, или отключить реранкер, или испортить шаблон,
   в который вставляется контекст.
5. Verbosity-ловушка: инструкция «отвечай максимально подробно и развёрнуто» —
   ответы длиннее, содержания не больше; проверка judge на verbosity bias.

Каждая мутация оформляется отдельным PR — harness должен отработать в своём штатном режиме, как на реальном изменении. Правило разбора: если мутация прошла зелёной, у harness слепое пятно, и чинится оно добавлением кейсов или ассертов, а не «починкой» конкретной мутации задним числом. Мутация 5 — самая коварная: ассерты формата она не трогает, средний judge-скор может даже вырасти; ловится либо пунктом рубрики о многословии, либо отдельной метрикой длины ответа с гейтом на её рост.

Метрики самого harness: catch rate и ложные тревоги

У harness, как у любого детектора, две характеристики: чувствительность и специфичность. Чувствительность — catch rate: доля пойманных мутаций из подсаженных. Цель капстоуна — не меньше 4 из 5. Специфичность проверяется «невинными» диффами: 3–5 PR с изменениями, не влияющими на поведение, — рефакторинг кода вокруг промпта, правка комментариев, эквивалентная перефразировка инструкции без смены смысла. Harness не должен на них краснеть: гейт, который блокирует безобидные PR, команда за месяц приучится игнорировать — и он умрёт социально раньше, чем технически.

Обязательный разбор: какой слой поймал какую мутацию. Типичная картина: формат ловят детерминированные ассерты (мутация 1), граничные кейсы — сегментные пороги (мутация 2, если в датасете есть сегмент edge — проверьте!), слабую модель — судья и статистический гейт на полном сете (мутация 3), retrieval — faithfulness-рубрика (мутация 4), verbosity — метрика длины (мутация 5). Если всё поймал один слой — остальные не работают или избыточны; если мутацию 3 поймал только full-прогон, а smoke пропустил — это нормально и означает, что вы правильно понимаете разрешающую способность маленького набора.

Операционные лимиты: smoke ≤ 10 минут и с посчитанной стоимостью в долларах; full — с бюджетом, известным заранее. Harness, о цене которого никто не знает, однажды молча отключат.

Отчёт, приёмка и жизнь после капстоуна

Финальный артефакт капстоуна — отчёт, по которому другой инженер поймёт и повторит вашу работу. Состав: (1) таблица мутаций — «мутация → пойман/пропущен → каким слоем → каким кейсом/гейтом»; (2) результаты невинных диффов — ложных тревог нет или разобраны; (3) метрики harness — catch rate, время и стоимость smoke и full; (4) калибровка judge — каппа против ваших ручных меток, дата калибровки, модель судьи; (5) выводы — найденные слепые пятна и добавленные после них кейсы. Отдельной строкой — версия датасета, промпта, моделей системы и судьи: без этого отчёт нельзя воспроизвести.

Критерии приёмки капстоуна: catch rate ≥ 4/5; ноль неразобранных ложных тревог; smoke укладывается в лимит; в датасете ≥ 50 кейсов с сегментами и регрессионными кейсами; судья калиброван (κ ≥ 0.6); статистический гейт использует парное сравнение с CI, а не голые проценты.

Что дальше, за пределами курса: онлайн-скоринг сэмпла продакшена тем же judge и алерты на дрейф; автопополнение датасета из инцидентов как штатный процесс; квартальная сверка распределения сегментов с живым трафиком; error bars во всех отчётах о качестве — по умолчанию, а не по праздникам. Главный вывод курса: эвалы — не разовый артефакт перед релизом, а контур обратной связи, такой же постоянный, как тесты и мониторинг. Прод рождает кейсы — кейсы охраняют прод.

Practice

Капстоун: harness против пяти мутаций

Соберите полный harness по контракту урока: датасет ≥ 50 кейсов, раннер, три слоя проверок, CI-workflow с гейтами и отчётом. Передайте напарнику каталог мутаций (или выполните роль напарника сами в отдельной ветке через несколько дней): 5 подсаженных регрессий пятью PR плюс 3 невинных диффа. Прогоните все 8 PR через harness, разберите результаты по слоям, устраните найденные слепые пятна добавлением кейсов.

Deliverable

Репозиторий с harness и финальный отчёт: таблица мутаций со слоями поимки, catch rate ≥ 4/5, разбор ложных тревог, стоимость и время прогонов, калибровка judge и список кейсов, добавленных после разбора слепых пятен.

Checkpoint

Представьте свой harness команде: почему ему можно доверять блокировку PR и как вы это доказали.

  • ✓ Доказательство — мутационный тест: названы подсаженные регрессии, catch rate и слой, поймавший каждую.
  • ✓ Показана специфичность: невинные диффы прошли зелёными, ложные тревоги разобраны.
  • ✓ Harness воспроизводим: версии датасета, промпта и моделей зафиксированы, стоимость и время прогонов известны, judge калиброван с κ ≥ 0.6.

Check yourself

Зачем подсаживать регрессии в систему, если harness и так запускается в CI?

01Зачем подсаживать регрессии в систему, если harness и так запускается в CI?

Мутация «отвечай максимально подробно» прошла через harness зелёной, средний judge-скор даже вырос. В чём урок?

02Мутация «отвечай максимально подробно» прошла через harness зелёной, средний judge-скор даже вырос. В чём урок?

Почему ложные тревоги harness опасны, хотя ничего не ломают?

03Почему ложные тревоги harness опасны, хотя ничего не ломают?

Smoke-набор пропустил подмену модели на слабую, а полный ночной прогон поймал. Как это оценить?

04Smoke-набор пропустил подмену модели на слабую, а полный ночной прогон поймал. Как это оценить?

Sources

Capstone: catch the planted regression · AI evals engineering: testing systems that never repeat themselves · VORCL