
今年 6 月,NVIDIA 在 Unreal Fest 2026 公布了面向 Unreal Engine 5 的本地 AI 角色工具,并展示了将 NPC 的角色设定与具体表演过程分开的工作流,让角色能够根据现场情况行动和回应,同时保持角色一致性。
当 AI 角色进入真实游戏运行时,一句台词通常会同时受到多组信号影响。
Quest Flag 记录任务已经推进到哪个分支,Relationship Value 表示角色与玩家的关系阶段,长期记忆保存双方共同经历过的事件,Persona 则定义角色长期保持的性格和语言风格。
这些信息都可能是正确的。Dialogue System 仍然需要一份可以直接使用的 Current Character State,说明剧情走到此刻,角色的关系、立场、行为倾向和情绪已经发生了哪些变化。
缺少这层状态时,RAG 可以召回正确事件,任务系统也能给出正确 Flag,模型依然可能沿用第一章的态度生成台词。
我们在上一篇文章中,已经系统介绍过在 PHASE-Tree(属性树)研究中将这类现象概括为 stale-state failure,也就是角色状态滞后。
PHASE-Tree|CPC 不只要会聊、会打,还要会成长:AI 队友的状态演化难题
PHASE-Tree(属性树)是一种面向长线 AI 角色的状态建模与演化方法。它把剧情与互动转成可追溯的证据,按照字段阻力、事件强度、证据跨度和更新冷却期维护角色的当前状态,再通过结构化文本或动态 LoRA 将状态提供给生成模型。
PHASE-Tree 位于游戏运行时的哪一层
一套完整的 AI 角色系统通常包含多个职责不同的模块。

PHASE-Tree 中的 Tree 指角色状态的层级结构。Behavior Tree 和 Utility AI 继续负责 NPC 的动作决策,Quest System 维护任务进度,剧情 Flag 保存关键分支,PHASE-Tree 则向对话和角色决策模块提供持续更新的 Current Character State。
例如,一次守城任务结束后,Quest Flag 可以记录任务已经完成,Relationship Value 可以增加信任分数,长期记忆可以保存玩家在危机中留下的事实。
PHASE-Tree 进一步维护这些经历带来的状态变化,例如角色已经从“保持戒备”进入“有限信任”,同时保留其谨慎、克制的长期表达风格。
四层状态,四种变化速度
PHASE-Tree 全称为 Psychology-grounded Hierarchical Attribute-Structured Evolving Tree。
它参考人格心理学对稳定特质、情境适应和即时状态的区分,将角色在时刻 \(t\) 的完整状态表示为四个部分:


Persona、Session 和 Moment 带有时间下标,会随着剧情推进以不同速度更新。


图 1 PHASE-Tree 的四层数字人格结构
图中的短期更新主要作用于 Session 和 Moment,Identity 与 Persona 保持锁定。长期更新中,Identity 仍作为身份锚点,Persona、Session 和 Moment 可以依据相应证据发生变化。
四层状态中的字段可以独立寻址,关系进展时只更新 Relationship,场景气氛改变时刷新 Moment,一次冲突不会连带改写角色的爱好、职业和说话方式。
这种字段级结构也方便游戏团队将状态接入已有系统,Quest State 可以关联 Session,关系阶段可以映射到 Persona 中的 Relationship,当前战斗后的紧张或兴奋则进入 Moment。
角色先根据当前状态完成本轮回应。互动结束以后,系统才从已经发生的内容中提取证据,形成下一时刻的状态。
当前状态 S ₜ → 本轮回应 → 提取证据 e ₜ → 下一时刻状态 S ₜ ₊₁
新证据从下一轮开始生效,不会回头改写已经生成的台词。
剧情先变成证据,证据再改变状态
PHASE-Tree 按互动发生的顺序更新角色,角色先根据当前状态完成本轮回应,互动结束后,系统再提取证据,生成下一时刻的状态:


新证据从下一轮开始生效,已经生成的台词不会被事后修改。
证据抽取以目标角色的视角进行,系统关注角色新知道了什么、对谁的态度发生了变化、做出了哪些承诺,以及当前立场和情绪受到了怎样的影响。
职业变化、重大背景揭示、关系确立和关键承诺会进入高重要度证据,普通但有意义的冲突、理解和态度变化,则作为中等重要度证据继续积累。
这些证据进入两条用途不同的轨道。
Track A:近期状态事件
Track A 关注最近发生的明确变化,主要服务关系、职业、爱好等低阻力字段。
一次任务中的背叛可能立即改变角色的信任状态,一项正式任命也可以直接更新职业字段。这类事实已经完成,不需要等待十几章剧情才进入状态。
Track B:长期角色弧证据
Track B 跨越多个剧情单元积累证据,主要服务性格、行为倾向和说话方式等中高阻力字段。
角色在一次战斗中表现勇敢,可能来自当时的特殊环境。角色在多个 Questline 中持续承担风险、保护队友并主动接下高危任务,才可能形成稳定的行为倾向变化。
同一件关键事件可以同时进入 Track A 和 Track B。它可以立即推进关系阶段,也可以成为长期角色弧中的一条证据。
字段何时获得更新资格
当证据指向某个字段的变化时,PHASE-Tree 还会检查证据跨度、事件强度和更新间隔:

