AdaMARP: An Adaptive Multi-Agent Interaction Framework for General Immersive Role-Playing
AdaMARP: An Adaptive Multi-Agent Interaction Framework for General Immersive Role-Playing
原文链接:https://arxiv.org/abs/2601.11007 作者:Zhenhua Xu, Dongsheng Chen, Shuo Wang, Jian Li, Chengjie Wang, Meng Han, Yabiao Wang 机构:浙江大学、腾讯优图实验室 发布日期:2026-01-16
速查卡
| 项目 | 内容 |
|---|---|
| 一句话总结 | 用“演员模型 + 场景管理器”把角色扮演从单角色聊天升级为可切场景、可加角色、可调度发言顺序的多智能体叙事系统。 |
| 大白话版 | 以前很多“AI 角色扮演”只是让模型学一个人设去接话;AdaMARP 想做的是“导演系统”:谁先说、场景何时切、有没有新人进场,都交给单独的管理器决定。 |
| 核心数字 | AdaRPSet 共 22,425 个会话、450,235 条 utterance;Qwen2.5-7B 经全量训练后平均分 8.72,较基线 8.37 提升 +0.35;Qwen2.5-14B 场景管理器 8.37,超过 Claude Sonnet 4.5 的 8.17。 |
| 评级 | A — 不是“把 prompt 写花”,而是把沉浸式角色扮演拆成可训练的协议层、控制层和评测层。 |
| 代码 | 论文页未给出公开代码链接 |
| 关键词 | immersive role-playing, multi-agent, scene manager, structured messaging, adaptive bench, narrative agents |
核心 Insight
这篇论文最重要的地方,不是“角色扮演效果更像人”,而是它明确指出:沉浸式叙事失败,往往不是某一句台词写得不够像,而是系统根本没有“导演层”。
过去常见做法,是把角色 profile 塞进 system prompt,然后让模型一轮一轮往下接。这样做的上限很低:角色能说像自己,但很难稳定处理场景变化、多人互动、临时新角色加入,以及长轨迹里动机不漂移。AdaMARP 的判断是,角色扮演至少要拆成两个能力:一类是“演员”能力,负责在既定角色/场景下生成带状态感的回复;另一类是“调度”能力,负责决定什么时候切场景、让谁发言、何时引入新角色、何时结束剧情。
所以它没有继续在单模型 prompt 上死磕,而是把系统拆成 Actor Model、User Model 和 Scene Manager 三个主体。这里最关键的是 Scene Manager:它不直接生成角色对白,但决定整段叙事怎么流动。这个分层让角色扮演第一次更像一个可控的多智能体系统,而不是“一个模型扮很多人”。
为什么这个想法 work?
因为叙事的难点本来就不止“语言像不像”,而在于“状态有没有被维护”。
单模型角色扮演容易崩的根因,是它把内部心理、外显动作、环境变化和说话内容混在一条文本流里,模型只要上下文一长,就会开始丢状态。AdaMARP 通过统一消息协议,把每轮交互拆成四个通道:Thought、Action、Environment、Speech。这样一来,模型不再只是吐一段对话,而是在显式维护“我在想什么、我做了什么、环境发生了什么、我说了什么”。
更进一步,Scene Manager 用离散动作空间来控制剧情,这比“让模型自己想想接下来该怎么演”更稳,因为它先把高层决策离散化,再让下游模型执行。也就是说,AdaMARP 的改进不是玄学 prompt,而是把叙事问题结构化。
方法详解
整体架构
AdaMARP 的整体 pipeline 可以写成:
初始角色集合 + 角色档案 + 初始场景
↓
Scene Manager 生成控制动作
↓
如果动作是 pick_speaker → Actor/User 生成一轮消息
如果动作是 switch_scene → 更新场景描述
如果动作是 add_role → 注入新角色档案与动机
如果动作是 end → 结束轨迹
↓
写回历史,进入下一轮
论文把交互状态写成:
其中:
- 是时刻 的角色集合
- 是到当前为止的完整交互历史
Scene Manager 的动作空间是:
这组动作设计得很克制,但正好覆盖了叙事里最关键的导演操作:开场、点名发言、换景、加人、收尾。
关键技术组件
组件 1:七维角色档案
做什么: 给角色建立足够细的、能跨长剧情维持一致性的 profile。
怎么做: AdaMARP 不满足于“姓名 + 性格”这种薄 profile,而是给主角色定义七个维度:
- Identity & Appearance
- Personality & Psychology
- Speaking Style
- Abilities, Interests & Achievements
- Social & Historical Context
- Personal History Arc
- Relationships
直觉解释: 这其实是在解决“角色一致性为什么老崩”。如果只有性格标签,模型很容易在长对话后忘记身份关系、历史负担和说话习惯;而七维档案同时编码了内在人格、外部关系和叙事弧线,所以角色在切场景、换话题时更不容易漂。
组件 2:四通道沉浸式消息格式
做什么: 把“角色扮演消息”从单一对白升级成带内部状态的复合消息。
怎么做: 每轮消息显式交织四类信息:
[Thought]:内部想法(Action):可观察动作<Environment>:环境状态或变化Speech:真正说出口的话
关键机制: 环境被提升为一等公民,而不是旁白噪音。论文强调环境有两层作用:
- 提供氛围 grounding,帮助情绪成立
- 作为因果变量,让动作反过来改变场景,场景再影响后续回复
数值例子: 假设一段剧情是“深夜医院走廊,两人争执,门后突然有声音”:
- Thought:角色对风险的主观判断
- Action:后退、停顿、靠墙
- Environment:走廊灯光、门后脚步声、门把手抖动
- Speech:真正说出的句子
过去很多系统只保留最后一层 Speech,结果“剧情感”全靠模型脑补;AdaMARP 则把前三层显式化,所以后续每一步都能继承状态。
组件 3:Scene Manager 场景管理器
做什么: 负责高层 orchestration,而不是代替演员说台词。
怎么做: Scene Manager 在每一步都基于当前状态 选择动作 ,并输出理由。不同动作携带不同参数:
switch_scene:输出新场景描述add_role:输出新角色名、档案、动机pick_speaker:指定下一位说话者
直觉解释: 这是本文最像“系统论文”的部分。它承认:多人叙事的问题,本质上有一个 scheduler。谁说话、什么时候换场、什么时候拉第三人进来,并不是自然会从下一句对白里“长出来”的,而应该成为可监督的决策。
组件 4:两套训练集
做什么: 分别教会系统“怎么演”和“怎么调度”。
怎么做:
-
AdaRPSet:训练 Actor Model
- AdaRPSet-Extracted:从 81 本 Goodreads 热门书籍中抽取互动片段,构建 12,525 个会话、177,157 条 utterance
- AdaRPSet-Synthesis:用强模型生成动态剧情数据,覆盖切场景、加角色等 extracted 数据稀缺的行为,9,900 个会话、273,078 条 utterance
- 总计:22,425 个会话、450,235 条 utterance
-
AdaSMSet:训练 Scene Manager
- 建在 AdaRPSet-Synthesis 之上
- 补上
pick_speaker等控制标签与理由字段
为什么要双数据源:
- Extracted 数据更像真实文学对话,强在“像人”
- Synthesis 数据更像控制工程样本,强在“会切场、会换人、会调度”
论文的核心判断很清楚:光靠真实文本抽取,动态行为覆盖不够;光靠合成数据,语言质感又可能发飘。两者是互补关系。
训练策略
论文给出了比较完整的训练细节:
- 验证集:从训练数据中 hold out 5%
- 训练轮数:8 epochs
- 学习率:固定
- warmup:前 5% steps,从 线性升到目标学习率
- 最大长度:16K tokens
- 截断:left truncation
- 并行策略:
- 7B/8B 单卡训练
- 14B 用 4 张 GPU
- 70B/72B 用 8 张 GPU
- batch:
- 7B/8B 与 14B:micro batch 24,global batch 48
- 70B/72B:micro batch 1,global batch 32
这套设定有个隐含信息:AdaMARP 不是靠“神秘大规模 RL”赢的,而是靠更对路的数据与任务拆分,在常规 SFT 框架里把系统做对了。
与现有方法的关键区别
| 维度 | 之前的方法 | 本文方法 | 为什么更好 |
|---|---|---|---|
| 角色表示 | 薄 profile 或单 prompt 人设 | 七维结构化角色档案 | 更适合长轨迹一致性 |
| 消息格式 | 单一对白为主 | Thought + Action + Environment + Speech | 显式保留状态与环境因果 |
| 系统结构 | 单模型扮多角 | Actor + User + Scene Manager | 把“演”和“导演”拆开 |
| 动态叙事 | 很少支持切场/加角色 | 通过离散控制动作原生支持 | 更接近真正剧情流 |
| 评测 | 静态问答式角色评测 | 100 条完整轨迹的 trajectory-level 评测 | 更能测长程稳定性 |
实验结果
主实验
AdaptiveBench 的设置是:从 AdaRPSet-Synthesis 测试集抽 100 个 seed,每条轨迹固定运行 20 轮对话,再用 GPT-5-Chat 做 judge,对角色一致性、环境 grounding、人际互动、叙事推进和指令遵循等维度打分。
Actor Model 主结果
| 方法 | 平均分 | Character Consistency | Environmental Grounding | Narrative Progression | 备注 |
|---|---|---|---|---|---|
| GPT-4o-mini | 8.78 | 8.99 | 8.19 | 8.17 | 商业闭源基线 |
| GPT-5-Chat | 9.10 | 9.09 | 8.84 | 8.90 | 最强闭源之一 |
| Gemini-2.5-Pro | 8.07 | 7.97 | 7.57 | 8.27 | 环境与一致性偏弱 |
| Claude Sonnet 4.5 | 9.27 | 9.35 | 8.97 | 9.23 | Actor 侧最强闭源 |
| Doubao-1.5-Pro-Character | 8.42 | 8.65 | 7.82 | 7.91 | 国内角色模型基线 |
| Qwen2.5-7B-Instruct | 8.37 | 8.61 | 7.70 | 7.73 | 开源底座基线 |
| Qwen2.5-7B-Instruct-Ours | 8.72 | 8.86 | 8.28 | 8.38 | 全量 AdaRPSet 训练 |
| Llama-3.1-8B + AdaRPSet | 8.89 | 9.00 | 8.39 | 8.52 | 8B 模型超过多个商业模型 |
解读:
- 7B Qwen 经 AdaRPSet 训练后,从 8.37 提到 8.72,提升 +0.35。
- Llama-3.1-8B 加全量训练后到 8.89,超过 GPT-4o-mini(8.78)、Gemini-2.5-Pro(8.07)和 Doubao(8.42)。
- 闭源最强依旧是 Claude Sonnet 4.5(9.27)与 GPT-5-Chat(9.10),说明 AdaMARP 解决了结构问题,但模型上限仍受底座能力约束。
Scene Manager 主结果
| 方法 | Scene Understanding | Speaker Discipline | Role Introduction Judgment | Overall |
|---|---|---|---|---|
| GPT-4o-mini | 7.64 | 8.55 | 7.18 | 7.64 |
| GPT-5-Chat | 8.03 | 8.15 | 7.78 | 7.90 |
| Claude Sonnet 4.5 | 8.21 | 8.62 | 8.05 | 8.17 |
| Qwen2.5-14B-Instruct | 7.65 | 8.42 | 7.34 | 7.63 |
| Qwen2.5-14B-Instruct-Ours | 8.23 | 8.25 | 8.64 | 8.37 |
| QwQ-32B | 8.48 | 8.92 | 7.97 | 8.41 |
解读:
- Qwen2.5-14B 加 AdaSMSet 后,Overall 从 7.63 到 8.37,提升 +0.74,约 +9.7%。
- 它超过 Claude Sonnet 4.5 的 8.17,非常关键:说明“导演层”能力比通用 instruction tuning 更依赖专门数据与控制 supervision。
- QwQ-32B 8.41 仍是开源推理型上限之一,说明场景管理本质上是 reasoning-heavy 任务。
消融实验(Ablation Study)
| 变体 | 平均分 | 与完整方法差距 | 说明 |
|---|---|---|---|
| Qwen2.5-7B Base | 8.37 | -0.35 | 原始基线 |
| + Extracted | 8.49 | -0.23 | 真实文学抽取数据改善格式与稳定性 |
| + Extracted + Synthesis | 8.72 | — | 动态剧情泛化最强 |
| Llama-3.1-8B + Extracted | 7.70 | -1.19 | 只学格式,不够应对动态轨迹 |
| Llama-3.1-8B + Extracted + Synthesis | 8.89 | — | 合成动态数据贡献巨大 |
关键发现:
- Extracted 数据的主要贡献是让模型学会统一协议和角色一致性。
- Synthesis 数据的主要贡献是让模型学会动态剧情:切场景、重分配角色、叙事推进。
- 对 Llama-3.1-8B 来说,只有 Extracted 明显不够;加入 Synthesis 后暴涨 +1.19,说明动态监督不是锦上添花,而是决定系统是否“会演剧情”的核心。
数据规模与可扩展性线索
| 数据集 | 来源 | Plots | Roles | 会话数 | Utterances | 平均轮数 |
|---|---|---|---|---|---|---|
| AdaRPSet-Extracted | 81 本图书 | 4,443 | 2,608 | 12,525 | 177,157 | 14.14 |
| AdaRPSet-Synthesis | 20 个主题 | 9,900 | 29,701 | 9,900 | 273,078 | 27.58 |
| AdaRPSet 总计 | — | 14,343 | 32,309 | 22,425 | 450,235 | 20.08 |
这里能看出作者的工程判断:真实文本负责“质量”,合成数据负责“覆盖”。这也是为什么它更像一个系统数据工程项目,而不是单纯模型 fine-tune。
复现评估
| 维度 | 评分(1-5) | 详细说明 |
|---|---|---|
| 数据可得性 | ⭐⭐ | 论文描述了 Goodreads 81 本书抽取与合成数据流程,但原始数据集未随文开放。 |
| 代码可得性 | ⭐ | 论文页未提供公开仓库,复现者需要自行重建抽取、场景管理和评测流水线。 |
| 算力需求 | ⭐⭐⭐ | 7B/8B 可单卡训练,14B 需 4 卡,70B/72B 需 8 卡;训练门槛中等偏上。 |
| 工程复杂度 | ⭐⭐⭐⭐ | 难点不是 SFT 本身,而是双数据集构建、Scene Manager 监督以及 trajectory 级评测。 |
| 预期收益 | ⭐⭐⭐⭐ | 对角色扮演、NPC、互动叙事、陪伴型 Agent 很有直接价值。 |
复现建议: 最务实的路径,不是先追最强底座,而是先复刻最小版协议层:七维 profile + 四通道消息 + pick_speaker/switch_scene/add_role 三个关键动作,再做一个小型轨迹评测集。把导演层做出来,比盲目换更大模型更值。
批判性分析
局限性(论文承认的 + 我们发现的)
论文自带的边界很明确:
- 主要评测仍然依赖 LLM-as-Judge,因此最终分数会受 judge 偏好影响。
- 数据里大量动态剧情来自合成,天然存在 synthetic bias。
我们额外看到三个问题:
- 评测仍偏主观。 虽然 AdaptiveBench 比静态 benchmark 强很多,但角色一致性、叙事吸引力这类指标仍主要是 judge 打分,不是可验证任务。
- Scene Manager 的动作空间仍偏小。 五个动作已经解决了“有没有导演层”,但离真正复杂剧情系统还远,比如冲突升级、伏笔回收、多线程剧情并发都还没建模。
- 成本问题没有真正解决。 论文附录有 token 成本分析,但系统本质上把一次对话拆成多个 agent 协作,生产环境里 token/延迟压力不会小。
改进方向
- 引入显式世界状态机: 现在 Environment 还是文本化描述,下一步应把空间、物体、事件因果做成结构化状态。
- 把 Scene Manager 训练成规划器: 当前更像局部调度器,未来可接长期 plot planning 与目标约束。
- 加入真人偏好评测: 让用户对“沉浸感”和“剧情自然度”打分,和 LLM judge 做双轨验证。
独立观察
- 这篇论文和 Agent 领域最近的“planner/executor”分层是同一趋势:复杂任务开始从单体模型走向角色分工。
- 它其实不只适用于二次元陪伴或 RPG,对教育模拟、销售演练、心理辅导、企业培训都很有迁移价值。
- 中国团队这次做对的一点,是没有只卷“角色像不像”,而是卷“系统能不能稳定跑长剧情”。这比继续刷单轮 character benchmark 更有产业意义。
对领域的影响
短期看,AdaMARP 会推动“角色扮演”从 prompt skill 变成系统工程:角色协议、场景状态、调度器、轨迹评测都会成为必修课。
中期看,它会让 NPC、陪伴 Agent、AI 剧本互动和教育模拟这些场景的技术栈开始收敛:大家都得回答同一个问题——你的系统里,到底有没有一个独立的导演层。
长期看,这篇论文真正重要的启发是:沉浸式智能体不该只被当作“会说话的角色”,而该被当作“在动态世界里持续行动和协作的叙事系统”。AdaMARP 还不是终点,但它把问题拆对了。