TL;DR
Если попросить LLM сыграть много разных персонажей по одному — сначала персонажа A, потом B, потом C — и спросить каждого, как он отреагирует на вопрос, модель схлопывает всех в один "самый логичный" ответ. Вместо того чтобы гонять модель через десятки ролей, можно задать один запрос: попросить сразу выдать распределение ответов по всей выборке в процентах. Это и называется Verbalized Sampling (VS, «вербализованная выборка»).
Исследователи создали 40 персонажей с разными профилями (возраст, доход, ценности) на основе реального опроса 2414 человек и попросили модель отыграть каждого по отдельности. Результат: 85% таких симуляций схлопнулись — почти все разные по профилю персонажи дали один и тот же "рациональный" ответ, хотя в реальной жизни мнения бы разделились. Хуже всего это происходит там, где у вопроса есть один логически "правильный" ответ — модель тянет туда всех, независимо от их характера.
Решение простое: не спрашивай каждого персонажа отдельно — попроси модель одним запросом сразу выдать, как распределятся ответы всей группы, с учётом их профилей. Это подняло точность распределения на 6-10 пунктов сразу в трёх разных моделях. Единственный побочный эффект — метод слегка переразбрасывает мнения (делает разброс даже больше, чем в реальности), поэтому результат стоит слегка "сжать" при интерпретации.
Схема метода
ШАГ 1: Опиши персонажей — демография, ценности, доход, поведенческие черты → список профилей
ШАГ 2: Одним запросом попроси модель выдать распределение ответов (в % или вероятностях) по всей группе, а не по одному человеку → таблица с процентами
ШАГ 3 (опционально): если разброс кажется чрезмерным — попроси модель "сжать" крайние значения к центру, сохранив порядок
Все шаги — в одном промпте, без создания отдельных диалогов для каждого персонажа.
Пример применения
Задача: Продакт-менеджер Ozon хочет понять, как разные сегменты покупателей отреагируют на введение платной подписки за быструю доставку.
Промпт:
Смоделируй распределение реакций 100 покупателей интернет-магазина
на новость: "Быстрая доставка (1 день) теперь доступна только по
платной подписке 299 руб/мес".
Состав аудитории:
- 30% — молодёжь 18-25 лет, доход до 40 тыс. руб/мес, часто заказывают недорогие товары
- 40% — семьи 26-40 лет, доход 60-100 тыс. руб/мес, заказывают регулярно
- 30% — пенсионеры и люди 50+, доход до 50 тыс. руб/мес, заказывают редко, но крупные покупки
Вопрос к аудитории: "Оформите ли вы подписку?"
Варианты: Да, оформлю / Нет, буду ждать бесплатную доставку / Перейду к конкуренту
Не проигрывай каждого человека по отдельности. Сразу дай распределение
процентов по каждому сегменту и итоговое распределение по всей выборке.
Результат: Модель выдаст таблицу с тремя сегментами и процентным распределением ответов внутри каждого, плюс итоговую цифру по всей аудитории. Разброс мнений внутри сегмента будет реалистичным (не 100% одного ответа), а не "все ответили одинаково".
Почему это работает
Когда LLM просят сыграть роль одного конкретного персонажа и дать один ответ, модель тянется к самому вероятному, "правильному" с её точки зрения варианту для этой роли. Это то же самое, из-за чего модели пишут "усреднённые" тексты — они ищут моду, а не разброс.
Но модель хорошо умеет оценивать статистику и вероятности, если явно попросить об этом. Внутри неё есть знания о том, как распределяются мнения в реальных опросах — просто доступ к этим знаниям открывается через другой тип запроса.
VS обходит слепое пятно ролевой игры: вместо того чтобы N раз просить модель "стать" кем-то (и каждый раз получать моду), мы один раз просим её описать картину целиком как распределение. Это переключает модель из режима "играть персонажа" в режим "оценить статистику" — и там она куда честнее показывает разброс.
Рычаги управления: - Подробная предыстория персонажа ("представь, что ты Иван, 45 лет, работает на заводе...") → ухудшает разброс, вгоняет модель в клише роли. Чем короче и суше профиль (просто цифры и факты) — тем лучше сохраняется реализм. - Температура (случайность генерации) → не помогает вообще. Проблема не в случайности ответа, а в том, что модель систематически стягивается к одной точке — температура на это не влияет. - Просьба "сжать" разброс после получения VS-ответа → компенсирует переразброс, если распределение выглядит слишком экстремальным (например, 0% и 100% вместо более плавных цифр).
Шаблон промпта
Смоделируй распределение мнений группы людей по вопросу: {вопрос}.
Состав группы:
{сегмент 1: доля %, ключевые характеристики}
{сегмент 2: доля %, ключевые характеристики}
{сегмент N: доля %, ключевые характеристики}
Варианты ответа: {вариант A} / {вариант B} / {вариант C}
Не отыгрывай каждого человека по отдельности одним ответом.
Вместо этого сразу дай распределение процентов ответов
внутри каждого сегмента и итоговое распределение по всей группе.
Учти, что в реальности мнения внутри сегмента всегда разделяются,
а не сходятся к одному варианту.
Плейсхолдеры: {вопрос} — что нужно узнать у аудитории, {сегмент} — описание группы людей (без лишних деталей биографии, только факты: возраст, доход, привычки), {вариант} — возможные ответы.
🚀 Быстрый старт — вставь в чат:
Вот шаблон для симуляции мнения аудитории через LLM. Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит про состав аудитории и варианты ответов — потому что без чёткой сегментации распределение будет размытым и бесполезным для решений.
Ограничения
⚠️ Не для прогноза конкретного человека: метод хорош для общей картины по группе, но провалит попытку угадать, как ответит конкретный подсегмент или отдельный человек — точность на уровне подгрупп заметно ниже, чем на уровне всей выборки.
⚠️ Не для многошаговых сценариев поведения: если нужно не мнение, а реальное действие в несколько шагов (например, "что закажет клиент, если бюджет ограничен") — калибровка почти не переносится. Модель почти всегда выберет "самый дешёвый" вариант, независимо от точного портрета персонажа.
⚠️ Переразброс: метод склонен слегка "перебарщивать" с разнообразием мнений — конечное распределение может быть чуть более полярным, чем в реальности. Стоит относиться к цифрам как к ориентиру, а не точному прогнозу.
⚠️ Риск путать статистику с памятью модели: если вопрос касается известного события (выборы, публичная статистика), модель может просто "вспомнить" реальные цифры, а не смоделировать их — это не то же самое, что реальное предсказание для нового вопроса.
Как исследовали
Исследователи взяли реальные данные опроса 2414 человек (World Values Survey, Турция) и превратили каждого респондента в цифровую карточку — демография, ответы на ценностные вопросы. Затем сравнили два подхода: заставить модель отыграть каждого человека отдельным запросом (и посчитать результат) против одного запроса с просьбой сразу выдать распределение по всей группе.
Проверку повторили на трёх разных моделях (закрытая, открытая MoE, другая открытая архитектура) — чтобы убедиться, что эффект не зависит от одной конкретной модели. Дополнительно протестировали метод "на прочность": устроили атаку на память модели (проверяли, не просто ли она вспоминает реальную статистику вместо симуляции) и сверили прогноз с реальным результатом национальных выборов.
Самое неожиданное: индивидуальный подход "по одному агенту" схлопывался в 85% случаев — даже там, где у вопроса не было явно "правильного" ответа (например, предпочтения в еде). Это говорит, что проблема не в конкретных сценариях, а в общей склонности модели искать один "правильный" ответ на роль, а не разброс мнений.
