Перейти к содержимому

Модуль XII — качество, оценки и тестирование

Модуль XII отвечает на один вопрос — по-прежнему ли мой агент делает то, что нужно?оценивая кандидатные выходы по версионированным эталонным наборам и выдавая результат как канонические межмодульные свидетельства. Это модуль слоя Intelligence: он измеряет, он не запускает субъекта и не воздействует на инфраструктуру. Эта страница — справочник по тому, что модуль оценок делает сегодня, и по его честным ограничениям.

Что он измеряет (и что никогда не запускает)

Заголовок раздела «Что он измеряет (и что никогда не запускает)»

XII — слой измерения, а не слой исполнения. Кандидатный выход поступает к нему уже произведённым — из тестовой песочницы (модуль XVII), из CI, встроенным в запрос или как выборочный сигнал реальной сессии — и XII оценивает его по случаям набора. Единственная модель, которую XII когда-либо вызывает, — это судья (для оценщика llm_judge); он никогда сам не запускает агента-субъекта или модель. Производство выходов — задача песочницы, а не XII.

Набор оценщиков подключаемый. Детерминированные, чистые встроенные оценщики покрывают распространённые контракты — exact, contains, not_contains, regex, json_valid, json_equal и numeric_range. Рядом с ними стоит оценщик llm_judge, который вызывает модель через порт Judge для оценки по рубрике.

Набор (suite) — это версионированный эталонный датасет: он содержит свои случаи, оценщик по умолчанию, порог прохождения и порог регрессии. Случаи только добавляются и неизменяемы в пределах версии — исправление случая создаёт новый suite_version, а не правку на месте, так что датасет, породивший любой прошлый вердикт, всегда можно восстановить.

Прогон (run) оценивает каждый случай набора, агрегирует score и pass_rate и сохраняет три вещи: только-добавляемые свидетельства по каждому случаю, изменяемый агрегат прогона и один основной EvalResult — канонический артефакт (Suite, SubjectKind, SubjectID, Score, Passed, OccurredAt, Metrics), который compliance (XIII) и UI читают не зная собственных таблиц XII. Прогоны выполняются синхронно; SSE-поток по прогону воспроизводит сохранённый прогон (кадры по случаям, затем сводка), он не воздействует. Регрессия относительно базовой линии устанавливает regressed и пишет основной Finding (Kind = eval_regression), по возможности эмитируемый в шину как finding.reported, чтобы модули доставки (здоровье/уведомления) его маршрутизировали. На стороне чтения scorecards агрегируют долю прохождения, средний балл и тренд по субъекту и экспортируются в CSV/JSON.

Кандидатный выход никогда не сохраняется — из любого источника. Результат по случаю хранит лишь односторонний хеш деталей и усечённую, очищенную метку для UI; маскирование выполняется обработчиком до сохранения, никогда не предполагается со стороны хранилища. Монитор оценивает поведенческие сигналы реальной сессии — её состояние, число находок, максимальную серьёзность и показатели токенов/стоимости (взятые из основных сигналов Session, Finding и CostRecord) — и никогда сырой текст выхода, который платформа вообще не сохраняет. Эталонные фикстуры — единственное ограниченное исключение: санкционированный оператором, добровольный, непроизводственный контент, усечённый обработчиком до записи, чтобы набор действительно можно было прогнать.

Калибровка судьи, смягчение смещения и регрессионный гейт CI

Заголовок раздела «Калибровка судьи, смягчение смещения и регрессионный гейт CI»

Вердиктам судьи доверяют только после измерения. Размеченный человеком калибровочный набор (построенный в управляемой сессии olivares evals label) питает калибровочный прогон, который измеряет судью относительно человеческого эталона: процент согласия с его 95%-м интервалом Уилсона, каппа Коэна (одного согласия недостаточно при дисбалансе классов), чувствительность/специфичность с их знаменателями и корреляцию смещения по многословию. Отчёт — только-добавляемое свидетельство; цель — согласие ≥ 0,85 и определённая каппа ≥ 0,6 — может быть повышена по прогону, но никогда не понижена. Набор, человеческие метки которого все «pass», не может измерить скорректированное на случайность согласие и ничего не сертифицирует.

Смягчение смещения встроено и измеряется: промпт судьи заставляет рассуждать до вердикта (анализ отбрасывается на лету — минимум данных) и предписывает не вознаграждать длину; добровольный попарный режим A/B-сравнения судит каждый общий случай дважды с переставленным порядком предъявления, объявляет победителя только когда оба порядка согласны и сообщает измеренную долю position_consistency.

Регрессионный гейт (POST /gate, CLI evals gate) превращает всё это в блокирующий вердикт CI: регрессия относительно базовой линии, доля прохождения ниже порога набора или некалиброванный судья проваливают гейт (выход 1); отсутствующая учётная запись судьи деградирует до объявленного предупреждения, никогда не молчаливого прохождения. Стоимость судьи в CI контролируется детерминированной выборкой случаев по сидам, кешем вердиктов с ключом по содержимому + пину модели судьи + версии промпта и предполётной проверкой бюджета FinOps, которая отказывается тратить сверх лимита. Единственный выход из проваленного гейта — управляемое переопределение (admin-уровень, письменная причина, аудируемое), которое меняет эффективный вердикт, перепроверяемый CI, но не записанный. Каждая сообщённая доля поставляется со своим знаменателем и 95%-м интервалом; полную методологию и источники см. в docs/EVAL-METHODOLOGY.md в репозитории.