Stage Whisper 如何解決「全知 NPC」問題:上下文隔離架構

NPC 能夠引用我的角色三個會話前說的話,這確實很酷。記憶系統正在運作。NPC 正在引用過去的事件,引用我說過的話。但是,這也開啟了一個不同的問題:NPC 開始變得全知全能。

以下是來自最近一個會話的一段摘錄,相關部分已標註:

「所以,」她說,聲音輕鬆地飄過樹葉的沙沙聲,「你來找我的真正原因是什麼?好奇心,還是你只是試圖避免整理你那張混亂書桌的其餘部分?」

那是在引用一個發生在完全不同的場景中的事情,而這個角色並不在場。這個角色應該完全不可能知道。

像這樣的小不一致是破壞沉浸感的。但在其他情況下,它可能是破壞遊戲的。例如,我有一個冒險,我的角色是一個在毫無戒心的人類世界中航行的秘密吸血鬼。NPC 開始隨口暗示他們知道我的秘密,這突然讓我的一天變得非常難以度過而不被懷疑。或者在其他例子中,如果我偷了一件神器,玩家是在一場搶劫中偷了神器的人,然後一個不相關的角色做出了可疑的評論。

AI 基本上決定使用上下文中任何可用的秘密來營造戲劇效果,而這實際上只應該在非常偶爾的情況下為劇情原因而發生。

那麼,為什麼我不能直接告訴 AI 不要這樣做?

問題在於你試圖實現一個否定。「不要 使用這個資訊。」這是一個與正面案例根本不同且更難的任務: 使用可用的資訊。為了訓練一個模型忽略相關上下文,你需要數千個資訊明顯可用但輸出刻意不使用它的情境範例。這幾乎是 AI 被設計來做什麼的對立面。對於大多數任務來說,忽略有用的上下文將是工作的失敗。

可以想像,一個模型可以被訓練成有更多不依據秘密行動的範例。但到目前為止,敘事和角色扮演並不是模型創造者的主要關注點,所以這個問題尚未得到應有的關注。


我意識到我必須在那個秘密吸血鬼冒險中修復這個問題。這個冒險的設定是讓我的角色大部分時間能夠偽裝成一個普通人,而整個重點是在不被發現的情況下應對這種緊張關係。當任何 NPC 發現這個秘密時,那將是一個重大的敘事時刻,因為之後需要說服他們對此事保持沉默。

我發現的是,幾乎每個潛在的對手都莫名其妙地知道。即使我沒有透露任何東西。而這立即破壞了劇情。感覺就好像我頭頂上有一個巨大的標誌,宣布我是一個吸血鬼。我的角色不斷在進行損害控制,或感覺每個角色都能對我施加影響力。

我花了很長時間實驗提示詞。最終我意識到我必須乾脆不將這些資訊包含在上下文中。

因此,解決方案是上下文隔離。如果 AI 無法避免使用它看到的一切,那麼資訊確實就不能在那裡。這在 Stage Whisper 中是可以實現的,因為每個場景和記憶已經標記了出現在其中的 NPC,所以我們可以輕鬆地過濾,只包含確實在那裡的角色。

但這裡有個陷阱。有些秘密是主要的情節驅動力。你不能直接刪除它們,因為故事仍然需要考量它們。無論是一場搶劫,還是一個秘密吸血鬼,那些秘密是敘事的核心,沒有它們就不會是同一個故事。

所以我們必須將文字生成一分為二。

第一部分我稱之為故事指導。它指導整體故事:情節、敘事節拍。它擁有所有的秘密,並可以決定如何最佳地圍繞這些秘密編織故事。它理解全貌,包括沒有任何角色應該知道的事情。

第二部分我稱之為場景指導。它「演繹」故事指導交給它的場景。它可以訪問所有相關的 NPC 記憶和人格,因此它有足夠的資訊來扮演所有 NPC 並提供一些間歇性旁白,但它真的不知道那些秘密。

有些資訊需要從一個傳遞到另一個,以便它們能夠在同一個故事上工作而不會互相矛盾。


故事指導產生一個摘要,告訴場景指導它需要知道的一切。它看起來像這樣:

<synopsis>
  Elian 與 Maeve 一起返回 314 號房間,熟悉的隱私結界為他們在精彩表演中聚集的注意力提供了短暫的喘息。感應到 Maeve 在不尋常的一天後需要學習,Elian 決定離開房間進行一些獨自探索
  <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 做所有事情,能給出更好的結果。這導致了一個自然的第三階段。

我稱之為遊戲指導。它的工作是處理 TTRPG 機制:投骰、技能檢定、狀態追蹤。它的上下文可以與其他的不同地進行最佳化,因為它較少關心敘事歷史,而更多關心遊戲規則和遊戲狀態。

添加遊戲指導有意想不到的好處。由於它每一回合都運行,以防玩家嘗試需要技能檢定的事情,它還可以決定玩家輸入是上一個場景的延續還是新的東西。如果玩家只是在跟一個 NPC 聊天而沒有推動情節,遊戲指導可以完全跳過故事指導,讓場景指導自行繼續場景。場景指導擁有 NPC 角色卡,可以進行記憶搜尋,因此它可以像這樣繼續對話,而無需完整故事指導呼叫的開銷。

這就是架構發展的方向:一個逐漸變得更專業化的三階段管線,在每一層都內建了節省成本的最佳化。


Stage Whisper 是為那些想要以長篇冒險的深度和一致性來玩單人 TTRPG 的人而打造的。記憶系統,包括這個上下文隔離架構,是使之成為可能的東西。開始使用加入我們的 Discord 來親身體驗它的實際運作。

更多關於 Stage Whisper 記憶系統的內容,請參閱第一部分:敘事一致性第三部分:NPC 做夢