非官方社区教程 · 内容整理自公开资料 · 豆包工作为字节跳动产品,本站与官方无关
豆包工作教程
首页/ Harness 拆解/CH-07 编排层:多 Agent 三层架构

CH-07 编排层:多 Agent 三层架构

图 7-1:多 Agent 三层编排

图 7-1:多 Agent 三层编排

7.1 为什么需要多个 Agent

单个 Agent 处理复杂任务时面临一个根本矛盾:上下文窗口有限,但复杂任务需要的信息很多。如果一个 Agent 同时负责理解用户意图、规划任务步骤、执行研究、编写代码、生成图片、检查质量,它的系统提示词会变得极其庞大,对话历史会迅速膨胀,模型的注意力被稀释,任务质量下降。

多 Agent 架构的解决方案是分工:把复杂任务拆给多个专门化的 Agent,每个 Agent 有自己的系统提示词、工具集和上下文窗口,只关注自己负责的部分。主 Agent 负责理解意图和协调,子 Agent 负责执行具体任务,结果通过消息传递汇总。

豆包工作实现了一个三层 Agent 架构:MainAgent → OrganizeAgent → SubAgent。这个架构不是可选的高级功能,而是内置在系统提示词和工具系统中的基础能力。

7.2 三层架构

7.2.1 MainAgent:用户界面层

MainAgent 是用户直接对话的 Agent,也就是你在豆包工作聊天窗口中与之交互的"豆包"。它的职责是:

  • 拥有完整的用户对话历史
  • 理解用户意图
  • 判断任务是自己完成还是委派
  • 向用户交付最终结果
  • 管理用户体验(回复风格、进度更新、错误沟通)

MainAgent 有一个关键约束:它默认不应该把复杂任务自己硬扛。系统提示词明确规定,复杂、多步骤、研究密集型任务应该委派给 OrganizeAgent,MainAgent 只负责"面对用户"的部分。

7.2.2 OrganizeAgent:任务编排层

OrganizeAgent 是 MainAgent 通过 create_agent 工具创建的"项目经理"。它的职责是:

  • 接收 MainAgent 委派的完整任务描述
  • 分解任务为子任务
  • 创建 SubAgent 执行各个子任务
  • 收集和整合 SubAgent 的结果
  • 向 MainAgent 返回最终产物

OrganizeAgent 不直接执行具体工作(不写代码、不做研究、不生成图片),它只做规划、委派和整合。这类似于一个项目经理:理解需求、拆分任务、分配给专家、验收成果。

7.2.3 SubAgent:任务执行层

SubAgent 是 OrganizeAgent 创建的"专家工人"。每个 SubAgent 负责一个明确的子任务,例如:

  • "搜索豆包工作的官方文档并总结"
  • "分析 App 包中的 Helper 二进制文件"
  • "生成一张架构图"
  • "把研究结果写成 Markdown 文档"

SubAgent 有自己独立的上下文窗口,只看到与自己任务相关的信息。它可以使用工具(Bash、Read、Write、搜索等),但不能创建新的 Agent(只有 MainAgent 可以创建 OrganizeAgent,OrganizeAgent 可以创建 SubAgent)。SubAgent 完成任务后,结果返回给 OrganizeAgent,自己的上下文随即释放。

7.3 三个编排工具

多 Agent 架构通过三个工具实现:「实测」

7.3.1 create_agent

create_agent 是 MainAgent 委派任务的唯一入口。参数包括:

  • agent_type:只能是 "OrganizeAgent"(MainAgent 不能直接创建 SubAgent)
  • title:任务的简短标题(不超过 16 字)
  • hint:给 OrganizeAgent 的补充信息

hint 参数是一个精妙的设计。它允许 MainAgent 把多轮对话中确认的偏好、约束、关键事实一次性传给 OrganizeAgent,避免 OrganizeAgent 只看到原始用户消息而做错方向。但 hint 有一个重要限制:它只到达 OrganizeAgent,不会自动透传给 SubAgent。如果某个约束需要 SubAgent 知道,OrganizeAgent 必须在创建 SubAgent 时显式转发。

这个设计防止了上下文污染:MainAgent 的对话历史和偏好不会自动灌入每个 SubAgent,保持了 SubAgent 上下文的干净。但它也要求 OrganizeAgent 主动判断哪些信息需要转发——如果 OrganizeAgent 忘记转发关键约束,SubAgent 可能偏离方向。

7.3.2 send_message

send_message 用于向已存在的 Agent 追加消息。典型场景:

  • 用户对前序产物提出修改要求("这个 PPT 改成横版")
  • 需要补充信息("基于刚才的 Excel 再加一个 Sheet")
  • 继续之前的任务("接着做")
  • 模糊指代("刚才那个")

