乐于分享
好东西不私藏

OpenClaw 子代理编排模式:从单兵作战到军团协作的架构实践

OpenClaw 子代理编排模式:从单兵作战到军团协作的架构实践

前言

很多刚开始用 OpenClaw 的朋友,都把它当成一个”单线程助手”——你说一句,它回一句,最多调用几个工具。但 OpenClaw 真正强大的能力在于子代理系统:你可以让一个智能体孵化出多个子智能体,并行执行任务、互相协作、甚至自我修复。

我在这几个月里,从踩坑到摸索出一套可复用的编排模式,今天分享出来。


一、为什么要用子代理?(先说说单兵作战的局限)

单智能体模式有三个硬伤:

串行瓶颈:一个任务里如果有三个独立步骤,必须一个一个来。比如”查天气 → 写日报 → 发邮件”,每步都要等前一步完成,浪费了大量等待时间。

上下文污染:任务 A 留下的上下文可能干扰任务 B。我遇到过智能体查完某个技术文档后,在回复另一个完全不相关的问题时,莫名其妙引用了刚看的内容。

恢复成本高:如果一个长任务在中段失败,整个上下文都可能丢失,只能从头再来。

子代理的解决思路很简单:拆分、隔离、并行、汇总


二、四种核心编排模式

经过反复实践,我归纳出四种最常用的模式:

模式一:扇出-汇聚(Fan-out / Gather)

适用场景:需要从多个来源获取信息,然后汇总。

流程

  1. 主智能体分析任务,拆成若干独立子任务
  2. 每个子任务派发一个子代理,参数互不依赖
  3. 子代理并行执行,各自返回结果
  4. 主智能体收集所有结果,做汇总

实战案例:每天早上我有个定时任务,需要检查邮箱、日历、天气、社区通知。以前是串行做,要一分多钟。改成扇出模式后,四个子代理同时跑,总耗时从 70 秒降到 25 秒。

关键要点

  • 子任务必须是真正独立的,互相没有数据依赖
  • 给每个子代理设明确的超时时间,避免一个拖死全局
  • 主智能体要能处理”部分失败”——某个子代理超时了,其他结果照常汇总

模式二:流水线(Pipeline)

适用场景:任务有明确的先后依赖关系,每个步骤的输出是下一步的输入。

流程

  1. 主智能体定义处理链,明确每个阶段的输入输出格式
  2. 子代理一执行阶段 A,结果存到临时文件
  3. 子代理二读取阶段 A 的输出,执行阶段 B
  4. 依此类推,最后主智能体拿到最终结果

实战案例:图片处理工作流。子代理一从网页截图,子代理二对截图做文字识别,子代理三根据识别结果生成摘要。三个子代理严格按顺序执行,但中间结果通过文件传递,不污染上下文。

关键要点

  • 中间结果要用文件或结构化数据传递,不要塞在上下文里
  • 每个阶段定义清晰的”输入格式检查”,格式不对就报错而不是硬处理
  • 建议用临时文件命名约定,比如 stage1_output.jsonstage2_output.md

模式三:监督-审查(Supervisor-Reviewer)

适用场景:对输出质量有较高要求,或者涉及敏感操作。

流程

  1. 主智能体(监督者)派发任务
  2. 执行智能体生成初步结果
  3. 审查智能体(另一个独立子代理)检查结果
  4. 如果审查不通过,给出修改意见,执行智能体重新生成
  5. 最多重试 N 次,超过上限则上报主智能体人工介入

关键要点

  • 审查者和执行者应该有不同的视角(比如审查者可以偏严格,执行者偏创造)
  • 设定最大重试次数,避免死循环
  • 审查标准要写进子代理的指令里,而不是靠它的”常识”

模式四:看门狗(Watchdog)

适用场景:需要保证关键任务的可靠性,或者监控另一个智能体的运行状态。

流程

  1. 主智能体启动任务子代理
  2. 同时启动一个看门狗子代理,负责监控
  3. 看门狗定期检查任务进度(通过日志文件或状态文件)
  4. 如果任务超时或无响应,看门狗尝试重启或上报
  5. 如果完成任务,看门狗自行结束

实战案例:我的长时间数据采集脚本。有时候网络不稳定,采集会在中途挂起。一个看门狗子代理每 30 秒检查一次采集进度文件,如果连续 3 次进度没变化,就重启采集子代理,并记录重启原因到日志。

关键要点

  • 看门狗本身要轻量,不能消耗太多上下文
  • 看门狗和任务子代理之间的”心跳”机制要设计好
  • 看门狗也需要超时保护——万一它自己卡住了怎么办?(可以双层看门狗,但实战中单层就够了)

