Chain-of-Agents
Paper · Agent · arXiv 2025

Chain-of-Agents:把「多智能体协作」压进一次解码

多智能体系统把规划、搜索、反思拆给多个独立的 LLM,能力强但通信贵、工作流难改、backbone 不参与训练; 工具集成推理(TIR)把工具调用压进单模型,却只有一条固定的 ReAct 循环。 这篇论文让同一个模型在同一条生成流里轮流扮演不同角色,先把 OAgents 的协作轨迹蒸馏成 CoA 序列做 SFT,再用 Agentic RL 优化任务成功率。

Weizhen Li 等 30 位作者 · arXiv 2508.13167v1 原文 v1 ↗ 代码 ↗
TL;DR · 30 秒抓住核心

MAS 把「谁负责什么」放在模型外面:多个 LLM 实例靠消息传递协作。它强在角色分工和工具编排,但通信、工作流工程和静态 backbone 都是外部成本。

TIR 把工具调用放进单模型的 ReAct 循环,端到端可训练,却只支持「think-action-observation」这一种流程,难以表达并行子任务、角色批判和多工具调度。

CoA 的做法是把角色切换也变成 token 流的一部分:模型按需激活 Thinking / Plan / Reflection / Verification 与 Search / Crawl / Code Generate,工具仍在外部执行,但协作上下文留在同一条流里。再用多智能体蒸馏和 DAPO 把这种能力训进 Qwen2.5 backbone。

55.3%
GAIA Pass@1(32B AFM-RL)
同表 OAgents 58.3
59.8%
AIME25 avg@16(32B AFM-RL)
ReTool-32B 49.3
84.6%
相对 OAgents 的 token 降幅
156,400 → 24,047
01

多智能体很强,但它的能力长在模型外面

先看清 MAS、TIR、ReAct 各自把「智能」放在哪,才能理解 CoA 想搬动的是什么。

复杂 agent 任务通常不是一次问答:要拆解、要查资料、要写代码、要回头检查。论文构造的训练轨迹跨度达到 5–20 hops,每个 hop 是一次 agent–tool 交互(§3.2)。这类任务需要的是多角色、多工具、多轮的协作,而不是单轮 ReAct 循环。

现有多智能体系统(Multi-Agent System, MAS)把角色放在模型外:每个 agent 往往是独立的 LLM 实例,靠消息传递协作。它强在角色分工和工具编排,但通信是外部开销,工作流要靠 prompt / workflow engineering 固定,backbone 通常不参与训练。

TIR 则相反:把工具调用放进单模型的 ReAct 循环,端到端可训练,也少了多实例通信。但一条「think-action-observation」流水线容纳不下多角色协作——它没有原生的机制让模型在同一任务里切换成规划者、检索者、批评者,再把它们的状态汇总起来。

核心缺口

同时要「多智能体协作」和「端到端可训练」

MAS 有协作但不可端到端训练;TIR 可端到端训练但只有单 agent 循环。CoA 的目标是把前者的角色协作搬进后者的单模型训练框架里,而不是再设计一个更复杂的 agent 框架。

02

两条现成路线,各缺一块

MAS 把协作放在模型外,TIR 把工具调用放进模型内;CoA 想把「协作」也放进去。

MAS

外部多智能体系统

代表:OAgents、OWL、DeepResearch。常见做法是多个 LLM 实例 + 编排器 + 消息传递。

强项:角色分工清楚,工具种类多,复杂任务的上限高;GPT-4.1 这类强 backbone 的单步能力很强。

盲区:通信和工作流是外部开销;backbone 静态,不能从任务结果里做数据驱动的更新;换领域往往要重写 prompt / workflow。

TIR

单模型工具集成推理

代表:Search-R1、ReTool、WebThinker。通过 SFT / RL 让模型在推理中调用搜索、代码执行等工具。

强项:单模型端到端,工具调用策略可训练;相比 MAS,少掉多实例通信,token 开销通常更低。

盲区:基本上是单 agent 的 ReAct 循环;并行子任务、角色批判、多工具之间的动态调度,都没有原生的表达方式。

Table 1:论文对四种范式的四项能力对照。原表逐格转录,“✓”表示支持,“✗”表示不支持。

ParadigmTool IntegrationEnd-to-end ExecutionMulti-agent CollaborationData-centric Optimization
ReAct✓✗✗✗
Multi-Agent System✓✗✓✗
Tool-Integrated Reasoning✓✓✗✓
Chain-of-Agents✓✓✓✓

