包办的问题:一个模型站在了太多位置上

设想一个示意场景:一座小镇里有面包师、卫兵和一位神秘的旅人,玩家在广场上同时和三个人说话。如果由同一个模型、同一段提示词扮演三个人,加上决定剧情走向,加上判断玩家能不能拿走货架上的东西,会出现几类典型问题。

  • 角色串味:面包师突然带上了卫兵的口头禅,因为两个人的设定在同一个上下文里互相渗透。
  • 规则被改写:为了让对话“好看”,模型顺手让玩家白拿了一个本来需要付钱的面包,规则就此失守。
  • 状态不一致:卫兵在上一段说自己没见过旅人,下一段却提起旅人的名字,因为没有一个地方把“谁知道什么”当作状态记下来。
  • 长期遗忘:三个月前的约定,在上下文里早就被挤出去了,也没有其他地方保存。

这些问题不完全是模型能力不够,而是职责混在一起。所以我们的判断是:把不同类型的工作拆开,各由一个更窄的角色负责,让每一个角色更容易被约束和检查。

先看状态:四类数据分别归谁

按照“数据与状态类型 → 模型分工 → 接口 → 边界”的顺序,先明确有哪些状态。

状态 举例(示意) 主要读写者
人物状态 性格锚点、当前情绪、个人目标、对他人的印象 Character Agent
剧情状态 已完成的关键节点、未回收的伏笔、当前节奏 Narrative Director
世界状态 地点、时间、资源、谁在哪、谁知道什么World Simulator
长期记忆事件、事实、关系的历史条目 Memory System

这张表的核心是“谁有权写”。每一类状态只有一个主要的写入者,其他角色只能读取,或者提交修改建议。这样一旦出现矛盾,就能沿着写入者去追责,而不是在一段混杂的文字里猜哪里出了问题。

四个角色各做什么

Character Agent(人物):每个重要人物一个。输入是当前场景、检索到的相关记忆、对话对象与自身目标;输出是这个人物此刻的意图、台词与行为提案。它不决定世界里发生什么,只决定“我想做什么、想说什么”。它的详细工作步骤,可以看AI角色工作流

Narrative Director(剧情):输入是剧情状态与玩家的行为;输出是节奏调整、事件触发与对角色的“舞台指示”,比如提示某个人物此刻应当出现。它守护主题、伏笔与不可破坏的节点。它并不亲自写台词,而是约束和触发,这一点与导演层如何约束剧情一脉相承。

World Simulator(世界):输入是各方提交的动作提案;输出是这些动作在世界规则下的结果。谁能拿到东西、门是否能打开、时间前进多少,都由它结算。它是规则的执行者,不追求好看,追求一致。

Memory System(长期状态):负责写入、检索、整合与遗忘,向其他三者提供“该记得的事”。它不参与生成,只提供依据,并在写入前做一致性检查。

接口:提案,而不是直接改写

多个Agent协作的关键不在于谁更聪明,而在于它们之间怎么说话。我们倾向于一个简单原则:提案—校验—提交

  1. Character Agent提出“我打算做什么”,例如面包师打算把面包递给玩家。
  2. Director检查这个动作是否与当前剧情节奏相冲突,比如此刻是否应该让面包师被卫兵打断。
  3. World Simulator检查资源与规则,比如玩家是否付了钱、面包师是否在货架旁。
  4. 仲裁环节汇总意见,决定采纳、修改还是打回,写入世界状态。
  5. Memory System记录这一轮里值得记住的事件。

各方不直接改写彼此的状态,只提交提案。仲裁的优先级可以这样示意:世界规则高于剧情需要,剧情需要高于角色一时的想法,角色的想法又高于纯粹的措辞偏好。当冲突出现时,被打回的一方会得到明确的理由,可以据此重新提案,而不是硬生生地被覆盖。

用一个冲突走一遍仲裁

再举一个示意的冲突。玩家想赊账拿走面包,面包师根据“心软”的性格,倾向于答应;Director发现这一幕本应由卫兵闯入打断,希望把交易推迟;World Simulator则判断,玩家身上没有足够的钱,赊账在当前规则下需要面包师对玩家有足够的信任。三方提案互相牵制。仲裁的结果可能是:赊账成立,但只限一个,并在面包师的记忆里留下一条“玩家欠了我一个面包”的事件,卫兵的闯入照常发生,并把话题引向这笔账。三个提案各自保留了一部分,谁也没有被彻底覆盖,而这条欠账还会在后面的剧情里成为一个可以回收的伏笔。

分工的成本,以及什么时候可以不分

多Agent协作并不便宜,需要认真讲清楚。

  • 调用更多、延迟更长:一次交互要经过多个环节。缓解办法是让不同环节用不同规模的模型,规则能解决的部分不调用模型。
  • 接口要维护:提案格式、状态字段、优先级规则都是需要长期维护的约定,改动一处可能牵动多处。
  • 仲裁本身会出错:优先级写死过于僵硬,写得太软又无法收敛,需要在回放里反复检查。
  • 不是每个NPC都需要一整套:路人、背景角色可以用轻量规则与模板,只有主要人物才启用完整的Character Agent;模拟人生这类大规模场景,更需要按活跃程度分层,这部分可以看虚拟社会的规模化与人物分层

一个务实的做法是从最小可用开始:先把世界规则与状态独立出来,再把导演与角色分开,最后才引入更细的仲裁。每一步都能带来可验证的收益,就继续拆;看不出收益,就不必为了架构好看而拆。

一个仍然开放的问题

分工解决了很多混杂造成的问题,却也带来新的难题。比如,角色的“想法”被仲裁打回时,角色的表现要如何自然地过渡,而不显得突兀?导演层过于强势时,角色会不会被推着走,失去自主性?多个角色的记忆共享到什么程度,才能既保证世界一致,又不让角色知道自己不该知道的事?这些问题目前没有一劳永逸的答案,需要在具体玩法里反复试验与回放校准。评估时也不能只看单次表现,更要看长时间运行后,是否仍然没有出现串味与状态漂移,这需要专门的回放与检查手段,而不是凭几次试玩的印象。

边界说明:本文所述的角色划分、接口与优先级,均是大发娱乐AI在设计层面的示意,并不代表某个已发布系统的实际配置。文中的小镇、面包师与卫兵为虚构举例。

小结

一个大模型也许写得出所有NPC的台词,但写得出不等于靠得住。让人物、剧情、世界、记忆各有归属,用提案与仲裁连接它们,才能让每一处矛盾都有迹可循。分工不是越细越好,而是让每个角色只对自己能负责的那部分状态负责,出了问题时,也能明确指出是哪一个环节需要修正。