GPT Researcher Deep Research 深度研究模式:递归树状探索的原理、配置与实战指南
【免费下载链接】gpt-researcherAn autonomous agent that conducts deep research on any data using any LLM providers项目地址: https://gitcode.com/GitHub_Trending/gp/gpt-researcher
导读
GPT Researcher 内置的Deep Research(深度研究)模式是专门为"对任意主题进行广度和深度兼备的探索"而设计的递归式研究系统:它在每一层并行发散出多条搜索路径(Breadth),又沿着每条分支递归下钻、追踪线索(Depth),最终把所有分支的发现聚合为一份结构化的研究报告。本文基于 backend/report_type/deep_research/README.md 展开,结合 gpt_researcher/skills/deep_research.py 的核心实现与 agent.py 的调用链路,带你掌握从快速上手、参数调优到源码级原理的完整能力,可以直接在自己的研究任务中落地这套"AI 研究员团队"模式。
什么是 Deep Research:树状探索的工作机制
Deep Research 是 GPT Researcher 在"AI 深度研究"趋势下推出的开源实现。与一次性的标准研究不同,它采用一种类似树的探索模式,正如 README 所描述的五大要点:
- 广度(Breadth):在每一层生成多条搜索查询,覆盖主题的不同侧面;
- 深度(Depth):对每条分支递归下钻,跟进线索、发现关联;
- 并发处理(Concurrent Processing):基于
async/await模式同时运行多条研究路径; - 智能上下文管理(Smart Context Management):自动聚合、综合所有分支的研究发现;
- 进度跟踪(Progress Tracking):实时汇报广度与深度两个维度的研究进展。
可以把它理解为"派出一个 AI 研究员团队":每位研究员沿自己的路径深入探索,同时彼此协作,共同构建对主题的完整理解。
在代码层面,这个模式由 ReportType 枚举中的DeepResearch = "deep"触发,核心执行体是 DeepResearchSkill 类。GPTResearcher在初始化时一旦检测到report_type == "deep",就会挂载该技能(见 agent.py#L191-L193),并在conduct_research()中单独分流处理(见 agent.py#L351-L353)。
快速开始:两段代码跑通深度研究
最小示例
README 给出了最简洁的启动方式,核心就是给GPTResearcher传入report_type="deep":
from gpt_researcher import GPTResearcher from gpt_researcher.utils.enum import ReportType, Tone import asyncio async def main(): # Initialize researcher with deep research type researcher = GPTResearcher( query="What are the latest developments in quantum computing?", report_type="deep", # This triggers deep research mode ) # Run research research_data = await researcher.conduct_research() # Generate report report = await researcher.write_report() print(report) if __name__ == "__main__": asyncio.run(main())这段代码完整覆盖了深度研究的两阶段流程:conduct_research()执行递归探索并返回聚合后的研究上下文,write_report()基于该上下文生成最终报告。
带进度回调的完整示例
仓库在 backend/report_type/deep_research/main.py 中提供了一个更完整的可直接运行的脚本,它演示了如何利用on_progress回调实时打印研究进展,并把最终报告导出为 PDF:
from gpt_researcher import GPTResearcher from backend.utils import write_md_to_pdf import asyncio async def main(task: str): # Progress callback def on_progress(progress): print(f"Depth: {progress.current_depth}/{progress.total_depth}") print(f"Breadth: {progress.current_breadth}/{progress.total_breadth}") print(f"Queries: {progress.completed_queries}/{progress.total_queries}") if progress.current_query: print(f"Current query: {progress.current_query}") # Initialize researcher with deep research type researcher = GPTResearcher( query=task, report_type="deep", # This will trigger deep research ) # Run research with progress tracking print("Starting deep research...") context = await researcher.conduct_research(on_progress=on_progress) print("\nResearch completed. Generating report...") # Generate the final report report = await researcher.write_report() await write_md_to_pdf(report, "deep_research_report") print(f"\nFinal Report: {report}") if __name__ == "__main__": query = "What are the most effective ways for beginners to start investing?" asyncio.run(main(query))直接运行即可体验完整的深度研究流程:先是广度展开、逐层下钻的实时日志,最后在本目录下生成deep_research_reportPDF 报告。这展示了 Deep Research 与后端服务能力(Markdown 转 PDF)的衔接方式。
配置详解:三个核心参数决定研究的广度与深度
Deep Research 的行为由三个参数控制,README 给出的默认值与说明如下:
| 参数 | 含义 | README 默认值 |
|---|---|---|
deep_research_breadth | 每一层并行研究路径的数量 | 4 |
deep_research_depth | 下钻探索的层数 | 2 |
deep_research_concurrency | 最大并发研究操作数 | 2 |
需要注意的是,参数的实际取值取决于你加载的配置文件。仓库内置的默认配置 gpt_researcher/config/variables/default.py 中定义的是:
# Deep research specific settings "DEEP_RESEARCH_BREADTH": 3, "DEEP_RESEARCH_DEPTH": 2, "DEEP_RESEARCH_CONCURRENCY": 4,即在默认配置下:每层广度 3、深度 2、并发 4。同时,gpt_researcher/config/variables/base.py 将这二者声明为BaseConfig的类型字段(DEEP_RESEARCH_BREADTH/DEPTH/CONCURRENCY: int),确保类型校验一致。
在 deep_research.py#L247-L249 中,DeepResearchSkill通过getattr(researcher.cfg, ...)读取这三个值,并在配置缺失时回退到 README 文档中的默认值(4/2/2):
self.breadth = getattr(researcher.cfg, 'deep_research_breadth', 4) self.depth = getattr(researcher.cfg, 'deep_research_depth', 2) self.concurrency_limit = getattr(researcher.cfg, 'deep_research_concurrency', 2)三种配置方式
你可以通过三种方式设置这些参数,README 与代码都支持:
1. 配置文件(推荐):在 YAML 配置中声明,然后通过config_path传入:
researcher = GPTResearcher( query="your query", report_type="deep", config_path="path/to/config.yaml" # Configure deep research parameters here )配置文件中的键名即deep_research_breadth、deep_research_depth、deep_research_concurrency。
2. 环境变量:以DEEP_RESEARCH_BREADTH、DEEP_RESEARCH_DEPTH、DEEP_RESEARCH_CONCURRENCY命名,会被配置系统读取并合并进cfg。
3. 测试/代码中直接注入:DeepResearchSkill直接读取researcher.cfg的属性,因此在构造GPTResearcher时通过cfg对象传参同样生效。tests/skills/test_deep_research_empty_results.py 就演示了这种用法:
deep_research_breadth=2, deep_research_depth=3, deep_research_concurrency=2,参数对行为的实际影响
breadth决定覆盖面:每层生成breadth条搜索查询。并且注意一个源码细节:在递归下钻时,下一层的广度会减半但保底为 2,即new_breadth = max(2, breadth // 2)(见 deep_research.py#L535)。也就是说 depth=2、breadth=4 时,第一层 4 条查询,第二层每条分支再派生 2 条,形成 4×2 的分支树。depth决定下钻层数:每层基于"前一层的研究目标 + 追问问题"构造下一层查询,越深越聚焦。concurrency决定资源占用:通过asyncio.Semaphore(self.concurrency_limit)限制同时进行的检索任务数(见 deep_research.py#L426)。设置过高可能触发检索 API 限流,过低则拖慢整体耗时。
进度追踪:ResearchProgress 回调协议
Deep Research 通过on_progress回调提供实时研究进展,回调对象ResearchProgress的完整字段(README 原文)如下:
class ResearchProgress: current_depth: int # Current depth level total_depth: int # Maximum depth to explore current_breadth: int # Current number of parallel paths total_breadth: int # Maximum breadth at each level current_query: str # Currently processing query completed_queries: int # Number of completed queries total_queries: int # Total queries to process在 deep_research.py#L233-L241 中,ResearchProgress的初始化逻辑为:current_depth从 1 开始向上计数到total_depth,current_breadth从 0 开始随查询完成递增,total_queries在查询生成后动态填充。回调会在以下关键节点被触发(见deep_research()方法):
- 每层开始、每条查询开始处理时(
progress.current_query被更新); - 每条查询完成时(
completed_queries、current_breadth递增); - 整层并发收束后(
current_breadth修正为成功结果数)。
前端/CLI 可以利用该回调渲染进度条或逐行日志,用于定位研究瓶颈或判断分支失败。
高级用法:定制研究流程
README 提供了完整的自定义调用姿势,包含语调、请求头、日志开关以及研究报告相关的访问接口:
researcher = GPTResearcher( query="your query", report_type="deep", tone=Tone.Objective, headers={"User-Agent": "your-agent"}, # Custom headers for web requests verbose=True # Enable detailed logging ) # Get raw research context context = await researcher.conduct_research() # Access research sources sources = researcher.get_research_sources() # Get visited URLs urls = researcher.get_source_urls() # Generate formatted report report = await researcher.write_report()其中get_research_sources()与get_source_urls()是GPTResearcher的公开方法(定义于 agent.py#L672 与 agent.py#L733),分别返回结构化的研究来源列表与去重后的访问 URL 列表。tone来自 gpt_researcher/utils/enum.py 的Tone枚举(如Tone.Objective)。
值得说明的是,headers与tone会被传递到每个分支的嵌套GPTResearcher实例中,保证整棵研究树的行为一致;同时嵌套研究者还会继承websocket、config_path以及 MCP 相关配置(mcp_configs、mcp_strategy,见 deep_research.py#L435-L448),意味着启用 MCP 检索器的用户同样可以在深度研究分支中使用。
源码剖析:递归树状探索的底层实现
了解参数与 API 之后,我们深入 gpt_researcher/skills/deep_research.py 看它究竟如何工作。
研究计划生成:先澄清方向,再展开分支
run()方法(deep_research.py#L580)是整个流程的入口,执行顺序为:
- 调用
generate_research_plan():先通过所有已配置的 retriever 获取初始搜索结果(get_search_results,来自 gpt_researcher/actions/query_processing.py),再把"原始查询 + 搜索结果 + 当前时间"交给 strategic LLM,生成若干追问问题(默认 3 个); - 自动生成答案占位
["Automatically proceeding with research"] * len(questions),把问题与答案拼进combined_query; - 调用递归核心
deep_research(); - 计算并记录深度研究的增量成本(
get_costs()差值),并写入 research 日志。
递归核心:广度展开 × 深度下钻
deep_research()(deep_research.py#L380)是树状探索的核心,每层的处理逻辑为:
- 生成 SERP 查询:
generate_search_queries(query, num_queries=breadth)要求 LLM 返回 JSON 数组[{"query": ..., "researchGoal": ...}](temperature 0.4,使用 strategic LLM); - 并发处理分支:对每条查询用
asyncio.Semaphore(concurrency_limit)限流,asyncio.gather同时执行;每个分支内部会 new 一个GPTResearcher(report_type 为普通ResearchReport、source 为Web)独立完成一次conduct_research(),再调用process_research_results()(reasoning effort 设为 High、max_tokens=4000,为推理模型预留 token 余量)抽取 learnings 与追问问题; - 收集与聚合:各分支的 learnings、citations、visited_urls、context、sources 被汇总;
- 递归下钻:若
depth > 1,以new_breadth = max(2, breadth // 2)、new_depth = depth - 1继续递归,下一层查询由"上层 researchGoal + 追问问题"拼接而成,实现线索追踪; - 上下文裁剪:所有 learnings/context 经
trim_context_to_word_limit()(上限MAX_CONTEXT_WORDS = 25000词,见 deep_research.py#L17-L18)裁剪,避免超出模型窗口。
容错与健壮性设计
README 承诺"查询失败自动跳过、单分支失败不影响整体",这在源码中得到印证:
- 每个分支的
process_query用try/except包裹,异常会记录日志并返回None,随后asyncio.gather结果统一过滤空值(deep_research.py#L479-L489); - 若某一层所有分支都失败(如 API Key 失效、retriever 离线),代码会立即停止下钻而非无意义地递归(deep_research.py#L499-L514),tests/skills/test_deep_research_empty_results.py 专门覆盖了这种空结果场景;
- LLM 输出解析采用
json_repair库自动修复 JSON(尾逗号、markdown 代码围栏包裹等),并提供逐行正则回退解析(Query:/Goal:/Learning [url]:等模式),tests/test_deep_research_parsing.py 对parse_search_queries_response等函数做了大量解析健壮性验证,包括大写JSON围栏、尾逗号修复等边界情况。
与主 Agent 的衔接
在 agent.py 中,conduct_research(on_progress)检测到ReportType.DeepResearch.value(即字符串"deep")后转入_handle_deep_research(),它负责:记录deep_research_initialize/start/complete等一系列 research 日志事件(包含 breadth、depth、concurrency、总成本等元数据),执行deep_researcher.run(),并把返回的聚合上下文写入self.context,供后续write_report()使用。
错误处理与异常场景
综合 README 与源码,Deep Research 的容错策略可归纳为:
- 查询级失败自动跳过:单条查询抛错不会中断整棵研究树;
- 分支级失败继续研究:即使部分分支无结果,成功分支的 learnings 仍会被保留用于最终报告;
- 空结果防护:某层完全没有成功分支时立即终止递归,避免无效的无限下钻;
- 进度可见性:
on_progress回调与日志事件能帮助快速定位失败分支与耗时瓶颈; - 上下文裁剪:无论研究多深,最终喂给报告生成器的上下文都会控制在 25000 词以内。
最佳实践
- 从宽开始(Start Broad):用较泛的主查询起步,让系统在后续层级中自行聚焦到具体细节;
- 监控进度(Monitor Progress):务必挂载
on_progress回调,理解研究流向,尽早发现异常; - 按需调参(Adjust Parameters):
- 更关注覆盖面 → 增大
breadth; - 更关注纵深感 → 增大
depth(注意耗时与成本成倍增长); - 记住"下钻层广度自动减半",初始
breadth过低会导致深层分支过少;
- 更关注覆盖面 → 增大
- 资源管理(Resource Management):
concurrency应结合你的检索 API 配额与机器性能设置,避免触发限流。
限制与资源考量
使用 Deep Research 前需要明确以下代价(README 原文要点):
- 依赖推理模型(Reasoning LLM):计划生成与结果分析会调用如
o3-mini这类推理模型(在example.py中可见O3_MINI_MODEL = "o3-mini"的用法),这意味着推理权限是必需的,且整体运行会显著变慢; - 耗时更长:递归多轮 + 并发检索,整体耗时远超标准研究;
- API 成本更高:多查询并发导致 token 消耗与 API 调用量明显上升;
- 系统资源需求更大:并行处理对内存与网络带宽提出更高要求。
提示:当前仓库默认配置为 breadth=3、depth=2、concurrency=4(default.py),文档示例默认值(4/2/2)仅作为无配置时的兜底。实际调优时应以你加载的配置文件为准,并通过
on_progress日志观察真实执行情况。
总结
GPT Researcher 的 Deep Research 模式把"广度发散 + 深度下钻 + 并发执行 + 智能聚合"封装成了一个开箱即用的report_type="deep",通过三个配置参数即可在覆盖面、深度与资源消耗之间自由权衡。理解 deep_research.py 的递归实现与容错机制,能帮你更好地预估成本、设计查询并定位问题。对于需要"追根究底"的复杂课题,这是一个值得优先选择的研究模式。
【免费下载链接】gpt-researcherAn autonomous agent that conducts deep research on any data using any LLM providers项目地址: https://gitcode.com/GitHub_Trending/gp/gpt-researcher
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考