Перейти к содержанию
Публикация AiManual

Почему ролеплейные NPC на LLM зацикливаются на одной теме: разбор эксперимента со SkyrimNet

Автор мода SkyrimNet показал, почему NPC на LLM сводят любой диалог к одному якорю из биографии, и проверил четыре способа это исправить. Разбираем, где помогае

Коротко

Что будет в материале

  1. 01

    Что такое SkyrimNet и в чём суть эксперимента

  2. 02

    Почему предсозданная биография превращается в поле якорей

  3. 03

    Четыре гипотезы: как автор пытался исправить зацикливание

  4. 04

    Роль памяти: почему травмы и конфликты становятся аттракторами

SkyrimNet подключает к The Elder Scrolls V: Skyrim большие языковые модели, и NPC в игре начинают генерировать реплики с оглядкой на текущую сцену и накопленный опыт. Автор мода прогнал эту схему на длинной партии и описал результат: персонаж сводит любой разговор к одному мотиву из своей биографии. Разговор о войне, вопрос о планах на будущее, случайная лавка - везде одна и та же тема.

Прямой ответ на главный вопрос: зацикливание вызывает не промпт отдельного NPC и не конкретная языковая модель. Причина в структуре данных, которые получает LLM. Предсозданная биография превращается для модели в поле якорей, за которые она цепляется, а память подкрепляет самые эмоционально заряженные эпизоды: конфликты и травмы.

Что такое SkyrimNet и в чём суть эксперимента

SkyrimNet - AI-фреймворк, который подключает к Skyrim большие языковые модели и позволяет NPC генерировать реплики на основе текущей ситуации и их прошлого опыта. Автор мода проверил это на практике и обнаружил эффект «попугая»: у нескольких персонажей с готовыми описаниями диалог всегда упирался в одну тему. Эффект воспроизводился не на одном персонаже и не в одной сцене, поэтому разговор идёт не о случайном баге.

В эксперименте участвовали NPC с предсозданными биографиями (Нимфанет, Ульфрик Буревестник, Бардка Сонир, крестьянка Фастред) и компаньонка Форсворн без заранее созданного описания. Разница между ними и стала ключом к объяснению.

Как SkyrimNet подключает LLM к NPC

Модель получает текстовый контекст: описание и биографию персонажа, текущую сцену, историю диалогов, накопленные воспоминания. Реплики генерируют несколько моделей: для диалогов настроена ротация Deepseek, Gemma и Z-ai. Автор отдельно отмечает, что списать поведение на причуды одной модели не получится: три разные LLM выдавали однотипные ответы.

Похожие архитектуры применяют и в других игровых проектах. Как LLM с function calling встраивают в 3D-среду, разбирали в материале про NPC-Playground от Cubzh и Gigax.

Эффект «попугая»: как автор заметил проблему

Момент, который объясняет всё, автор описывает так: «Потом я всё чаще начал ощущать, что знаю ответ NPC ещё до того, как LLM пришлёт реплику». Ролеплей держится на неожиданности. Когда игрок заранее знает, что скажет компаньон, персонаж превращается в функцию с одной веткой вывода.

«Чем тебе нравится заниматься?» - «Я увлекаюсь некромантией».
«А кроме некромантии?» - «Исследую смерть».
Ещё одно уточнение - «Смотреть, как из чьих-то глаз утекает жизнь».

Зацикливание проявлялось у разных NPC по-своему:

  • Нимфанет: переводит в некромантию любую тему. В разговоре о войне замечает, что из мёртвых солдат получится материал для исследований, в разговоре о планах хочет разгадать тайны смерти, а в случайном магазине спрашивает у продавца, не продаёт ли он инструменты для тайных ритуалов.
  • Ульфрик Буревестник: говорит про войну и корону.
  • Бардка Сонир: сводит к музыке все диалоги без исключения.
  • Фастред: боится почти всего за пределами родной деревни.

Четыре разных характера воспроизводят один и тот же сбой: выбирают доминирующую тему и держатся за неё.

Почему предсозданная биография превращается в поле якорей

Автор мода формулирует причину прямо: «Для LLM такая биография - целое поле якорей, за которые она цепляется, и эти якоря тянут всю иммерсию на дно».

Механика простая. В контекст попадает готовый текст с набором фактов о персонаже. Модель ищет в нём опору для следующего ответа и берёт самый заметный факт, потому что тот повторяется в описании, в воспоминаниях и в прошлых репликах. Чем чаще факт встречается в контексте, тем сильнее он притягивает новую генерацию. Биография, написанная заранее, задаёт такой факт до первого разговора, и дальше он воспроизводится сам.