其中:

公式中的三个 ∧ 表示三项条件需要同时通过。证据不会被加权成一个模糊的综合分数。
证据跨度用于判断变化是否经过了足够多的独立剧情单元,事件强度确认其中是否包含能够支撑变化的关键事件,冷却间隔用于防止同一字段在短时间内反复翻转。
在实验中,性格和说话方式等高阻力字段要求证据覆盖至少 16 个剧情单元,其中包含至少 6 条高重要度事件,并满足对应的更新间隔。
关系、职业和爱好等低阻力字段拥有更快的更新条件。一条高重要度证据或两条中等重要度证据,即可使相关字段进入候选更新。
一句话可以改变情绪,一次关键事件可以推进关系。习惯需要反复出现,性格则要经过更长的剧情检验。通过这些门槛的变化,还会在正式写入前接受进一步校验。
候选更新与确定性校验
开放剧情很难用固定规则逐句穷举,大模型更擅长理解其中的语义变化。角色状态的写入需要稳定边界,不能跟着一次模型判断随意改动。
PHASE-Tree 将理解和写入分开处理。
大模型读取证据记录,提出候选更新。它会说明准备修改哪个字段、改成什么内容,以及判断依据来自哪些剧情。
确定性校验器随后核对证据编号与来源,检查跨度、强度和更新间隔是否达标。它还会确认本次修改只影响目标字段,原有内容得到保留,同一份证据也没有被反复使用。
任何一项检查没有通过,原状态保持不变。
通过校验后,系统优先执行 incremental merge。仍然成立的描述会被保留,新剧情增加新的侧面或修正局部内容。新旧状态发生明确冲突时,系统只替换冲突部分。
每次通过校验的字段更新都会保留证据来源和版本记录。开发团队可以按字段检查它在什么剧情单元发生变化,以及本次变化使用了哪些事件作为依据。
一棵人格树,怎样抵达角色的下一句话?
PHASE-Tree 不绑定单一生成模型。当前角色状态可以通过两条路径交给模型。

图 2 PHASE-Tree 的双路径生成机制
两条路径共享当前 Dialogue Context,区别在于角色状态进入模型的方式。
显式文本注入
显式路径将四层状态整理成结构化自然语言,与当前对话一起交给生成模型:


这种方式可以直接检查模型读取了哪些状态字段,也便于开发团队定位角色口吻、关系阶段或即时情绪是否被正确注入。论文的主要结果采用这条路径。
隐式参数适配
参数适配路径通过超网络,把当前角色状态映射为动态 LoRA 增量权重:

图 2 中,Profile Embedding、Module Embedding 和 Depth Embedding 共同描述字段内容、所属模块及层级位置。

角色状态发生变化时,LoRA 增量权重随之更新,提示词中只需要保留当前对话。
长对话实验中,显式文本路径的平均输入为 1736 tokens,参数适配路径为 372 tokens,输入长度减少约 79%。当前 Profile-to-LoRA 映射会损失一部分细粒度状态信息,因此论文将参数适配路径用于研究提示长度与生成效果之间的取舍。

LongEvoRoleBench 让角色演化可以被测试
LongEvoRoleBench 将八组角色对话数据整理成统一的下一句台词生成任务。四组长篇语料来自《老友记》《办公室》《哈利·波特》和《星际迷航》,用于检查角色能否跨越剧情阶段持续演化。另有四组短篇语料,关注单个场景中的信息、立场和情绪变化。
长篇语料采用随机测试和 temporal extrapolation 两种划分。时间外推测试会将后期季数或书目留作测试数据,用于观察角色进入后续剧情后,生成模型是否仍然沿用早期状态。
评测包含三个维度:
- 角色一致性,采用 1—5 分评分;
- 场景连贯性,采用 1—5 分评分;
- 参考台词语义相似度,使用余弦相似度。
长篇语料主结果

以上结果是四组长篇语料在随机测试和时间外推测试上的宏平均。PAG 表示人设增强提示,RAG 表示历史对话检索增强。表中的外部文本基线按每项指标分别选择。
消融实验

