Як Stage Whisper вирішує проблему «Всезнаючого NPC»: архітектура ізоляції контексту

NPC, які можуть процитувати те, що мій персонаж сказав три сесії тому, — це було досить вражаюче. Система пам'яті працювала. NPC посилалися на минулі події, цитували мої слова. АЛЕ це породило іншу проблему: NPC стали всезнаючими.

Ось уривок із недавньої сесії, релевантну частину виділено:

«Тож, — каже вона, і її голос легко лунає над шелестом листя, — яка справжня причина, чому ти прийшов/-ла мене шукати? Цікавість, чи ти просто намагаєшся уникнути того, щоб розібрати решту того хаосу на своєму столі

Це було посилання на те, що сталося в абсолютно іншій сцені, у якій цей персонаж не брав участі. Персонаж не мав жодної можливості це знати.

Дрібні непослідовності на кшталт цього ламають занурення. Але в інших випадках це може бути критичним для гри. Наприклад, у мене є кампанія, де мій персонаж — таємний вампір, який діє у світі нічого не підозрюючих людей. NPC почали ненароком натякати, що вони знають мій секрет, і це раптом зробило для мене вкрай важким пройти хоч день без підозр. Або в інших прикладах: якщо я вкрав артефакт під час пограбування, гравець — той, хто його вкрав, — а потім абсолютно не пов'язаний персонаж робить підозрілі коментарі.

AI фактично вирішив використовувати будь-які й усі секрети, доступні в контексті, заради драматичного ефекту, а це мало б траплятися лише дуже зрідка з сюжетних причин.

То чому я не можу просто сказати AI цього не робити?

Проблема в тому, що ви намагаєтеся досягти негативу. «Не використовуй цю інформацію.» Це принципово інше й значно складніше завдання, ніж позитивний випадок: використати наявну інформацію. Щоб навчити модель ігнорувати релевантний контекст, знадобилися б тисячі прикладів ситуацій, де інформація явно доступна, але вивід свідомо її не використовує. Це майже антитеза того, для чого AI спроєктований. Для більшості задач ігнорувати корисний контекст — це провал роботи.

Теоретично модель можна було б додатково натренувати на прикладах, де секрети не використовуються. Але оповідь і рольова гра досі не були великим фокусом для розробників моделей, тож ця проблема не отримала належної уваги.


Я усвідомив, що мушу це виправити в тій кампанії з таємним вампіром. Кампанія була влаштована так, що мій персонаж міг більшу частину часу видаватися за звичайну людину, і весь сенс полягав у тому, щоб долати цю напругу, не потрапивши викритим. Великий наративний момент мав статися тоді, коли будь-який NPC дізнався б секрет — бо тоді його треба було б переконати мовчати про це.

Що я виявив — майже кожен потенційний антагоніст якимось чином знав. Хоча я нічого не розкривав. І це одразу ж ламало сюжет. Здавалося, ніби в мене над головою висить величезний знак, що сповіщає, що я вампір. Мій персонаж постійно мусив лагодити ситуацію або відчувати, що кожен персонаж має на нього важелі впливу.

Я довго експериментував із промптами. Зрештою зрозумів, що мушу просто не вмикати цю інформацію в контекст взагалі.

Розв'язок, відтак, — ізоляція контексту. Якщо AI не може не використовувати все, що бачить, тоді інформації фізично не має бути там. Це реалізовано в Stage Whisper, тому що кожна сцена й спогад уже позначені тими NPC, які в них беруть участь, тож ми можемо легко відфільтрувати лише тих персонажів, які справді були присутні.

Але є заковика. Деякі секрети — головні двигуни сюжету. Ви не можете просто їх видалити, бо сюжет усе ще має їх ураховувати. Чи то пограбування, чи таємний вампір — ці секрети є серцевиною наративу, і без них історія не була б тією самою.

Тож нам довелося розділити генерацію тексту на дві частини.

Першу частину я називаю Режисер оповіді (Story Director). Він керує загальним сюжетом: розвитком подій, наративними моментами. У нього є всі секрети, і він може вирішувати, як найкраще подати сюжет з огляду на ці секрети. Він розуміє повну картину, включно з речами, які ще не має знати жоден персонаж.

Другу частину я називаю Режисер сцен (Scene Director). Він «відіграє» сцену, яку передає йому Режисер оповіді. Він має доступ до всіх релевантних спогадів і особистостей NPC, тож має достатньо інформації, щоб грати всіх NPC і давати певну інтерстиціальну оповідь, але він буквально не знає секретів.

Частину інформації потрібно передати від одного до іншого, щоб вони могли працювати над тією самою історією, не протидіючи одне одному.


Режисер оповіді формує стислий виклад сцени, який передає Режисеру сцен усе, що йому потрібно знати. Це виглядає приблизно так:

<synopsis>
  Еліан повертається до Кімнати 314 разом із Мейв, знайомі захисні чари дають короткочасний перепочинок від уваги, яку вони привернули під час свого видовищного виступу. Відчуваючи потребу Мейв попрацювати над навчанням після незвичного дня, Еліан вирішує залишити свою кімнату заради самотньої розвідки
  <npc_list>maeve-corwin</npc_list>
  <location>room-314</location>
  <new_scene/>
</synopsis>

Це повідомляє Режисеру сцен, що відбувається в сцені, де вона відбувається, хто в ній бере участь і чи це нова сцена. Присутність персонажа гравця передбачається. Режисер оповіді також може за потреби генерувати розмову поза персонажем для гравця і створювати детальні нотатки для власного майбутнього використання.

