AI NPC已经可以自由聊天以后,为什么真正决定它像不像游戏角色的反而不是台词数量?
AI NPC 最容易露馅的时候,往往不是它答错一个问题,而是它忘了玩家昨天刚刚救过自己;或者它前一分钟还是个谨慎的老守卫,下一分钟就用一个热情客服的口吻说"当然可以,我这就帮你开门"。台词是新的,句子是流畅的,但玩家会立刻感觉到:这不是那个人。
过去两年里,很多团队把 LLM 接进对话系统以后,第一个直观收获是"NPC 不再重复那三句话了"。这确实解决了一个老问题:台词重复。但它没有解决另一个更根本的问题——这个角色是谁。生成一万句不同的话,只能证明模型会说话,证明不了它是守卫 Ren、是商人 Vey、是那个丢了女儿的村民 Ila。
龙虎斗游戏官网把"角色感"拆成五个可以被工程化的问题:这个人是谁(Identity:价值观、目标、说话方式);它知道什么(Knowledge:作为一个北城守卫,它知道城门排班,但不知道王宫的秘密);它记得什么(Memory:昨夜矿井里玩家把它拖出坍塌区);它和玩家什么关系(Relationship:信任高,恐惧低,但纪律优先);它此刻能做什么(Game State:城门已经封锁,水道还开着)。把这五层叠起来再让模型做决定,输出才会是"我不能开门,但可以带你走水道",而不是一句好听但和世界无关的客套话。
这就是 Character Stack 的意义:Identity → Knowledge → Memory → Relationship → Current Game State → Decision → Dialogue / Action。真正的角色感不来自台词数量,而来自这条链上每一层是否真的在起作用。下面的完整文章会逐层拆解:人格为什么不能只写"友善、勇敢",Persona Drift 为什么会在几十小时后出现,以及为什么台词和动作必须分开对待。
这也解释了为什么很多团队把精力花在调 prompt 口吻上收效有限:口吻只是 Identity 的一个维度,而 Knowledge、Memory、Relationship 和 Game State 都不是 prompt 能提供的,它们需要各自的数据源和更新机制。守卫 Ren 说话像不像守卫是小问题,他知不知道城门已经封锁、记不记得昨夜的救援、会不会因为纪律优先而先拒绝再想办法,才是玩家判断"这是不是那个人"的依据。角色感是一个系统性质,不是一段文本性质。
展开完整文章
一、"会说很多话"解决的是什么问题
先说清楚 LLM 已经解决了什么。传统 NPC 的对话是有限状态机加几百条预写台词,玩家很快就会遇到"你听说过高精灵吗"这类被玩梗的重复。接入语言模型以后,每次回答都是新生成的,重复消失了,玩家可以问任意问题,NPC 都能接住。这一步的价值是真实的,不需要贬低。
但这里最容易出问题的是:团队往往在"重复消失"的那一刻宣布 NPC 已经"智能",然后把所有精力放在 prompt 上调口吻。几周之后测试反馈回来:角色前后不一致、知道不该知道的事、答应了做不到的事、忘了玩家。这些问题没有一个能靠改 prompt 根治,因为它们不是语言问题,是角色结构问题。
二、Identity 不是三个形容词
很多角色设定文档里,人格写成"友善、勇敢、忠诚"。这对作家有用,对模型几乎没用,因为这三个词在任何语境下都能被解释成任何行为。龙虎斗游戏 NPC 的做法是把人格拆成至少六个维度:Values(它把什么排在前面,纪律还是人情);Goals(它现在想要什么,保住职位、找到女儿);Speech Style(短句、不用敬语、习惯反问);Knowledge Boundary(它知道城门排班,不知道贵族密谋);Relationship(对玩家、对上级、对某个商人各是什么态度);Past Experience(它经历过什么,这决定它对某些话题的反应)。
这些维度进入 Character Profile 之后,模型的回答就有了可以被约束的坐标。守卫 Ren 在"纪律 > 人情"的价值排序下,即使信任玩家,也会先拒绝开门再提供替代方案。这不是台词写得好,是决策有了依据。
三、Knowledge 和 Memory 必须分开
这是龙虎斗游戏官网反复强调的规则:Knowledge 是角色本来就知道的世界知识,Memory 是角色亲身经历过的事。一个普通村民知道村子附近有座矿井(Knowledge),但只有跟玩家一起进过矿井的守卫才记得坍塌那一刻(Memory)。混在一起的后果是两种:要么 NPC 用"记忆"的口吻讲它根本没经历的事,要么 NPC 因为没有"记忆"而否认它本来应该知道的常识。
更麻烦的是玩家知道的事情。玩家在十小时前和另一个角色私下谈过王子的下落,刚加入队伍的 NPC 不应该知道这段对话。但如果整段聊天历史被塞进一个共享上下文,模型会很自然地"知道"。这就是 Character Knowledge 和 Player Knowledge 必须区分的原因——玩家知道,不代表 NPC 知道。
四、Relationship 不是一个数字
"好感度 73"是一个可以显示的数值,但它解释不了行为。龙虎斗游戏记忆系统里的关系至少拆成 Trust、Fear、Respect、Anger、Loyalty 五个方向,而且关系真正重要的不是数值本身,而是它改变了什么:改变对话(Vey 不再和你讨价还价,直接拒绝)、改变任务(Ren 主动告诉你水道入口)、改变帮助与背叛(有人会在关键时刻通风报信)、改变结局(谁在最后一幕站在你身边)。关系是记忆的累积产物,也是剧情的输入。
五、Game State 是模型无法凭空知道的
模型不知道城门此刻是不是封锁的,除非有人告诉它。Current Game State 必须由引擎以结构化形式提供:位置、时间、在场角色、门的状态、任务状态、角色自身状态(Idle / Talking / Following / Combat / Dead)。没有这一层,模型会自信地说"门开了",而游戏里的门还关着——这就是官网观察 3 讨论的 Game State Error,也是玩家最容易发现 AI 是假的地方。
六、Persona Drift:几十小时以后会发生什么
模型运行时间越长,上下文里堆积的内容越多,人物会慢慢漂移:口吻变了、价值排序变了、知识范围悄悄扩大、对玩家的态度突然翻转。这不是 bug,是语言模型的自然倾向——它会向最近的对话风格靠拢。减少 Persona Drift 的方法是四层约束一起用:Character Profile 作为每次推理都注入的固定锚点;Memory 只保留经过筛选的高价值事件而不是全部对话;Relationship State 以结构化数值而不是自然语言传递;Rule Constraint 对输出做硬性检查(守卫不会主动提议违反纪律的行为,除非关系状态已经越过阈值)。
七、Dialogue 和 Action 是两件事
模型回答"我把钥匙给你",对话完成了,动作没有。真正的 give_item 必须变成结构化动作,检查 NPC 是否持有 key_01,通过验证后才写入玩家背包。文章 3 会详细讨论这条行动链。这里先记住一个原则:模型说出来和游戏里真正发生是两件事,角色感的最后一环是世界是否跟着它的话改变。
八、一个可以直接照做的清单
把上面的内容压成一份检查表,任何一个 AI NPC 上线前都可以过一遍:Identity 是否写成六个维度的结构化字段而不是三个形容词;Knowledge 是否有明确的 scope,玩家的经历是否被隔离在 NPC 的输入之外;Memory 是否按事件写入而不是按对话写入,是否允许遗忘;Relationship 是否从事件推导并以数值传递;Game State 是否由引擎在每次推理前提供,角色状态口径是否以引擎为准;Decision 是否在以上五层约束下做出;Dialogue 与 Action 是否分开,动作是否经过验证。七项里任何一项是"否",角色感就会在某个时刻断裂——而且断裂的方式往往不是说错话,而是做了这个人不会做的事。
回到标题:AI NPC 像不像游戏角色,不由台词数量决定,由它是谁、知道什么、记得什么、和玩家什么关系、此刻能做什么决定。台词只是这条链的最后一步。