这张表是论文的范式主张,不是实验结果。它想说明的缺口很具体:ReAct 能调工具,但靠 prompt 拼装,不是端到端训练出来的策略;MAS 有协作,但协作发生在多个模型实例之间;TIR 把工具调用训练进模型,却没有多角色协作;只有 CoA 同时占了四格。

03

CoA:一个模型,一条流,按需切换角色

核心不是新网络结构,而是把「谁在什么时候说话」变成可训练的序列格式。

论文把 CoA 拆成两类角色。角色型 agent 负责高层推理和协调,工具型 agent 负责具体执行。所有角色共享同一个模型参数,切换只体现在当前生成的内容和标签上。

Role-playing Agents

谁在协调

  • Thinking Agent:编排推理流程,维持解题状态的一致性。
  • Plan Agent:把 query 拆成结构化的任务序列,例如 ⟨search, crawl, …⟩。
  • Reflection Agent:做自我批评、知识融合,处理证据之间的不一致。
  • Verification Agent:按形式化正确性标准检查推理完整性。
Tool Agents

谁在动手

  • Search Agent:改写查询、优先选择来源。
  • Crawl Agent:并行抽取页面内容、解析技术细节。
  • Code Generate Agent:生成代码,并在 sandbox 里执行。

工具仍在模型外执行;CoA 内化的是角色调度和协作上下文,不是把搜索引擎或 Python 解释器塞进参数里。

状态转移:下一步激活谁,由当前状态决定

St = fθ(St-1, φt-1, ot-1)
φt ~ P(φ | St)
Eq. 4 · Thinking Agent 根据上一状态、上一个角色和 observation,决定下一个激活角色 φt

φt 不是另一个模型实例,而是当前 token 流里被激活的角色。模型在同一条上下文里继续写:先产出角色的思考,再产出工具调用,工具返回的 observation 拼回同一条流,然后继续下一个角色。论文把这称为「single decoding (inference) process」。

SFT 序列长什么样

<think> Ccot </think><tools> αm(αp) </tools><observation> Ot </observation><reflection> Ft </reflection> … <answer> At </answer>
§3.2 的 SFT 格式 · <think> 是推理,<tools> 是工具动作,<observation> 是环境返回,<reflection> 是反思,<answer> 是最终答案
关键细节

observation 不进 loss

SFT 的目标函数对工具返回的 observation 做 masking(Eq. 7)。模型要学的是「下一步该想什么、该调什么工具」,而不是复述搜索结果或 sandbox 输出。论文给出的理由是防止环境噪声传播(§3.2)。

动手看:一条 CoA 轨迹里的五个片段

点任意片段,或按「下一步」。注意第 3 段:observation 会拼回上下文,但 SFT loss 不算它。

当前片段
先点「下一步」,从 Plan 开始走。
模型生成,参与 loss 环境返回,loss 被 mask
这个交互覆盖了什么、没覆盖什么按 §3.1 / §3.2 拼装

覆盖:角色名(Thinking / Plan / Reflection / Verification 与 Search / Crawl / Code Generate)、SFT 序列标签(<think>、<tools>、<observation>、<reflection>、<answer>)、observation masking 的位置。

没覆盖:真实工具返回内容、具体任务的跳数、多轮错误修正、RL 阶段的 token 级奖励。五个片段的顺序是按论文范式拼出的示意,不是附录 C 案例的逐字轨迹。

04

先蒸馏,再 RL:把外部协作变成可训练信号

这条流水线的关键不是 SFT / RL 本身,而是「教师轨迹怎么变成学生能学的序列」。

第一步:从 OAgents 录一条可学的轨迹

论文用的教师是 OAgents,一个开源多智能体系统(§3.2)。OAgents 执行任务时,作者记录每个 agent 的激活、动手前的推理状态和输出,把「谁在什么状态下做了什么」按顺序抽成一条 CoA 轨迹。这不是词级知识蒸馏,而是agent 级 / 序列级的行为蒸馏:学生学的是角色激活顺序和决策模式,不是教师的词概率分布。

原始轨迹质量参差,所以有四道渐进过滤。注意第 3、4 道不是简单删除,而是下采样 / 上采样——它们改变的是数据分布,不只是数据量。

§3.2:四阶段渐进过滤(据原文整理,不是原表)。

阶段规则目的
复杂度过滤总 agent–tool 交互少于 5 次的轨迹直接丢弃。去掉过于简单的任务。
质量过滤错答案、冗余工具输入、未严格遵循指令的样本移除;QA / search 用 LLM 判,code 看测试是否全过,math 对 golden answer。去掉“脏数据”,即使答案碰巧正确。
反思增强缺少 reflection 的轨迹下采样;math / code 任务直接丢弃无反思的轨迹。优先保留带自我批评、自我修正的样本。
纠错上采样search / QA 中 <double_check> 初判可信度低、但最终答对的轨迹上采样。让模型多见“先错后改”的过程。