Два режисери не бачать однакового контексту. Ось розподіл:

Режисер оповіді бачить:

Це все, що потрібно Режисеру оповіді, щоб ухвалювати цікаві, послідовні сюжетні рішення. Це багато даних, але KV-кеш допомагає тримати витрати під контролем.

Режисер сцен бачить:

Це свідомо обмежений погляд. Режисер сцен має усе, що йому потрібно для ведення сцени, і ні з чого зайвого.

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

Розподіл публічного й повного листа персонажа гравця є ключовим. Режисеру оповіді потрібно знати повні деталі та всі секрети, щоб формувати сюжет. Але Режисер сцен не повинен знати цих деталей. Йому все одно треба знати, хто такий персонаж гравця фізично, як він виглядає, яка в нього публічна репутація — речі, які будь-який NPC міг би обґрунтовано підхопити просто з того, що поруч. Підтримка окремого публічного листа означає, що Режисер сцен завжди має цей контекст, ніколи не потребуючи доступу до секретів.

Фільтрація спогадів за сценою

Кожна сцена позначена тим, які NPC в ній присутні. Це означає, що ми точно знаємо, які нещодавні сцени є релевантними для кожного NPC, і додаємо їх у контекст Режисера сцен. Припущення: сцени в межах поточної сесії є високорелевантними. Для давніших спогадів семантичний пошук витягує ті, що можуть мати значення.

Результат — Режисер сцен, який справді не може знати речей, яких не знають персонажі сцени. Не тому, що йому сказали не знати, а тому, що цієї інформації фізично там немає.


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

Без цієї системи зазвичай немає способу здивувати NPC. Всі вони поводяться так, наче щось підозрюють. Може, не прямо, але в тому, як вони з тобою говорять, завжди є цей відтінок знання. Це важко описати, але відчувається. Драматична напруга таємної ідентичності просто відсутня.

Але з цією системою NPC грають абсолютно прямолінійно. Вони поняття не мають. І сцени, де відбувається велике одкровення, справді «заходять», бо до того моменту немає жодного натяку на це. Комедія працює, бо публіка, NPC, справді не бачать, що це станеться.

Є один крайній випадок. Оскільки Режисер сцен не знає точного секрету, він час від часу робить анатомічно некоректні деталі. Це важко уникнути, бо Режисер сцен працює з публічним листом персонажа, який не містить цих деталей. Обхідний шлях — додати третій крок: Режисер оповіді переглядає згенеровану сцену, перш ніж вона піде назовні, щоб упіймати будь-які такі розбіжності. Це додає вартості й затримки, тому він у планах, але ще не реалізований.

Одне, що мене здивувало: коли секрет у грі розкривається, він поширюється природно. Режисер сцен зберігає раніше згенеровані сцени, тож коли NPC дізнається щось у сцені, це стає частиною їхнього контексту на наступний хід. Наприкінці сцен ці сцени формують спогади NPC. Наприкінці сесій листи NPC оновлюються. Обидва ці механізми означають, що знання секрету окремим NPC фіксується, і сюжет може продовжуватися з цим NPC, який тепер справді в курсі.

Компроміс

Цей підхід не безкоштовний. Витрати зростають, але не подвоюються, оскільки контекст Режисера сцен відносно легкий. Кеш промптів теж допомагає суттєво. У міру того, як сцена розгортається, нові ходи додаються в кінець контексту, а це означає, що 90% промпта може надходити з кешу, а не генеруватися заново щоразу.

Наразі це ввімкнено для всіх кампаній. Архітектурні зміни достатньо значні, що немає сенсу надавати шлях, який обходить це налаштування. Для більшості кампаній компроміс того вартий, навіть якщо у вашій історії немає великих секретів, бо послідовність NPC має значення незалежно від того.

Що це відкриває: Ігровий режисер

Двоступеневий конвеєр демонструє дещо корисне: розділення задач між більш спеціалізованими AI з оптимізованими контекстами дає кращі результати, ніж один AI, який робить усе. Це підводить до природного третього етапу.

Я називаю його Ігровий режисер (Game Director). Його завдання — опікуватися механікою TTRPG: кидками кісток, перевірками навичок, відстеженням статусів. Його контекст може бути оптимізований інакше, ніж у інших, оскільки його менше цікавить наративна історія й більше — правила гри та її стан.

Додавання Ігрового режисера має несподівану перевагу. Оскільки він запускається щоходу, на випадок, якщо гравець спробує щось, що потребує перевірки навички, він також може вирішити, чи введення гравця є продовженням попередньої сцени, чи чимось новим. Якщо гравець просто спілкується з NPC без просування сюжету, Ігровий режисер може повністю пропустити Режисера оповіді й дозволити Режисеру сцен продовжити сцену самостійно. У Режисера сцен є листи NPC, і він може виконувати пошук у спогадах, тож може продовжувати діалог без накладних витрат повного виклику Режисера оповіді.

Це напрямок, у якому рухається архітектура: триступеневий конвеєр, що дедалі більше спеціалізується, з оптимізаціями витрат, вбудованими на кожному шарі.


Stage Whisper створено для людей, які хочуть грати сольні TTRPG із глибиною й послідовністю довготривалої кампанії. Система пам'яті, включно з цією архітектурою ізоляції контексту, робить це можливим. Почніть або приєднайтесь до нашого Discord, щоб побачити, як це працює на практиці.

Детальніше про систему пам'яті Stage Whisper див. Частина 1: Наративна послідовність і Частина 3: Сни NPC.