从 DT 补全 Session 和 Moment 后,角色一致性、场景连贯性和参考台词语义相似度分别增加 0.110、0.334 和 0.043。
这组结果显示,长期 Persona、当前场景信息和即时情绪都会影响下一句台词。只维护跨阶段演化,无法覆盖角色在当前场景中的完整状态。
状态审计与跨底座验证
我们人工审计了 152 条已经接受的字段更新。其中,77.6% 获得充分证据支持,22.4% 获得部分支持,这批抽样中没有发现缺少依据的更新。
跨底座实验覆盖 Qwen3-0.6B、Gemma-4-E4B、Qwen2.5-7B 和 Qwen3-32B。PHASE-Tree 的长篇场景连贯性在四个底座上均为各自行内最高。
从 PHASE-Tree 到 MemOS Cloud
PHASE-Tree 给出角色状态演化的方法。MemOS 可以承载长期记忆与结构化属性状态,并与剧情脚本、任务 Flag 和关系值等业务信号一起维护角色当前状态。
MemOS Cloud 属性记忆为结构化字段提供创建、更新和检索入口。模板最多支持三层嵌套,也可以通过 algorithm_updatable 决定某个字段能否根据对话自动更新。
接入游戏角色时,开发团队可以按照自己的 Character State Schema 映射身份、关系阶段、当前立场和即时情绪,再将检索到的结构化状态与 Quest System、Relationship Value、Narrative Flag 和 Dialogue System 组合使用。
开始前需要准备:
- MemOS Cloud API Key;
- 在 MemOS 控制台创建的属性记忆模板;
- Python 环境和
requests 库。
代码中的 YOUR_API_KEY 和 tpl_user_001 需要替换为实际值。
线上体验
创建模板
属性记忆模板在 MemOS 控制台 中创建和维护。模板使用 JSON 描述,最多三层嵌套:
{
"基础信息": {
"姓名": { "value": "", "algorithm_updatable": false },
"职业": { "value": "", "algorithm_updatable": true },
"居住地": { "value": "", "algorithm_updatable": true }
},
"性格标签": {
"三个关键词": { "value": "", "algorithm_updatable": true }
}
}
value:属性字段值,可以留空或填入默认值;
algorithm_updatable:标记该属性是否允许算法从对话中自动更新。
修改或删除模板中的字段,会影响所有绑定过该模板的属性记忆实例字段,请谨慎修改已绑定示例的属性树模板。
绑定用户到模板
为用户绑定模板后,MemOS 会为该用户创建属性记忆实例。后续添加消息时 MemOS 自动更新对应字段值,动态维护用户画像。
import requests
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://memos.memtensor.cn/api/openmem/v1"
data = {
"bind_list": [
{"user_id": "memos_user_123", "profile_template_id": "tpl_user_001"}
]
}
res = requests.post(
f"{BASE_URL}/bind/profile_template",
headers={"Authorization": f"Token {API_KEY}"},
json=data)print(res.json())
添加对话
用户在对话中提到自己的职业和爱好,MemOS 自动抽取信息并更新属性记忆。
import requests
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://memos.memtensor.cn/api/openmem/v1"
data = { "user_id": "memos_user_123", "conversation_id": "conv_0624", "allow_memory_view": ["profile", "detail_factual", "preference"], "messages": [ {"role": "user", "content": "我在杭州做产品经理,平时喜欢看科幻小说和露营。"}, {"role": "assistant", "content": "了解了,杭州是个好地方,周边露营地很多。"}
]
}
res = requests.post(
f"{BASE_URL}/add/message",
headers={"Authorization": f"Token {API_KEY}"},
json=data
)
print(res.json())
检索属性记忆
在新会话中询问用户信息时,调用检索记忆接口,在 include_memory_view 中传入 "profile" 即可召回属性记忆。
import requests
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://memos.memtensor.cn/api/openmem/v1"
data = {
"user_id": "memos_user_123",
"query": "这个用户的基本情况是什么?",
"include_memory_view": ["profile"]
}
res = requests.post(
f"{BASE_URL}/search/memory",
headers={"Authorization": f"Token {API_KEY}"},
json=data)print(res.json())
更多信息请查看:
memos-docs.openmem.net/memos_cloud/features/profile
从一条 Questline 开始验证 ~
工程验证可以从一条已经具备 Quest Flag、Relationship Value 和对话日志的 Questline 开始。
先定义能够独立寻址的角色状态字段,再为关键剧情标记证据单元和重要度。证据进入 Track A 或 Track B 后,按照字段阻力、事件强度、剧情跨度和冷却间隔执行更新判定。
状态更新完成后,可以比较注入前后的下一句台词,并检查三个结果:
- 更新是否只影响目标字段;
- 新状态是否能够追溯到具体剧情证据;
- Dialogue System 是否正确读取了当前关系、立场和情绪。
当字段变化、证据记录和最终台词能够沿同一条链路对应起来,这次运行时验证就完成了。
相关资源现已开放
- PHASE-Tree 论文:
- PHASE-Tree 代码
- LongEvoRoleBench 数据集
- PHASE-Tree 模型
- MemOS Cloud 属性记忆:
如果你正在开发开放世界 NPC、互动叙事、角色养成、IP 虚拟人或其他长线 AI 角色,可以从一条真实 Questline 开始测试,也欢迎带着具体的角色 Schema、剧情结构和运行时接入需求,与我们交流!

关于 MemOS
MemOS 为 AI 应用构建统一的记忆管理平台,让智能系统如大脑般拥有灵活、可迁移、可共享的长期记忆和即时记忆。
作为记忆张量首次提出“记忆调度”架构的 AI 记忆操作系统,我们希望通过 MemOS 全面重构模型记忆资源的生命周期管理,为智能系统提供高效且灵活的记忆管理能力。