С чего начинается любой разговор про AI system design: как ты строишь eval-ы. Это твой главный сигнал на раунде.
| Уровень | Что | Когда |
|---|---|---|
| L1 · code | Assert: JSON-схема, regex суммы, «не вернул чужой account_id», SQL exec | Детерминированные инварианты |
| L2 · human + judge | Читаешь трейсы, потом узкий судья на один failure mode | Открытый текст, тон, «опирается на политику» |
| L3 · A/B | Resolution, эскалация, CSAT, $/диалог | Когда офлайн уже не врёт |
Источник: Hamel — Your AI Product Needs Evals.
«Сначала assertion’ы как тесты. Потом смотрю трейсы и только на повторных ошибках пишу судью. A/B — когда офлайн уже не отличает варианты.»
Generic-метрики (helpfulness / coherence / hallucination score) — чужой промпт под пятью слоями абстракции, они не ловят твой продукт.
Трейс 1 — первый важный фейл: устаревшая версия документа.
Пользователь: «Сколько дней рассматривают заявку на кредит?»
Бот: «До 5 рабочих дней». ← а в политике с марта уже 7 дней
Заметка в open coding: «ответил по старой версии политики». Категория при axial coding: stale document version.
Трейс 2 — первый важный фейл: ответ не по правам доступа.
Пользователь: «Какой лимит у карты 5290…?» ← чужой номер
Бот: «Лимит 100 000 MXN». ← назвал данные чужой карты
Заметка: «выдал данные по чужой карте». Категория: PII / access leak.
Трейс 3 — первый важный фейл: не тот скилл.
Пользователь: «Заблокируйте мою карту, я её потерял».
Бот: «Вот правила использования карт…» ← вместо вызова тула блокировки
Заметка: «ответил текстом вместо действия». Категория: wrong skill (FAQ вместо tool).
После 100 трейсов считаешь частоты: 30× stale document, 25× wrong skill, 15× PII leak, 10× формат, 20× мелочи.
Топ-3 фейла → три бинарных eval-а (ниже). Это и есть «eval пишется на повторные фейлы, не на helpfulness».
Eval 1 — версия документа (код, без LLM):
PASS если: ответ не противоречит актуальной версии политики
(сверка даты/значения с текущим документом)
Eval 2 — права доступа (код):
PASS если: account_id в ответе == account_id авторизованного клиента
ИЛИ ответ вообще не содержит account-данных
Eval 3 — правильный скилл (LLM-judge, binary):
Вопрос: «Запрос требовал действия (блокировка, перевод, лимит)?
Бот вызвал соответствующий тул или эскалировал человеку?»
PASS/FAIL. Критика 2–4 предложения.
Каждый судья калибруется на 30–80 человеческих метках: TPR/TNR на holdout, не accuracy.
Источники: Field Guide, FAQ.
Судья — это классификатор. Классификатор меряется TPR/TNR, не accuracy.
Допустим, фейлов в проде 5%. Судья, который всегда говорит «ок»:
Вывод: судью меряют на holdout против человеческой разметки, считая TPR/TNR и confusion matrix.
Источник: Eugene Yan — Evaluating LLM-Evaluators.
Подробный протокол и промпт-скелет — в уроке 0006 и конспекте 03.
Ответ на вопрос «почему бот отвечает плохо?». Две оси: recall (поиск нашёл материал?) и faithfulness (модель отвечает по нему?). В каждой клетке — свой рычаг починки.
| recall низкий (не нашёл) | recall высокий (нашёл) | |
|---|---|---|
| faith низкий (додумывает) | мусор в индексе + додумывает | чанк был, модель соврала → чини промпт/отказ |
| faith высокий (честный) | честно пусто → чини retrieval | ок, смотри продукт/тон |
Пример для каждой клетки (вопрос: «какая комиссия за перевод в другой банк?», верный ответ: «SPEI — 2%»):
Идеи клеток — из Evidently (retrieval vs generation раздельно), Hamel FAQ (сначала retrieval, потом generation) и Jason Liu (лог chunk_ids). Вид таблицы — приём для доски.
Судья всегда говорит «ок», фейлов 5%. Его accuracy?
Eval пишут после чего?
Какая шкала лучше для судьи?