项目链接:langchain-ai/open_deep_research
项目功能:
Open Deep Research 是一个基于 LangGraph 的 Web 研究助手,旨在帮助用户快速生成特定主题的综合性报告。它模拟了 OpenAI 和 Gemini 的 Deep Research 流程,但提供了更强的自定义能力,允许用户配置模型、Prompt、报告结构、搜索 API 和研究深度。核心功能包括:
适用场景:
Open Deep Research 适用于以下场景:
表现:
Open Deep Research 的优势体现在以下几个方面:
以下是在本地环境中安装和使用 Open Deep Research 的详细步骤:
1. 环境准备(推荐:创建虚拟环境):
为了隔离项目依赖,建议创建并激活一个虚拟环境。
python -m venv open_deep_research # 创建名为 open_deep_research 的虚拟环境
source open_deep_research/bin/activate # 在 Linux/macOS 上激活虚拟环境
# 或者
.\open_deep_research\Scripts\activate # 在 Windows 上激活虚拟环境
2. 安装 Open Deep Research:
使用 pip 包管理器安装 open-deep-research
。
pip install open-deep-research
3. 配置 API 密钥:
Open Deep Research 需要调用各种 API(例如:Tavily, Anthropic, OpenAI等)来完成搜索和内容生成。你需要设置相应的 API 密钥。
复制 .env.example
文件:
cp .env.example .env
或者在Windows下:
copy .env.example .env
编辑 .env
文件:
打开 .env
文件,将 sk-xxx
替换为你自己的 API 密钥。 例如:
OPENAI_API_KEY=sk-your_openai_api_key
ANTHROPIC_API_KEY=sk-your_anthropic_api_key
TAVILY_API_KEY=your_tavily_api_key
GROQ_API_KEY=your_groq_api_key
PERPLEXITY_API_KEY=your_perplexity_api_key
EXA_API_KEY=your_exa_api_key
PUBMED_API_KEY=your_pubmed_api_key
[email protected]
设置环境变量 (可选):
或者,你也可以直接设置环境变量,这与编辑 .env
文件的效果相同,并且可以在不同项目之间共享API密钥。
export TAVILY_API_KEY=<your_tavily_api_key>
export ANTHROPIC_API_KEY=<your_anthropic_api_key>
# 更多 API key...
请注意,某些操作系统(如 Windows)使用不同的环境变量设置语法(set TAVILY_API_KEY=
)。
4. 使用示例 (Python 代码):
以下是一个简单的使用示例,展示了如何使用 Open Deep Research 生成报告。
from langgraph.checkpoint.memory import MemorySaver
from open_deep_research.graph import builder
import uuid
memory = MemorySaver()
graph = builder.compile(checkpointer=memory)
topic = "Overview of the AI inference market with focus on Fireworks, Together.ai, Groq"
thread = {"configurable": {"thread_id": str(uuid.uuid4()),
"search_api": "tavily",
"planner_provider": "openai",
"planner_model": "claude-3-7-sonnet-latest",
"writer_provider": "anthropic",
"writer_model": "claude-3-5-sonnet-latest",
"max_search_depth": 1,
}}
import asyncio
async def main():
async for event in graph.astream({"topic":topic,}, thread, stream_mode="updates"):
print(event)
print("\n")
if __name__ == "__main__":
asyncio.run(main())
这段代码:
MemorySaver
(用于保存运行状态) 和 builder
(用于构建 LangGraph)。MemorySaver
实例,并使用 builder.compile()
编译 LangGraph。thread
字典配置了运行参数,包括 search_api
, planner_provider
, planner_model
, writer_provider
, 和 writer_model
等。graph.astream()
方法运行 LangGraph。stream_mode="updates"
表示以流式更新的方式输出结果。graph.astream()
返回的事件,并打印到控制台。中断和反馈:
Open Deep Research 的核心在于人机交互。当报告计划生成后,程序会中断,等待用户反馈。
"true"
,然后程序会继续运行,生成最终报告。5. 在 Jupyter Notebook 中使用(推荐):
建议在 Jupyter Notebook 中使用 Open Deep Research,因为可以更方便地查看中间结果和进行交互。 你可以参考 src/open_deep_research/graph.ipynb
文件中的示例。 该文件是一个完整的jupyter notebook,包含所有步骤。
6. 使用 LangGraph Studio UI (可选):
如果你想使用图形界面来运行 Open Deep Research,可以按照以下步骤操作:
克隆代码仓库:
git clone https://github.com/langchain-ai/open_deep_research.git
cd open_deep_research
安装依赖:
# 安装 dependencies
pip install -e .
pip install langgraph-cli[inmem]
启动 LangGraph 服务器:
langgraph dev
访问 Studio UI:
在浏览器中打开 https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:2024
(以你的实际端口为准)。按照界面提示输入主题,并提供反馈。
核心思想:
Open Deep Research 的核心思想在于 将深度研究过程分解为可配置、可交互的自动化工作流,并以 人机协作 的方式生成高质量的报告。它借鉴了 OpenAI 和 Gemini Deep Research 的理念,但强调 用户对整个研究过程的控制和干预,并利用 LangGraph 框架实现流程的模块化和可扩展性。
更具体地说,其核心思想可以总结为:
创新与优化:
Open Deep Research 在以下几个方面进行了创新和优化:
基于 LangGraph 的工作流引擎:
灵活的配置系统:
Configuration
类,集中管理可配置参数。模块化的搜索 API 抽象:
get_search_params()
函数根据所选 API 自动过滤和传递相应的参数。 新增搜索引擎只需要新增对应的模块即可,而不需要改动主流程。智能查询生成与反思:
高效的数据处理和格式化:
deduplicate_and_format_sources()
函数高效地对搜索结果进行去重、截断和格式化,以满足 LLM 模型的输入要求。 这样做能节约token,节省费用。可定制的 Prompt 模板:
代码示例:
以下代码片段展示了 Open Deep Research 的一些创新与优化:
灵活的配置:
from open_deep_research.configuration import Configuration
config = Configuration.from_runnable_config(runnable_config) # 从配置对象中加载配置
search_api = get_config_value(config.search_api) # 处理字符串枚举变量
统一的搜索 API 抽象:
if search_api == "tavily":
search_results = await tavily_search_async(query_list)
elif search_api == "perplexity":
search_results = perplexity_search(query_list)
# 其他搜索 API...
智能查询生成与反思:
from open_deep_research.prompts import query_writer_instructions
system_instructions = query_writer_instructions.format(topic=topic, section_topic=section.description)
queries = llm.invoke([SystemMessage(content=system_instructions), HumanMessage(content="Generate search queries...")])
那么对于deep research来说,是以什么条件作为判断跳出思维链的标准的呢?
Open Deep Research 的思维链(主要是指在每个报告章节生成和迭代过程中)跳出标准主要基于以下几个条件:
章节内容质量评估(Grade):
write_section
函数中,使用了LLM模型(通常是planner model)对生成的章节内容进行评估。section_grader_instructions
提示词来判断章节内容是否充分、准确、相关,并且是否解决了章节目标。grade
字段,其值为 "pass" 或 "fail"。 如果 grade
为 "pass",则认为章节内容质量达到要求,可以跳出思维链。最大搜索深度限制(max_search_depth):
Configuration
类中的 max_search_depth
参数限制了每个章节可以进行的最大搜索迭代次数(写作、反思、搜索、重写)。write_section
函数会检查当前的搜索迭代次数 (state["search_iterations"]
) 是否超过了 max_search_depth
。 如果超过,即使章节内容质量评估为 "fail",也会强制跳出思维链,防止无限循环。具体的代码逻辑:
在 src/open_deep_research/graph.py
文件的 write_section
函数中,有以下代码:
# 如果章节通过了质量评估,或者达到了最大搜索深度,则发布章节并停止迭代
if feedback.grade == "pass" or state["search_iterations"] >= configurable.max_search_depth:
# 发布章节到已完成章节列表
return Command(
update={"completed_sections": [section]},
goto=END
)
# 否则,更新搜索查询,继续搜索和写作
else:
return Command(
update={"search_queries": feedback.follow_up_queries, "section": section},
goto="search_web"
)
Open Deep Research 使用 章节内容质量评估 和 最大搜索深度限制 作为双重标准,判断是否跳出思维链。前者保证章节内容达到质量要求,后者防止无限循环。这两个条件的结合,在保证研究深度的同时,也提高了研究的效率和可靠性。
在实际使用中,可以调整 max_search_depth
参数,以控制研究的深度和耗时。 如果需要更高的质量,可以增加 max_search_depth
,但也要注意避免进入无限循环。同时,prompt的设计也会极大的影响思维链的效果,好的prompt可以大大减少迭代的次数。