为什么一句回复不够

先看一个示意场景。玩家走进旅馆,对老板阿岚说:“上次你提过的那把旧钥匙,我找到线索了。”如果系统只把这句话连同最近几轮聊天丢给模型,模型多半会写出一句得体的回应,比如“真的吗?快说说看”。这句话本身没有错,问题在于它没有任何依据:阿岚到底提没提过钥匙?她对玩家是信任还是提防?这把钥匙在世界里是不是早就丢了?

我们的判断是,AI角色不应只生成一句回复,而应先知道自己是谁、记得什么、现在想做什么,再决定说什么。这个思路对应的正是Character Agent的工作流。下面把它排成九步,每一步给出输入、输出,并标出出错点,读完就能明白为什么不建议让一个提示词包办全部。

九步流程总览

  1. 接收输入:玩家的文字、语音转写或操作,附带时间与场景。
  2. 意图理解:判断玩家想做什么,是提问、承诺、试探、玩笑,还是想执行世界内的动作。
  3. 记忆检索:从事件记忆、事实记忆、关系记忆里取回与此相关的少量条目。
  4. 关系状态读取:当前信任、亲近程度、最近的情绪起伏、未解决的矛盾。
  5. 世界状态核对:地点、物品、时间、谁知道什么,检查玩家所说是否与世界一致。
  6. 角色目标判断:此刻角色自己想要什么,是帮助、观察、隐瞒还是结束对话。
  7. 行动规划:在目标与规则的约束下,选出接下来要做的动作或话题。
  8. 对话与行为生成:按人设的语气、口头习惯写出台词与动作。
  9. 记忆更新:把这一轮里真正重要的东西写回记忆与状态,其余丢弃或压缩。

这九步并不意味着每次交互都要调用九次大模型。轻量的步骤可以用规则或小模型完成,只有最需要语言理解和表达的环节才交给大模型。哪些步骤合并、哪些拆开,是成本与质量之间的权衡,不同玩法的取舍也不同。

前四步:听懂、想起、定位

接收输入看似最简单,实际上要做两件事:清洗和绑定。清洗是去掉口误与重复;绑定是把这句话绑定到具体的场景和对象上,比如“他”指的是谁。如果绑定错了,后面所有步骤都建立在错误的对象上。

意图理解输出的不是一个标签,而是一个带置信度的解释列表。玩家说“我找到线索了”,可能是真的汇报,也可能是虚张声势。意图不明确时,更稳妥的做法是让角色以符合人设的方式追问,而不是硬猜。

记忆检索是整条链里最容易被低估的一环。检索的条件不只是文字相似,还包括时间、参与者和重要度。阿岚有没有提过旧钥匙,靠的是把“钥匙”与“阿岚说过”这类事件条目匹配起来,而不是翻聊天记录。检索一次只取少数几条,太多会稀释注意力,太少会漏掉关键旧事。

关系状态读取给后面的语气定调。同样一句“我找到线索了”,在信任度高时阿岚会直接追问细节,在刚发生过争执时会先冷淡一句。关系状态应当是一份结构化的小档案,而不是模型临场从聊天里猜。关于这些记忆怎样被存取与遗忘,可以看长期记忆为什么不是无限聊天记录

中间三步:世界、目标与规划

世界状态核对负责挡住“说得通但不成立”的东西。阿岚说旧钥匙在阁楼,可世界状态里阁楼已被封死;如果不核对,角色就会向玩家指一条不存在的路。这一步的输出是一份“允许与不允许”的清单,供后两步引用。

角色目标判断是让角色显得有主见的关键。目标不需要复杂,一两条就够:阿岚想保护旅馆的秘密,同时又想弄清玩家的来意。目标会随事件变化,也可以被玩家的行为推动,但不应被玩家一句话轻易覆盖。没有目标的角色,只会被动应答,长期看就是一个话多的问答机器。

