LangGraph - Open Deep Research

概述

Open Deep Research 是一个基于 LangGraph 构建的开源深度研究系统,能够根据用户请求灵活调整研究策略,生成高质量的研究报告。该系统采用多代理架构,支持并行研究任务,并通过上下文工程优化 token 使用。

核心挑战

深度研究任务具有开放性特点,不同类型请求需要不同策略:

  • 比较类请求:如”比较两个产品”,需要分别研究后综合对比
  • 列表类请求:如”找出前20名候选人”,需要开放式搜索后排序
  • 验证类请求:如”X是否成立?”,需要深度迭代研究,重视信息质量

三阶段架构

1. Scope(范围确定)

用户澄清:使用聊天模型获取额外上下文,确保理解用户需求
简报生成:将用户交互转化为结构化研究简报,作为后续研究的指导原则

2. Research(研究执行)

监督代理(Supervisor)

  • 将研究简报分解为独立子主题
  • 决定是否需要并行化研究
  • 评估研究完整性,决定是否继续迭代

子代理(Sub-agents)

  • 专注单一子主题研究
  • 使用搜索工具和MCP工具收集信息
  • 清理研究发现,移除无关内容
  • 生成详细答案并引用来源

关键设计

  • 子代理间上下文隔离,避免信息污染
  • 监督代理根据研究深度需求动态调整策略
  • 支持并行和串行两种研究模式

3. Write(报告撰写)

  • 单次LLM调用生成最终报告
  • 输入:研究简报 + 所有清理后的研究发现
  • 输出:结构化研究报告,严格遵循简报要求

技术实现

LangGraph架构

1
2
3
4
5
class ResearchState(TypedDict):
research_brief: str
sub_topics: List[str]
research_results: Dict[str, Any]
final_report: Optional[str]

节点设计

  • scope_node:生成研究简报和子主题
  • research_node:执行并行研究任务
  • write_node:生成最终报告

边控制

  • 条件边:根据研究完整性决定是否继续迭代
  • 并行边:支持多个子代理同时工作

核心代码实现

1. 主图构建 (350:370)

1
2
3
4
5
6
7
8
deep_researcher_builder = StateGraph(AgentState, input=AgentInputState, config_schema=Configuration)
deep_researcher_builder.add_node("clarify_with_user", clarify_with_user)
deep_researcher_builder.add_node("write_research_brief", write_research_brief)
deep_researcher_builder.add_node("research_supervisor", supervisor_subgraph)
deep_researcher_builder.add_node("final_report_generation", final_report_generation)
deep_researcher_builder.add_edge(START, "clarify_with_user")
deep_researcher_builder.add_edge("research_supervisor", "final_report_generation")
deep_researcher_builder.add_edge("final_report_generation", END)

2. Scope阶段实现

用户澄清节点 (47:60):

1
2
3
4
async def clarify_with_user(state: AgentState, config: RunnableConfig) -> Command[Literal["write_research_brief", "__end__"]]:
# 检查是否需要用户澄清
# 使用 ClarifyWithUser 结构化输出
# 条件跳转: write_research_brief 或 END

简报生成节点 (63:82):

1
2
3
4
async def write_research_brief(state: AgentState, config: RunnableConfig)-> Command[Literal["research_supervisor"]]:
# 生成研究简报
# 使用 ResearchQuestion 结构化输出
# 初始化 supervisor_messages

3. Research阶段实现

监督代理子图 (85:180):

监督节点 (85:102):

1
2
3
4
async def supervisor(state: SupervisorState, config: RunnableConfig) -> Command[Literal["supervisor_tools"]]:
# 分析研究简报
# 绑定工具: ConductResearch, ResearchComplete
# 决定研究策略

监督工具节点 (105:180):

1
2
3
4
async def supervisor_tools(state: SupervisorState, config: RunnableConfig) -> Command[Literal["supervisor", "__end__"]]:
# 执行 ConductResearch 工具调用
# 并行启动 researcher_subgraph
# 条件跳转: supervisor 或 END

研究者子图 (183:320):

研究者节点 (183:204):

1
2
3
4
async def researcher(state: ResearcherState, config: RunnableConfig) -> Command[Literal["researcher_tools"]]:
# 专注单一研究主题
# 绑定所有可用工具
# 执行工具调用循环

研究者工具节点 (207:250):

1
2
3
4
async def researcher_tools(state: ResearcherState, config: RunnableConfig) -> Command[Literal["researcher", "compress_research"]]:
# 执行工具调用
# 处理工具结果
# 条件跳转: researcher 或 compress_research

研究压缩节点 (253:320):

1
2
3
4
async def compress_research(state: ResearcherState, config: RunnableConfig):
# 压缩研究发现
# 清理无关内容
# 生成结构化输出

4. Write阶段实现

最终报告生成 (323:370):

1
2
3
4
async def final_report_generation(state: AgentState, config: RunnableConfig):
# 生成最终报告
# 使用研究简报 + 所有发现
# 单次LLM调用

工具集成

搜索工具

  • 通用搜索:Google、Bing
  • 学术搜索:Google Scholar、arXiv
  • 专业搜索:特定领域数据库

MCP工具

  • 文件读取:PDF、DOC、TXT
  • 数据库查询:SQL、NoSQL
  • API调用:REST、GraphQL

工具获取函数 (open_deep_research/src/open_deep_research/utils.py):

1
2
3
async def get_all_tools(config):
# 获取所有可用工具
# 包括搜索API和MCP工具

上下文工程

Token优化

  • 研究简报压缩:提取关键信息
  • 结果清理:移除冗余和无关内容
  • 分块处理:大文档分段处理

上下文隔离

  • 子代理独立上下文
  • 避免信息污染
  • 结果合并策略

Token限制处理 (open_deep_research/src/open_deep_research/utils.py):

1
2
3
def is_token_limit_exceeded(e, model):
# 检测token限制错误
# 实现重试机制

关键洞见

1. 多代理适用性

  • 仅用于可并行任务:多代理适合研究阶段,不适合写作阶段
  • 避免协调问题:早期版本尝试并行写作导致内容不连贯
  • 上下文隔离优势:避免长上下文窗口的失败模式

2. 上下文工程重要性

  • Token节省:Anthropic报告多代理系统使用15x更多token
  • 避免限制:防止达到上下文窗口限制
  • 成本控制:减少token支出,避免TPM限制

3. 灵活深度控制

  • 监督代理决策:根据请求复杂度决定研究深度
  • 简单请求:避免不必要的深度研究
  • 复杂请求:支持高token使用和延迟

4. 架构优势

  • 三阶段设计:平衡灵活性与输出质量
  • 模块化:易于扩展和定制
  • 可配置:支持用户自定义模型、工具和MCP服务器

实际应用

典型场景

  • 市场研究:产品对比、竞品分析
  • 学术研究:文献综述、实验设计
  • 商业决策:投资分析、风险评估
  • 内容创作:深度报道、技术文档

使用方式

  • LangGraph Studio:本地运行和测试
  • Open Agent Platform:在线演示和使用
  • 自部署:支持私有化部署

技术栈

  • 框架:LangGraph + LangChain
  • 状态管理:TypedDict + 条件边
  • 工具集成:MCP协议 + 多API支持
  • 并行处理:异步执行 + 上下文隔离
  • 质量保证:结果验证 + 错误重试

未来方向

  • Token优化:更好的工具响应处理和上下文过滤
  • 质量评估:热路径中的质量检查机制
  • 长期记忆:研究报告的存储和复用
  • 多模态支持:图像、视频分析能力

参考资料

Open Deep Research Blog
GitHub代码库
在线演示