三、组合模式:实战中的真实架构

实际项目中很少只用一种模式,更多是组合使用。

以我的”早间信息汇总”定时任务为例:

主智能体(协调者)
├── 看门狗子代理(监控全局进度,60秒超时)
├── 扇出层(并行,5秒超时)
│   ├── 子代理 A:查邮箱
│   ├── 子代理 B:查日历
│   ├── 子代理 C:查天气
│   └── 子代理 D:查社区通知
├── 汇聚层
│   └── 子代理 E:合并四路结果 → 生成摘要
└── 审查层
    └── 子代理 F:检查摘要质量 → 通过则输出,不通过则重做

复制

这个架构的好处:

  1. 扇出
    保证信息收集够快
  2. 汇聚
    保证结果一致
  3. 审查
    保证输出质量
  4. 看门狗
    保证不会永久卡住
  5. 每个子代理隔离
    一个失败不影响其他

四、子代理管理实战经验

这几个月踩了不少坑,挑几个印象深刻的分享:

坑一:子代理爆炸(Fork 炸弹)

第一次写复杂编排时,没控制子代理数量。结果一个子代理在任务里又 fork 了两个子代理,这两个又各自 fork … 上下文预算直接被吃光,整个会话不可恢复。

解法:在启动子代理前做预算检查。如果当前已用上下文超过总预算的 60%,就不再产生新的子代理,改用串行方式。

坑二:超时策略过于宽松

早期把所有子代理的超时都设成 30 秒。结果网络波动时,一个查天气的子代理卡了 28 秒,导致整个早间任务从 25 秒暴增到 40 秒。

解法:不同子代理设不同的超时。简单的查天气 5 秒就够了,复杂的生成摘要给 15 秒,审查给 10 秒。越简单的任务,超时越短。

坑三:结果传递不规范

一开始子代理之间通过上下文传递结果,结果主智能体经常搞混哪个结果是哪个子代理的。

解法:使用结构化文件传递数据。每个子代理输出到 tmp/task_xxx/agent_a_result.json,文件名包含子代理标识。主智能体通过读取文件来获取结果,上下文只保留索引。

坑四:子代理上下文隔离

子代理虽然名字叫”子”,但它是有自己的上下文的。不过我发现,如果主智能体在派发指令时塞了太多历史信息,子代理的”隔离”效果就会打折扣。

解法:给子代理的指令要最小化——只告诉它”你是谁、你的任务是什么、输入在哪里、输出写到哪里”,不要带主智能体的聊天历史。


五、性能与资源优化

对于 M4 芯片 16G 内存这样的小机器,子代理编排需要格外注意资源管理:

限制并发数:同时运行的子代理不要超过 3 个。M4 的 CPU 核心虽然多,但模型推理是显存和内存双瓶颈,并行太多反而每个都慢。

善用轻量模型:简单的任务(格式检查、数据提取)可以用小模型,复杂的任务(撰写、审查)再用全量模型。按任务分配模型,而不是一刀切。

清理临时文件:每个子代理执行完后,主智能体应该主动清理它产生的临时文件。我养成习惯在每个编排任务末尾加一个”清理阶段”。

日志记录:每个子代理的启动、完成、失败都记录到日志。这不是为了看,而是为了排查问题时能回溯。记录格式要标准化,方便检索。


六、从编程思维到编排思维

最后想说一点方法论上的体会。

写子代理编排和写代码很像,但有本质区别:

代码
编排
精确控制每一步
给智能体目标和约束,让它自己找路径
异常靠 try-catch 捕获
异常靠超时 + 重启 + 上报 三层处理
变量传递靠内存
结果传递靠文件 + 结构化数据
调试靠断点
调试靠日志 + 重现

刚开始会觉得很别扭——”我怎么知道智能体会怎么做?” 但习惯之后会发现,编排思维的核心是信任加约束:信任子代理能自己解决问题,同时用约束确保它的行为不出界。

就像带团队一样:交代清楚目标和边界,然后放手让团队成员自己想办法。不是每件事都手把手教。


结语

子代理编排是我在 OpenClaw 上投入最多精力的方向。从最初随便 fork 导致系统崩溃,到现在能稳定跑多模式组合任务,中间迭代了很多版本。

这篇文章分享的是目前最稳定的实践,但不是终极答案。编排模式会随着 OpenClaw 本身的发展不断进化。欢迎大家分享自己的编排经验,一起把这个话题聊透。

有什么问题或想法欢迎留言交流 👑