LangGraph - Open Deep Research
概述
Open Deep Research 是一个基于 LangGraph 构建的开源深度研究系统,能够根据用户请求灵活调整研究策略,生成高质量的研究报告。该系统采用多代理架构,支持并行研究任务,并通过上下文工程优化 token 使用。
核心挑战
深度研究任务具有开放性特点,不同类型请求需要不同策略:
- 比较类请求:如”比较两个产品”,需要分别研究后综合对比
- 列表类请求:如”找出前20名候选人”,需要开放式搜索后排序
- 验证类请求:如”X是否成立?”,需要深度迭代研究,重视信息质量
三阶段架构
1. Scope(范围确定)
用户澄清:使用聊天模型获取额外上下文,确保理解用户需求
简报生成:将用户交互转化为结构化研究简报,作为后续研究的指导原则
2. Research(研究执行)
监督代理(Supervisor):
- 将研究简报分解为独立子主题
- 决定是否需要并行化研究
- 评估研究完整性,决定是否继续迭代
子代理(Sub-agents):
- 专注单一子主题研究
- 使用搜索工具和MCP工具收集信息
- 清理研究发现,移除无关内容
- 生成详细答案并引用来源
关键设计:
- 子代理间上下文隔离,避免信息污染
- 监督代理根据研究深度需求动态调整策略
- 支持并行和串行两种研究模式
3. Write(报告撰写)
- 单次LLM调用生成最终报告
- 输入:研究简报 + 所有清理后的研究发现
- 输出:结构化研究报告,严格遵循简报要求
技术实现
LangGraph架构
1 | class ResearchState(TypedDict): |
节点设计:
scope_node
:生成研究简报和子主题research_node
:执行并行研究任务write_node
:生成最终报告
边控制:
- 条件边:根据研究完整性决定是否继续迭代
- 并行边:支持多个子代理同时工作
核心代码实现
1. 主图构建 (350:370
)
1 | deep_researcher_builder = StateGraph(AgentState, input=AgentInputState, config_schema=Configuration) |
2. Scope阶段实现
用户澄清节点 (47:60
):
1 | async def clarify_with_user(state: AgentState, config: RunnableConfig) -> Command[Literal["write_research_brief", "__end__"]]: |
简报生成节点 (63:82
):
1 | async def write_research_brief(state: AgentState, config: RunnableConfig)-> Command[Literal["research_supervisor"]]: |
3. Research阶段实现
监督代理子图 (85:180
):
监督节点 (85:102
):
1 | async def supervisor(state: SupervisorState, config: RunnableConfig) -> Command[Literal["supervisor_tools"]]: |
监督工具节点 (105:180
):
1 | async def supervisor_tools(state: SupervisorState, config: RunnableConfig) -> Command[Literal["supervisor", "__end__"]]: |
研究者子图 (183:320
):
研究者节点 (183:204
):
1 | async def researcher(state: ResearcherState, config: RunnableConfig) -> Command[Literal["researcher_tools"]]: |
研究者工具节点 (207:250
):
1 | async def researcher_tools(state: ResearcherState, config: RunnableConfig) -> Command[Literal["researcher", "compress_research"]]: |
研究压缩节点 (253:320
):
1 | async def compress_research(state: ResearcherState, config: RunnableConfig): |
4. Write阶段实现
最终报告生成 (323:370
):
1 | async def final_report_generation(state: AgentState, config: RunnableConfig): |
工具集成
搜索工具:
- 通用搜索:Google、Bing
- 学术搜索:Google Scholar、arXiv
- 专业搜索:特定领域数据库
MCP工具:
- 文件读取:PDF、DOC、TXT
- 数据库查询:SQL、NoSQL
- API调用:REST、GraphQL
工具获取函数 (open_deep_research/src/open_deep_research/utils.py
):
1 | async def get_all_tools(config): |
上下文工程
Token优化:
- 研究简报压缩:提取关键信息
- 结果清理:移除冗余和无关内容
- 分块处理:大文档分段处理
上下文隔离:
- 子代理独立上下文
- 避免信息污染
- 结果合并策略
Token限制处理 (open_deep_research/src/open_deep_research/utils.py
):
1 | def is_token_limit_exceeded(e, model): |
关键洞见
1. 多代理适用性
- 仅用于可并行任务:多代理适合研究阶段,不适合写作阶段
- 避免协调问题:早期版本尝试并行写作导致内容不连贯
- 上下文隔离优势:避免长上下文窗口的失败模式
2. 上下文工程重要性
- Token节省:Anthropic报告多代理系统使用15x更多token
- 避免限制:防止达到上下文窗口限制
- 成本控制:减少token支出,避免TPM限制
3. 灵活深度控制
- 监督代理决策:根据请求复杂度决定研究深度
- 简单请求:避免不必要的深度研究
- 复杂请求:支持高token使用和延迟
4. 架构优势
- 三阶段设计:平衡灵活性与输出质量
- 模块化:易于扩展和定制
- 可配置:支持用户自定义模型、工具和MCP服务器
实际应用
典型场景
- 市场研究:产品对比、竞品分析
- 学术研究:文献综述、实验设计
- 商业决策:投资分析、风险评估
- 内容创作:深度报道、技术文档
使用方式
- LangGraph Studio:本地运行和测试
- Open Agent Platform:在线演示和使用
- 自部署:支持私有化部署
技术栈
- 框架:LangGraph + LangChain
- 状态管理:TypedDict + 条件边
- 工具集成:MCP协议 + 多API支持
- 并行处理:异步执行 + 上下文隔离
- 质量保证:结果验证 + 错误重试
未来方向
- Token优化:更好的工具响应处理和上下文过滤
- 质量评估:热路径中的质量检查机制
- 长期记忆:研究报告的存储和复用
- 多模态支持:图像、视频分析能力