Почему нейросеть для DnD забывает мир: как я чиню память ИИ-мастера

Нейросеть для DnD забывает события, потому что у языковой модели нет постоянной памяти мира: она держит только текущее "окно" текста и каждый ход пересобирает сцену заново. Лечится это отдельной памятью мира вне окна: летопись кампании (только дописывается), база фактов с отбором ~20 под ход и карточки NPC - так спутники, локации и исходы конфликтов не теряются.
Почему нейросеть для DnD забывает мир: как я чиню память ИИ-мастера
Короткая версия: нейросеть для DnD забывает, что происходит, не потому что “тупая”, а потому что у языковой модели нет постоянной памяти мира. Движок пересобирает сцену каждый ход заново из текста - и то, что не попало в этот текст, для него просто исчезает. Едешь в телеге - через ход уже топаешь пешком. Лечится это отдельной памятью мира: состояние (где ты, на чём едешь, кто рядом) живёт вне контекстного окна, в базе, которую движок читает и обновляет каждый ход. Ниже разбираю, почему так выходит у любого ИИ-мастера, и показываю на цифрах, как это устроено в моём боте: летопись, база фактов, карточки NPC и спутники, которые больше не растворяются в воздухе.
Почему ИИ-мастер забывает события и персонажей?
ИИ-мастер забывает, потому что языковая модель держит в голове только текущее “окно” текста - рабочую память на несколько тысяч слов. Когда игра становится длиннее окна, самые старые ходы выпадают за край, и модель их больше не видит. Для неё то, что ушло за край, физически перестаёт существовать. Отсюда и забытые НПС, и пропавшие квесты, и телега, которая растворилась в воздухе.
Тут важно понять одну вещь. Модель не “вспоминает” вашу партию, как вспоминаешь ты. Каждый ход она заново читает кусок недавнего текста и по нему достраивает, что происходит. Нет отдельной полочки, где записано “игрок сейчас в телеге, рядом Даша-полурослик, до города два дня пути”. Есть только простыня диалога - и если факт про телегу уехал за край окна, телега для мастера не “забыта”, её просто нет.
Окна за 2026 год выросли - от 128 тысяч токенов у моделей попроще до миллиона с лишним у топовых, - но одна плотная сессия DnD с описаниями локаций, бросками и репликами НПС набивает их на удивление шустро. И даже когда всё формально влезло, модель достаёт информацию неравномерно: по исследованию Нельсона Лю и коллег (TACL, 2024) языковые модели лучше всего вспоминают начало и конец контекста и заметно хуже - середину. Эффект так и называется “потерян в середине” (lost in the middle). Важная деталь из середины партии может быть технически “в памяти”, а мастер её всё равно проворонит.
”Едешь в телеге - через ход идёшь пешком”: как баг выглядит за столом
Самый показательный баг в моём боте выглядел так: едешь в телеге - через ход уже топаешь пешком. Никто телегу не отбирал, лошадь не пала, разбойники не нападали. Просто движок пересобрал сцену заново, а про телегу в свежем куске текста ничего не было - и мир тихо перезагрузился за твоей спиной.
Ребят, за столом это бесит сильнее, чем любой кривой бросок. Живой Мастер держит картинку мира в голове: он твёрдо знает, где ты, на чём едешь, кто рядом стоит. А нейросеть без нормальной памяти каждый ход как будто первый раз садится за стол. Отсюда и НПС, который забыл, что ты ему уже помог, и лут, который испарился, и освобождённый пленник, который снова оказался в клетке.
Корень у всех этих багов один - нет отдельного, устойчивого состояния мира. Есть только текст, из которого мастер каждый раз гадает заново. Поэтому и правило у меня в проекте прибито одной строкой: нейросеть не имеет права терять мир за твоей спиной.
Как память мира устроена в моём боте: летопись, факты, карточки NPC
Чиню я это не уговорами модели “помни получше”, а движком. Сейчас на проде память мира держится на трёх опорах, и у каждой есть проверяемые цифры.
Летопись кампании. Каждый ход нарратор дописывает в летопись одну строку пересказа - “Ход N: …”, 150-200 символов. Летопись только дописывается, никогда не переписывается: вчерашний текст байт в байт совпадает с сегодняшним, поэтому провайдер отдаёт его из кэша почти бесплатно. Когда летопись перерастает 18 тысяч символов, фоновый вызов сжимает старую половину в короткий пролог, а свежие строки остаются дословно. Самая длинная летопись на проде сейчас - 27,5 тысячи символов чистой истории кампании. Про то, как летопись заодно срезала цену хода, я писал отдельно - кэш промпта и переезд на DeepSeek.
База фактов. Отдельная таблица, куда каждый ход записываются новые факты о мире - с меткой важности, видимости и сроком жизни. На всех кампаниях бота таких фактов накопилось больше 25 тысяч; в одной активной кампании живёт порядка 160. В промпт нарратора при этом попадает не вся куча: ядро из 12 самых важных фактов плюс до 8 “горячих”, отобранных под конкретное действие игрока. Модель каждый ход видит около 20 фактов - ровно те, что нужны сцене.
Карточки NPC. У каждого встреченного персонажа своя запись: имя, раса, отношение к герою, уровень доверия от −10 до +10 и собственная память - до 7 “известных фактов” в карточке. На проде таких NPC уже больше двух тысяч, и у тысячи с лишним из них память непустая. NPC “здесь сейчас” подаются нарратору полной карточкой, NPC из других мест - одной строкой со строгим запретом вводить их в сцену: так погибший в прошлой главе злодей не воскресает в таверне.
Весь промпт нарратора при этом - около 38 тысяч символов, примерно 8 тысяч токенов, собранных из 16 блоков: от неизменных правил Мастера до пер-ходовых вставок движка. Проза - витрина, состояние мира - склад.
Спутники, сцены и исходы: что было и что стало
Самая наглядная проверка памяти мира - спутник. Раньше скажешь NPC “идём со мной” - и через десяток ходов он растворяется, будто его и не звали. Эльфийка-следопыт шла рядом, вы залезли в подземелье, полчаса рубили гоблинов - и на выходе Мастер уже не уверен, была ли она вообще. Вот что поменялось по трём фронтам.
Спутники. Что было: NPC выпадал из истории после пары сцен. Что стало: спутник фиксируется в состоянии мира и переходит между локациями вместе с тобой. На проде прямо сейчас 159 NPC живут со статусом спутника. Отдельно движок понимает “расставание без исчезновения”: если ты уходишь или сбегаешь, NPC не стирается из мира - он остаётся в сцене и просто перестаёт быть спутником.
Сцены. Что было: движок путал два разных “пошли” - “пошли вглубь леса” (перемещение, сцена меняется) и “пошли, расскажи про свой народ” (та же поляна, просто разговор). То терялись спутники при переходе, то мир зря дёргался на каждую реплику. Что стало: рядом с прозой модель заполняет машиночитаемые поля - сменилась ли локация, кто теперь в сцене, что произошло. Факты едут в состояние мира по схеме, а не угадываются из настроения абзаца.
Исходы. Что было: освобождённый пленник мог снова оказаться в клетке, а завершённая погоня - начаться заново. Что стало: исход конфликта - это запись, а не пересказ. Конфликт закрылся - движок ставит галочку в состоянии мира, и назад её случайной репликой не отыграть. Смысл твоих решений держится ровно на том, что мир их запомнил.
Тот же принцип “состояние - это запись со своим паспортом” чинит и боевые статусы: как бот перестал терять паралич и отравление, я разбирал в статье про состояния DnD 5e, а как NPC ходил за героем по всем сценам фантомом - в разборе бага про canon-гард.
Чем такая память лучше перезаписываемой сводки?
Перезаписываемая сводка сжимает всю прошлую игру в один короткий пересказ и каждый ход переписывает его заново. Работает, пока фактов мало. Но чем дольше партия, тем сильнее детали стираются: пересказ пересказа пересказа превращается в “ну, вы куда-то шли, что-то делали”. Именно поэтому у меня сводки-перезаписи больше нет вовсе - её заменила летопись, которая не переписывается, плюс точные факты, которые лежат отдельно от прозы на своих полках.
Разница на пальцах. Сводка - это когда ты пересказываешь фильм другу, потом пересказываешь свой пересказ: к пятому разу от сюжета остаётся “там был мужик и что-то взорвалось”. Летопись с базой фактов - это когда рядом с пересказом лежит блокнот с именами, местами и предметами, и Мастер в него подглядывает каждый ход. Чуть сложнее в реализации, но мир перестаёт течь сквозь пальцы: длина партии упирается не в окно модели, а в размер хранилища - а его можно растить сколько угодно.
Что это меняет за столом: цифры с прода
Меняется главное ощущение - мир существует, даже когда ты на него не смотришь. Спутник дожидается, локация не подменяется, решённое остаётся решённым. И это уже не обещание из роадмапа: на боте сыграно 828 кампаний и больше 46 тысяч ходов. Сорок кампаний перевалили за сотню ходов игрока - при том что старой памяти “на окне” хватало бы от силы на пару десятков. Рекордсмен наиграл 313 ходов за четыре дня, и его мир не рассыпался.
Вывод, к которому я пришёл за год стройки, простой: не пытайся сделать модель, которая помнит всё, - сделай мир, который сам помнит себя, а модели оставь то, что она умеет лучше всего: рассказывать. Бот всё ещё в бете, что-то наверняка вылезет - но фундамент под памятью держит.
Если хочешь пощупать ИИ-мастера для DnD 5e-совместимой игры и заодно поймать пару моих багов раньше меня - загляни в бота @dnd5char_bot, а за девлогом и разборами вроде этого я пишу в канал “Таверна Мокрый Тортл” @dnd5chat. Тестерам, которые ловят “телега-исчезла” моменты и присылают их мне, - отдельное спасибо, вы буквально двигаете стройку. А про то, как из этой памяти складывается долгая игра одним персонажем, - читай разбор соло-кампании с ИИ.
Частые вопросы
Сколько текста помнит нейросеть в игре?
Ровно столько, сколько влезает в контекстное окно - от 128 тысяч токенов у простых моделей до 1 миллиона с лишним у топовых. Одна длинная сессия DnD набивает этот объём быстро, поэтому память мира надо хранить вне окна: в нашем боте это летопись, база фактов и карточки NPC.
Можно ли играть с нейросетью долгую кампанию, а не один вечер?
Да, если состояние мира хранится отдельно от текста: тогда длина партии ограничена размером хранилища, а не окна модели. На нашем боте 40 кампаний перевалили за сотню ходов игрока, а рекорд - 313 ходов за четыре дня.
Что такое проблема "потерян в середине" у нейросетей?
Это когда модель лучше вспоминает информацию из начала и конца контекста и хуже - из середины (Нельсон Лю и коллеги, TACL 2024). В игре важная деталь из середины партии может формально быть в памяти, но мастер её всё равно упустит - ещё одна причина держать факты мира в отдельной базе.
Как готовился материал: черновик собирает мой ИИ-конвейер по темам из практики таверны, факты сверяются с первоисточниками и правилами, финальную версию я читаю и правлю руками перед публикацией. Обложку тоже рисует нейросеть. Про кухню — на странице о проекте.