--- 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 工作流设计]] - [[上下文工程与记忆管理]]