← The Practical AI Product Engineering Playbook
05 / 10 · 75 min

Evals and observability: never ship “seems to work” to production

Golden sets and rubrics, calibrating an LLM judge, a regression gate in CI when the model or prompt changes, and tracing that links every failure to a specific call chain.

Lesson content is currently available in Russian.

What you will learn

  • →Собирать golden set и rubric и калибровать LLM-судью против человеческой разметки.
  • →Отслеживать качество, faithfulness, latency и cost как отдельные оси.
  • →Ставить regression gate в CI и связывать провалы с trace id.

Что измерять: четыре оси вместо одного «успеха»

Главная ошибка команд, выпускающих AI-фичи, — единая метрика «успеха». Композитный показатель усредняет разнонаправленные движения и прячет деградацию: качество ответов выросло на 3%, а p95 latency удвоился — «успех» не изменился, а пользователи ушли. Меряйте оси раздельно:

  • Quality — решена ли задача пользователя: точность extraction, полезность ответа, выполнение инструкции. Определяется rubric-ой, специфичной для задачи.
  • Faithfulness — опирается ли ответ на предоставленные источники (критично для RAG): доля утверждений, подкреплённых контекстом.
  • Latency — отдельно time-to-first-token (определяет ощущение отзывчивости при streaming) и полное время ответа; всегда p50/p95/p99, никогда не среднее — среднее маскирует хвост, который и бесит пользователей.
  • Cost — цена запроса в токенах и деньгах, по фичам: рост cost на 40% при неизменном качестве — это регрессия, даже если «всё работает».

К этим четырём добавляются операционные счётчики из прошлых уроков: repair rate structured outputs, доля ответов без цитат, доля «данных недостаточно», число tool calls на задачу. Каждый из них — ранний индикатор, срабатывающий за часы и дни до жалоб.

Раздельные оси дают язык для честных trade-off-ов: «новый промпт даёт +5 п.п. качества за +30% cost — принимаем?» — это решение продукта, а не спор о вкусах. С единой метрикой такой разговор невозможен в принципе.

Golden set и rubric: эталон, которому можно верить

Golden set — размеченный набор кейсов, на котором проверяется каждая версия системы. Реалистичный размер для старта — 30–50 кейсов, зрелый набор — 150–300; больше обычно не нужно, важнее состав:

  • 60–70% — типовые запросы из реального трафика (с обезличиванием персональных данных);
  • 20–30% — пограничные случаи: неполные данные, противоречивый вход, длинные документы, смешение языков;
  • 10% — adversarial: попытки увести модель от задачи, провокации выдумки, кейсы «правильный ответ — отказ».

Каждый кейс: input, ожидание (эталонный ответ или свойства, которым ответ обязан удовлетворять) и rubric — явные критерии оценки. Rubric важнее эталона: для генеративных задач «правильных» ответов много, а критерии («все суммы совпадают с документом», «нет утверждений без опоры», «формат соблюдён») проверяемы всегда.

Ручная проверка 300 кейсов на каждый коммит нереальна, поэтому оценивает LLM-судья. Но судье нельзя верить на слово — его калибруют: 50–100 кейсов размечают люди, затем считается согласованность судьи с человеком. Ниже ~85% — переписывайте rubric и промпт судьи, пока не сойдётся. Судья фиксируется как версия: конкретная модель, промпт, temperature 0 — иначе ваши метрики поплывут от апдейта судьи, а не системы.

Golden set — живой артефакт: каждый продовый инцидент и каждое ручное исправление добавляют кейс. Set, не обновлявшийся квартал, измеряет вчерашнюю систему.

Regression gate: evals в CI

Правило простое: любое изменение промпта, модели, схемы инструмента или параметров retrieval проходит через прогон golden set до мержа — ровно так же, как код проходит через тесты. Для этого промпты и конфигурация должны жить в git, а не в head инженера или в админке без истории.

# в CI-пайплайне, на каждый PR, затрагивающий prompts/ или model config
npm run evals -- --suite golden --baseline main --report evals-report.json
# gate: quality не ниже baseline минус 2 п.п., cost не выше +20%, p95 не выше +30%

