3,583 papers
arXiv:2610.07544 72 6 окт. 2026 г. FREE

Контрфактуальный аудит LLM-судьи: проверка, не влияют ли бренд, язык и пол на оценку релевантности

КЛЮЧЕВАЯ СУТЬ
Обнаружено: LLM-судья (модель, которая ставит метки good, fair или bad) меняет оценку из-за слов, которые на смысл не влияют. Это имя бренда, язык запроса и слово «мужчины» или «женщины». Метод контрфактуального аудита позволяет проверить вашего судью до того, как вы построите на нём отбор, ранжирование или отчёты. Берёшь одну пару «запрос — объявление» и меняешь ровно один признак, остальное не трогаешь. Прогоняешь каждую версию по 10 раз. Сдвиг больше шума — это смещение судьи.
Адаптировать под запрос
⚡

TL;DR

LLM-судья (модель, которая ставит оценки good / fair / bad) меняет оценку, когда меняется то, что на смысл не влияет. Это название рекламодателя, язык запроса и демографическое слово в запросе. Метод проверки простой, контрфактуальный аудит: берёшь одну и ту же пару «запрос — объявление», меняешь один признак, оставляешь всё остальное и смотришь, сдвинулась ли оценка. Если сдвинулась, судья реагирует на лишнее.

Боль в том, что вы видите судью как «объективного» и строите на нём отбор, ранжирование или отчёты. На деле одно и то же объявление с именем крупного бренда получает чуть лучшие метки, чем с именем малоизвестной фирмы. Тот же текст на английском оценивается иначе, чем на финском или китайском. В запросе «вакансии для мужчин» и «вакансии для женщин» инженерная вакансия получает разные метки. Причина: модель училась на текстах, где бренды, языки и профессии связаны стереотипами. Эти связи просачиваются в оценку, даже когда по смыслу пара не изменилась.

Метод состоит из трёх частей: подмена одного признака, повторные прогоны (у GPT-4o ответ плавает от раза к разу) и контрольное сравнение «англ. против англ.», чтобы отделить реальный сдвиг от шума. Из защиты проверили маскирование названий компаний перед оценкой. Оно безопасно, если запрос не про конкретную компанию, и вредит, если про неё.

🔬

Схема метода

ШАГ 1: Выбрать признак, который НЕ должен менять оценку
       (бренд / язык / демографическое слово) → список признаков

ШАГ 2: Собрать пары-двойники: тот же запрос и текст,
       меняется ТОЛЬКО этот признак → таблица «оригинал / вариант»
       (+ контрольный перефраз того же смысла)

ШАГ 3: Прогнать судью на всех версиях, 10 раз каждую
       (несколько запросов) → доли bad и fair по версиям

ШАГ 4: Сравнить версии между собой и с контролем
       «оригинал против оригинала» → сдвиг сверх шума = смещение

ШАГ 5 (защита): если запрос не про компанию — замаскировать
       названия в тексте перед оценкой → перепроверить шаги 3–4

Шаги 1–4 можно проводить вручную в чате на небольшой выборке. На большой выборке понадобится простая автоматизация, и LLM поможет её собрать.

🚀

Пример применения

Задача: Вы руководитель маркетплейс-команды. Вы настроили LLM-судью, который оценивает, подходит ли карточка товара запросу «чёрная шляпа». По его меткам вы решаете, какие карточки продвигать. Хочется убедиться, что судья не любит громкие названия продавцов (например, «Ламода» против «ИП Сидоров»).

Промпт:

Ты — оценщик релевантности. Тебе дан поисковый запрос и объявление.
Оцени, насколько объявление подходит запросу по смыслу.
Ответ — одно слово: good, fair или bad. Без пояснений.

Запрос: чёрная шляпа
Объявление: Чёрная шляпа — Ламода, официальный сайт — Скидки на чёрные шляпы

Затем в новых чатах повторите тот же промпт, меняя только название продавца: «Ламода» → «Wildberries» → «ИП Сидоров» → «Шляпный магазин Север». Каждую версию прогоните 10 раз. Добавьте контроль: оригинальную версию тоже прогоните дважды по 10 раз.

Результат: Вы получите таблицу: для каждого названия — сколько раз пришло good, fair и bad. Если громкое название стабильно получает больше good, чем неизвестное, при том что отличается только оно, судья смещён. Разброс между двумя прогонами одного оригинала покажет «шум» модели: сдвиг меньше шума можно игнорировать. Для запросов вроде «Ламода шляпа», где пользователь сам ищет бренд, названия не маскируйте. Там название входит в смысл запроса.