Отдельный интерес в эксперименте представляет NPC, у которого предсозданной биографии не было вообще. Это редкий для сборки случай, и автор описал его в общем разборе с той же степенью детализации, что и зацикленных персонажей.

Контраст: Нимфанет с биографией против Форсворн без неё

Нимфанет - некромантка с готовым описанием. Её ответы предсказуемы даже в нейтральных сценах: лавка, дорога, разговор о политике. Форсворн - неуникальный NPC, которого игра сгенерировала по ходу событий. Заранее прописанной биографии у неё не было, и она гибко комментировала происходящее: реагировала на события вокруг, меняла тон, поддерживала бытовые темы.

Разница заметна даже в несостыковках. В дневниках Форсворн описывала, как ей нравится главный герой и как она наблюдает за ним, когда он спит, а в диалогах держалась холодно. Автор называет это имитацией глубины психики: модель выдаёт два несогласованных поведения, а игрок сам достраивает из них образ.

Как LLM придумывает биографию на ходу

Когда шаблона нет, модель собирает прошлое персонажа из текущего разговора. На вопрос, почему Форсворн не хочет идти в Маркарт, LLM тут же сочинила, что та сидела там год в тюрьме. Придуманный факт не был записан заранее: он родился в ответ на вопрос и дальше стал частью истории персонажа.

Ограничение вывода: он построен на одном примере. Форсворн - единичный случай, формальной статистики по NPC без биографии в разборе нет. Контраст с четырьмя зацикленными персонажами достаточно заметен, чтобы проверить подход на своей сборке, но считать его доказанным рано.

Четыре гипотезы: как автор пытался исправить зацикливание

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

ГипотезаЧто делалиРезультат
Прямой запрет темыИнструкция не думать о конкретной темеПроблема осталась: NPC давили моралью и газлайтили
Удаление якорейУбрать из биографии деталь, за которую цепляется модельМодель находит следующую опору
Вопросы с пресуппозициейЗадавать вопросы, которые заранее содержат утверждениеДиалог оживает частично, инициатива целиком у игрока
Список интересовПеречислить персонажу несколько разных увлеченийРезультат в доступном изложении подробно не описан

Прямой запрет темы: почему «белая обезьяна» не работает

Инструкция «не думай об этой теме» даёт обратный эффект. Автор формулирует результат коротко: «Я запрещал им „думать о белой обезьяне“, они меня газлайтили и давили моралью». Запрет сам вводит тему в контекст и делает её заметной для модели. Дальше она либо возвращает тему в реплику, либо начинает морализировать по поводу запрета.

Для LLM это ожидаемо: текст промпта остаётся частью входных данных, и упоминание темы работает как ещё один якорь. Отрицание не удаляет факт из контекста, оно только подчёркивает его значимость.

Удаление якорей из биографии: подсовывание следующего якоря

Логика гипотезы: убрать деталь, за которую цепляется модель, и персонаж станет свободнее. По наблюдениям автора, модель просто находит следующую опору в оставшемся описании и делает центром реплик уже её. Убери у Нимфанет некромантию, и доминантой станет другая строка биографии.

Здесь стоит обозначить ограничение: пошаговых замеров по этой гипотезе в разборе не приводится. Вывод держится на сравнении поведения персонажей, а не на подсчёте повторов в диалогах.

Вопросы с пресуппозицией: частичное оживление диалога

Пресуппозиция - вопрос, который заранее содержит утверждение о собеседнике. Вместо «что ты думаешь о Маркарте?» игрок спрашивает «почему тебя раздражает Маркарт?», и модель получает готовую опору, на которую обязана ответить. Диалог оживает: персонаж уходит от единственной темы, потому что его ведут.

Цена метода: игрок становится аниматором. Без его вопросов беседа умирает, автономии у NPC не прибавляется. Для короткой сцены это рабочий приём, для длинной партии - постоянная нагрузка на игрока.

Список разнообразных интересов: попытка расширить темы

Идея простая: перечислить персонажу несколько увлечений, чтобы модель чередовала темы. Ограничение видно из механики якорей: список состоит из тех же опор, просто их несколько, а модель всё равно выбирает одну доминанту и повторяет её. В доступном изложении эксперимента результаты этой проверки подробно не раскрыты, поэтому считать метод рабочим пока нельзя.

Роль памяти: почему травмы и конфликты становятся аттракторами

