多 agent 系统通过将复杂任务分解为专门化的独立 agent 来提升 LLM 应用的能力。核心思想是让多个具有不同提示词、工具和职责的 agent 通过结构化的通信模式协作完成任务。主流框架(AutoGen、LangGraph、CrewAI、OpenClaw)都采用图结构或对话模式来编排 agent 交互,强调异步消息传递、可观测性和模块化设计。
主要协作机制
1. 图结构编排(LangGraph)
核心特点:
- 显式定义 agent 节点和状态转移
- 使用有向图描述工作流
- 支持条件分支和循环
- 强类型状态管理
优点:
- ✅ 流程可视化,易于理解和调试
- ✅ 精确控制执行路径
- ✅ 适合复杂的非对话型工作流
- ✅ 状态管理清晰,便于追踪
缺点:
- ❌ 需要预先设计完整流程图
- ❌ 动态调整流程较困难
- ❌ 学习曲线较陡峭
- ❌ 过度设计风险(简单任务也用图)
适用场景:
- 多步骤数据处理管道
- 需要条件分支的决策流程
- 需要人工审核节点的工作流
- 复杂的企业级应用
来源 : LangGraph Multi-Agent Workflows
2. 对话模式(AutoGen)
核心特点:
- Agent 间交互框架为"对话"
- 支持多轮协商和讨论
- 异步事件驱动架构(v0.4+)
- 跨语言互操作(Python、.NET)
优点:
- ✅ 更自然的交互方式
- ✅ 灵活的协作模式
- ✅ 支持分布式 agent 网络
- ✅ 内置可观测性(OpenTelemetry)
缺点:
- ❌ 控制力较弱,难以保证确定性
- ❌ 对话可能陷入循环或偏离主题
- ❌ 调试困难(需要追踪完整对话历史)
- ❌ 成本较高(多轮对话消耗更多 token)
适用场景:
- 需要多方协商的任务(如代码审查)
- 创意生成和头脑风暴
- 模拟人类团队协作
- 研究和实验性项目
来源 : AutoGen - Microsoft Research
3. 角色驱动(CrewAI)
核心特点:
- 每个 agent 有明确的"角色"和"目标"
- 预定义的协作模式(sequential、hierarchical)
- 强调 agent 的"个性"和专业化
- 简化的配置方式
优点:
- ✅ 上手快,配置简单
- ✅ 角色隐喻易于理解
- ✅ 适合模拟真实团队结构
- ✅ 内置常见协作模式
缺点:
- ❌ 灵活性有限(受限于预定义模式)
- ❌ 复杂流程支持不足
- ❌ 生态相对较小
- ❌ 高级定制需要深入源码
适用场景:
- 快速原型开发
- 模拟特定职业团队(如营销团队、开发团队)
- 教育和演示项目
- 中小型应用
4. 层级化 Supervisor 模式(LangGraph + AutoGen)
核心特点:
- Supervisor agent 负责任务分配和路由
- 子 agent 执行具体任务
- 支持递归层级(子 agent 也可以是 supervisor)
- 集中式错误处理
优点:
- ✅ 清晰的责任划分
- ✅ 易于扩展(添加新 agent 不影响现有结构)
- ✅ 统一的错误处理和重试机制
- ✅ 适合大规模系统
缺点:
- ❌ Supervisor 成为单点瓶颈
- ❌ 增加一层抽象,调试更复杂
- ❌ Supervisor 的路由逻辑可能变得复杂
- ❌ 子 agent 间无法直接通信
适用场景:
- 大型企业应用
- 需要动态任务分配的系统
- 多租户场景(不同用户使用不同 agent 组合)
- 需要集中监控和管理的系统
来源 : LangGraph Multi-Agent Workflows
5. OpenClaw Subagent 机制
核心特点:
- 主 agent 通过
sessions_spawn启动子 agent - 子 agent 有独立的 workspace 和配置
- 支持
mode: "run"(一次性)和mode: "session"(持久化) - 基于 allowlist 的权限控制
- 推送式完成通知(不需要轮询)
优点:
- ✅ 完全隔离的执行环境(独立 workspace)
- ✅ 灵活的生命周期管理(cleanup: delete/keep)
- ✅ 安全的权限模型(allowAgents 白名单)
- ✅ 支持查看子 agent 执行历史(sessions_history)
- ✅ 异步非阻塞(主 agent 不等待子 agent)
- ✅ 可配置超时和错误处理
缺点:
- ❌ 子 agent 间无法直接通信(需通过主 agent 中转)
- ❌ 配置相对复杂(需要在 openclaw.json 中预定义)
- ❌ 调试需要查看多个 session 历史
- ❌ 文档和社区资源较少
适用场景:
- 需要强隔离的任务(如处理不同用户数据)
- 长时间运行的后台任务
- 需要独立配置和工具集的专业化 agent
- 个人助理和自动化场景
- 需要精细权限控制的多租户系统
配置示例:
json
{
"agents": {
"list": [
{
"id": "main",
"subagents": {
"allowAgents": ["researcher", "coder", "writer"]
}
},
{
"id": "researcher",
"workspace": "~/.openclaw/workspace-researcher"
}
]
}
}
使用示例:
javascript
sessions_spawn({
agentId: "researcher",
runtime: "subagent",
mode: "run",
runTimeoutSeconds: 300,
cleanup: "keep",
task: `
## 行为规范
读取 workspace/SUBAGENT_SOUL.md 并严格遵循。
## 任务
研究 XXX 主题,输出 JSON 格式报告。
## 输出格式
{"summary": "...", "findings": [...]}
`
})
来源: OpenClaw 官方文档
状态管理模式对比
共享状态(Shared Scratchpad)
机制:所有 agent 可见彼此的完整工作过程
优点:
- ✅ 信息透明,便于协作
- ✅ 适合调试和审计
- ✅ Agent 可以从其他 agent 的中间结果中学习
缺点:
- ❌ 上下文膨胀(每个 agent 都看到所有历史)
- ❌ 成本高(token 消耗大)
- ❌ 可能引入噪音(无关信息干扰)
适用场景:
- 协作密集型任务(如代码审查)
- 需要完整审计日志的场景
- 调试和开发阶段
独立上下文(Independent Context)
机制:每个 agent 维护独立状态,仅将最终结果传递给全局状态
优点:
- ✅ 上下文简洁,成本低
- ✅ Agent 间解耦,易于并行
- ✅ 减少噪音干扰
缺点:
- ❌ 丢失中间信息
- ❌ 调试困难(看不到子 agent 的思考过程)
- ❌ 协作能力弱
适用场景:
- 结果导向型任务(如数据处理)
- 并行执行的独立任务
- 生产环境(成本敏感)
OpenClaw 的混合模式
OpenClaw 采用独立上下文 + 可选历史查询的混合模式:
- 默认:子 agent 独立执行,只返回最终结果
- 可选:主 agent 可通过
sessions_history查询子 agent 的完整执行历史 - 灵活:根据需要决定是否查看中间过程
优势:
- 平衡了成本和可观测性
- 生产环境用独立上下文(低成本)
- 调试时查询历史(高可见性)
最佳实践建议
通用原则
- 明确职责边界:每个 agent 应有清晰的职责范围和专用工具集,避免职责重叠
- 选择合适的编排模式 :
- 简单协作 → 对话模式(AutoGen)
- 复杂流程 → 图结构(LangGraph)
- 快速原型 → 角色驱动(CrewAI)
- 强隔离需求 → Subagent 模式(OpenClaw)
- 设计容错机制:使用 supervisor 模式进行错误处理和任务重试
- 优先异步通信:避免阻塞式调用,使用事件驱动架构提升可扩展性
- 投资可观测性:从一开始就集成追踪和日志工具(如 LangSmith、OpenTelemetry)
- 渐进式复杂化:从简单的 agent 协作开始,根据需要逐步引入层级结构
- 避免过度设计:不是所有任务都需要 multi-agent,单 agent + 工具链可能更简单有效
- 独立测试 agent:每个 agent 应可独立评估和改进,不依赖完整系统
OpenClaw 特定建议
- 创建 SUBAGENT_SOUL.md:定义子 agent 的行为规范,在 task 中要求读取
- 使用 cleanup: "keep" 调试:开发阶段保留子 agent 历史,便于排查问题
- 设置合理超时 :根据任务复杂度设置
runTimeoutSeconds(建议 180-300 秒) - 明确输出格式:在 task 中详细描述期望的输出格式(JSON、Markdown 等)
- 错误处理 :要求子 agent 遇到错误时返回
ERROR:前缀的消息 - 避免递归调用:子 agent 不应再启动子 agent(除非有明确的层级设计)
- 权限最小化 :只在
allowAgents中添加必要的子 agent
决策树:选择合适的机制
任务是否需要多个专业化 agent?
├─ 否 → 使用单 agent + 工具链
└─ 是 ↓
需要强隔离(独立 workspace/配置)?
├─ 是 → OpenClaw Subagent
└─ 否 ↓
流程是否复杂且需要精确控制?
├─ 是 → LangGraph(图结构)
└─ 否 ↓
需要多轮协商和讨论?
├─ 是 → AutoGen(对话模式)
└─ 否 ↓
快速原型或模拟团队?
├─ 是 → CrewAI(角色驱动)
└─ 否 → LangGraph Supervisor(层级化)
实际案例
案例 1:内容创作管道(LangGraph)
场景:自动生成博客文章
- Agent 1: 研究员(搜索资料)
- Agent 2: 作者(撰写初稿)
- Agent 3: 编辑(审核和修改)
- Agent 4: SEO 优化师(添加关键词)
为什么选 LangGraph:
- 流程固定(研究 → 撰写 → 编辑 → 优化)
- 需要人工审核节点(编辑后可能需要人工确认)
- 状态清晰(每个阶段的输出是下一阶段的输入)
案例 2:代码审查系统(AutoGen)
场景:多个 agent 讨论代码质量
- Agent 1: 安全专家(检查安全漏洞)
- Agent 2: 性能专家(分析性能问题)
- Agent 3: 可读性专家(评估代码风格)
- Agent 4: 总结者(汇总意见)
为什么选 AutoGen:
- 需要多方讨论和协商
- 没有固定流程(专家可能互相反驳)
- 创意性任务(不同视角的碰撞)
案例 3:个人助理(OpenClaw)
场景:日常任务自动化
- Main Agent: 主助理(接收用户指令)
- Researcher Agent: 搜索和研究
- Stock Watcher Agent: 监控股票
- Email Agent: 处理邮件
为什么选 OpenClaw:
- 需要独立 workspace(不同 agent 处理不同数据)
- 长时间运行(股票监控需要持续运行)
- 权限隔离(邮件 agent 不应访问股票数据)
- 个人场景(不需要复杂的企业级功能)
参考来源
- LangGraph: Multi-Agent Workflows - LangChain Blog
- AutoGen - Microsoft Research
- AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation (arXiv:2308.08155)
- LangGraph GitHub Repository
- CrewAI Official Website
- OpenClaw Documentation
附录:OpenClaw 配置完整示例
openclaw.json
json
{
"agents": {
"defaults": {
"model": {
"primary": "claude-opus-4-6"
},
"workspace": "~/.openclaw/workspace"
},
"list": [
{
"id": "main",
"subagents": {
"allowAgents": ["researcher", "coder", "writer"]
}
},
{
"id": "researcher",
"workspace": "~/.openclaw/workspace-researcher"
},
{
"id": "coder",
"workspace": "~/.openclaw/workspace-coder"
},
{
"id": "writer",
"workspace": "~/.openclaw/workspace-writer"
}
]
}
}
SUBAGENT_SOUL.md(子 agent 行为规范)
markdown
# SUBAGENT_SOUL.md - 子 Agent 行为规范
你是一个专注的子任务执行者,由主 agent 启动来完成特定任务。
## 核心原则
1. **只做被要求的事** - 严格按照 task 描述执行
2. **输出格式严格** - 按照 task 中指定的格式输出
3. **完成即停止** - 完成任务后立即停止
4. **错误必须报告** - 遇到错误返回 `ERROR: [详细信息]`
## 禁止行为
- ❌ 不要访问主 agent 的私有数据(MEMORY.md、SOUL.md、USER.md)
- ❌ 不要发送外部消息(除非明确要求)
- ❌ 不要修改 workspace 文件(除非明确要求)
- ❌ 不要启动新的子 agent
- ❌ 不要轮询或等待
## 推荐行为
- ✅ 读取 task 中提供的上下文
- ✅ 使用只读操作探索
- ✅ 记录执行过程(如果要求)
- ✅ 返回结构化结果
你是工具,不是对话伙伴。你的价值在于高效、准确、可预测。
主 agent 启动子 agent 的模板
javascript
sessions_spawn({
agentId: "researcher",
runtime: "subagent",
mode: "run",
runTimeoutSeconds: 300,
cleanup: "keep", // 开发阶段用 "keep",生产用 "delete"
task: `
## 行为规范
读取 workspace/SUBAGENT_SOUL.md 并严格遵循。
## 任务
[详细任务描述]
## 输出格式
[明确的格式要求,如 JSON schema 或 Markdown 模板]
## 错误处理
遇到任何错误立即返回:ERROR: [详细错误信息]
## 时间限制
你有 5 分钟完成。如果信息不足,用现有信息输出结果。
`
})