🧠

Почему это работает

Слабость. LLM-судья не измеряет «смысл» в чистом виде. Он генерирует метку по паттернам из обучающих текстов. Громкие бренды, определённые языки и стереотипные пары вроде «инженер — мужчина» оставили в этих паттернах след. К тому же GPT-4o отвечает нестабильно: одна и та же пара при повторе может получить другую метку. Поэтому одного прогона мало: вы не отличите смещение от случайности.

Сильная сторона. Модель реагирует на каждое слово входа предсказуемо, и это позволяет ставить чистые эксперименты. Меняете одно слово, остальное держите неизменным, и любая разница в ответе объясняется этим словом. Модель не нужно «спрашивать» о её смещениях. Достаточно наблюдать за её метками.

Как метод это использует. Парные версии с одним изменённым признаком изолируют причину. Повторные прогоны усредняют шум. Контроль «оригинал против оригинала» даёт порог, ниже которого сдвиг неразличим. Маскирование названий убирает сам источник смещения из входа, но только там, где название не часть смысла запроса.

Рычаги управления: - Число прогонов (в статье 10): для оценки на глаз хватит 3–5, для выводов «лучше/хуже» нужно больше. - Признак подмены: бренд, язык, пол, возраст, регион, любое «лишнее» для вашей задачи слово. - Контрольный перефраз (например, «для женщин» против «для девушек» против «для мужчин»): показывает, меняет оценку сама формулировка или группа. - Маскирование: включайте, только если запрос не называет компанию.

📋

Шаблон промпта

Ты — оценщик релевантности. Тебе даны запрос и объявление.
Оцени, насколько объявление подходит запросу ПО СМЫСЛУ.
Ответ — одно слово: good, fair или bad. Без пояснений.

Запрос: {запрос}
Объявление: {текст_объявления_с_признаком_X}

Протокол аудита (делайте вручную или через автоматизацию):

1. Версия 0 (оригинал): {признак_оригинал}
2. Версия 1: {признак_вариант_1}   ← всё остальное идентично
3. Версия 2: {признак_вариант_2}
4. Контроль: версия 0, прогнанная второй раз отдельно
5. Каждую версию — {число_прогонов} раз, каждый раз в новом чате
6. Посчитать: доля bad и доля (bad + fair) по каждой версии
7. Сдвиг больше, чем между двумя прогонами оригинала = смещение

Подставляйте: {запрос} и {текст_объявления} из ваших реальных данных, {признак} — то, что не должно влиять (название продавца, язык, слово про пол), {число_прогонов} — от 5 до 10.

🚀 Быстрый старт — вставь в чат:

Вот шаблон контрфактуального аудита LLM-судьи. Адаптируй под мою задачу: [что именно оценивает мой судья и что в нём не должно влиять на оценку]. 
Задавай вопросы, чтобы заполнить поля.

[вставить шаблон выше]

LLM спросит, что оценивает ваш судья и какой признак не должен менять оценку. Это нужно, чтобы подмена затрагивала только один признак, а смысл пары оставался прежним. Она возьмёт паттерн из шаблона и соберёт набор пар-двойников под вашу задачу.

⚠️

Ограничения

⚠️ Значения в статье сдвинуты: авторы прибавили к цифрам неназванные константы ради конфиденциальности. Порядок и разницы сохранены, но абсолютным значениям доверять нельзя.

⚠️ Маскирование вредит, когда запрос про компанию: для запроса вроде «Озон шляпа» название и есть смысл. Если его убрать, качество судьи падает (показано на модели Qwen).

⚠️ Проверка маскирования на GPT-4o слабая: её провели один раз. Вывод «потерь в точности не видно» стоит перепроверить на ваших данных.

⚠️ Нет рейтинга «известный бренд всегда выигрывает»: крупные бренды обычно получают лучшие метки, но не везде. Один из менее крупных ритейлеров оценивался лучше крупного по одному показателю.

⚠️ Эффект бренда небольшой: разница измеряется единицами процентных пунктов. Для маленькой выборки её не поймать, нужны сотни пар и повторы.

