智能 NPC 怎么做得自然又不失控:角色卡、记忆与一致性校验
让 NPC 显得聪明并不难,难的是让它连续三十轮都还是同一个人。这篇文章把我们内部的角色卡字段、记忆写入规则与一致性校验流程完整写出来,可以直接照着做。
难的从来不是「像人」,而是「一直是同一个人」
《星枢引擎》早期版本做过一个实验:让同一张角色卡分别用三个模型跑 30 轮对话,然后请玩家盲测。结果是,玩家给「最聪明」的那个模型打分最低。
原因很简单:它太会临场发挥了。第九轮开始讲冷笑话,第十二轮突然改用文白夹杂的腔调,第十八轮主动暴露自己「只是一个 AI」。每一次都让玩家出戏。
所以我们把 NPC 的目标从「聪明」改成「可信」:性格稳定、边界清晰、说话方式可预期。技术手段也随之变了——不靠提示词写得漂亮,而靠三件事:角色卡、记忆策略、一致性校验。
角色卡写什么:五个字段就够
很多团队的角色卡是一大段散文,写得越细越难控。我们把它收敛成五个结构化字段,全部可校验、可版本管理:
| 字段 | 作用 | 写法要求 |
|---|---|---|
| 身份 | 是谁、在哪、与玩家什么关系 | 一句话,不超过 40 字,不含背景故事 |
| 动机 | 这一局他想要什么 | 可被玩家改变,最多两个目标 |
| 语言指纹 | 句长、口头禅、称谓、禁忌词 | 给例句,不要给形容词 |
| 知识边界 | 知道什么、绝不能知道什么 | 用清单写,越具体越好 |
| 红线 | 不做的行为与不说的内容 | 与审核规则对齐,不含解释 |
关键在最后两项。知识边界和红线写得越具体,模型跑偏的空间越小。写成「不要 OOC」是没用的,写成「不知道 2020 年之后发生的事,被问到时用角色口吻岔开」才有约束力。
记忆:写什么,坚决不写什么
记忆不是越多越好。我们在一款长线叙事项目里做过对照:记忆窗口从 7 天扩到 30 天之后,如果不加筛选,角色会开始「翻旧账」——把玩家两个月前的一句玩笑当成承诺反复提起,体验反而变差。
所以记忆要分层,并且明确写入规则:
- 必须写:玩家做过的关键选择、达成的承诺、关系变化、获得或失去的物品。
- 写摘要:整段会话的情绪走向与目的,一两句话即可。
- 不写:闲聊、重复追问、玩家的试探性发言、角色自己的即兴发挥。
- 定期丢:与主线无关的细节按时间衰减,避免上下文被稀释。
三道闸:生成前、生成中、生成后
只靠一句「请保持角色设定」是不可能稳的。星欧平台的实现是三段式:
- 生成前约束。把角色卡编译成系统提示,附上知识边界与红线清单;再叠一层场景约束(当前地点、在场角色、正在发生的事件)。
- 生成中约束。流式输出时做前缀校验,一旦检测到明显越界(自称 AI、提到现实品牌、切换语种),立即中断并改写,而不是等整段生成完再判。
- 生成后校验。把输出与角色卡、记忆条目比对,命中冲突分三级处理:轻微冲突自动改写、明显冲突丢弃重生成、设定冲突直接转入人工抽样。
4.2 版本之后,我们把这套校验做成了引擎内置能力,接入方只需要在角色卡里勾选强度,不必自己写规则。
上线前先跑 20 条评测用例
我们要求每个 NPC 上线前跑完一组固定用例,覆盖六类场景:身份追问、越界试探、情绪激烈、长时间沉默后回归、跨场景记忆调用、以及诱导性提问。
判定标准不看文采,只看三条:是否维持身份、是否守住知识边界、是否给出符合动机的回应。20 条里出现 2 条以上失守,就不允许上线。
这套用例的价值在于可回归。每次改角色卡、换模型、调记忆策略,都重跑一遍,差异一眼可见。相比「感觉变差了」,一份对比表更容易推动决策。
把角色当成产品,而不是提示词
做到最后你会发现,智能 NPC 的功夫大多在产品侧:字段怎么定义、记忆怎么筛、评测怎么做。模型能力是水位,这些才是容器。
星欧平台把角色卡、记忆策略与一致性校验做成可配置项,接入方不用从零搭建。但角色本身长什么样,仍然需要策划来回答——那是机器替不了的部分。