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>
这告诉场景指导场景中发生了什么,在哪里,谁在其中,以及是否是新场景。玩家角色的存在是假定的。故事指导还可以可选地向玩家发出非角色扮演对话,并为自己将来使用做出详细的表演笔记。
两位指导看到的不是同一个上下文。以下是划分:
故事指导看到:
- 完整的冒险文件,包括 GM 笔记、会话计划、冒险设置和当前冒险状态
- 完整的玩家角色卡,包括所有秘密
- 所有 NPC、地点和知识库的列表
- 会话概要和摘要
- 最近两个场景的完整历史
这是故事指导做出有趣且一致的情节决策所需的一切。这是很多数据,但 KV 缓存使成本保持可控。
场景指导看到:
- 没有 GM 笔记的部分冒险文件
- 玩家角色卡的公开版本,省略了任何秘密,但包括外貌和公开声誉,即普通 NPC 合理知道的事情
- NPC 实际参与的最后几个场景的概要
- 地点详情
- 每个 NPC 可能有的最近几点记忆
- 故事指导的摘要
这是一个刻意简化的视图。场景指导拥有运行场景所需的一切,以及不应该有的东西。
两套角色卡
公开与完整玩家角色卡的区分是关键。故事指导需要知道完整细节和所有秘密来创作故事。但场景指导不应该知道这些细节。它仍然需要知道玩家角色的身体状况、外貌、公开声誉,任何 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 梦境。