/ru/research · что мы измерили
Проверили конформное предсказание как правило «когда звать человека» в скрининге сеньоров. Покрытие на незнакомых навыках 0,913, к человеку уходит 4% интервью, но среди автоматически продвинутых 14,9% ошибок. Простой порог 0,9 по вероятности модели ни в одном из пяти сдвигов покрытие не нарушил: предрегистрированная гипотеза опровергнута.
Конформное предсказание обещает: 90% ответов модели будут верными, даже если модель плохо откалибрована. В скрининге кандидатов это выглядит как готовое правило, когда звать человека. Мы проверили его на интервью по навыкам, которых модель в обучении не видела. Обещание выполнилось: покрытие 0,913. А среди кандидатов, которых система сама пропустила дальше, оказалось 15% не сеньоров: гарантия касается другой величины.
Модель читает стенограмму технического интервью и решает, сеньор кандидат или нет. Это LoRA-адаптер full на Qwen2.5-3B из прошлых экспериментов, точность около 0,89 на отложенной выборке. Вопрос в том, на каких интервью ей можно верить без человека.
Политика асимметричная, и это важно для всего дальнейшего:
Конформная часть строит для каждого интервью множество возможных меток. Нонконформность s = 1 − p̂(y | x), порог q̂ берётся квантилем ⌈(n+1)(1−α)⌉/n по калибровочной выборке, α = 0,1. Множество {1} значит продвинуть, {0} значит отказ на подтверждение, {0, 1} или пустое значит эскалацию. Гарантия: метка попадает в множество не реже чем в 90% случаев, если калибровка и новые данные одинаково распределены.
Интервью синтетические, с известной правдой (бенчмарк v3). Калибровка на 112 интервью отложенной выборки. Тест: 149 интервью по двум навыкам, которых модель не видела: ClickHouse и сети Linux. Новых вызовов модели не было, всё посчитано на сохранённых вероятностях из E13, около минуты на CPU.
Предрегистрация записана 27.10.2026 до первого запуска. Пять фиксированных сдвигов «калибровка → тест»: S1 отложенная → оба новых навыка; S2 и S3 по одному новому навыку; S4 и S5 интервью, сгенерированные моделью, которой нет в калибровке (deepseek-v4.1-flash и qwen3.8-27b).
Пороги:
| порог | что значит |
|---|---|
| P1: покрытие на S1 ≥ 0,88 | гарантия держится на незнакомых навыках (0,90 с допуском 2 п.п.) |
| P2: эскалация на S1 ≤ 50% | человеку уходит не больше половины |
| P3: простой порог нарушает покрытие на ≥ 5 п.п. в 3 из 5 сдвигов | ради этого и нужна конформная калибровка |
| опровержение: CP лучше порога по покрытию в среднем меньше чем на 2 п.п. | тогда гипотеза снята |
Простой порог взят бейзлайном из 2604.07667: модель отвечает сама, если max(p, 1−p) ≥ 0,9, иначе эскалация. Никакой калибровки, вероятность модели принимается как есть.
| порог | значение | итог |
|---|---|---|
| P1 | 0,913 [0,86; 0,95] | выполнен |
| P2 | эскалация 4,0%, автономия 45,0%, пакетный отказ 51,0% | выполнен |
| P3 | 0 из 5: покрытие порога 0,973–0,987 | не выполнен |
| опровержение | CP − порог = −6,24 п.п. | сработало |
Первые две строки выглядят как успех. На новых навыках гарантия держится, человеку уходит одно интервью из 25.
Третья строка снимает центральную гипотезу. Простой порог 0,9 не нарушил покрытие ни в одном сдвиге, наоборот, покрыл больше. Наш LoRA-адаптер держит вероятности у полюсов, поэтому порог 0,9 срабатывает редко и перестраховывается: эскалация 18–27% против 3–8% у конформного метода. Методы различаются балансом «сколько отдаём человеку / сколько ошибаемся сами».
Дальше самое неприятное. Вот что происходит с автоматической частью у конформного метода:
| сдвиг | покрытие | эскалация | ошибка среди продвинутых |
|---|---|---|---|
| S1, оба новых навыка | 0,913 | 4,0% | 14,9% (10 из 67) |
| S2, ClickHouse | 0,932 | 2,7% | 8,6% |
| S3, сети Linux | 0,893 | 5,3% | 21,9% |
| S4, новый генератор deepseek | 0,859 | 2,9% | 18,4% |
| S5, новый генератор qwen | 0,973 | 8,0% | 0,0% |
| порог 0,9 на S1, для сравнения | 0,973 | 22,2% | 7,8% (4 из 51) |
Маргинальное покрытие считает все ответы вместе. Отказы покрыть легко: модель видит слабого кандидата и уверенно говорит «нет». Эти правильные отказы и набирают 90%, пока ложные продвижения копятся в другом углу. А продвижение у нас единственное действие без человека.
Естественная попытка исправить это Mondrian по классу: отдельный квантиль для не-сеньоров, чтобы гарантировать покрытие именно y = 0. На калибровке это даёт ≥ 0,9 по построению. На новых навыках покрытие не-сеньоров 0,847 (S1), 0,808 (S3), 0,800 (S4). Гарантия по классу опирается на ту же обменность, и сдвиг навыка её ломает.
Weighted CP (Tibshirani et al., 2019) перевзвешивает калибровку под тест по отношению плотностей. Там, где было недопокрытие, он его чинит: на S4 0,859 → 0,888, на S3 0,893 → 0,960 ценой эскалации 5% → 20%. Но классификатор «калибровка или тест» разделяет их идеально, AUC 1,00 во всех сдвигах, то есть оценка отношения плотностей вырождена. Веса остаются разумными только благодаря регуляризации логистической регрессии. Работающим методом я бы это не назвал.
Безопасность автоматической части больше зависит от смещения модели, чем от конформной обёртки. TF-IDF+LR с тем же split CP на S1: покрытие 0,906, автономия 22,8%, ошибка среди продвинутых 2,9% (1 из 34). Эта модель на новых навыках недооценивает сеньоров, продвигает редко и почти без ошибок. full при той же обёртке продвигает вдвое чаще и ошибается в 14,9%.
Реализация проверена отдельно: на 200 случайных половинках объединённого пула, где обменность выполнена, покрытие split CP 0,897–0,902 у всех четырёх моделей.
Контролировать надо прямо ту величину, за которую отвечаем: P(не сеньор | продвинут). Для этого есть conformal risk control и Learn-then-Test, которые дают гарантию на произвольный риск, а не на покрытие. Следующий эксперимент (E23-сдвиг) ставит цель P(не сеньор | продвинут) ≤ 0,07 с поправкой на сдвиг; бейзлайн тот же консервативный порог 0,9, который на S1 уже даёт 7,8%.
Weighted CP имеет смысл только с оценкой плотностей по признакам, которые не выдают навык напрямую (длина, стиль), иначе AUC 1,00 сводит её к нулю.
full только на 112 интервью: предсказаний модели на train нет, а если бы были, они были бы in-sample.Конформная гарантия на этих данных выполнилась честно. Ошибка была в том, что я ждал от неё защиты продвижения, а она обещала только покрытие.