LLM NPC System
本文试图设计一个游戏中的 NPC 系统,目标是让游戏环境更加真实,丰满,有趣。为了达到这个目标,我们试图实现一个在开放世界场景下的大量 NPC 驱动系统。它具有以下特点:
- 大量的 NPC 数量
- 丰富的 NPC 种类
- 真实的 NPC 行为
- 有趣的 NPC 互动
我们希望引入 LLM 的能力来增强 NPC 驱动系统。一个完整的 NPC 驱动系统应该包括以下几个部分:
- 对话系统
- 行为系统
- 情感系统
- 记忆系统
- 社交系统
下面详细分析这些系统,以及 LLM 可以在这些系统中扮演的角色。
对话系统
语言 -> 玩家/其他 NPC
对话系统是一个 NPC 与玩家或者其他 NPC 交流的系统。这也是 NPC 最核心的能力,因为这是玩家与 NPC 互动时最容易感知的一个方面。相比于传统的对话树结构,LLM 可以自由生成对话,有更好的灵活性和可扩展性。目前研究最多的也是这方面的内容,这里暂时不做展开。
可能问题点:
在线直出的推理结果,可能会有很多合规问题,这点要格外注意。
行为系统
动作 -> 环境/其他 NPC
行为系统是一个 NPC 与环境交互的系统。传统的行为系统分为两方面:
- NPC 方面:行为树,状态机,效用函数
- 环境方面:物理引擎,碰撞检测,路径规划,交互逻辑
NPC 方面
LLM 可以考虑代替行为树,根据不同的观测值和人物设定来生成不同的行为。
参考 Voyager 项目中的实现,生成行为树的部分或全部。
可能问题点:
Prompt 和 Response 的格式规范问题
环境方面
考虑抽象简化环境内容,模拟引擎接口,规定简化的环境交互接口和交互逻辑。需要显式地规定环境的交互逻辑,这样才能保证 LLM 生成的动作是合法的。
抽象内容:
- 物体
- 位置
- 人物
- 时间
- 动作
可能问题点:
- 规定合法的环境交互逻辑
- 思考 LLM 来代替环境交互逻辑的可能性(不够精确)
- 动作和交互的时序性保证
情感系统
维护一个情感状态机,根据环境和对话的内容来更新情感状态机的状态。LLM 可以用来驱动情感状态机的状态转移。
可能问题点:
情感系统的状态机设计,规则生成,即从人设映射到状态机的状态转移规则。
记忆系统
维护一个记忆库,记录 NPC 应该记忆的内容,包括:
- log 信息
- 对话历史
- 动作历史
- 时空信息
- 背景信息
- 人物设定
- 社交关系
- 环境信息
- 时空信息
- 地图信息
- 物体信息
- 知识信息
可以用向量数据库来存储这些信息,LLM 可以用来生成这些信息。
可能问题点:
向量数据库的检索设计。
社交系统
社交系统维护的是人(NPC)之间的关系情况。也是一个状态机,根据环境和对话的内容来更新状态机的状态。LLM 可以用来驱动状态机的状态转移。
可能问题点:
社交系统的状态机设计,规则生成,即从人设映射到状态机的状态转移规则。
为了减少成本的层级设计
LLM 的调用成本还是很高,用它来驱动上述 NPC 系统会有两方面的成本问题:
- 一方面同时在线的玩家时刻都在和 NPC 交互,每次交互都会调用若干次 LLM 推理
- 另一方面为了维持一个大量的 NPC 系统,需要同时在线大量的 NPC,这也会导致大量的 LLM 调用
因此考虑设计一个层级的 NPC 系统,根据和玩家的交互程度,将 NPC 分为三个层级:
- 和玩家直接交互的 NPC
- 玩家可以看到/听到的 NPC
- 玩家看不到/听不到的 NPC
对于玩家可以直接交互的 NPC,我们可以用 LLM 来驱动,因为这些 NPC 的交互次数是最多的,而且玩家可以直接感知到,所以这些 NPC 的交互质量要求也是最高的。
对于其他两种 NPC,我们可以用一种由粗到细的方式来驱动。
具体地,可以将所有其他 NPC 的行为先用一种粗粒度的方式来驱动,如传统行为树模拟或 LLM 生成的事件简报。然后根据玩家的感知程度,Lazy Update 这些 NPC 的具体行为或对话内容。
上述所有的生成内容都会落盘到数据库中,这样可以保证玩家离线后,NPC 的行为和对话内容不会发生变化。
To be continued…
阅读材料
- Voyager
- LLM 驱动的 Mine Craft 行为树
- 代替 RL 算法生成行为策略
- Generative Agents
- 斯坦福小镇
- 用 LLM 生成对话和日常生活
- camel
- 角色扮演对话框架
- 支持多角色扩展
- chat haruhi
- 人格模拟对话系统
- 精调