Web agent 的 SFT 数据共 16,433 条:MHQA 8,826 条 + Web Agent 7,607 条;RL 数据为 169,615(MHQA)+ 10,427(Web)(§4.1)。Code agent 的 SFT 数据正文写约 47k 条(§4.2),RL 数据 47,560 条(Table 9)。轨迹的平均跳数在 4.35–7.29 之间(Table 2 / Table 3 未转录,只引用 Avg. Hops 列),比常见的 2–3 hop benchmark 长得多。

第二步:用 DAPO 把「会模仿」推到「会拿分」

RL 之前先筛题。Web agent 用 Qwen2.5-72B 在无工具条件下对每题采样 32 次,算 exact-match pass rate rq;rq > 0.3 的题被排除(§3.3)。理由很直接:这些题要么不需要工具就能做,要么已经被参数知识污染,训 RL 学不到真正的工具使用。Code agent 则用 7B AFM 每题采样 8 次,8 次全对的题丢弃(§3.3)。

训练算法是 DAPO。Web RL 每轮 64 个 prompt、每个 prompt 8 条 rollout,单条 rollout 最多 24 steps / 32k tokens;Code RL 每个 prompt 8 条 rollout、最多 8 次 tool call;两者都用 VeRL(§4.1 / §4.2)。

Rweb = scoreanswer
Rcode = scoreanswer × scoreformat
Eq. 10–11 · web 只用二元答案判定;code 还要求 <code>…</code> 格式正确,且测试全过

Web 的 scoreanswer 来自 LLM-as-Judge(Qwen2.5-72B)的二元判断;论文没有给 format reward,理由是高质量 SFT 冷启动已经保证了格式。Code 的 scoreformat 检查每次调用是否包在 <code>\n```py\n…```\n</code> 里,数学题则用 Math-Verify 做答案抽取和校验(§3.3)。

05

架构:没有新网络,改的是上下文协议

AFM 的 backbone 仍是 Qwen2.5 系列;CoA 的“架构”体现在一条序列怎么组织角色、工具和 observation。

论文的贡献在训练与推理协议,不在网络结构:32B AFM 直接用 Qwen2.5-32B-Instruct,code agent 用 Qwen2.5-Coder-32B-Instruct(§4.1 / §4.2)。真正的改动集中在三处:system prompt 里的角色与工具说明、SFT 序列的标签格式、以及 loss 对 observation 的 mask。

外部 MAS:角色在多个模型实例里 Orchestrator (LLM) Plan LLM Search LLM Code LLM Reflect LLM 消息传递 · 工作流工程 · 每个 agent 一个模型实例 CoA / AFM:角色在同一条解码流里 <think> <tools> <observation> <reflection> <answer> 单个 LLM 解码流:角色切换发生在 token 之间 虚线框是环境返回,SFT loss 对它做 mask Search Crawl Python 工具仍在模型外执行;observation 拼回同一条流
图 1:MAS 把角色放在多个模型实例里;CoA 把角色切换放进同一条解码流。工具(Search / Crawl / Python)仍在模型外执行。据 Figure 2 与 §3.1 重绘的示意,不是原文图的像素级复制。
这张图覆盖了什么、没覆盖什么点开看边界

覆盖:MAS 的多实例/消息传递、CoA 的单模型 token 流、角色标签与工具调用的关系、observation 的 mask 位置。

没覆盖:OAgents 的具体 agent 数量与消息协议、Figure 3 的轨迹转换细节、Figure 4 的 SFT/RL 训练框架。图中把工具画成 Search / Crawl / Python 是为了对应 §3.1 的角色表,不代表每个任务都会同时调用这三种工具。

一个容易误解的点:CoA 不是“只调用一次工具的模型”。它仍会多次调用外部工具,也会把每次 observation 拼回上下文;它省掉的是多个 LLM 实例之间的消息传递,以及这部分通信带来的 token 开销(§3.1)。Figure 5 的效率对比也是在这个意义上成立的(§5.1)。

06

效果:32B 三线能打,但每组数字都有条件

先看原表,再看两个反直觉点:RL 的增益在数学上最大;效率优势取决于你拿谁当基线。

Web agent:同规模领先,跨 backbone 要分开看

Table 7:web agent 基准,Pass@1;节选 32B 对照行(完整表未转录)。OAgents 是 GPT-4.1 backbone;DeepResearch 的 Backbone 列原文写「-」,未报告;AFM 是 Qwen2.5-32B-Instruct;GAIA 用 103 条 text-only 子集,BrowseComp 1,266 条,HLE 用 500 条 text-only 子集(§4.1);表中“-”为原文未报告。