⚠️ Демографические тесты синтетические: запросы составлены искусственно по шаблонам. Показаны отобранные случаи с большой разницей, а не средняя картина.

⚠️ Нет готовых защитных промптов: авторы не проверяли инструкции вида «игнорируй бренд». Проверили только удаление названий и перебалансировку обучающих данных. Последнее требует дообучения и вам недоступно.

🔍

Как исследовали

Команда Microsoft взяла две модели-судьи: GPT-4o (метки good / fair / bad) и Qwen-7B, дообученную на 700 тысячах примеров (выдаёт вероятность релевантности). Идея была простой: если смысл пары не изменился, оценка тоже не должна. Из реальных рекламных логов взяли 2000 пар «запрос — товарное объявление» и 878 пар «запрос — вакансия» и подменили в объявлениях название рекламодателя на разные крупные бренды. Чтобы отделить смещение от случайных колебаний GPT-4o, каждую версию прогнали по десять раз.

Результат: объявления от крупных рекламодателей получали чуть более благоприятные метки. Например, у Job Platform A доля bad была 14,4% против 15,3% у Job Platform B. Строгой зависимости от известности при этом нет. Тот же текст на английском, китайском и финском тоже оценивался по-разному: GPT-4o совпадал с собой на повторе английского в 94,6% случаев, а между английским и китайским только в 83,7%. Неожиданно, что самый стабильный язык не равен языку с самыми добрыми метками: для китайского метки были благоприятнее, чем для финского, хотя стабильность там ниже. Для демографии составили синтетические запросы в сферах работы, жилья и кредита, и там проявились стереотипы про пол и профессию. Инженерные вакансии получали лучшие метки для запросов про мужчин.

Защиту проверили так. Удаление названий компаний почти не влияло на Qwen, если запрос компанию не называл, и ухудшало результат, если называл. Из этого следует практический вывод: решение «маскировать или нет» зависит от намерения запроса. Для Qwen сработала и перебалансировка обучающих меток, но это требует дообучения и для читателя недоступно.

💡

Адаптации и экстраполяции

🔧 Техника: добавить контрольный перефраз → отделить смещение от формулировки

Вместо одной пары «для мужчин / для женщин» добавьте третью: «для женщин / для девушек». Если «мужчины» против «женщины» даёт сдвиг, а «женщины» против «девушки» нет, значит, дело в группе, а не в словах. Так в статье отделяли реальную чувствительность к демографии от чувствительности к формулировке.

Экстраполяция на вашу работу: тот же аудит подходит для любого судьи в вашем процессе.

Я использую LLM для оценки {что_оценивается: резюме / отзывов / обращений клиентов}.
Признак, который НЕ должен влиять на оценку: {признак: имя кандидата / название компании / язык}.
Составь 20 пар-двойников: одинаковый текст, отличается только {признак}.
Для каждой пары выдай версию А и версию Б. Больше ничего не меняй.

Прогоните версии через вашего судью по 5–10 раз каждую и сравните доли оценок по версиям. Эта экстраполяция — моя, в статье такой проверки для резюме или отзывов нет.

🔗

Ресурсы

  • Работа: A Systematic Investigation of Bias in Large Language Models for Advertising Relevance
  • Авторы: Weiwei Wang, Yinchuan Xu, Jialu Gao, Youkow Homma, Jian Jiao (Microsoft)
  • Связанные работы из статьи: Lichtenberg et al., 2024 и Chu & Hou, 2026 (смещения в рекомендациях); Fu & Liu, 2025 (разброс LLM-оценок между языками); Dong et al., 2024 (инструкции о справедливости в промптах)

📋 Дайджест исследования

Ключевая суть

Обнаружено: LLM-судья (модель, которая ставит метки good, fair или bad) меняет оценку из-за слов, которые на смысл не влияют. Это имя бренда, язык запроса и слово «мужчины» или «женщины». Метод контрфактуального аудита позволяет проверить вашего судью до того, как вы построите на нём отбор, ранжирование или отчёты. Берёшь одну пару «запрос — объявление» и меняешь ровно один признак, остальное не трогаешь. Прогоняешь каждую версию по 10 раз. Сдвиг больше шума — это смещение судьи.

Принцип работы

