Как Stage Whisper решает проблему «всезнающих НИПов»: архитектура изоляции контекста

НИПы, которые могут процитировать что-то, что мой персонаж сказал три сессии назад, было довольно круто видеть. Система памяти работала. НИПы ссылались на прошлые события, цитировали сказанное мной. НО это также породило другую проблему: НИПы начали становиться всезнающими.

Вот отрывок из недавней сессии, релевантная часть выделена:

«Итак, — говорит она, её голос легко разносится над шелестом листьев, — какова настоящая причина, по которой ты пришёл искать меня? Любопытство, или ты просто пытаешься избежать разбора остальной части своего хаотичного стола

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

Мелкие несоответствия вроде этого разрушают погружение. Но в других случаях это может быть game-breaking. Например, у меня есть кампания, где мой персонаж — тайный вампир, navigating мир ничего не подозревающих людей. НИПы начали casually намекать, что знают мой секрет, что внезапно сделало очень трудным для меня прожить день без подозрений. Или в других примерах: если я украл артефакт во время ограбления, игрок был тем, кто украл артефакт во время ограбления, а затем несвязанный персонаж делает подозрительные комментарии.

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

Так почему я не могу просто сказать ИИ не делать этого?

Проблема в том, что вы пытаетесь достичь отрицательного. «Не используй эту информацию.» Это фундаментально иная и гораздо более сложная задача, чем положительный случай: используй информацию, которая есть. Чтобы обучить модель игнорировать релевантный контекст, потребовались бы тысячи примеров ситуаций, где информация была явно доступна, но вывод намеренно её не использовал. Это почти антитеза того, для чего ИИ разработан. Для большинства задач игнорирование полезного контекста было бы провалом работы.

Теоретически модель можно было бы обучить с большим количеством примеров не действовать на основе секретов. Но повествование и ролевые игры не были большим фокусом для создателей моделей до сих пор, так что эта проблема не получила заслуженного внимания.


Я понял, что должен исправить это в той кампании с тайным вампиром. Кампания была построена так, чтобы мой персонаж мог большую часть времени сходить за обычного человека, и весь смысл был в navigating этого напряжения без того, чтобы быть раскрытым. Это был бы большой нарративный момент, когда любой НИП узнал бы секрет, потому что тогда их нужно было бы убеждать молчать об этом.

Я обнаружил, что практически каждый потенциальный антагонист каким-то образом знал. Хотя я ничего не раскрывал. И это сразу ломало сюжет. Было ощущение, будто над моей головой висела большая табличка с надписью, что я вампир. Мой персонаж постоянно занимался damage control или чувствовал, что каждый персонаж имеет leverage над моим.

Я долго экспериментировал с промптами. В конце концов я понял, что придётся просто не включать информацию в контекст вообще.

Решение, таким образом, — изоляция контекста. Если ИИ не может не использовать всё, что видит, то информация действительно должна отсутствовать. Это достижимо в Stage Whisper, потому что каждая сцена и воспоминание уже помечены НИПами, которые в ней появляются, так что мы можем легко фильтровать, чтобы включать только тех персонажей, которые действительно там были.

Но вот загвоздка. Некоторые секреты — главные двигатели сюжета. Нельзя просто полностью их удалить, потому что история всё ещё должна их учитывать. Будь то ограбление или тайный вампир, эти секреты являются ядром повествования, и без них это была бы не та же история.

Поэтому нам пришлось разделить генерацию текста на две части.

Первую часть я называю Story Director. Он dirige общую историю: сюжет, нарративные повороты. У него есть все секреты, и он может решать, как лучше развернуть историю с учётом этих секретов. Он понимает полную картину, включая то, что ни один персонаж пока не должен знать.

Вторую часть я называю Scene Director. Он «разыгрывает» сцену, переданную ему Story Director. У него есть доступ ко всем релевантным воспоминаниям и личностям НИПов, так что у него достаточно информации, чтобы играть всех НИПов и предоставлять промежуточное повествование, но он действительно не знает секретов.

Некоторая информация должна передаваться от одного к другому, чтобы они могли работать над одной историей, не работая друг против друга.


Story Director создаёт synopsis, который сообщает Scene Director всё, что ему нужно знать. Это выглядит примерно так:

<synopsis>
  Элиан возвращается в комнату 314 с Мейв, знакомые защитные чары предлагают краткую передышку от внимания, собранного во время их впечатляющего выступления. Чувствуя потребность Мейв в учёбе после необычного дня, Элиан решает покинуть их комнату для одиночного исследования
  <npc_list>maeve-corwin</npc_list>
  <location>room-314</location>
  <new_scene/>
</synopsis>

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

Два директора не видят один и тот же контекст. Вот разделение:

Story Director видит:

Это всё, что нужно Story Director для принятия интересных, последовательных сюжетных решений. Это много данных, но KV-кэш сохраняет затраты управляемыми.