send_message 的关键价值是复用 Agent 上下文。每个 Agent 绑定独立的会话上下文,包括之前读取的文件、执行的命令、生成的中间产物。新建 Agent 会丢失这些上下文,而 send_message 让任务在原有上下文中继续。

7.3.3 terminate_organizer

terminate_organizer 用于终止一个正在运行的 OrganizeAgent。典型场景:

  • Agent 偏离了用户需求
  • 用户改变了方向,原任务不再需要
  • 用户要求重做
  • 继续运行没有价值

终止后,MainAgent 可以创建新的 OrganizeAgent 处理新需求。这个工具提供了"急刹车"能力——当多 Agent 任务跑偏时,不需要等待它自然结束。

7.4 任务委派流程

图 7-2:多 Agent 任务委派序列

一个典型的多 Agent 任务执行流程如下:

用户:"帮我研究豆包工作的 Harness 设计,写成蓝皮书"
    ↓
MainAgent:理解任务,判断为复杂研究任务
    ↓
MainAgent → create_agent(OrganizeAgent, hint="用五层框架...")
    ↓
OrganizeAgent:接收任务,分解为:
  1. 本地文件探索
  2. 联网调研
  3. 证据整理
  4. 正文写作
  5. 审查验证
    ↓
OrganizeAgent → create SubAgent("本地文件探索")
    ↓
SubAgent 1:执行文件分析,返回发现
    ↓
OrganizeAgent → create SubAgent("联网调研")
    ↓
SubAgent 2:执行网络搜索,返回资料
    ↓
OrganizeAgent:整合两份结果
    ↓
OrganizeAgent → create SubAgent("正文写作")
    ↓
SubAgent 3:基于整合结果写正文,返回文档
    ↓
OrganizeAgent:审查文档,返回给 MainAgent
    ↓
MainAgent:向用户交付最终产物

「推断」

在这个流程中,每个 SubAgent 只看到自己需要的信息:文件探索 SubAgent 不需要知道联网调研的结果,写作 SubAgent 只看到整合后的材料。这种信息隔离提高了每个 SubAgent 的注意力集中度。

7.5 上下文隔离与信息边界

多 Agent 架构中最微妙的设计是上下文边界:

7.5.1 MainAgent 的上下文

MainAgent 拥有完整的用户对话历史,包括所有之前的消息、工具调用和结果。这是它理解模糊指代("刚才那个""继续")的基础。

7.5.2 OrganizeAgent 的上下文

OrganizeAgent 的初始上下文包括:

  • 用户的原始消息(自动透传)
  • MainAgent 的 hint(一次性补充信息)
  • 自己的系统提示词(编排规则)

自动看到 MainAgent 的完整对话历史。如果用户在多轮对话中逐步明确了需求,MainAgent 需要通过 hint 把关键信息传递给 OrganizeAgent。

7.5.3 SubAgent 的上下文

SubAgent 的初始上下文由 OrganizeAgent 在创建时提供(subtask 描述)。它不自动看到:

  • MainAgent 的对话历史
  • MainAgent 给 OrganizeAgent 的 hint
  • 其他 SubAgent 的结果

OrganizeAgent 负责在 subtask 中显式提供 SubAgent 需要的所有信息。这是"信息最小化"原则:每个 Agent 只知道完成自己任务所需的最少信息。

7.5.4 VM 会话共享

虽然上下文隔离,但所有 Agent 共享同一个虚拟机(VM)会话和工作目录。这意味着:

  • SubAgent 写入的文件,OrganizeAgent 和其他 SubAgent 可以读取
  • SubAgent 安装的依赖,后续 SubAgent 可以使用
  • 工作目录中的文件是跨 Agent 的共享状态

文件系统成为 Agent 之间的"共享黑板":SubAgent 不通过消息传递大量数据,而是把结果写入文件,其他 Agent 通过读取文件获取。这比在消息中传递大块数据更高效,也避免了上下文窗口的浪费。

7.6 与 DeerFlow sub-agent 的对照

字节开源的 DeerFlow 2.0 也实现了多 Agent 架构,其设计可以与豆包工作对照。「社区」

DeerFlow 的 sub-agent 设计特点:

  1. 按需生成:sub-agent 不是预定义的,而是根据任务需要动态生成,每个 sub-agent 有特定的角色和任务描述。
  2. 自动拾取 Skill:sub-agent 自动发现和加载相关 Skill(通过 frontmatter description),与豆包工作的 Skill 机制一致。
  3. 沙箱隔离:sub-agent 在 Docker/K8s/local 三种沙箱模式中运行,与豆包工作的 Seatbelt 沙箱理念一致但实现不同。
  4. MCP 内置:sub-agent 可以连接 MCP 服务器获取工具能力。
  5. IM 集成:DeerFlow 支持 Lark/Slack/Discord 作为交互界面。

