代理协调器 #
本文档中引用的文件
- examples/supervisor/main.go
- prebuilt/supervisor.go
- showcases/open_deep_research/main.go
- showcases/open_deep_research/state.go
- showcases/open_deep_research/supervisor.go
- showcases/open_deep_research/researcher.go
- showcases/open_deep_research/prompts.go
- showcases/open_deep_research/utils.go
- showcases/open_deep_research/config.go
- examples/supervisor/README.md
- showcases/open_deep_research/README.md
目录 #
引言 #
Supervisor 模式是多代理系统中一种重要的协调机制,它通过中央协调器(Supervisor)来管理和分配任务给专业化的工作代理(Worker Agent)。这种模式在复杂的多智能体协作场景中发挥着关键作用,特别是在需要动态任务分配、状态协调和流程控制的场景中。
本文档基于 LangGraphGo 代码库中的两个主要示例:基础 Supervisor 示例和 Open Deep Research 多代理研究系统,深入分析 Supervisor 模式的实现原理、工作机制和最佳实践。
项目结构概览 #
LangGraphGo 项目采用模块化设计,包含多个示例和展示项目,其中 Supervisor 模式相关的组件分布在以下目录中:
graph TD
A[LangGraphGo 项目] --> B[examples/supervisor]
A --> C[prebuilt/supervisor.go]
A --> D[showcases/open_deep_research]
B --> E[main.go - 基础 Supervisor 示例]
B --> F[README.md - 使用说明]
C --> G[CreateSupervisor 函数]
C --> H[状态管理]
C --> I[条件路由]
D --> J[main.go - 研究系统入口]
D --> K[state.go - 状态定义]
D --> L[supervisor.go - 协调器实现]
D --> M[researcher.go - 研究者实现]
D --> N[prompts.go - 系统提示]
D --> O[utils.go - 工具函数]
D --> P[config.go - 配置管理]
图表来源
- [examples/supervisor/main.go](https://github.com/smallnest/langgraphgo/blob/main/examples/supervisor/main.go#L1-L138)
- [prebuilt/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/supervisor.go#L1-L153)
- [showcases/open_deep_research/main.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/main.go#L1-L96)
章节来源
- [examples/supervisor/README.md](https://github.com/smallnest/langgraphgo/blob/main/examples/supervisor/README.md#L1-L16)
- [showcases/open_deep_research/README.md](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/README.md#L1-L190)
核心组件分析 #
基础 Supervisor 组件 #
基础 Supervisor 示例展示了最简单的多代理协调模式:
classDiagram
class Supervisor {
+CreateSupervisor(model, members) StateRunnable
-workflow StateGraph
-members map[string]*StateRunnable
-schema MapSchema
}
class StateRunnable {
+Invoke(ctx, state) interface
+Compile() StateRunnable
}
class MathAgent {
+calculate(expression) string
+tools []Tool
}
class GeneralAgent {
+respond(query) string
+tools []Tool
}
Supervisor --> StateRunnable : "orchestrates"
StateRunnable <|-- MathAgent
StateRunnable <|-- GeneralAgent
图表来源
- [examples/supervisor/main.go](https://github.com/smallnest/langgraphgo/blob/main/examples/supervisor/main.go#L71-L87)
- [prebuilt/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/supervisor.go#L14-L153)
Open Deep Research 超级系统 #
Open Deep Research 展示了更复杂的企业级 Supervisor 实现:
classDiagram
class DeepResearcher {
+CreateDeepResearcherGraph(config) MessageGraph
-supervisorGraph MessageGraph
-researcherGraph MessageGraph
-reportGenerator Graph
}
class SupervisorState {
+supervisor_messages []MessageContent
+research_brief string
+notes []string
+research_iterations int
+raw_notes []string
}
class ResearcherState {
+researcher_messages []MessageContent
+tool_call_iterations int
+research_topic string
+compressed_research string
+raw_notes []string
}
class AgentState {
+messages []MessageContent
+supervisor_messages []MessageContent
+research_brief string
+raw_notes []string
+notes []string
+final_report string
}
DeepResearcher --> SupervisorState : "manages"
DeepResearcher --> ResearcherState : "coordinates"
DeepResearcher --> AgentState : "integrates"
图表来源
- [showcases/open_deep_research/state.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/state.go#L44-L77)
- [showcases/open_deep_research/main.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/main.go#L34-L35)
章节来源
- [examples/supervisor/main.go](https://github.com/smallnest/langgraphgo/blob/main/examples/supervisor/main.go#L71-L87)
- [showcases/open_deep_research/state.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/state.go#L44-L77)
架构概览 #
Supervisor 模式的核心架构遵循分层设计原则,包含以下关键层次:
graph TB
subgraph "用户交互层"
UI[用户查询]
Output[最终报告]
end
subgraph "协调管理层"
Supervisor[Supervisor 协调器]
TaskRouter[任务路由器]
StateManager[状态管理器]
end
subgraph "执行层"
Researcher1[研究者 1]
Researcher2[研究者 2]
ResearcherN[研究者 N]
end
subgraph "工具层"
SearchTool[搜索工具]
ThinkTool[思考工具]
CompressionTool[压缩工具]
end
UI --> Supervisor
Supervisor --> TaskRouter
TaskRouter --> StateManager
StateManager --> Researcher1
StateManager --> Researcher2
StateManager --> ResearcherN
Researcher1 --> SearchTool
Researcher1 --> ThinkTool
Researcher2 --> SearchTool
Researcher2 --> ThinkTool
ResearcherN --> SearchTool
ResearcherN --> ThinkTool
Researcher1 --> CompressionTool
Researcher2 --> CompressionTool
ResearcherN --> CompressionTool
CompressionTool --> Supervisor
Supervisor --> Output
图表来源
- [showcases/open_deep_research/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/supervisor.go#L14-L331)
- [showcases/open_deep_research/researcher.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/researcher.go#L12-L225)
详细组件分析 #
基础 Supervisor 实现 #
基础 Supervisor 通过 CreateSupervisor 函数创建,该函数实现了以下核心功能:
状态架构设计 #
flowchart TD
A[状态架构初始化] --> B[创建 MapSchema]
B --> C[注册 AppendReducer]
C --> D[设置消息合并策略]
D --> E[节点定义]
E --> F[添加 Supervisor 节点]
F --> G[添加成员节点]
G --> H[边定义]
H --> I[设置入口点]
I --> J[添加条件边]
J --> K[添加循环边]
K --> L[编译工作流]
图表来源
- [prebuilt/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/supervisor.go#L15-L152)
Supervisor 节点逻辑 #
Supervisor 节点的核心职责包括:
- 分析当前对话历史
- 生成系统提示词
- 调用 LLM 进行路由决策
- 解析工具调用参数
- 返回下一个执行节点
章节来源
- [prebuilt/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/supervisor.go#L29-L106)
Open Deep Research 协调器 #
Open Deep Research 的 Supervisor 实现更加复杂,支持多种工具调用和并行处理:
协调器状态管理 #
stateDiagram-v2
[*] --> 初始化
初始化 --> 分析研究请求
分析研究请求 --> 规划研究策略
规划研究策略 --> 委托研究任务
委托研究任务 --> 并行执行
并行执行 --> 收集结果
收集结果 --> 评估进展
评估进展 --> 决定继续或完成
决定继续或完成 --> 委托研究任务 : 继续
决定继续或完成 --> 生成最终报告 : 完成
生成最终报告 --> [*]
图表来源
- [showcases/open_deep_research/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/supervisor.go#L25-L331)
工具调用处理 #
Open Deep Research 支持三种主要工具:
| 工具名称 | 功能描述 | 参数结构 | 使用场景 |
|---|---|---|---|
| ConductResearch | 委托研究任务 | research_topic (详细主题描述) | 创建新的研究子任务 |
| ResearchComplete | 标记研究完成 | complete (布尔值) | 研究完成后终止流程 |
| think_tool | 反思和规划 | reflection (反思内容) | 策略性思考和决策 |
章节来源
- [showcases/open_deep_research/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/supervisor.go#L82-L134)
研究者代理实现 #
研究者代理负责具体的搜索和信息收集工作:
sequenceDiagram
participant S as Supervisor
participant R as Researcher
participant T as Search Tool
participant M as Model
S->>R : 委托研究任务
R->>M : 分析研究需求
M->>R : 生成搜索策略
R->>T : 执行网络搜索
T->>R : 返回搜索结果
R->>M : 分析搜索结果
M->>R : 生成反思内容
R->>S : 提交研究发现
S->>S : 评估整体进展
图表来源
- [showcases/open_deep_research/researcher.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/researcher.go#L27-L225)
章节来源
- [showcases/open_deep_research/researcher.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/researcher.go#L27-L171)
状态流转与迭代控制 #
基础 Supervisor 状态流转 #
基础 Supervisor 的状态流转相对简单,主要围绕任务分配和完成:
flowchart LR
A[开始] --> B[Supervisor 分析]
B --> C{是否完成?}
C --> |否| D[选择 Worker]
D --> E[Worker 执行]
E --> F[Worker 报告]
F --> B
C --> |是| G[结束]
图表来源
- [prebuilt/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/supervisor.go#L133-L149)
Open Deep Research 迭代控制 #
Open Deep Research 实现了更复杂的迭代控制机制:
迭代限制机制 #
flowchart TD
A[开始新迭代] --> B{检查迭代计数}
B --> |未超限| C[分析研究需求]
B --> |已超限| D[标记完成]
C --> E[规划研究策略]
E --> F[委托研究任务]
F --> G[并行执行]
G --> H[收集结果]
H --> I[评估进展]
I --> J{是否满足要求?}
J --> |否| B
J --> |是| D
D --> K[生成最终报告]
图表来源
- [showcases/open_deep_research/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/supervisor.go#L36-L62)
并发控制 #
系统通过配置参数控制并发研究单元的数量:
| 配置参数 | 默认值 | 说明 |
|---|---|---|
| MaxConcurrentResearchUnits | 3 | 最大并行研究任务数 |
| MaxResearcherIterations | 10 | 最大研究迭代次数 |
| MaxToolCallIterations | 20 | 每个研究者的最大工具调用次数 |
章节来源
- [showcases/open_deep_research/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/supervisor.go#L187-L204)
- [showcases/open_deep_research/config.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/config.go#L48-L53)
条件路由机制 #
基础 Supervisor 条件路由 #
基础 Supervisor 使用简单的字符串匹配进行条件路由:
flowchart TD
A[Supervisor 决策] --> B{解析工具调用}
B --> C{选择的成员}
C --> |MathExpert| D[MathAgent 执行]
C --> |GeneralAssistant| E[GeneralAgent 执行]
C --> |FINISH| F[结束流程]
D --> G[返回结果]
E --> G
F --> H[最终输出]
G --> A
图表来源
- [prebuilt/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/supervisor.go#L133-L144)
Open Deep Research 高级路由 #
Open Deep Research 实现了更复杂的条件路由逻辑:
工具调用路由 #
flowchart TD
A[接收工具调用] --> B{检查调用类型}
B --> |ResearchComplete| C[终止流程]
B --> |ConductResearch| D[并行执行研究]
B --> |think_tool| E[执行思考操作]
B --> |其他| F[错误处理]
D --> G[启动多个研究者]
G --> H[等待所有完成]
H --> I[收集结果]
E --> J[记录反思]
J --> K[更新状态]
I --> L[返回到 Supervisor]
K --> L
C --> M[生成最终报告]
图表来源
- [showcases/open_deep_research/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/supervisor.go#L305-L325)
并行执行机制 #
系统支持最多 MaxConcurrentResearchUnits 个研究任务同时执行:
sequenceDiagram
participant S as Supervisor
participant W as Worker Pool
participant R1 as Researcher 1
participant R2 as Researcher 2
participant RN as Researcher N
S->>W : 提交研究任务
W->>R1 : 启动任务 1
W->>R2 : 启动任务 2
W->>RN : 启动任务 N
par 并行执行
R1->>W : 返回结果 1
and
R2->>W : 返回结果 2
and
RN->>W : 返回结果 N
end
W->>S : 汇总所有结果
图表来源
- [showcases/open_deep_research/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/supervisor.go#L205-L299)
章节来源
- [prebuilt/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/supervisor.go#L133-L144)
- [showcases/open_deep_research/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/supervisor.go#L305-L325)
并行执行与工作流管理 #
并行执行架构 #
Open Deep Research 实现了真正的并行执行能力:
并发控制实现 #
graph TB
subgraph "主 Supervisor 节点"
A[接收工具调用]
B[分离任务类型]
end
subgraph "并行执行池"
C[Concurrent Limit]
D[Worker Goroutines]
E[Result Collection]
end
subgraph "研究者实例"
F[Researcher 1]
G[Researcher 2]
H[Researcher N]
end
A --> B
B --> C
C --> D
D --> F
D --> G
D --> H
F --> E
G --> E
H --> E
E --> A
图表来源
- [showcases/open_deep_research/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/supervisor.go#L205-L299)
状态合并机制 #
系统使用专门的状态合并函数来处理并行执行的结果:
flowchart TD
A[收集并行结果] --> B[创建结果通道]
B --> C[启动 Worker Goroutines]
C --> D[等待所有完成]
D --> E[收集结果]
E --> F[合并状态]
F --> G[更新全局状态]
subgraph "Worker 1"
H[执行研究]
I[返回结果]
end
subgraph "Worker 2"
J[执行研究]
K[返回结果]
end
C --> H
C --> J
H --> I
J --> K
I --> E
K --> E
图表来源
- [showcases/open_deep_research/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/supervisor.go#L212-L299)
工作流编译与优化 #
系统在运行时动态编译工作流以优化性能:
| 优化策略 | 实现方式 | 性能提升 |
|---|---|---|
| 延迟编译 | 按需编译子图 | 减少内存占用 |
| 状态缓存 | 复用编译结果 | 提高执行速度 |
| 边缘优化 | 预计算常用路径 | 减少运行时开销 |
章节来源
- [showcases/open_deep_research/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/supervisor.go#L232-L252)
性能考虑 #
内存管理 #
系统采用了多种内存优化策略:
- 状态共享: 多个节点共享相同的状态架构
- 延迟加载: 只在需要时编译工作流
- 资源池化: 复用 LLM 连接和工具实例
并发优化 #
graph LR
A[并发限制] --> B[Goroutine 池]
B --> C[通道通信]
C --> D[同步原语]
D --> E[资源释放]
F[状态合并] --> G[原子操作]
G --> H[锁优化]
H --> I[批量处理]
API 调用优化 #
系统实现了智能的 API 调用策略:
- 批量处理: 将多个小请求合并为批量请求
- 缓存机制: 缓存频繁访问的数据
- 重试策略: 实现指数退避重试
故障排除指南 #
常见问题与解决方案 #
Supervisor 无法选择下一步 #
症状: Supervisor 始终返回 FINISH 或无响应
原因分析:
- LLM 输出格式不正确
- 工具定义不完整
- 状态传递错误
解决方案:
- 检查系统提示词的完整性
- 验证工具定义的 JSON Schema
- 确认状态键名的一致性
并行执行超时 #
症状: 研究任务长时间无响应
原因分析:
- API 调用超时
- 死锁或竞态条件
- 资源不足
解决方案:
- 设置合理的超时时间
- 检查并发控制逻辑
- 监控系统资源使用情况
状态丢失或损坏 #
症状: 中间结果丢失或状态不一致
原因分析:
- 状态合并函数错误
- 并发写入冲突
- 序列化失败
解决方案:
- 验证状态合并逻辑
- 添加适当的同步机制
- 实现状态验证和恢复
章节来源
- [showcases/open_deep_research/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/supervisor.go#L82-L97)
- [showcases/open_deep_research/supervisor.go](https://github.com/smallnest/langgraphgo/blob/main/showcases/open_deep_research/supervisor.go#L221-L239)
结论 #
Supervisor 模式在多代理系统中提供了强大而灵活的任务协调能力。通过 LangGraphGo 的实现,我们可以看到:
主要优势 #
- 灵活性: 支持动态任务分配和路由
- 可扩展性: 易于添加新的 Worker 类型
- 可靠性: 完善的错误处理和恢复机制
- 性能: 高效的并行执行和状态管理
最佳实践建议 #
- 合理设计状态架构: 使用适当的 reducer 和合并策略
- 优化条件路由: 基于业务逻辑设计高效的路由规则
- 监控和调试: 实现完善的日志记录和监控机制
- 测试覆盖: 充分测试各种边界情况和异常场景
未来发展方向 #
随着多代理系统的复杂度增加,Supervisor 模式可能会向以下方向发展:
- 更智能的自适应路由算法
- 更精细的资源调度机制
- 更强大的异常恢复能力
- 更好的跨域协作支持
通过深入理解和正确应用 Supervisor 模式,开发者可以构建出更加智能和高效的多代理系统,为复杂的业务场景提供强有力的技术支撑。