Алгоритм простой. 1. Выбери признак, который не должен влиять на оценку: название продавца, язык, слово про пол. 2. Сделай пары-двойники. Запрос и текст одинаковые, меняется только этот признак. 3. Прогони каждую версию 10 раз, каждый раз в новом чате. 4. Сравни доли bad и fair между версиями. 5. Добавь контроль: оригинал прогони ещё раз отдельно. Контроль «оригинал против оригинала» показывает, как сильно модель плывёт сама по себе. Всё, что меньше этого разброса, можно выкинуть. Это как взвесить одну и ту же гирю дважды. Если весы показали разное, то и сравнивать с другой гирей пока рано. Есть и защита: замаскировать названия компаний перед оценкой. Но только если запрос не про конкретную компанию.

Почему работает

LLM-судья не измеряет смысл в чистом виде. Он выдаёт метку по следам из обучающих текстов. А там бренды, языки и профессии связаны стереотипами. Громкое название получает чуть лучшие метки, чем малоизвестное. Один и тот же текст на английском и на финском оценивается по-разному. Инженерная вакансия по запросу «для мужчин» и «для женщин» тоже получает разные метки. К тому же GPT-4o отвечает нестабильно. Одна пара при повторе может получить другую метку. Поэтому одного прогона мало: смещение не отличить от случайности. Меняешь одно слово, остальное держишь неизменным — и любая разница в ответе принадлежит этому слову. Модель не надо спрашивать про её предвзятость. Достаточно смотреть на метки. Честная оговорка: эффект бренда небольшой, единицы процентных пунктов. Авторы ещё и сдвинули абсолютные цифры ради конфиденциальности. Верить можно порядку и разницам, но не самим значениям. На маленькой выборке такое не поймать, нужны сотни пар и повторы.

Когда применять

Оценка качества и поиск → конкретно для проверки LLM-судьи, на метках которого вы продвигаете карточки, объявления или ответы, особенно когда решения принимаются автоматически и никто не смотрит глазами. Подходит для признаков: название бренда, язык, пол, возраст, регион и любое слово, которое по смыслу лишнее. Маскирование названий не подходит для запросов про саму компанию, вроде «Озон шляпа». Там название и есть смысл, и качество судьи падает. Готовых защитных промптов вида «игнорируй бренд» авторы не проверяли. Демографические тесты у них синтетические, по шаблонам, и показаны отобранные случаи с большой разницей.

Мини-рецепт

1. Назови лишнее: выпиши, что в вашей задаче не должно влиять на оценку. Например, название продавца.
2. Склепай двойников: тот же запрос, тот же текст, меняется только признак. Бери 3-5 вариантов.
3. Зафиксируй формат: судья отвечает одним словом, good, fair или bad, без пояснений.
4. Гоняй пачками: каждую версию 10 раз, каждый раз в новом чате. Для оценки на глаз хватит 3-5.
5. Заведи контроль: оригинал прогони дважды отдельно. Это ваш уровень шума.
6. Посчитай: доля bad и доля bad + fair по каждой версии.
7. Сравни: сдвиг больше разброса между двумя прогонами оригинала — судья смещён.
8. Решай про маскирование: запрос не про компанию — замаскируй названия и повтори шаги 4-7. Запрос про компанию — не трогай.

Ленивый старт, вставь в чат: Вот шаблон аудита LLM-судьи. Адаптируй под мою задачу: [что оценивает мой судья и что не должно влиять на оценку]. Задавай вопросы, чтобы заполнить поля.

Примеры

[ПЛОХО]: `Оцени, подходит ли объявление запросу «чёрная шляпа»: Чёрная шляпа — Ламода, официальный сайт` — один прогон, один продавец, вывод «судья нормальный». [ХОРОШО]: `Ты — оценщик релевантности. Оцени, насколько объявление подходит запросу по смыслу. Ответ — одно слово: good, fair или bad. Без пояснений. Запрос: чёрная шляпа. Объявление: Чёрная шляпа — {продавец}, официальный сайт — Скидки на чёрные шляпы` — и дальше подставляешь «Ламода», «Wildberries», «ИП Сидоров», «Шляпный магазин Север». Каждый вариант прогоняешь 10 раз в новых чатах. Оригинал гоняешь дважды как контроль. Если у громкого названия good стабильно больше, чем у «ИП Сидоров», и разница выше шума, судья любит громкие имена. [ПЛОХО]: `Сравни вакансии для мужчин и для женщин` — вопрос судье в лоб. Он ответит гладко и ничего не покажет. [ХОРОШО]: `Запрос: вакансии для мужчин. Объявление: Инженер-конструктор, полный день` и тот же запрос со словами «для женщин» и «для девушек». Последнее слово — контрольный перефраз. Он покажет, сдвигает оценку сама формулировка или группа.
Источник: A Systematic Investigation of Bias in Large Language Models for Advertising Relevance
ArXiv ID: 2610.07544 | Сгенерировано: 2026-10-07 05:10