方法BackboneGAIA AvgWebWalkerBrowseCompHLE
Qwen2.5-32B-Instruct—6.83.10.65.4
OAgentsGPT-4.158.3-13.720.2
DeepResearch—67.4-51.526.6
WebDancerQwQ-32B51.547.93.87.2
WebSailorQwen2.5-32B53.2-10.5-
AFM-SFTQwen2.5-32B50.561.510.016.3
AFM-RLQwen2.5-32B55.363.011.118.0

同 32B 参数规模内(backbone 不同),AFM-RL 的 GAIA 55.3 高于 WebSailor 53.2(+2.1 个百分点,55.3 − 53.2)和 WebDancer 51.5。但把其他 agent 框架放进来,OAgents 58.3(GPT-4.1 backbone)、DeepResearch 67.4(backbone 原文未报告)都在 AFM 之上;BrowseComp 上 OAgents 13.7、DeepResearch 51.5 也高于 AFM 的 11.1。这不是同 backbone 的比较,不能直接读成“单模型打败多智能体”。

数学:AIME25 的 RL 增益最大

Table 11:数学基准,32B 节选(完整表未转录)。AIME24 / AIME25 / AMC23 报 avg@16;MATH500 / OlympiadBench 报 Pass@1;“Avg.” 是五列平均,混合了两种口径。注意 AFM-SFT 行的 Avg. 栏写 60.0,但五列复算为 (41.0+31.0+82.8+78.9+51.1)/5 = 57.0;同表其余各行的 Avg. 都与五列简单平均一致(AFM-RL 78.0、ReTool 74.4、SimpleTIR 71.5、Qwen2.5-Coder 36.6)。

方法AIME24AIME25MATH500AMC23OlympiadBenchAvg.
Qwen2.5-Coder-32B13.310.073.050.635.936.6
ReTool-32B67.049.393.296.166.474.4
SimpleTIR-32B-Multi59.949.292.991.663.771.5
AFM-SFT41.031.082.878.951.160.0
AFM-RL66.759.894.696.672.178.0

AFM-RL 的 AIME25 59.8 比 ReTool-32B 的 49.3 高 10.5 个百分点(59.8 − 49.3),比 SimpleTIR-32B-Multi 的 49.2 高 10.6 个百分点(59.8 − 49.2);五列平均 78.0 比 ReTool 的 74.4 高 3.6 个百分点(78.0 − 74.4)。AIME24 上 ReTool 的 67.0 仍高于 AFM-RL 的 66.7——不是每一列都翻过去。另外,AFM-SFT 的 Avg. 栏 60.0 与五列复算 57.0 不一致:按表内 Avg. 栏,SFT→RL 的平均增益是 +18.0(78.0 − 60.0);按五列复算则是 +21.0(78.0 − 57.0)。两处并列,本页不替原文选择。

代码:32B 的 LiveCodeBench v5 与 CodeContests

Table 12:代码生成基准,Pass@1;节选 32B 对照行(完整表未转录)。表中两组 AFM 行没有标参数量;正文的 47.9 / 32.7 对应 32B 推断(依据:§4.2 的 32B 设置与 Table 12 最后一行的数值对应)。表头把这两组未标参数的 AFM 行也归入「TIR Methods From Qwen-2.5-32B Family Models」,但 §4.2.2 给出的增益 15.3 − 6.8 = 8.5、24.7 − 11.5 = 13.2 说明它们是 7B 行,表头与正文不一致。

方法LiveCodeBench v4LiveCodeBench v5CodeContestsAvg.
Qwen2.5-Coder-32B28.728.10.611.5
Retool19.023.410.310.5
AFM-SFT37.043.122.420.5
AFM-RL43.047.932.724.7

32B AFM-RL 在 LiveCodeBench v5 上 47.9、CodeContests 32.7,均高于 Retool 的 23.4 / 10.3;这两列也是正文点名引用的数字(§1 Introduction / §4.2)。Table 12 还有两组未标参数的 AFM 行:AFM-SFT 为 v4 28.0 / v5 26.3 / CodeContests 13.3(Avg. 13.5),AFM-RL 为 29.0 / 28.7 / 18.8(Avg. 15.3)。按 §4.2.2 的 8.5(15.3 − 6.8)与 13.2(24.7 − 11.5)两组增益,这两行是 7B 结果,不要和 32B 行混在一起读。

效率:84.6% 与 57.0% 是两个基线上的相对降幅