行动规划把上面几项合到一起:在目标、关系、世界约束下,选一个动作。它的输出应当是结构化的,比如“先试探,不透露钥匙下落,但给出一个可以继续追问的线索”,而不是直接输出台词。让规划与表达分开,好处是规划可以被校验,表达可以被替换。

三步之间的一个常见陷阱

这三步最怕互相越界。世界核对如果被模型“顺手”改写,等于让角色可以凭空编造设定;目标判断如果每一轮都被玩家的最后一句话覆盖,角色就没有连续性;规划如果直接输出台词,校验就无从下手。所以更合理的做法是让每一步只读上游、只写自己的那份输出,出了问题也能一眼看出是哪一步。

后两步:表达与写回

对话与行为生成才是玩家看到的部分。这里的核心约束是人设稳定:口头习惯、用词、情绪强度都应当落在角色的锚点之内。如果规划说“试探”,表达就不应变成热情邀请。这一步的失败往往表现为“说的话很好听,但不像她”。

记忆更新是最后一步,也是最容易被忽略的一步。它要回答三个问题:这一轮有没有值得记住的事件,有没有需要更新的关系,有没有需要修改的事实。玩家随口开的玩笑,不该被当作重大承诺存下来;玩家郑重说出的约定,则应当被标为高重要度并加以保护。写回如果太随意,错误会在下一轮被当成事实读出来,越滚越大。

出错点对照表

环节典型出错 后果 常用校验或降级办法
意图理解 把玩笑当承诺,或反之关系与目标被错误推动低置信度时追问,不直接写入
记忆检索 漏掉关键旧事,或取回过时条目 角色忘事、或重复自我介绍 检索结果带时间与来源,冲突时以最新且已确认的为准
关系状态 沿用旧的情绪,忽略最近事件语气与当下不符 关系状态带时间戳,超时自动回落到基线
世界核对角色提到不存在的物品或路线 玩家被误导,剧情矛盾 引用的实体必须在世界状态里存在
行动规划 与角色目标或规则冲突 角色突然变得不像自己 规划先过规则检查,再进入表达
记忆更新把一时情绪写成长期事实 错误被反复读取写入前评估重要度,不确定的先存为待确认

这张表里的“后果”都是示意性的判断,不是统计结论。它的用途是提醒团队和读者:出错往往不是发生在最后的那句台词上,而是发生在更靠前的某个状态里,回复只是把它暴露出来。

校验、降级,以及边界

每一步之后都应当有一个廉价的校验,不通过就降级,而不是硬着头皮往下走。降级的方式有几种:意图不明就追问;检索没命中就让角色坦承“我记不太清了”,而不是编一段往事;世界核对不通过就换一个在世界内成立的说法。让角色承认自己不确定,反而比一本正经地说错更接近一个真实的人。

工作流还需要与更大的结构配合。单个角色的九步,是放在导演层、世界规则和记忆系统之下运行的,这部分分工可以看Character Agent与Director的分工。记忆写入、检索与遗忘的流水线,则在游戏大模型的记忆系统里有更完整的说明。

边界说明:这篇文章描述的是大发娱乐官网所采用的设计思路,文中的旅馆老板阿岚和钥匙都是示意角色,步骤数与顺序也不是唯一答案。具体产品能力以App内说明为准。角色不是真人,不替代现实关系;玩家应始终能调整角色的主动频率,查看、编辑或删除被记住的内容。

一个可以拿去检查的清单

如果想判断一个AI角色系统是不是真的有工作流,而不只是一个提示词,可以问这几个问题:

  • 它回复之前,有没有一份可以被查看的“检索到的记忆”?
  • 关系状态是结构化保存,还是每次靠模型从聊天里重新猜?
  • 角色有没有自己的目标,并且目标能随事件变化?
  • 玩家说了一件世界里不成立的事,角色会怎么处理?
  • 一轮对话之后,系统写回了什么,又丢弃了什么?

这五个问题里只要有两三个答不上来,多半说明角色只是在“生成一句回复”。反过来,能一条条答上来,才说明它知道自己是谁、记得什么、现在想做什么。