Scene Director видит:

Это намеренно уменьшенный обзор. У Scene Director есть всё необходимое для проведения сцены и ничего, чего у него быть не должно.

Два листа персонажа

Различие между публичным и полным листом игрового персонажа является ключевым. Story Director должен знать полные детали и все секреты, чтобы создавать историю. Но Scene Director не должен знать эти детали. Ему всё ещё нужно знать, кто такой игровой персонаж физически, как он выглядит, его публичную репутацию — то, что любой НИП разумно заметил бы, просто находясь рядом с ним. Поддержание отдельного публичного листа означает, что Scene Director всегда имеет этот контекст, никогда не нуждаясь в доступе к секретам.

Фильтрация воспоминаний по сценам

Каждая сцена помечена тем, какие НИПы присутствуют. Это означает, что мы точно знаем, какие недавние сцены релевантны для каждого НИПа, и добавляем их в контекст Scene Director. Предполагается, что сцены внутри текущей сессии высоко релевантны. Для более старых воспоминаний семантический поиск находит те, которые могут иметь значение.

Результат — Scene Director, который действительно не может знать того, чего персонажи в сцене не знают. Не потому, что ему сказали не знать, а потому что этой информации физически там нет.


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

Без этой системы обычно нет способа удивить НИПов. Они все ведут себя так, будто что-то подозревают. Может, не напрямую, но то, как они с вами говорят, всегда имеет этот оттенок знания. Это трудно описать, но вы это чувствуете. Драматическое напряжение тайной личности просто отсутствует.

Но с этой системой НИПы играют полностью прямо. Они понятия не имеют. И сцены, где происходит большое раскрытие, действительно работают, потому что до этого момента нет абсолютно никакого намёка на это. Комедия работает, потому что аудитория — НИПы — искренне этого не ожидает.

Есть один крайний случай. Поскольку Scene Director не знает точного секрета, он иногда делает анатомически некорректные детали. Этого трудно избежать, так как Scene Director работает с публичным листом персонажа, который не включает эти детали. Обходным путём было бы добавление третьего шага: Story Director проверяет сгенерированную сцену перед её отправкой, чтобы выявить любые расхождения, подобные этому. Это добавляет стоимость и задержку, так что это в дорожной карте, но ещё не реализовано.

Одна вещь, которая меня удивила: когда секрет действительно раскрывается в игре, он распространяется естественно. Scene Director держит ранее сгенерированные сцены, так что как только НИП узнаёт что-то в сцене, это становится частью его контекста для следующего хода. В конце сцен эти сцены формируют воспоминания для НИПа. В конце сессий листы НИПов обновляются. И то, и другое означает, что знание отдельного НИПа о секрете записывается, и история может продолжаться с этим НИПом, теперь действительно знающим.


Компромисс

Этот подход не бесплатен. Стоимость возрастает, хотя и не вдвое, поскольку контекст Scene Director относительно лёгок. Кэш промптов также значительно помогает. По мере развития сцены новые ходы добавляются в конец контекста, что означает, что 90% промпта может приходить из кэша, а не генерироваться заново каждый раз.

В настоящее время это включено для всех кампаний. Архитектурные изменения достаточно значительны, что не имеет смысла предоставлять путь, который обходит эту настройку. Для большинства кампаний компромисс оправдан, даже если в вашей истории нет крупных секретов, потому что последовательность НИПов важна в любом случае.

Что это открывает: Game Director

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

Я называю его Game Director. Его задача — обрабатывать механики настольной ролевой игры: броски костей, проверки навыков, отслеживание статусов. Его контекст может быть оптимизирован иначе, чем у других, поскольку он меньше заботится о нарративной истории и больше о игровых правилах и состоянии игры.

Добавление Game Director имеет неожиданное преимущество. Поскольку он запускается каждый ход на случай, если игрок попытается сделать что-то, требующее проверки навыка, он также может решать, является ли ввод игрока продолжением последней сцены или чем-то новым. Если игрок просто болтает с НИПом, не двигая сюжет, Game Director может полностью пропустить Story Director и позволить Scene Director продолжить сцену самостоятельно. У Scene Director есть листы НИПов, и он может выполнять поиск по воспоминаниям, так что он может продолжать диалог таким образом без накладных расходов полного вызова Story Director.

Это направление, в котором движется архитектура: трёхэтапный конвейер, который становится всё более специализированным, с оптимизациями экономии затрат, встроенными на каждом уровне.


Stage Whisper создан для людей, которые хотят играть в одиночные настольные ролевые игры с глубиной и последовательностью длительной кампании. Система памяти, включая эту архитектуру изоляции контекста, — это то, что делает это возможным. Начните или присоединяйтесь к нашему Discord, чтобы увидеть, как это работает на практике.

Подробнее о системе памяти Stage Whisper см. Часть 1: Нарративная последовательность и Часть 3: Сновидения НИПов.