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, но выводы стоит проверять заново.