Files
autumn-recruitment/06.AI/agent-design/多智能体协作模式.md
T

152 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags: [ai/agent, multi-agent, supervisor, critic-pattern, planner]
create time: 2026-08-08 18:43
update time: 2026-08-08 18:43
---
# 多智能体协作模式
## 概述
单个 Agent 的能力受限于上下文窗口和工具集。多智能体系统通过让多个专业化的 Agent 分工协作,实现复杂任务的可扩展解耦。核心挑战在于通信协议设计、任务分解质量和冲突消解机制。
## 详解
### Supervisor 模式 — 主从分发
Supervisor 作为中央调度器,接收用户请求后将任务拆解为子任务,分配给专业子 Agent,最后整合结果。
```mermaid
sequenceDiagram
participant User as 用户
participant S as Supervisor Agent
participant A as Writer Agent
participant B as Researcher Agent
participant C as Editor Agent
User->>S: 提交复合需求
S->>S: 任务分解与规划
S->>B: 子任务1: 调研背景资料
B-->>S: 返回调研报告
S->>A: 子任务2: 撰写初稿
A-->>S: 返回初稿
S->>C: 子任务3: 审校编辑
C-->>S: 返回定稿
S-->>User: 交付最终结果
```
**关键设计决策:**
- **任务粒度**:子任务拆得太细导致通信开销过大;太粗则失去并行价值。一般 3-7 个粒度最合适——匹配人类短期记忆容量(Miller 法则)。
- **状态一致性**:所有中间产物存储在共享 State 中,Supervisor 负责读取每个阶段的产出并构造下一轮输入。
```go
// Go 示例:Supervisor 路由到子 Agent
type Supervisor struct {
agents map[string]*Agent // agentId → Agent实例
router ModelRouter // LLM 驱动的路由决策
}
func (s *Supervisor) Dispatch(task string) string {
intent := s.router.Classify(task) // 调用 LLM 判断意图类型
resultChan := make(chan Result)
for _, subtask := range s.Decompose(intent, task) {
go func(st SubTask) {
agent := s.agents[st.AgentID]
resultChan <- agent.Execute(st)
}(subtask)
}
return s.Aggregate(resultChan, len(subtasks))
}
```
### Critic 模式 — 审查反馈循环
Critic Agent 不生产内容,只评估已有内容的质量,给出评分和改进建议。形成 Producer-Critic 的对抗循环。
```mermaid
graph TD
A["Producer Agent\n生成候选方案"] --> B["Critic Agent\n质量评分"]
B --> C{"分数 ≥ 阈值?"}
C -->|"否"| D["Feedback\n具体改进意见"]
D --> A
C -->|"是"| E["接受输出"]
```
**适用场景:**代码审查、文章校对、Prompt 优化验证、安全策略校验。
> [!NOTE]
> Critic 的质量取决于它的评估标准是否量化。纯自然语言的评判主观性太强,应该定义结构化评分维度:准确性、完整性、安全性各占权重。
### Planner 模式 — 规划先行
Planner Agent 先输出一串有序的步骤序列,Executors 按步骤逐个执行。Plan 可静态制定,也可动态调整。
**静态 Planning:**
```
Step 1: 搜索「XX 技术栈的性能基准」
Step 2: 汇总三个数据源的对比表
Step 3: 针对劣势项提出优化建议
Step 4: 生成总结报告
```
**动态 Planning(Replan):** 当某一步失败或结果不符合预期时,Planner 重新规划后续步骤。例如搜索结果为空时,自动调整为「扩大搜索范围 → 使用同义词 → 切换到备选信息源」。
### 消息传递协议
多 Agent 之间通过结构化消息通信,推荐基于 JSON Schema 定义契约:
```json
{
"type": "task_assignment",
"id": "task_001",
"from": "supervisor",
"to": "researcher",
"payload": {
"instruction": "检索 Golang gc 在 1.21 中的改动",
"timeout_ms": 30000,
"format": "structured_summary"
}
}
```
**消息类型体系:**
| 类型 | 方向 | 用途 |
|------|------|------|
| `task_assignment` | S→Agent | 分配子任务 |
| `result_report` | Agent→S | 汇报完成结果 |
| `feedback_request` | C→Agent | 要求重新生成 |
| `escalation` | Agent→S | 上报异常求决策 |
| `cancellation` | S→All | 全局取消信号 |
### 各模式对比
| 模式 | 优点 | 缺点 | 最佳适用场景 |
|------|------|------|-------------|
| Supervisor | 架构清晰、便于监控 | 单点瓶颈、上下文窗口压力大 | 复杂长链路任务,如研究报告生成 |
| Critic | 显著提升输出质量 | 增加延迟和 token 消耗 | 对准确性要求高的场景 |
| Planner | 解耦规划与执行、支持重试 | Plan 可能不合理需 Replan | 步骤依赖明确的流水任务 |
| Swarm | 简洁灵活、天然并行 | 缺乏全局协调、易产生不一致 | 探索性、发散性头脑风暴 |
> [!TIP]
> 面试高频题:为什么不做一个超级大的 Agent?答案:① 上下文窗口有限,塞入太多能力会稀释注意力;② 工具冲突概率随数量增加而上升;③ 调试困难——出问题时无法定位是哪个模块的问题;④ 迭代成本高,改一个能力可能需要重新微调整个模型。
## 实践场景
**项目复盘:Gen2D 项目中的多 Agent 设计**
Gen2D 项目中采用了 Supervisor + Planner 混合模式:
1. 入口 Agent 将用户需求分解为前端/后端/测试三条线
2. 每条线内由 Planner 制定步骤序列
3. Executor Agent 按步骤执行,每次执行后写入共享日志
4. Reviewer Agent 做最终交叉检查
这种分层设计避免了单层 DAG 节点过多导致的管理复杂度。
## 扩展阅读
- [[Eino DAG 工作流设计]]
- [[上下文工程与记忆管理]]