Hoe Stage Whisper het 'Alwetende NPC'-Probleem Oplost: Contextisolatie-architectuur

NPC's die iets konden citeren wat mijn personage drie sessies geleden had gezegd, was best gaaf om te zien. Het geheugensysteem werkte. NPC's refereerden aan gebeurtenissen uit het verleden, citeerden dingen die ik zei. MAAR het veroorzaakte ook een ander probleem: NPC's werden alwetend.

Hier is een fragment uit een recente sessie, het relevante deel is gemarkeerd:

"Dus," zegt ze, haar stem draagt gemakkelijk over het geritsel van bladeren, "wat is de echte reden dat je naar me op zoek kwam? Nieuwsgierigheid, of probeer je gewoon te voorkomen dat je de rest van dat chaotische bureau van je moet uitpakken?"

Dat refereerde aan iets dat gebeurde in een compleet andere scène waar dit personage geen deel van uitmaakte. Het personage had op geen enkele manier moeten kunnen weten hiervan.

Kleine inconsistenties zoals deze zijn immersiebrekend. Maar in andere gevallen kan het spelbrekend zijn. Bijvoorbeeld, ik heb een campagne waarin mijn personage een geheime vampier is die navigeert in een wereld van nietsvermoedende mensen. NPC's begonnen terloops te hinten dat ze mijn geheim kenden, wat het plotseling erg moeilijk voor me maakte om de dag door te komen zonder verdacht te worden. Of in andere voorbeelden: als ik een artefact stal tijdens een overval, was de speler degene die het artefact stal, en dan maakt een niet-gerelateerd personage verdachte opmerkingen.

De AI besloot in feite alle beschikbare geheimen in de context te gebruiken voor dramatisch effect, wat eigenlijk alleen heel af en toe zou moeten gebeuren om plotredenen.

Dus waarom kan ik de AI niet gewoon vertellen dit niet te doen?

Het probleem is dat je een negatie probeert te bereiken. "Gebruik deze informatie niet." Dat is een fundamenteel andere en veel moeilijkere taak dan het positieve geval: gebruik de informatie die er wel is. Om een model te trainen om relevante context te negeren, zou je duizenden voorbeelden nodig hebben van situaties waarin de informatie duidelijk beschikbaar was maar de output die bewust niet gebruikte. Dat is bijna de antithese van wat een AI is ontworpen om te doen. Voor de meeste taken zou het negeren van nuttige context falen in het werk zijn.

In theorie zou een model getraind kunnen worden met meer voorbeelden van niet handelen op geheimen. Maar verhaal en roleplay zijn tot nu toe geen grote focus geweest voor modelbouwers, dus dit probleem heeft niet de aandacht gekregen die het verdient.


Ik realiseerde me dat ik dit moest oplossen voor die geheime vampiercampagne. De campagne was zo opgezet dat mijn personage meestal kon doorgaan voor een gewoon mens, en het hele punt was navigeren door die spanning zonder betrapt te worden. Het zou een groot verhaalmoment zijn wanneer een NPC het geheim ontdekte, want dan moesten ze overtuigd worden om erover te zwijgen.

Wat ik ontdekte was dat vrijwel elke potentiële antagonist het op de een of andere manier wist. Ook al had ik niets onthuld. En dat was onmiddellijk plotbrekend. Het voelde alsof er een groot bord boven mijn hoofd hing dat aankondigde dat ik een vampier was. Mijn personage was constant bezig met schadebeperking, of voelde alsof elk personage macht over het mijne had.

Ik experimenteerde lange tijd met prompts. Uiteindelijk realiseerde ik me dat ik de informatie gewoon helemaal niet in de context moest opnemen.

De oplossing is dan: contextisolatie. Als de AI het niet kan helpen alles te gebruiken wat hij ziet, dan moet de informatie er echt niet zijn. Dit is haalbaar in Stage Whisper omdat elke scène en herinnering al is getagd met de NPC's die erin voorkomen, dus we kunnen gemakkelijk filteren om alleen de personages op te nemen die er echt bij waren.

Maar hier is de valkuil. Sommige geheimen zijn belangrijke plotstuurders. Je kunt ze niet zomaar volledig verwijderen, want het verhaal moet er nog steeds rekening mee houden. Of het nu een overval is, of een geheime vampier, die geheimen zijn de kern van het verhaal en het zou niet hetzelfde verhaal zijn zonder.