Проблемы LLM

ПроблемаСутьКак обойти
Модель-судья меняет оценку из-за деталей, которые не влияют на смыслПросишь модель оценить пару «запрос — текст» по смыслу. Меняешь слово, которое ничего не меняет по смыслу: название бренда, язык, слово про пол. Оценка сдвигается. Причина: модель училась на текстах со стереотипными связями «бренд — качество» и «профессия — пол». Эти связи просачиваются в метку. Ещё хуже: одна и та же пара при повторе может получить другую метку. Если строишь на судье отбор или ранжирование, ошибка копится незаметноНе считай судью объективным, пока не проверил. Проверь его парной подменой: меняй один лишний признак, остальное держи неизменным. Прогоняй каждую версию много раз. Сравнивай сдвиг с шумом самой модели. Подробности — в методе ниже

Методы

МетодСуть
Парная подмена с контролем шума — проверка судьи на лишние признакиЧто делать: 1) Выбери признак, который не должен влиять на оценку: бренд, язык, пол, возраст, регион. 2) Возьми одну пару «запрос — текст». Сделай несколько версий. В каждой меняется только этот признак. 3) Прогони каждую версию 5–10 раз. Каждый раз в новом чате, с одним и тем же запросом. 4) Добавь контроль: оригинал прогони ещё раз отдельно. 5) Посчитай доли плохих и средних меток по версиям. 6) Сдвиг больше, чем между двумя прогонами оригинала, значит смещение. Почему работает: меняется одно слово, поэтому любая разница объясняется им. Повторы усредняют случайность. Контроль «оригинал против оригинала» показывает порог шума. Всё, что ниже порога, можно игнорировать. Формат ответа судьи: одно слово, без пояснений. Так метки легко считать. Защита: если запрос не называет компанию, замаскируй названия в тексте перед оценкой. Так источник смещения уходит из входа. Когда да: любой судья или классификатор на модели, много пар, нужны сравнения групп. Когда нет: если запрос сам про бренд («Озон шляпа»). Название там часть смысла, и маскирование ухудшит оценку. Осторожно: эффект обычно небольшой, единицы процентных пунктов. Для уверенного вывода нужны сотни пар и повторы. Инструкция «игнорируй бренд» не проверена, на неё не полагайся
📖 Простыми словами

A Systematic Investigation of Bias inLargeLanguageModelsfor Advertising Relevance

arXiv: 2610.07544

Твой модный LLM-судья, которому ты поручил оценивать релевантность, ни хрена не объективен. Он не анализирует чистый смысл, а просто цепляется за паттерны из терабайтов интернет-мусора, на котором учился. Если в тексте мелькает громкий бренд, стереотипное слово или другой язык, нейронка моментально плывёт и меняет оценку. По факту это не беспристрастная модерация, а оцифрованная вкусовщина.

Это как фейсконтрольщик в клубе, который пускает парня просто за лейбл на футболке, хотя тот еле стоит на ногах. Формально правила одни для всех, но ноунейм в простом худи идёт лесом. Модель ведёт себя точно так же: абсолютно одинаковое объявление от условной «Ламоды» покажется ей идеальным, а от «ИП Сидоров» внезапно станет вторым сортом.

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

Проверяли это на рекламе, но грабли общие для всей индустрии. Тот же перекос гарантированно вылезет в HR-скрининге резюме, модерации отзывов или автоматической сортировке тикетов поддержки. Везде, где ты доверяешь AI решать судьбу контента, ты рискуешь задушить нормальных авторов и подсунуть клиенту хлам. Слепая вера в промпты — это слив бюджета.

Короче: хватит молиться на LLM как на истину в последней инстанции. Любого AI-судью нужно аудировать стресс-тестами, иначе ты масштабируешь случайные глюки и наивно зовёшь это дата-дривен подходом. Либо ты регулярно проверяешь модель на вшивость, либо алгоритм тихо режет твою конверсию в пользу тех, у кого просто название помоднее.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с