Figure 5 比较的是 10 个随机 GAIA 样本上的「每成功任务」开销。切换基线,AFM 的相对降幅会变——这就是为什么效率数字必须带对照,而不能只写一个孤立的 84.6%。

相对降幅
切换上方基线,查看 AFM 的相对 token 降幅。
手算块:两组参数 → 结果与 JS 输出逐位一致

组 1(OAgents → AFM):AFM 24,047 tokens,OAgents 156,400 tokens。相对降幅 = (156,400 − 24,047) / 156,400 = 132,353 / 156,400 = 0.8462468 = 84.62468% → 显示为 84.6%。

组 2(WebThinker → AFM):AFM 24,047 tokens,WebThinker 55,957 tokens。相对降幅 = (55,957 − 24,047) / 55,957 = 31,910 / 55,957 = 0.5702593 = 57.02593% → 显示为 57.0%。

工具调用合计(Search + Crawl/Visit):OAgents 7.4 + 2.8 = 10.2;WebThinker 2.3 + 23.0 = 25.3;AFM 2.4 + 2.4 = 4.8。AFM 比 OAgents 少 10.2 − 4.8 = 5.4 次,比 WebThinker 少 25.3 − 4.8 = 20.5 次。

这里没有分布,只有三个方法的单点汇总值,因此不适用总体标准差(÷N);JS 与手算都保留一位小数。

三个反直觉的读法

原文里对不上的三处并列记录,不合并
  • BrowseComp 11.1 vs 11.0:Table 7 的 AFM-RL 写 11.1;Table 13 的 AFM 行写 11.0。两处并列。
  • SmolAgents 的分数:§5.3 正文写 SmolAgents 66.7、SmolAgents-Pass@3 73.9;Table 13 的 SmolAgents 行为 52.1、63.6,66.7 / 73.9 在 OAgent 行。两处并列。
  • Code SFT 规模:§4.2 正文写约 47k 条;Table 9 的 SFT 合计栏写 59,929,逐行相加为 59,939(443 + 2,695 + 10,339 + 1,112 + 45,350)。三处并列。

以上只引用相关单元格;Table 9 / Table 13 均未完整转录。

07

边界:它内化的是协作,不是能力上限

论文的数据和设定本身给出四条边界;它们不推翻结果,但决定了这套方法适合什么场景。

边界一

教师的上限会传给学生

CoA 的 SFT 数据来自 OAgents 的成功轨迹(§3.2)。从 §3.2 与实验设置看,论文只用了 OAgents 作为教师,没有报告其他教师或教师质量消融;按这个训练流程,学生能学到的协作模式首先受教师覆盖范围限制。推断(依据:§3.2 只使用 OAgents,未报告教师消融)。

边界二

工具仍在模型外,效率结论有样本条件

AFM 仍要调用外部 Search / Crawl / Python;Figure 5 的 token 统计是 10 个随机 GAIA 样本、每成功任务的平均值(§5.1)。它证明的是「同样的任务成功能少花 token」,不是「所有场景都更快」。推断(依据:§5.1 的 10 样本设定;§5.1 未给端到端延迟分解)。

边界三

未见工具泛化是“不对称”的

§5.2 的反向验证很具体:只在代码/数学上训练的 code-agent 模型,能零样本调用没见过的 web 工具(先搜索、再用 Python 计算);反过来,web-agent 模型虽然会在正确时机发起 Python executor / Visual inspector 调用,却常因格式细节(三反引号、完整 JSON 字段)解析失败。所谓“未见工具泛化”,取决于工具对格式的严格程度,不是普遍能力。推断(依据:§5.2 的反向验证只覆盖 web 与 code/math 两类工具,未测更多工具类型)。

边界四

工具预算和奖励信号都有上限

推理时 AFM 最多 12 次 tool call(§4.2.1,原文指的是 code agent);web agent 的 RL 预算是 24 steps / 32k tokens,code agent 8 次 tool call(§4.1 / §4.2)。更长的工具链会被预算截断。另外,web RL 的奖励是 Qwen2.5-72B 的二元判断(§3.3),§3.3 只描述二元 judge,未报告 judge 偏差或换 judge 的敏感性——对开放式答案,这层判定本身是一个未消融的变量。推断(依据:§3.3 只描述二元 judge,未给 judge 消融)。

一句话总结:CoA 把“多智能体怎么协作”内化成了一条可训练的 token 流,但没有把工具能力、世界知识或教师的盲区一起内化。如果任务需要无法用 role prompt 表达的外部工作流、教师 MAS 本身不可用、或工具链远超 12 次调用,这套蒸馏路线就不划算;如果奖励只能靠一个未校准的 LLM judge,RL 阶段也会把这个偏差放大。