Sådan løser Stage Whisper problemet med 'alvidende NPC'er': Arkitektur for kontekstisolering
NPC'er, der kunne citere noget, min karakter sagde for tre sessioner siden, var ret fedt at se. Hukommelsessystemet virkede. NPC'er henviste til tidligere begivenheder, citerede ting, jeg sagde. MEN det startede også et andet problem: NPC'er begyndte at blive alvidende.
Her er et uddrag fra en nylig session, det relevante er fremhævet:
"Så," siger hun, og hendes stemme bærer let over bladenes raslen, "hvad er den egentlige grund til, at du kom og ledte efter mig? Nysgerrighed, eller prøver du bare at undgå at pakke resten af det kaotiske skrivebord ud?"
Det henviste til noget, der skete i en helt anden scene, som denne karakter ikke var en del af. Karakteren burde ikke have haft nogen mulighed for at vide det.
Små uoverensstemmelser som denne bryder indlevelsen. Men i andre tilfælde kan det ødelægge spillet. For eksempel har jeg en kampagne, hvor min karakter er en hemmelig vampyr, der navigerer i en verden af intetanende mennesker. NPC'er begyndte tilfældigt at antyde, at de kendte min hemmelighed, hvilket pludselig gjorde det meget svært for mig at komme igennem dagen uden at blive mistænkt. Eller i andre eksempler: Hvis jeg stjal en artefakt under et kup, og en uvedkommende karakter derefter kommer med mistænkelige kommentarer.
AI'en besluttede simpelthen at bruge alle tilgængelige hemmeligheder i konteksten til dramatisk effekt, hvilket egentlig kun burde ske meget lejlighedsvis af plothænsyn.
Så hvorfor kan jeg ikke bare bede AI'en om at lade være?
Problemet er, at du prøver at opnå en negation. "Brug ikke denne information." Det er en fundamentalt anderledes og meget sværere opgave end den positive udgave: brug den information, der er der. For at træne en model til at ignorere relevant kontekst ville du have brug for tusindvis af eksempler på situationer, hvor informationen tydeligvis var tilgængelig, men outputtet bevidst ikke brugte den. Det er nærmest antitesen til det, en AI er designet til at gøre. I de fleste opgaver ville det at ignorere nyttig kontekst være at fejle i sit arbejde.
Man kunne forestille sig, at en model kunne trænes med flere eksempler på ikke at handle på hemmeligheder. Men fortælling og rollespil har indtil videre ikke været et stort fokus for modelskabere, så dette problem har ikke fået den opmærksomhed, det fortjener.
Jeg indså, at jeg var nødt til at løse dette i den hemmelige vampyrkampagne. Kampagnen var sat op, så min karakter kunne udgive sig for at være et almindeligt menneske det meste af tiden, og hele pointen var at navigere i den spænding uden at blive opdaget. Det ville være et stort narrativt øjeblik, når en NPC fandt ud af hemmeligheden, for så skulle de overtales til at tie stille om den.
Det, jeg opdagede, var, at stort set alle potentielle antagonister på en eller anden måde vidste det. Selvom jeg ikke havde afsløret noget. Og det ødelagde straks plottet. Det føltes, som om der var et stort skilt over mit hoved, der bekendtgjorde, at jeg var vampyr. Min karakter var konstant i gang med skadesbegrænsning eller følte, at alle karakterer havde noget på min.
Jeg eksperimenterede med prompts i lang tid. Til sidst indså jeg, at jeg var nødt til slet ikke at inkludere informationen i konteksten.
Løsningen er derfor kontekstisolering. Hvis AI'en ikke kan lade være med at bruge alt, hvad den ser, så må informationen helt konkret ikke være der. Dette kan lade sig gøre i Stage Whisper, fordi hver scene og hvert minde allerede er tagget med de NPC'er, der optræder i dem, så vi nemt kan filtrere og kun inkludere de karakterer, der faktisk var til stede.
Men her er hagen. Nogle hemmeligheder er store plotdrivere. Man kan ikke bare slette dem helt, for historien skal stadig tage højde for dem. Uanset om det er et kup eller en hemmelig vampyr, er disse hemmeligheder centrale for fortællingen, og det ville ikke være den samme historie uden dem.
Så vi var nødt til at opdele vores tekstgenerering i to dele.
Den første del kalder jeg Story Director. Den styrer den overordnede historie: plottet, de narrative beats. Den har alle hemmelighederne og kan beslutte, hvordan historien bedst kan udformes givet disse hemmeligheder. Den forstår det fulde billede, herunder de ting, ingen karakter burde kende endnu.
Den anden del kalder jeg Scene Director. Den "udspiller" den scene, den får overleveret af Story Director. Den har adgang til alle relevante NPC-minder og personligheder, så den har nok information til at spille alle NPC'erne og levere noget mellemliggende fortælling, men den kender oprigtigt ikke hemmelighederne.
Noget information skal overføres fra den ene til den anden, så de kan arbejde på den samme historie uden at modarbejde hinanden.
Story Director producerer en synopsis, der fortæller Scene Director alt, hvad den har brug for at vide. Den ser nogenlunde sådan her ud:
<synopsis>
Elian vender tilbage til værelse 314 med Maeve, hvor de velkendte privatlivsbeskyttelser giver et kort pusterum fra den opmærksomhed, der samlede sig under deres spektakulære opvisning. Da Elian fornemmer, at Maeve har brug for at studere efter en usædvanlig dag, beslutter han at forlade deres værelse for at udforske på egen hånd
<npc_list>maeve-corwin</npc_list>
<location>room-314</location>
<new_scene/>
</synopsis>
Dette fortæller Scene Director, hvad der foregår i scenen, hvor den finder sted, hvem der er med, og om det er en ny scene. Spillerkarakterens tilstedeværelse antages. Story Director kan også valgfrit udsende out-of-character-beskeder til spilleren og lave detaljerede præstationsnoter til eget fremtidigt brug.
De to directors ser ikke den samme kontekst. Her er opdelingen:
Story Director ser:
- fulde kampagnefiler, herunder spilledernoter, sessionsplan, kampagneopsætning og aktuel kampagnestatus
- det fulde spillerkarakterark, herunder alle hemmeligheder
- en liste over alle NPC'er, lokationer og baggrundsviden
- sessionsreferater og opsummeringer
- hele historikken for de seneste to scener
Dette er alt, hvad Story Director har brug for for at træffe interessante, konsistente plotbeslutninger. Det er mange data, men KV-cachen holder omkostningerne overskuelige.
Scene Director ser:
- delvise kampagnefiler uden spilledernoterne
- den offentlige version af spillerkarakterarket, som udelader eventuelle hemmeligheder, men stadig indeholder fysisk udseende og offentligt omdømme — hvad en typisk NPC med rimelighed ville vide
- resuméer af de sidste scener, NPC'erne faktisk var med i
- lokationsdetaljer
- de seneste minder, hver NPC eventuelt har
- synopsen fra Story Director
Dette er et bevidst reduceret overblik. Scene Director har alt, hvad den har brug for til at køre scenen, og intet, den ikke burde have.
To karakterark
Skellet mellem det offentlige og det fulde spillerkarakterark er afgørende. Story Director har brug for at kende de fulde detaljer og alle hemmeligheder for at producere historien. Men Scene Director bør ikke kende disse detaljer. Den har stadig brug for at vide, hvem spillerkarakteren er fysisk, hvordan de ser ud, deres offentlige omdømme, de ting, enhver NPC med rimelighed ville opfange bare ved at være omkring dem. Ved at vedligeholde et separat offentligt ark har Scene Director altid denne kontekst uden nogensinde at skulle have adgang til hemmelighederne.
Filtrering af minder efter scene
Hver scene tagges med, hvilke NPC'er der er til stede. Det betyder, at vi præcis ved, hvilke nylige scener der er relevante for hver NPC, og vi tilføjer dem til Scene Directors kontekst. Antagelsen er, at scener inden for den aktuelle session er meget relevante. For ældre minder finder semantisk søgning dem, der kunne betyde noget.
Resultatet er en Scene Director, der oprigtigt ikke kan vide ting, som karaktererne i scenen ikke ved. Ikke fordi den fik besked på at lade være, men fordi den information fysisk ikke er der.
Jeg har kørt en kampagne, hvor min karakter er en menneskelig kvinde, der er nødt til at klæde sig som en mand for at sikre sin families adelstitel på grund af arvereglerne. Det er en munter komediekampagne, og den byder på et par komediescenarier, der udspringer af denne kønsforvirring.
Uden dette system på plads er der generelt ingen måde at overraske NPC'er på. De opfører sig alle, som om de aner noget. Måske ikke direkte, men måden, de taler til dig på, har altid dette snert af viden. Det er svært at beskrive, men man kan mærke det. Den dramatiske spænding ved en hemmelig identitet er der bare ikke.
Men med dette system på plads spiller NPC'erne det helt ligeud. De har ingen anelse. Og de scener, hvor den store afsløring finder sted, rammer virkelig, fordi der indtil da slet ikke er nogen hentydning til det. Komedien virker, fordi publikum, NPC'erne, oprigtigt ikke ser det komme.
Der er ét grænsetilfælde. Fordi Scene Director ikke kender den nøjagtige hemmelighed, laver den lejlighedsvis anatomisk ukorrekte detaljer. Det er svært at undgå, da Scene Director arbejder ud fra et offentligt karakterark, der ikke indeholder disse detaljer. Løsningen ville være at tilføje et tredje trin: Story Director gennemgår den genererede scene, før den sendes ud, for at fange uoverensstemmelser som denne. Det tilføjer omkostninger og latenstid, så det er på køreplanen, men endnu ikke implementeret.
Én ting, der overraskede mig: Når en hemmelighed først afsløres i spillet, breder den sig naturligt. Scene Director har de tidligere genererede scener, så når en NPC lærer noget i en scene, bliver det en del af deres kontekst til næste tur. Ved slutningen af scener danner disse scener minder for NPC'en. Ved slutningen af sessioner opdateres NPC-arkene. Begge dele betyder, at en individuel NPC's kendskab til en hemmelighed bliver registreret, og historien kan fortsætte med, at den NPC nu oprigtigt er indviet.
Afvejningen
Denne tilgang er ikke gratis. Omkostningerne stiger, dog ikke helt til det dobbelte, da Scene Directors kontekst er relativt let. Promptcachen hjælper også betydeligt. Efterhånden som scenen udspiller sig, føjes nye ture til slutningen af konteksten, hvilket betyder, at 90 % af prompten kan komme fra cachen i stedet for at blive regenereret fra bunden hver gang.
I øjeblikket er det aktiveret for alle kampagner. De arkitektoniske ændringer er betydelige nok til, at det ikke giver mening at tilbyde en vej, der omgår denne opsætning. For de fleste kampagner er afvejningen det værd, selv hvis din historie ikke har store hemmeligheder, for NPC-konsistens betyder noget uanset hvad.
Hvad dette åbner for: Game Director
To-trins-pipelinen demonstrerer noget nyttigt: At opdele opgaver mellem mere specialiserede AI'er med optimerede kontekster giver bedre resultater end én AI, der gør alt. Det fører naturligt til et tredje trin.
Jeg kalder det Game Director. Dens opgave er at håndtere bordrollespilsmekanikkerne: terningslag, færdighedstjek, statussporing. Dens kontekst kan optimeres anderledes end de andres, da den bekymrer sig mindre om narrativ historie og mere om spilregler og spiltilstand.
Tilføjelsen af en Game Director har en uventet fordel. Da den kører hver tur, i tilfælde af at spilleren prøver noget, der kræver et færdighedstjek, kan den også afgøre, om spillerens input er en fortsættelse af den sidste scene eller noget nyt. Hvis spilleren bare chatter med en NPC uden at bevæge plottet, kan Game Director springe Story Director helt over og lade Scene Director fortsætte scenen på egen hånd. Scene Director har NPC-arkene og kan foretage hukommelsessøgninger, så den kan føre dialog videre på denne måde uden det fulde overhead af et Story Director-kald.
Det er den retning, arkitekturen bevæger sig i: en tre-trins-pipeline, der bliver gradvist mere specialiseret, med omkostningsbesparende optimeringer indbygget i hvert lag.
Stage Whisper er bygget til mennesker, som vil spille solo-bordrollespil med dybden og sammenhængen fra en langvarig kampagne. Hukommelsessystemet, herunder denne arkitektur for kontekstisolering, er det, der gør det muligt. Kom i gang, eller deltag på vores Discord for at se, hvordan det fungerer i praksis.
Læs mere om Stage Whispers hukommelsessystem i Del 1: Narrativ sammenhæng og Del 3: NPC-drømme.