Пороги — предмет договорённости команды, но принцип один: регрессия блокирует мерж, а осознанный trade-off (потеря качества ради троекратной экономии) оформляется явным override с записью, кто и почему решил. Отчёт прогона — не одна цифра, а diff по кейсам: какие кейсы сломались, какие починились, с примерами вход/выход. Смотреть на сломанные кейсы глазами — обязательная часть ревью: два процентных пункта могут означать «чуть хуже везде» или «полный провал на юридических документах», и это очень разные ситуации.

Отдельный, самый недооценённый триггер — смена версии модели провайдером. Модель под тем же именем может измениться, а «улучшение» модели в среднем не означает улучшения на вашей задаче. Пиннинг версии там, где провайдер позволяет, плюс прогон golden set при любом переключении — дешёвая страховка от худшего типа инцидента: «ничего не деплоили, а всё сломалось».

Экономика вопроса: прогон 200 кейсов стоит единицы долларов. Один необнаруженный регресс в проде стоит на порядки дороже — деньгами, доверием и неделей отладки.

Tracing: от плохого ответа к причине за минуты

Без трассировки отладка LLM-системы выглядит так: «пользователь пожаловался на странный ответ — попробуем воспроизвести». С трассировкой: открыли trace по id из жалобы, увидели всю цепочку, нашли причину. Разница — часы против минут.

Что пишется в trace каждого запроса:

  • trace id, сквозной через все компоненты и возвращаемый клиенту (чтобы жалоба сразу содержала его);
  • span на каждый model call: версия промпта (hash), версия модели, параметры, input/output токены, latency, finish reason;
  • span на каждый tool call: аргументы, результат или ошибка, длительность;
  • для RAG — какие чанки нашлись, их score и что вошло в контекст;
  • итог: суммарный cost, число итераций, финальный статус.

Технически это обычный OpenTelemetry с атрибутами под LLM-специфику — не изобретайте свой формат, возьмите готовые конвенции (Langfuse, OpenLLMetry) и получите визуализацию бесплатно.

Два обязательных правила. Первое — PII redaction: в traces попадает контент промптов и ответов, значит туда попадают персональные данные; маскирование до записи, а не при чтении, и понятная политика retention. Второе — sampling с умом: 100% трассировка ошибок и провалов evals, 1–10% успешных запросов; при инциденте sampling поднимается до 100% одним переключателем.

И замыкание петли, ради которого всё затевалось: каждый провал eval-прогона ссылается на trace своего прогона, каждый продовый инцидент — на traces реальных запросов. Плохой кейс из прода за один шаг превращается в новый кейс golden set — это и есть работающий цикл улучшения качества.

Practice

Eval harness с дашбордом

Соберите harness на 30+ кейсах для любого пайплайна из прошлых уроков: rubric, LLM-судья с temperature 0, калибровка судьи на 20 кейсах против вашей ручной разметки. Прогоните три версии промпта, постройте scoreboard по осям quality/cost/latency с diff по кейсам и ссылкой на trace каждого провала.

Deliverable

Scoreboard с историей трёх версий, процент согласованности судьи с ручной разметкой, diff сломанных/починенных кейсов и переход из провала в trace.

Checkpoint

Чем отличаются quality, faithfulness и observability и почему их нельзя сводить в одну метрику?

  • ✓ Студент различает оси качества и объясняет, как композитная метрика прячет деградацию.
  • ✓ Есть пример regression gate с порогами и явным override для осознанных trade-off-ов.
  • ✓ Каждый провал eval и каждая жалоба из прода привязаны к trace id.

Check yourself

Почему единая метрика «успеха» опасна для AI-фичи?

01Почему единая метрика «успеха» опасна для AI-фичи?

Что необходимо, чтобы результатам LLM-судьи можно было доверять?

02Что необходимо, чтобы результатам LLM-судьи можно было доверять?

Провайдер обновил модель под тем же именем, вы ничего не деплоили. Нужно ли прогонять golden set?

03Провайдер обновил модель под тем же именем, вы ничего не деплоили. Нужно ли прогонять golden set?

Зачем возвращать trace id клиенту вместе с ответом?

04Зачем возвращать trace id клиенту вместе с ответом?

Eval-прогон показал минус 2 п.п. качества у нового промпта. Правильная реакция?

05Eval-прогон показал минус 2 п.п. качества у нового промпта. Правильная реакция?

Sources

Evals and observability: never ship “seems to work” to production · The Practical AI Product Engineering Playbook · VORCL