Så löser Stage Whisper problemet med 'allvetande NPC:er': En arkitektur för kontextisolering
Det var riktigt häftigt att se NPC:er citera något min karaktär hade sagt tre sessioner tidigare. Minnessystemet fungerade. NPC:erna hänvisade till tidigare händelser och citerade saker jag hade sagt. MEN det skapade också ett annat problem: NPC:erna började bli allvetande.
Här är ett utdrag från en nylig session. Den relevanta delen är markerad:
"Så", säger hon med en röst som lätt bär över lövens prassel, "vad är den verkliga anledningen till att ni sökte upp mig? Nyfikenhet, eller försöker ni bara slippa reda ut resten av det där kaotiska skrivbordet?"
Det hänvisade till något som hade hänt i en helt annan scen där karaktären inte var med. Karaktären borde inte ha kunnat veta det.
Små motsägelser som denna bryter inlevelsen. Men i andra fall kan de förstöra spelet. Jag har till exempel en kampanj där min karaktär är en hemlig vampyr som försöker ta sig fram i en värld av intet ont anande människor. NPC:er började ledigt antyda att de kände till min hemlighet, vilket plötsligt gjorde det mycket svårt för mig att klara vardagen utan att bli misstänkt. Ett annat exempel är om spelaren stal en artefakt under en kupp och en helt orelaterad karaktär sedan kommer med misstänksamma kommentarer.
AI:n bestämde sig i praktiken för att använda alla hemligheter som fanns i kontexten för dramatisk effekt, något som egentligen bara borde ske mycket sällan av intrigskäl.
Varför kan jag då inte bara säga åt AI:n att låta bli?
Problemet är att ni försöker åstadkomma något negativt. "Använd inte den här informationen." Det är en helt annan och mycket svårare uppgift än det positiva fallet: använd den information som finns. För att träna en modell att ignorera relevant kontext skulle man behöva tusentals exempel på situationer där informationen är tydligt tillgänglig men avsiktligt inte används i resultatet. Det är nästan motsatsen till vad en AI är utformad för att göra. För de flesta uppgifter vore det ett misslyckande att ignorera användbar kontext.
Det går att föreställa sig att en modell skulle kunna tränas på fler exempel där den inte agerar på hemligheter. Men modellskaparna har hittills inte fokuserat särskilt mycket på berättande och rollspel, så problemet har inte fått den uppmärksamhet det förtjänar.
Jag insåg att jag var tvungen att lösa detta i kampanjen med den hemliga vampyren. Kampanjen var utformad så att min karaktär för det mesta kunde passera som en vanlig människa, och hela poängen var att navigera den spänningen utan att bli avslöjad. Varje gång en NPC fick reda på hemligheten skulle det bli ett stort berättelseögonblick, eftersom den då behövde övertalas att hålla tyst.
Jag upptäckte att i stort sett varje potentiell antagonist på något sätt visste. Trots att jag inte hade avslöjat något. Det förstörde omedelbart intrigen. Det kändes som om jag hade en stor skylt över huvudet som meddelade att jag var vampyr. Min karaktär fick ständigt försöka begränsa skadan eller känna att varenda karaktär hade ett övertag över min.
Jag experimenterade länge med promptar. Till slut insåg jag att jag helt enkelt inte kunde ta med informationen i kontexten alls.
Lösningen är alltså kontextisolering. Om AI:n inte kan låta bli att använda allt den ser måste informationen genuint saknas. Det går att åstadkomma i Stage Whisper eftersom varje scen och minne redan är taggat med de NPC:er som förekommer där. Vi kan därför enkelt filtrera så att bara de karaktärer som faktiskt var närvarande inkluderas.
Men det finns ett problem. Vissa hemligheter driver hela intrigen. De kan inte bara tas bort helt, eftersom berättelsen fortfarande måste ta hänsyn till dem. Oavsett om det handlar om en kupp eller en hemlig vampyr är hemligheterna centrala för berättelsen, och utan dem skulle det inte vara samma historia.
Därför var vi tvungna att dela textgenereringen i två delar.
Den första kallar jag Berättarregissören. Den regisserar berättelsen i stort: intrigen och berättelsemomenten. Den känner till alla hemligheter och kan avgöra hur berättelsen bäst ska utvecklas utifrån dem. Den förstår helheten, inklusive allt som ingen karaktär ännu borde känna till.
Den andra kallar jag Scenregissören. Den "spelar upp" scenen som Berättarregissören ger den. Den har tillgång till alla relevanta NPC-minnen och personligheter, så den har tillräckligt med information för att spela alla NPC:er och ge viss sammanbindande berättarröst, men den känner genuint inte till hemligheterna.
Viss information måste föras vidare från den ena till den andra, så att de kan arbeta med samma berättelse utan att motverka varandra.
Berättarregissören skapar en synopsis som berättar allt Scenregissören behöver veta. Den ser ut ungefär så här:
<synopsis>
Elian returns to Room 314 with Maeve, the familiar privacy wards offering brief respite from the attention gathered during their spectacular display. Sensing Maeve's need to study after an unusual day, Elian decides to leave their room for some solitary exploration
<npc_list>maeve-corwin</npc_list>
<location>room-314</location>
<new_scene/>
</synopsis>
Det berättar för Scenregissören vad som händer i scenen, var den utspelar sig, vilka som deltar och om det är en ny scen. Det förutsätts att spelarkaraktären är närvarande. Berättarregissören kan också välja att ge spelaren kommentarer utanför rollen och skriva detaljerade regianvisningar för eget framtida bruk.
De två regissörerna ser inte samma kontext. Så här delas den upp:
Berättarregissören ser:
- fullständiga kampanjfiler, inklusive spelledarens anteckningar, sessionsplanen, kampanjkonfigurationen och kampanjens aktuella status
- det fullständiga spelarkaraktärsbladet, inklusive alla hemligheter
- en lista över alla NPC:er, platser och all lore
- sessionssammandrag och sessionssammanfattningar
- hela historiken för de två senaste scenerna
Det är allt Berättarregissören behöver för att fatta intressanta och konsekventa beslut om intrigen. Det är mycket data, men KV-cachen håller kostnaderna hanterbara.
Scenregissören ser:
- delar av kampanjfilerna utan spelledarens anteckningar
- den offentliga versionen av spelarkaraktärsbladet, som utelämnar alla hemligheter men fortfarande innehåller fysiskt utseende och offentligt anseende — sådant en vanlig NPC rimligen skulle känna till
- sammanfattningar av de senaste scener som NPC:erna faktiskt deltog i
- platsinformation
- de senaste minnena som varje NPC kan ha
- synopsis från Berättarregissören
Det är en avsiktligt begränsad vy. Scenregissören har allt den behöver för att leda scenen och inget den inte borde ha.
Två karaktärsblad
Skillnaden mellan det offentliga och det fullständiga spelarkaraktärsbladet är avgörande. Berättarregissören behöver känna till alla detaljer och hemligheter för att skapa berättelsen. Men Scenregissören ska inte känna till dem. Den behöver fortfarande veta vem spelarkaraktären är rent fysiskt, hur hen ser ut, vilket offentligt anseende hen har och sådant en NPC rimligen skulle uppfatta bara genom att vistas i närheten. Genom att underhålla ett separat offentligt blad har Scenregissören alltid denna kontext utan att någonsin behöva få tillgång till hemligheterna.
Filtrera minnen efter scen
Varje scen taggas med de NPC:er som är närvarande. Därför vet vi exakt vilka nyliga scener som är relevanta för varje NPC och lägger till dem i Scenregissörens kontext. Antagandet är att scener i den aktuella sessionen är mycket relevanta. För äldre minnen lyfter semantisk sökning fram dem som kan spela roll.
Resultatet är en Scenregissör som genuint inte kan känna till sådant karaktärerna i scenen inte känner till. Inte för att den blev tillsagd att låta bli, utan för att informationen fysiskt inte finns där.
Jag har kört en kampanj där min karaktär är en mänsklig kvinna som måste klä sig som en man för att säkra familjens titel inom lågadeln, på grund av arvsreglerna. Det är en lättsam komedikampanj med några komiska scenarier som uppstår ur könsförväxlingen.
Utan det här systemet finns det i allmänhet inget sätt att överraska NPC:er. De beter sig alla som om de misstänker något. Kanske inte direkt, men sättet de talar med er på har alltid en antydan om att de vet. Det är svårt att beskriva, men det känns. Den dramatiska spänningen i en hemlig identitet saknas helt enkelt.
Med systemet på plats spelar NPC:erna däremot helt oförstående. De har ingen aning. Och scenerna med det stora avslöjandet träffar verkligen, eftersom ingenting dessförinnan har anspelat på det. Komedin fungerar eftersom rollfigurerna — NPC:erna — genuint inte ser det komma.
Det finns ett gränsfall. Eftersom Scenregissören inte känner till den exakta hemligheten skapar den ibland anatomiskt felaktiga detaljer. Det är svårt att undvika eftersom Scenregissören arbetar utifrån ett offentligt karaktärsblad som saknar dessa uppgifter. Lösningen vore att lägga till ett tredje steg: Berättarregissören granskar den genererade scenen innan den skickas ut för att upptäcka sådana avvikelser. Det ökar kostnaden och fördröjningen, så det finns på utvecklingsplanen men har ännu inte implementerats.
En sak överraskade mig: när en hemlighet avslöjas i spelet sprids kunskapen naturligt. Scenregissören behåller de tidigare genererade scenerna, så när en NPC får veta något i en scen blir det en del av dess kontext i nästa drag. I slutet av scenerna skapar dessa scener minnen åt NPC:n. I slutet av sessionerna uppdateras NPC-bladen. Båda delarna gör att en enskild NPC:s kunskap om en hemlighet registreras, och berättelsen kan fortsätta med en NPC som nu verkligen känner till den.
Kompromissen
Den här metoden är inte gratis. Kostnaden ökar, men inte riktigt till det dubbla eftersom Scenregissörens kontext är relativt lätt. Promptcachen hjälper också avsevärt. Allt eftersom scenen utspelar sig läggs nya drag till sist i kontexten. Det innebär att 90 procent av prompten kan komma från cachen i stället för att genereras om från början varje gång.
För närvarande är detta aktiverat för alla kampanjer. Arkitekturändringarna är så omfattande att det inte är meningsfullt att erbjuda en väg som kringgår upplägget. För de flesta kampanjer är kompromissen värd det, även om berättelsen saknar stora hemligheter, eftersom konsekventa NPC:er alltid spelar roll.
Vad detta möjliggör: Spelregissören
Tvåstegspipelinen visar något användbart: att dela upp uppgifter mellan mer specialiserade AI:er med optimerade kontexter ger bättre resultat än att låta en enda AI göra allt. Det leder naturligt till ett tredje steg.
Jag kallar det Spelregissören. Dess uppgift är att hantera TTRPG-mekaniken: tärningsslag, färdighetskontroller och statusspårning. Dess kontext kan optimeras på ett annat sätt än de andras, eftersom den bryr sig mindre om berättelsehistoriken och mer om spelregler och speltillstånd.
Att lägga till en Spelregissör har en oväntad fördel. Eftersom den körs varje drag ifall spelaren försöker göra något som kräver en färdighetskontroll kan den också avgöra om spelarens inmatning fortsätter den senaste scenen eller inleder något nytt. Om spelaren bara samtalar med en NPC utan att föra intrigen framåt kan Spelregissören hoppa över Berättarregissören helt och låta Scenregissören fortsätta scenen på egen hand. Scenregissören har NPC-bladen och kan göra minnessökningar, så den kan fortsätta en sådan dialog utan omkostnaden för ett fullständigt anrop till Berättarregissören.
Det är riktningen arkitekturen utvecklas i: en trestegspipeline som blir alltmer specialiserad, med kostnadsbesparande optimeringar inbyggda i varje lager.
Stage Whisper är byggt för personer som vill spela solo-TTRPG med djupet och konsekvensen hos en långvarig kampanj. Minnessystemet, inklusive denna arkitektur för kontextisolering, gör det möjligt. Kom i gång eller gå med i vår Discord för att se hur det fungerar i praktiken.
Läs mer om Stage Whispers minnessystem i del 1: Narrativ konsekvens och del 3: NPC-drömmar.