豆包工作与 DeerFlow 的关键差异:

维度 豆包工作 DeerFlow 2.0
Agent 层级 固定三层(Main/Organize/Sub) 动态生成,层级灵活
沙箱 macOS Seatbelt(本地) Docker/K8s/local(云端优先)
运行环境 用户桌面 云端容器或本地
交互界面 桌面客户端 IM 机器人 + Web
开源 是(74K stars)
目标用户 大众/企业 开发者/企业

两者的相似性——sub-agent 按需生成、Skill 自动拾取、沙箱隔离、MCP 内置——反映了字节内部对 Agent 架构的共识设计模式。豆包工作可以看作这些模式在桌面端的产品化实现。

7.7 多 Agent 的实际价值

多 Agent 架构不是银弹,它在以下场景中价值最大:

长链条任务:研究 → 分析 → 写作 → 审查,每个阶段需要不同的能力和上下文。单 Agent 容易在后期遗忘早期的约束,多 Agent 通过上下文重置保持专注。

并行任务:OrganizeAgent 可以同时创建多个 SubAgent 并行执行独立子任务(如同时搜索多个来源),缩短总时间。

上下文管理:复杂任务的对话历史可能超过单个上下文窗口。多 Agent 把信息分散到多个上下文中,每个 Agent 只处理相关片段。

质量控制:OrganizeAgent 作为"项目经理"审查 SubAgent 的结果,可以在整合前发现问题。写作 SubAgent 和审查 SubAgent 的分离,避免了"自己检查自己"的盲区。

但在简单任务中("帮我改个文件名""今天天气怎么样"),多 Agent 反而增加开销。MainAgent 的系统提示词明确规定:只有复杂任务才委派,简单任务直接完成。这种"按需委派"的策略平衡了能力和效率。

7.8 错误处理与恢复

多 Agent 架构中的错误处理比单 Agent 更复杂,因为错误可能发生在任何一层。

7.8.1 SubAgent 失败

当 SubAgent 执行失败时(工具调用错误、权限不足、超时、模型返回异常),OrganizeAgent 有几种处理方式:

  • 重试:如果错误是暂时性的(网络超时、服务不可用),OrganizeAgent 可以重新创建 SubAgent 或通过 send_message 让它重试。
  • 降级:如果某个工具不可用,OrganizeAgent 可以让 SubAgent 换一种方式完成任务(比如搜索失败时改用网页抓取)。
  • 上报:如果错误无法恢复,OrganizeAgent 把错误信息返回给 MainAgent,由 MainAgent 决定是否告知用户或请求更多信息。
  • 终止:如果 SubAgent 严重偏离任务,OrganizeAgent 可以终止它并创建新的 SubAgent。

7.8.2 OrganizeAgent 失败

如果 OrganizeAgent 本身出现问题(任务分解不合理、陷入循环、上下文溢出),MainAgent 可以通过 terminate_organizer 终止它,然后创建新的 OrganizeAgent 重新开始。这是"急刹车"机制在编排层的应用。

7.8.3 部分成功

复杂任务可能部分成功——研究 SubAgent 返回了结果,但写作 SubAgent 失败了。OrganizeAgent 可以保留已完成的结果(写入文件系统),只重新执行失败的部分。这是文件系统作为"共享黑板"的另一个优势:中间结果持久化在磁盘上,不会因为某个 SubAgent 失败而丢失。

7.8.4 幂等性与重复执行

定时任务和重试机制要求任务尽可能幂等——重复执行不会产生副作用。系统提示词中对定时任务的 query 格式要求(写入"本次请求是由定时任务触发的")有助于 SubAgent 判断当前是否为定时触发,避免重复操作。但完全的幂等性需要任务设计时保证,框架只提供机制,不强制语义。

7.9 多 Agent 的成本考量

多 Agent 不是免费的。每个 SubAgent 都有独立的系统提示词、工具定义和上下文窗口,每次工具调用都消耗 token。一个有 5 个 SubAgent 的任务,token 消耗可能是单 Agent 的 3-5 倍。

豆包含系统提示词通过以下方式控制成本:

  1. 简单任务不委派:MainAgent 直接处理简单任务,避免不必要的 Agent 创建。
  2. 上下文最小化:SubAgent 只看到自己需要的信息,不继承 MainAgent 的完整对话历史。
  3. 延迟加载工具:tool_search 机制避免所有 SubAgent 都加载完整工具 schema。
  4. Skill 按需加载:只有匹配的 Skill 才读取完整正文。

