目录
在上一篇什么是多智能体系统?中掌握了“协调多个 AI”这一概念之后,接下来的问题就是实际该如何构建。本文以 2026 年事实上的标准——主管模式(指挥中枢型)为题材,面向初学者讲解5 步实践流程。
在进入复杂的框架话题之前,先说最重要的原则——“先用单一智能体构建,碰到瓶颈后再以最小规模增加”。一开始就组建大团队,多半是过度设计。后半部分会给出按照 Claude Agent SDK 与 OpenAI Agents SDK 官方文档写成、可以直接读懂的最小代码,以及角色的拆分方法和实际常见的失败。用 MCP 接入工具时,思路也一样。
先小步构建,先测量,再增加
— 从最小配置起步的主管模式
* 代码依据 Claude Agent SDK 与 OpenAI Agents SDK 的官方文档编写(2026年10月4日确认)。SDK 更新很快,运行前请在各自的官方文档中核对参数名。文中的数字都注明了出处。
1. 动手之前:你真的需要多智能体吗
第一道关卡不是技术,而是判断。多智能体很强大,但并非对所有工作都有效。如果以下任何一条都不符合,那么先用单一智能体来构建才是正解。
应当转向多智能体的 3 个信号
- 专业性分离:知识无法塞进一个提示词里(横跨调研、法务、代码等领域)
- 并行性:同时推进多项作业明显更快
- 判断分离:把“执行者”与“验证者”分开能提升质量
反过来,正如上一篇提到的,在一条直线的流程上用多智能体会吃亏。Google Research 的研究(2026年1月发布,比较了 180 种配置)中,在像规划这样必须严格按顺序推理的任务(PlanCraft)上,所测试的多智能体变体全部比单一智能体差 39%~70%。费用也会增加。Anthropic 在介绍自家研究智能体的文章中写道:智能体消耗的 token 约为聊天的 4 倍,多智能体系统约为 15 倍。请以“数量多不等于更聪明”为出发点。
2. 基本形态=主管模式
不知道选哪种模式时,从主管模式(指挥中枢型)开始最稳妥。主流 SDK 都把它作为官方的基本模式写进了文档。在 Claude Agent SDK 中,主智能体通过 Agent 工具调用子智能体;在 OpenAI Agents SDK 中,对应的是“Agents as tools”(由经理角色把专业智能体当作工具来调用)。
最终答案只有一个负责人
主管始终掌握对话的主导权,汇总工作者的结果后作答。OpenAI 的文档也建议:想让一个智能体负责最终答案时采用这种形态。
错误不易扩散
在同一项 Google Research 研究中,彼此不交流、并行工作的配置把错误放大了 17.2 倍,而有协调者的配置只放大 4.4 倍。
便于审计
委托了谁、委托了什么、返回了什么,都留在主管的记录里。每个工作者的工具可以单独限定,事故的影响范围也能预估。
机制很简单。主管(指挥中枢)接收整体任务,将其分解为子任务,委派给专业工作者,再汇总结果。主管无需知道工作者具体怎么干,只需判断“调用哪个工作者、以何种输出格式”。专业知识由工作者那一方掌握。
需要注意,OpenAI Agents SDK 里说的交接(handoff),比 STEP 4 泛指的“交接”含义更窄:分诊角色把对话本身移交给专业角色,之后由专业角色直接回答用户。这里不再保留主管,因此应当把它当作与主管模式不同的另一种模式(如何选择见第 6 节)。
3. 用 5 步构建
用五个步骤搭建一套最小配置的主管模式。铁律是:最初从2-3 个工作者起步,边测量边按需增加。
STEP 1. 分解任务
把“最终目标”和“所需的专业角色”写在纸上。例如:制作市场调研报告,就是“①收集信息→②分析→③撰写→④事实核查”。分解要事先明确——这里含糊,整体就会崩盘。
STEP 2. 定义工作者(最多 3-5 个)
给每个工作者赋予一个角色、所需的工具、一种输出格式。一开始别贪多,最多 3-5 个。每个工作者相互独立,只持有自己的工具(搜索、代码执行等)。
STEP 3. 设计主管
在主管的提示词中,明确列出“允许调用的工作者名称”(硬上限)。诀窍在于:比起单个工作者,要在主管的设计上花最多时间。这里决定了整体质量。
STEP 4. 确定交接与上下文共享
定义工作者之间传递什么、以何种格式传递。把全部上下文传给所有人会让 token 膨胀,因此只挑选必要的信息来传递。智能体间协同的标准协议就是 A2A。
4. 最小代码示例①:Claude Agent SDK(Python)
先用 Anthropic 的 Claude Agent SDK 搭一个主管 1 个+工作者 2 个(调研员、核查员)的结构。准备工作只有 pip install claude-agent-sdk 和设置环境变量 ANTHROPIC_API_KEY(官方快速入门;SDK 不会自动读取 .env 文件)。写法依照官方的 Subagents 页面。SDK 的整体用法见Claude Agent SDK 指南。
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, AgentDefinition, ResultMessage
options = ClaudeAgentOptions(
model="claude-opus-5-5", # 主管(主智能体)
system_prompt=(
"你负责统筹一份调研报告。调研交给 researcher,事实核查交给 reviewer,"
"最终文字由你来写。委托时务必写明目的、返回格式和范围。"
),
allowed_tools=["Agent", "WebSearch", "WebFetch"], # 无需确认即可使用的工具
agents={
"researcher": AgentDefinition(
description="收集一手资料的调研员。需要事实或数字时使用。",
prompt="针对给定的问题查找一手资料,以附出处 URL 的要点列表返回。不要用推测补空。",
tools=["WebSearch", "WebFetch"], # 这个角色只能用这些工具
model="sonnet",
maxTurns=15,
),
"reviewer": AgentDefinition(
description="草稿的事实核查员。定稿之前必须使用。",
prompt="把草稿中的每条主张与出处对照,列出没有依据的句子。",
tools=["WebFetch"],
model="sonnet",
maxTurns=10,
),
},
max_turns=30, # 整体往返次数上限
max_budget_usd=5.0, # 费用上限(SDK 的估算)
env={"CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH": "1"}, # 不让工作者再创建子智能体
)
async def main():
try:
async for message in query(
prompt="收集三项关于生成式 AI 在工作中使用情况的官方统计,写成一份简短报告",
options=options,
):
if isinstance(message, ResultMessage):
print(message.subtype, message.total_cost_usd)
print(message.result)
except Exception as error:
print(f"中途停止:{error}") # 达到上限时也会到这里
asyncio.run(main())
要点有 5 个。
- 工作者用
AgentDefinition列在agents里。主管读取各工作者的description来决定何时调用谁,所以 description 要具体写明“这个角色做什么、什么时候用”。 - 列出
tools后,该角色就只拥有这些工具。核查员拿不到写入类工具就是这个原因。而allowed_tools是“无需确认即可使用的工具”清单,并不限制工具(官方 Python 参考)。 - 上限设三重。每个角色的
maxTurns、整体的max_turns、费用的max_budget_usd。达到整体上限时,结果的子类型会变成error_max_turns或error_max_budget_usd并停止(智能体循环说明)。 - 阻止嵌套。子智能体还可以再创建子智能体。把环境变量
CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH设为1,工作者就会自己完成工作。同时运行的数量可以用CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS(默认 20)限制。 AgentDefinition的字段名是驼峰式。把maxTurns写成max_turns,在创建时就会报 TypeError(官方注释)。主管指定了当前的claude-opus-5-5,工作者指定了别名"sonnet"。用别名的话,版本升级后也不必改代码。
官方文档指出,Opus 5 比以前的模型更愿意把工作交给子智能体,并建议除了在提示词里提要求,还要设置深度、并发数和费用的上限。指示只能改变“怎么委托”,真正能可靠地让运行停下来的只有上限。
5. 最小代码示例②:OpenAI Agents SDK(Python)
用 OpenAI 的 Agents SDK 写同样的结构,就是用 as_tool() 把专业智能体变成工具,交给主管的 tools(官方 Agents as tools)。准备工作是 pip install openai-agents 和环境变量 OPENAI_API_KEY(官方快速入门)。省略 model 时使用 SDK 的默认模型;默认值会随 SDK 版本变化,请在 Models 页面确认。
import asyncio
from agents import Agent, Runner, WebSearchTool
researcher = Agent(
name="Researcher",
instructions="针对给定的问题查找一手资料,以附出处 URL 的要点列表返回。不要用推测补空。",
tools=[WebSearchTool()],
)
reviewer = Agent(
name="Reviewer",
instructions="把收到的草稿中的每条主张与出处对照,列出没有依据的句子。",
)
manager = Agent(
name="Manager",
instructions=(
"你负责统筹一份调研报告。调研交给 research,事实核查交给 review,"
"最终文字由你来写。"
),
tools=[
researcher.as_tool(
tool_name="research",
tool_description="收集附出处的一手资料",
max_turns=10, # 这个角色的往返上限
),
reviewer.as_tool(
tool_name="review",
tool_description="核查草稿中的事实",
),
],
)
async def main():
result = await Runner.run(
manager,
input="收集三项关于生成式 AI 在工作中使用情况的官方统计,写成一份简短报告",
max_turns=10, # 超过则抛出 MaxTurnsExceeded
)
print(result.final_output)
asyncio.run(main())
两个 SDK 的共同注意点和不同之处如下。
- 工作者不知道父级的对话。通过
as_tool()调用的一方不会自动继承父级运行的对话状态(官方文档)。Claude Agent SDK 也一样,子智能体从父级拿到的只有 Agent 工具的指示文本。文件路径、错误信息、已经决定的事项,都要写进委托内容里。 - 上限是
Runner.run(..., max_turns=)。超过就会抛出MaxTurnsExceeded。传入error_handlers={"max_turns": ...},可以用预设的回答代替异常(Running agents)。 - 用交接来写的话,是
Agent(..., handoffs=[billing_agent, refund_agent])。接手的一方会接管对话,默认能看到之前的全部对话记录。如果有不想交出去的信息,用input_filter过滤。
6. 角色怎么分:好的拆分与坏的拆分
比代码更难的是怎么分。Anthropic 写道,每个子智能体都需要拿到目标、输出格式、要用的工具和信息来源、任务边界这四样东西(同一篇文章)。下面把满足这些条件的拆分和不满足的拆分并列出来。
| 拆分方式 | 判断 | 理由 |
|---|---|---|
| 按专业和工具拆分(调研、写作、事实核查) | 好 | 每个角色只拿到需要的工具和权限。核查员可以设成只读。 |
| 按彼此独立的对象拆分(三家公司的产品各由一个角色调查) | 好 | 互不等待、并行运行,最后由主管比较。 |
| 把一条直线的工序切成碎片(摘要→排版→翻译各用一个角色) | 避免 | 只是在等前一步的结果,并不能并行,而且每次交接都会丢失上下文。单一智能体就够了。 |
| 不划定范围就把同一个问题分给多个角色 | 避免 | Anthropic 的早期版本在调查半导体短缺时,一个子智能体在研究 2021 年的汽车芯片危机,另外两个则重复调查 2025 年的供应链。 |
| 把执行者和核查者合并成一个角色 | 避免 | 变成自己检查自己的输出,单独设核查的意义就没了。 |
用几个智能体,同一篇文章也给出了参考。Anthropic 在其研究智能体的主管提示词中写入了规模准则:简单的事实查找用 1 个智能体、调用工具 3~10 次;直接比较用 2~4 个子智能体、各调用 10~15 次;复杂的研究可能超过 10 个子智能体。这是调研类工作的数字,在你自己的工作中请从小的一端开始,测量之后再增加。
主管模式和交接如何选择,OpenAI 文档的标准很清楚。想让一个智能体负责最终答案、或要合并多个专业角色的结果,就用主管模式(Agents as tools)。如果分流本身就是工作,被选中的专业角色直接回答用户即可(例如客服咨询的分流),就用交接。两者也可以组合使用。
7. 常见失败与对策
容易栽跟头的地方基本是固定的。下面整理了 Anthropic 说在自家研究智能体上真实发生过的失败,以及两个 SDK 官方文档提醒注意的地方。
| 失败例 | 对策 |
|---|---|
| 为简单的问题派出大量工作者(Anthropic 的早期版本曾为简单查询派出 50 个子智能体) | 把规模准则写进主管的提示词,并设置并发数和费用上限。 |
| 没完没了地寻找根本不存在的信息源(同样是早期版本的失败) | 用每个角色的 maxTurns 和整体的 max_turns 截断。 |
| 工作者之间重复做同一件事 | 委托时写明目的、返回格式和范围(包括不做什么)。 |
| 工作者不了解前提,答非所问 | 父级的对话不会传过去。把需要的事实写进委托内容。 |
| 主管不委派,自己动手 | 把 description 写具体,或者在提示词里点名调用(Claude Agent SDK 官方故障排查)。 |
| token 膨胀(多智能体约为聊天的 15 倍) | 不要传全部上下文,只传需要的部分。工作者使用便宜的模型。 |
| 顺序型任务精度下降(有研究测得差 39%~70%) | 如果是一条直线的工作,就回到单一智能体。 |
| 不知道在哪里失败的 | 记录每次调用。在 Claude Agent SDK 中,可以通过 name 为 Agent 的 tool_use 块和 parent_tool_use_id 分辨每条消息来自哪个角色。 |
共通的教训是“比起框架,提示词、工具设计与评估框架(eval harness)更能决定成败”。OpenAI 的文档同样列举了打磨提示词、监控并迭代、让智能体专精一项任务、投入评估等做法。比起华丽的架构,小步构建、测量、只在划算时才增加的纪律,最终才是最快的。
总结
多智能体系统的构建,只要从最小配置的主管模式起步就不可怕。我们来回顾要点。
本文要点
- 🚦 先从单一开始。 在必须按顺序推理的任务上,有研究发现多智能体全部变差 39%~70%。
- 🧠 基本形态是主管模式。 Claude Agent SDK 用子智能体,OpenAI Agents SDK 用 Agents as tools。
- 🔢 5 步:分解→定义工作者→设计主管→交接→测量。
- 🧩 拆分方式:按专业、工具或彼此独立的对象来分。不要把一条直线的工序切碎。
- ⚠️ 上限设三重(每个角色、整体、费用)。委托工作者时写明目的、格式和范围。
“小步构建,先测量,再增加”。只要守住这条纪律,多智能体就会成为能托付复杂工作的强力搭档。概念梳理见什么是多智能体系统?,单体的构建方法见如何构建 AI 智能体。
FAQ
Q. 应该先从哪种模式开始构建?
A. 主管模式(指挥中枢型)是唯一选择,没有疑问。主流框架都支持它,失败模式已知,参考实现也最丰富。等熟练之后再去探索其他模式。
Q. 工作者从几个开始比较好?
A. 最初 2-3 个,最多也控制在 3-5 个以内。数量越多越不稳定,token 也会膨胀。常规做法是边测量,只在证明确有需要时才增加。
Q. 框架(SDK)是必须的吗?
A. 不是必须的。OpenAI 的文档也介绍了“用代码决定顺序”的做法,例如用结构化输出给任务分类再决定下一个角色,或在循环中交替运行执行角色和评估角色,并指出这样在速度、成本和效果上更可预测。顺序固定的工作适合这种方式。如果不想自己编写会话保存、工具权限和上限,用 SDK 是捷径。
Q. 怎样防止成本爆炸?
A. ①给整体和每个角色的往返次数设上限 ②设置费用上限(Claude Agent SDK 的 max_budget_usd)③不传全部上下文,只传需要的部分 ④工作者使用便宜的模型,这 4 点很有效。据 Anthropic 统计,多智能体系统消耗的 token 约为聊天的 15 倍。请从一开始就设好上限。