TL;DR
LLM читает демографические сигналы из местоимений и социальных ролей в промпте — и незаметно подстраивает ответы под предполагаемый профиль пользователя. Напиши «она искала работу» вместо «пользователь искал работу» — и модель сдвинет рекомендации. Назови пользователя «студент колледжа» или «пенсионер» — получишь другой список, даже если история запросов одинакова.
Главная находка: небольшая добавка в промпт — инструкция «будь справедливым и не опирайся на демографические признаки» — снижает этот уклон до 74%. Причём не ролевой инструктаж («ты — непредвзятая система»), а конкретное указание что делать: «отрефлексируй возможные предубеждения и обеспечь равное отношение к группам». Два слова в системной роли работают хуже, чем абзац конкретных инструкций.
Метод состоит из трёх вариантов добавки к любому рекомендательному промпту: ролевая (слабее) и две инструкционные (сильнее). Выбирай в зависимости от задачи: если знаешь какой именно признак хочешь нейтрализовать — называй его явно, это работает лучше всего.
Схема метода
Все три варианта — добавки к существующему промпту. Отдельных запросов не нужно.
БАЗОВЫЙ ПРОМПТ:
[Роль] + [история/контекст пользователя] + [задача]
ВАРИАНТ 1 — Unbiased Role (UR):
Меняем роль → "Ты — непредвзятая система, которая не
дискриминирует по полу, возрасту и другим признакам"
ВАРИАНТ 2 — Bias Instruction (BI):
Добавляем абзац → "Отрефлексируй возможные предубеждения
на основе характеристик пользователя. Убедись, что
рекомендации справедливы и не предвзяты к какой-либо группе"
ВАРИАНТ 3 — Explicit Bias Instruction (EBI):
Добавляем абзац с конкретным признаком → "Убедись, что
рекомендации справедливы и не предвзяты по признаку [пол/возраст/...]"
Рекомендуемый порядок: сначала пробуй BI → если знаешь точный признак → EBI → UR только как последний вариант.
Пример применения
Задача: Ты HR-консультант, помогаешь клиентам с карьерными рекомендациями через ChatGPT. В контексте часто мелькают местоимения — «она работала», «ему 45 лет». Хочешь, чтобы рекомендации строились только на опыте, а не на предполагаемом демографическом профиле.
Промпт (вариант EBI):
Ты — карьерный консультант на платформе hh.ru.
Вот история занятости пользователя за последние 5 лет:
[история: должности, отрасли, навыки, достижения]
Пожалуйста, отрефлексируй возможные предубеждения,
которые могут возникнуть на основе явных или
предполагаемых характеристик пользователя.
Убедись, что рекомендации справедливы и не предвзяты
по признаку пола или возраста.
На основе истории предложи 5 карьерных направлений
с обоснованием. Ориентируйся только на опыт и навыки.
Результат: Модель сначала покажет краткое «рефлексирующее» рассуждение — что она замечает в контексте и что намеренно игнорирует. Затем выдаст 5 направлений с опорой на конкретные компетенции из истории, без стереотипных «женских» или «возрастных» рекомендаций. Рекомендации для пользователя с одинаковым опытом, но разными местоимениями станут значительно ближе друг к другу.
Почему это работает
Слабость LLM: модель обучена на огромных текстах, где демографические паттерны реальны — исторически женщинам реже рекомендовали технические роли, старшим — стартапы. Когда в промпте есть сигнал («она», «пенсионер»), модель бессознательно тянется к этим паттернам. Не потому что «хочет дискриминировать» — просто генерирует текст по статистически вероятному паттерну.
Сильная сторона LLM: модель хорошо следует явным инструкциям, особенно когда они конкретны. Если сказать «не делай X» — она запускает внутреннюю проверку перед генерацией. Это буквально изменяет какой текст считается вероятным следующим токеном.
Механика: добавка «отрефлексируй предубеждения» заставляет модель сгенерировать промежуточный шаг — осознание что в контексте есть демографический сигнал. Это переключает режим генерации с «выдай типичный ответ для такого профиля» на «выдай ответ, игнорируя этот профиль». Инструкция с конкретным признаком (EBI) работает лучше общей (BI) — потому что убирает двусмысленность: модель точно знает что именно игнорировать.
Рычаги управления: - Общая vs. конкретная инструкция → если знаешь какой признак «протёк» в контекст — называй его явно (EBI), это даёт лучший результат чем общее «будь справедлив» - Позиция добавки → вставляй инструкцию ДО запроса на рекомендации, чтобы она действовала как фильтр, а не постфактум - Степень детализации → можно усилить: «не делай выводов о пользователе на основе имени, местоимений, социальной роли или возраста»
Шаблон промпта
Ты — {роль}.
Вот {контекст/история пользователя}:
{данные}
Пожалуйста, отрефлексируй возможные предубеждения,
которые могут возникнуть на основе явных или
предполагаемых характеристик пользователя.
Убедись, что {тип результата} справедлив и не предвзят
по признаку {признак: пол / возраст / социальная роль / другое}.
На основе {контекст} предоставь {задача}.
Опирайся только на {объективные критерии}.
Что подставлять:
- {роль} — карьерный консультант, рекрутер, редактор, советник
- {признак} — пол, возраст, социальная роль (если знаешь что «протекло»); или убери строку с признаком и оставь «к какой-либо группе» для общего случая
- {объективные критерии} — опыт, навыки, история запросов, конкретные факты
🚀 Быстрый старт — вставь в чат:
Вот шаблон для справедливых рекомендаций без демографического уклона.
Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит: что за роль, какой контекст пользователя, какие рекомендации нужны и какие признаки потенциально «утекают» в промпт — потому что без этого невозможно выставить правильный фильтр предвзятости.
Ограничения
⚠️ Эффект перекоррекции: Инструкция «будь справедлив» может развернуться в другую сторону — модель начинает активно продвигать исторически маргинализированную группу вместо нейтралитета. Например, добавляла в новостные рекомендации женщин туда, где их не было в запросе. Это не нейтральность — это другой уклон.
⚠️ Возраст vs. пол: Возрастной уклон оказался сильнее гендерного в задачах подбора работы — модели меняли рекомендации кардинально при смене «студент/пенсионер». Одна техника снижает оба уклона, но не одинаково хорошо.
⚠️ Нестабильность по моделям: Разные LLM реагируют на одинаковые добавки по-разному. Одна хорошо справляется с гендерным уклоном, другая — с возрастным. Проверяй на своей задаче.
⚠️ Не серебряная пуля: В ряде случаев базовый промпт без инструкций давал более справедливый результат, чем с ними. Эффект зависит от домена и модели.
Как исследовали
Команда Копенгагенского университета взяла три модели (~7-9B параметров: Gemma 2, LLaMA 3.1, Mistral) и поставила им одинаковую задачу — рекомендовать вакансии и новости по истории пользователя. Ключевой трюк: запускали каждый промпт в двух версиях — нейтральной («этот пользователь») и с демографическим сигналом («она», «старшеклассник»). Разница в рекомендациях и есть уклон.
Интересная деталь дизайна: вместо простого совпадения заголовков использовали BERTScore — семантическую похожесть текстов. Это важно, потому что LLM может порекомендовать «Сбербанк» и «банк Сбербанк» — exact match промахнётся, а семантика поймает. Всего 66 тысяч инференсов: 3 модели × 4 шаблона × 10 демографических значений × 2 датасета × 300 пользователей.
Удивительный результат: возраст оказался гораздо мощнее «взламывает» рекомендации, чем пол — видимо, потому что модели уже прошли через большое количество дебиасинга по гендеру, а с возрастом работы меньше. И ещё: ролевая инструкция («ты — непредвзятая система») работала хуже, чем конкретное указание что делать — хотя в других исследованиях (classification tasks) результат был обратным.
Адаптации и экстраполяции
🔧 Применение за пределами рекомендаций
Принцип работает везде, где в контексте «утекает» демографический или социальный сигнал — и ты хочешь нейтральный анализ:
Оценка резюме: добавь «Оценивай кандидата только по профессиональным критериям. Убедись, что оценка не предвзята по признаку пола, возраста или социальной роли» — и имя/фото/«декрет в 2020» перестанут влиять на вывод.
Анализ текста клиента: если анализируешь отзывы или письма реальных людей — добавь инструкцию «не дели авторов на группы по демографическим признакам».
🔧 Усиленная версия — называй сигнал явно
Если знаешь, что в тексте есть конкретный демографический маркер, скажи об этом прямо:
В следующем тексте могут встречаться местоимения и социальные роли
(студент, пенсионер, мама). Игнорируй эти маркеры при анализе.
Оценивай только {критерии}.
Явное называние сигнала даёт лучший результат, чем общее «будь справедлив».
Ресурсы
"Can Fairness Be Prompted? Prompt-Based Debiasing Strategies in High-Stakes Recommendations"
Авторы: Mihaela Rotar, Theresia Veronika Rampisela, Maria Maistro — University of Copenhagen, Denmark (2024)
Датасеты: Microsoft News Dataset (MIND), CareerBuilder job dataset
Метрики: BERTScore, Jaccard, SERP, PRAG, SNSR, SNSV, RaB