这些设计在能力和成本之间取得平衡。对于用户来说,多 Agent 任务可能消耗更多的模型额度,但换来了更好的任务质量和更可靠的结果。

7.10 多 Agent 的典型使用模式

基于系统提示词中的编排规则和实际使用体验,可以总结出多 Agent 的几种典型模式:

7.10.1 研究-写作模式

这是最常见的模式:一个 SubAgent 负责搜索和收集资料,另一个 SubAgent 负责基于资料写作。研究 SubAgent 可以并行搜索多个来源,写作 SubAgent 只看到整合后的材料,不被搜索过程干扰。

适用场景:写报告、做调研、竞品分析、文献综述。

7.10.2 生成-审查模式

一个 SubAgent 生成内容(代码、文档、设计),另一个 SubAgent 独立审查。审查 SubAgent 没有参与生成过程,没有"自己检查自己"的盲区,可以更客观地发现问题。

适用场景:代码审查、合同审查、事实核查、质量保证。

7.10.3 管道模式

任务被拆成线性的多个阶段,每个 SubAgent 负责一个阶段,前一个的输出是后一个的输入。例如:数据收集 → 数据清洗 → 数据分析 → 可视化 → 报告生成。

适用场景:数据处理流水线、内容生产流水线、ETL 任务。

7.10.4 并行-合并模式

多个 SubAgent 并行执行独立的子任务,OrganizeAgent 收集所有结果后合并。例如同时分析多个竞争对手、同时测试多个方案、同时从多个数据源检索。

适用场景:多维度分析、批量处理、A/B 测试。

7.10.5 专家会诊模式

对于需要多领域知识的复杂问题,OrganizeAgent 创建多个不同领域的专家 SubAgent,各自从自己的专业角度分析,OrganizeAgent 综合各方观点给出结论。

适用场景:跨学科问题、复杂决策、风险评估。

7.11 编排层的架构判断

判断一:三层架构是"项目经理"模式的工程化。 MainAgent 面对用户、OrganizeAgent 规划协调、SubAgent 执行任务——这不是技术驱动的设计,而是对人类工作方式的模拟。它的优势是可解释性强(用户能理解"谁在做什么"),劣势是固定层级可能不够灵活(某些任务可能需要四层或两层)。「推断」

判断二:hint 不透传是关键的信息卫生设计。 自动透传 hint 会让每个 SubAgent 都背负 MainAgent 的全部上下文,违背分工的初衷。强制 OrganizeAgent 显式转发,虽然增加了遗漏风险,但保持了 SubAgent 上下文的干净。这是"显式优于隐式"的工程原则在 Agent 设计中的体现。「推断」

判断三:文件系统是 Agent 间的主要数据通道。 Agent 之间不通过消息传递大块数据,而是通过共享文件系统交换结果。这解释了为什么豆包工作强调文件操作工具(Read/Write/Edit/Glob/Grep)和产物交付工具(present_files)——文件系统是多 Agent 协作的"总线"。「推断」

判断四:与 DeerFlow 的一致性暗示了内部框架。 豆包工作和 DeerFlow 在 sub-agent、Skill、沙箱、MCP 四个维度上的设计高度一致,不太可能是巧合。更可能的情况是字节内部有一个共享的 Agent 框架或设计规范,豆包工作(桌面端)、DeerFlow(开源)、AgentKit(云端)都是这个框架的不同产品形态。CH-09 将详细分析这个体系内关系。「推断」

下一章将进入迭代层,分析豆包工作如何支持长时间运行的任务——任务模式、定时任务、多端同步和后台执行。

CHAPTER 08 · ZJBB-004

来源:《豆包工作 Harness 设计拆解蓝皮书》 · 作者 大鹏|智见 AI
授权:CC BY-NC-SA 4.0 (署名 · 非商业性使用 · 相同方式共享)—— 转载请保留原作者署名与相同协议。
整理:疯狂的豇豆 · 查看完整来源清单
🤖 GEO 问答 · 生成式引擎优化

❓ 什么是CH-07 编排层:多 Agent 三层架构?

图 7-1:多 Agent 三层编排

❓ 如何理解为什么需要多个 Agent?

单个 Agent 处理复杂任务时面临一个根本矛盾:上下文窗口有限,但复杂任务需要的信息很多。如果一个 Agent 同时负责理解用户意图、规划任务步骤、执行研究、编写代码、生成图片、检查质量,它的系统提示词会变得极其庞大,对话历史会迅速膨胀,模型的注意力被稀释,任务质量下降。

❓ 如何理解三层架构?

MainAgent 是用户直接对话的 Agent,也就是你在豆包工作聊天窗口中与之交互的"豆包"。它的职责是:

❓ 如何理解三个编排工具?

多 Agent 架构通过三个工具实现:「实测」