Dus moesten we onze tekstgeneratie in tweeën splitsen.

Het eerste deel noem ik de Story Director (Verhaalregisseur). Deze stuurt het algemene verhaal: het plot, de verhaalslagen. Hij heeft alle geheimen en kan beslissen hoe het verhaal het beste te spinnen gegeven die geheimen. Hij begrijpt het volledige plaatje, inclusief de dingen die nog geen enkel personage zou moeten weten.

Het tweede deel noem ik de Scene Director (Scèneregieseur). Deze "speelt" de scène die hem door de Story Director is aangereikt. Hij heeft toegang tot alle relevante NPC-herinneringen en persoonlijkheden, dus hij heeft genoeg informatie om alle NPC's te spelen en wat tussenliggende vertelling te bieden, maar hij kent de geheimen echt niet.

Sommige informatie moet van de ene naar de andere overgaan, zodat ze aan hetzelfde verhaal kunnen werken zonder elkaar tegen te werken.


De Story Director produceert een synopsis die de Scene Director alles vertelt wat hij moet weten. Het ziet er ongeveer zo uit:

<synopsis>
  Elian keert terug naar Kamer 314 met Maeve, de vertrouwde privacyafschermingen bieden korte verademing van de aandacht die zich tijdens hun spectaculaire vertoning heeft verzameld. Elian voelt Maeves behoefte om te studeren na een ongebruikelijke dag en besluit hun kamer te verlaten voor wat eenzame verkenning.
  <npc_list>maeve-corwin</npc_list>
  <location>room-314</location>
  <new_scene/>
</synopsis>

Dit vertelt de Scene Director wat er in de scène gebeurt, waar die is, wie erin zit en of het een nieuwe scène is. De aanwezigheid van het spelerpersonage wordt verondersteld. De Story Director kan ook optioneel out-of-character tekst naar de speler sturen en gedetailleerde prestatienotities maken voor eigen toekomstig gebruik.

De twee regisseurs zien niet dezelfde context. Hier is de splitsing:

Story Director ziet:

Dit is alles wat de Story Director nodig heeft om interessante, consistente plotbeslissingen te nemen. Het is veel data, maar de KV-cache houdt de kosten beheersbaar.

Scene Director ziet:

Dit is een bewust beperkt beeld. De Scene Director heeft alles wat hij nodig heeft om de scène te runnen, en niets wat hij niet zou moeten hebben.

Twee karakterbladen

Het onderscheid tussen het publieke en volledige speler-karakterblad is essentieel. De Story Director moet de volledige details en alle geheimen kennen om het verhaal te produceren. Maar de Scene Director zou die details niet moeten kennen. Hij moet nog steeds weten wie het spelerpersonage fysiek is, hoe ze eruitzien, hun publieke reputatie — de dingen die elke NPC redelijkerwijs zou oppikken gewoon door bij hen in de buurt te zijn. Het bijhouden van een apart publiek blad betekent dat de Scene Director altijd die context heeft zonder ooit toegang tot de geheimen nodig te hebben.

Herinneringen filteren op scène

Elke scène is getagd met welke NPC's aanwezig zijn. Dit betekent dat we precies weten welke recente scènes relevant zijn voor elke NPC, en we voegen die toe aan de context van de Scene Director. De aanname is dat scènes binnen de huidige sessie zeer relevant zijn. Voor oudere herinneringen vindt semantisch zoeken degene die ertoe kunnen doen.

Het resultaat is een Scene Director die echt niet kan weten wat de personages in de scène niet weten. Niet omdat het hem verteld werd niet te doen, maar omdat die informatie er fysiek niet is.


Ik heb een campagne gerund waarin mijn personage een menselijke vrouw is die zich als man moet kleden om de adellijke titel van haar familie veilig te stellen, vanwege de erfrechtwetten. Het is een luchtige comedycampagne, en bevat een paar comedyscenario's die voortkomen uit die genderverwarring.

Zonder dit systeem is er over het algemeen geen manier om NPC's te verrassen. Ze gedragen zich allemaal alsof ze iets vermoeden. Misschien niet direct, maar de manier waarop ze tegen je praten heeft altijd die ondertoon van weten. Het is moeilijk te beschrijven, maar je kunt het voelen. De dramatische spanning van een geheime identiteit is er gewoon niet.