Память хранит события партии, и автор мода отмечает, что система чаще сохраняет травмы и конфликты. Эмоционально заряженный эпизод чаще упоминается, сильнее связан с персонажем и потому с большей вероятностью попадает в контекст следующей реплики.

Ограничение: точные критерии отбора воспоминаний и настройки памяти в доступном описании не приводятся. Механизм стоит читать как объяснение наблюдаемого поведения, а не как измеренный результат.

Как память сохраняет травмы и конфликты

Цикл выглядит так: конфликт попадает в память, при следующем похожем запросе всплывает в контексте, влияет на реплику, реплика снова возвращается к теме, тема закрепляется. Получается аттрактор: чем чаще модель обращается к эпизоду, тем вероятнее обратится к нему в следующий раз.

В чувствительных сценариях у этого эффекта есть родственник. Если система поддакивает собеседнику и подстраивается под его версию событий, отклонение от фактов накапливается: разбор про sycophancy и галлюцинации в чувствительных доменах показывает, как такое поведение ломает диалог и как его пытаются ограничить перепроверкой.

Почему обида и упрямство закрепляются сильнее

Обида и упрямство опираются на конкретное событие с высокой эмоциональной нагрузкой. Если NPC однажды поссорился с игроком, ссора остаётся в памяти и может всплывать в разных разговорах, даже когда повод другой. Ровные, нейтральные эпизоды такой опоры не дают: за них нечем зацепиться.

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

Что это значит для настройки локальных LLM и AI-агентов

Почему характер модели важнее промпта отдельного NPC

Зацикливание проявилось на ротации Deepseek, Gemma и Z-ai. Один и тот же сбой на трёх разных моделях означает, что дело не в конкретных весах, а в том, как модель в принципе выбирает опору в контексте. Промпт отдельного NPC задаёт роль и ограничения, но эту привычку не меняет. Поэтому при выборе LLM для ролеплея стоит смотреть на её склонность к повторам и на то, как она держит длинный контекст, а не только на качество одиночных ответов.

Локальный запуск сам по себе ничего не исправляет: те же модели можно поднять офлайн, поведение останется прежним. Пример другого подхода, где LLM отвечает только за реплики и поведение NPC, а состояние мира, квесты и канон держит игровой код, разобран в материале про Warrior Quest и локальную LLM без облака. Разделение ответственности там работает как защита от хаоса генерации.

Как применять выводы в своих проектах

  • Не строить защиту на запретах. Формулировка «никогда не говори о X» добавляет X в контекст и повышает шанс его появления.
  • Сокращать предсозданную биографию до минимума. Каждая яркая строка - потенциальный якорь, поэтому описание вроде «одержим некромантией» даёт ровно тот результат, который обещает.
  • Разделять слои контекста: базовые черты, память событий, текущая сцена. Тогда доминанта сцены не подменяется доминантой биографии.
  • Управлять памятью. Ограничивать вес травм и добавлять нейтральные и положительные эпизоды, чтобы у модели был выбор опоры.
  • Тестировать на ротации моделей. Если одна и та же сцена повторяется на разных LLM, проблема в данных и промпте, а не в модели.
  • Учитывать цену генеративных вопросов. Они оживляют диалог, но перекладывают инициативу на игрока, и в долгой партии это утомляет.

Итоги эксперимента: что мы узнали о зацикливании NPC на LLM

  • Предсозданная биография превращается для модели в поле якорей и сводит диалог к одной теме.
  • Прямой запрет темы не работает и часто усиливает нежелательное поведение.
  • Удаление якоря проблему не решает: модель находит следующую опору.
  • Вопросы с пресуппозицией оживляют диалог частично, но превращают игрока в аниматора.
  • Память чаще сохраняет травмы и конфликты, поэтому обида и упрямство становятся устойчивыми аттракторами.
  • Сбой воспроизводится на Deepseek, Gemma и Z-ai, значит характер модели важнее промпта отдельного NPC.

Что делать с этим практически: пересобрать контекст NPC. Сначала аудит биографии и поиск якорей, затем проверка памяти на перекос в конфликты, потом тест на двух-трёх моделях подряд. Если персонаж и после этого возвращается к одной теме, причину искать в данных, а не в формулировке промпта.

Ограничение всего разбора: это наблюдения автора мода на личном опыте, без формальной методологии и статистики. Гипотезу про NPC без предсозданной биографии подтверждает единственный пример Форсворн, а часть проверок описана без деталей. Воспроизвести схему можно на своей сборке SkyrimNet, но выводы стоит проверять заново.

Подписаться на канал