Все исследования

/ru/research · что мы измерили

Гарантия 90% выполнена, а каждый седьмой продвинутый кандидат не сеньор: конформная эскалация на сдвиге навыка

Проверили конформное предсказание как правило «когда звать человека» в скрининге сеньоров. Покрытие на незнакомых навыках 0,913, к человеку уходит 4% интервью, но среди автоматически продвинутых 14,9% ошибок. Простой порог 0,9 по вероятности модели ни в одном из пяти сдвигов покрытие не нарушил: предрегистрированная гипотеза опровергнута.

Авторы: slavb18
  • AI
  • LLM
  • ML
  • Research
  • Conformal Prediction
  • HRTech

Конформное предсказание обещает: 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.
  • Сдвиги не независимы: тест S1 есть объединение тестов S2 и S3.
  • Модель не переобучалась под каждый сдвиг. Сдвиг только относительно калибровки, генераторы из S4 и S5 модель в обучении видела.
  • Данные синтетические, интервалы покрытия ±4–6 п.п. при n = 75–170. На навыках с n ≈ 20 (Kafka, React) покрытие 0,80–0,82, это в пределах шума.

Конформная гарантия на этих данных выполнилась честно. Ошибка была в том, что я ждал от неё защиты продвижения, а она обещала только покрытие.

Все исследования