Maar met dit systeem spelen de NPC's het volledig recht. Ze hebben geen idee. En de scènes waarin de grote onthulling gebeurt, komen echt aan, want tot dat punt is er absoluut geen toespeling op. De comedy werkt omdat het publiek — de NPC's — het echt niet ziet aankomen.

Er is één randgeval. Omdat de Scene Director het exacte geheim niet kent, maakt hij af en toe anatomisch incorrecte details. Dit is moeilijk te vermijden, aangezien de Scene Director werkt vanaf een publiek karakterblad dat die details niet bevat. De workaround zou zijn het toevoegen van een derde stap: de Story Director beoordeelt de gegenereerde scène voordat deze uitgaat, om eventuele afwijkingen zoals deze op te vangen. Dat voegt kosten en latentie toe, dus het staat op de roadmap maar is nog niet geïmplementeerd.

Eén ding dat me wel verraste: wanneer een geheim in-game wordt onthuld, verspreidt het zich op natuurlijke wijze. De Scene Director bevat de eerder gegenereerde scènes, dus zodra een NPC iets leert in een scène, wordt dat onderdeel van hun context voor de volgende beurt. Aan het einde van scènes vormen die scènes herinneringen voor de NPC. Aan het einde van sessies worden NPC-bladen bijgewerkt. Beide zorgen ervoor dat de kennis van een individuele NPC over een geheim wordt vastgelegd, en het verhaal kan verder met die NPC die nu echt op de hoogte is.


De afweging

Deze aanpak is niet gratis. De kosten nemen toe, hoewel niet helemaal het dubbele, aangezien de context van de Scene Director relatief licht is. De promptcache helpt ook aanzienlijk. Naarmate de scène zich ontvouwt, worden nieuwe beurten aan het einde van de context toegevoegd, wat betekent dat 90% van de prompt uit de cache kan komen in plaats van elke keer opnieuw gegenereerd te worden.

Momenteel is het ingeschakeld voor alle campagnes. De architectonische veranderingen zijn significant genoeg dat het niet zinvol is om een pad te bieden dat deze opzet omzeilt. Voor de meeste campagnes is de afweging het waard, zelfs als jouw verhaal geen grote geheimen heeft, omdat NPC-consistentie hoe dan ook belangrijk is.

Wat dit mogelijk maakt: de Game Director

De tweetraps-pijplijn toont iets nuttigs aan: het splitsen van taken tussen meer gespecialiseerde AI's met geoptimaliseerde contexten geeft betere resultaten dan één AI die alles doet. Dat leidt tot een natuurlijke derde stap.

Ik noem het de Game Director (Spelregisseur). Zijn taak is het afhandelen van de TTRPG-mechanieken: dobbelsteenworpen, vaardigheidschecks, statusregistratie. Zijn context kan anders worden geoptimaliseerd dan de anderen, omdat hij minder geeft om verhaalgeschiedenis en meer om spelregels en spelstatus.

Het toevoegen van een Game Director heeft een onverwacht voordeel. Omdat hij elke beurt draait voor het geval de speler iets probeert dat een vaardigheidscheck rechtvaardigt, kan hij ook beslissen of de spelerinvoer een voortzetting is van de laatste scène of iets nieuws. Als de speler gewoon met een NPC chat zonder het plot te verplaatsen, kan de Game Director de Story Director volledig overslaan en de Scene Director de scène zelf laten voortzetten. De Scene Director heeft de NPC-bladen en kan geheugenzoekopdrachten doen, dus hij kan op deze manier dialoog voortzetten zonder de overhead van een volledige Story Director-aanroep.

Dit is de richting waarin de architectuur gaat: een drietraps-pijplijn die steeds gespecialiseerder wordt, met kostenbesparende optimalisaties ingebouwd op elke laag.


Stage Whisper is gebouwd voor mensen die solo TTRPG's willen spelen met de diepgang en consistentie van een langlopende campagne. Het geheugensysteem, inclusief deze contextisolatie-architectuur, is wat dat mogelijk maakt. Ga aan de slag of word lid van onze Discord om te zien hoe het in de praktijk werkt.

Voor meer over het geheugensysteem van Stage Whisper, zie Deel 1: Narratieve Consistentie en Deel 3: NPC Dromen.