Deep Research 的整体架构
Deep Research 可以说是 Agent 的代表了,输入一个问题,然后模型通过一系列的网络搜索、思考、提炼总结,最后得出一份全面精准的报告。一直以来,我对 Deep Research 是如何构建的也很感兴趣。
恰好 Google 开源了一个用 Gemini + LangGraph 搭建 Deep Research 的项目‣,这是一个很棒的项目,既可以学习到如何打造一个 Deep Research 应用,又可以学习到当下流行的 LangGraph 这个框架的知识,于是我准备打开这个项目的源码开始学习如何搭建一个基本的 Deep Research 应用。
该项目包含了前端+后端,是一个完整的应用,而本次我主要的目的是探究 Deep Research 是怎么做的,于是只把目光放在 backend/src/agent 这个文件夹目录下。
先用 LangGraph 自带的可视化功能来看看整体架构是怎么样的。

由图可见,其实这个 Deep Research 非常简洁,只包含了4种不同的 Node,分别是:
- generate_query
- web_research
- reflection
- finalize_answer
简单来说,就是一个根据用户问题生成查询,然后用生成的查询去互联网上搜索,根据搜索到的结果再去总结输出。但实际上在真实的操作中,有很多细节可以关注,比如说并行做网络搜索,还有总结的答案经过评估不对还要重新搜索等等。
对于整个 Graph,还有一些 State 需要关注。项目中定义了四种状态:OverallState、QueryGenerationState、ReflectionState、WebSearchState,分别对应几个节点以及整体架构的一些参数的设置。
下面就通过阅读一个个 Node 来看看 Google 在这个项目中对 Deep Research 做了什么细节处理。
generate_query
首先,从获取到用户的问题后会进入第一个节点 generate_query。我们知道,Deep Research 首先是 Deep Search,而如果我们要做 Deep Search,就不能简单的将用户的问题拿去搜索,这会变成一个传统的 RAG,一点都不 Deep。在这一步,会用模型生成更多样化的查询,特别是针对开放性的问题,可以形成更全面的查询增强。
比如,当用户询问:“大语言模型的最新进展和其安全性与伦理影响。”或许可以将问题拆解为“大语言模型的最新进展”、“大语言模型的安全性研究”、”大语言模型的伦理问题“几个子查询去进行搜索,而且,这几个搜索既可以上并行也可以存在先后关系,但在这里,项目只使用了并行搜索。
在进入 web_research 节点之前,根据生成特定数量的查询做了一个门控:
builder.add_conditional_edges(
"generate_query", continue_to_web_research, ["web_research"]
)
通过 continue_to_web_research 这个函数,生成 n 个 web_research 并发送相应的子查询。
在 generate_query 这个节点中,生成子查询的模型可以使用更小更快的模型,比如项目中就是用了 gemini-2.0-flash,然后可以把 temperature 调高,使得模型更有创造性,可以生成更多样化的搜索词。
为了保证时效性,prompt 中还有这样一句话:
- Query should ensure that the most current information is gathered. The current date is {current_date}.
总结一下,generate_query 这个节点就是为了更好的 search 做准备,兼顾了多样性和时效性。
web_research
有意思的是,这个节点不是 web_search,而是 web_research,这也就意味着,这个节点不是单纯做简单的搜索。事实上这个节点的函数非常强大,包含了信息采集+初步处理,完成了“搜索-阅读-总结“的过程。
这个节点利用了 Gemini 的 Tool Use 功能,首先使用 google_search 来对上一个节点生成的子查询进行搜索。在这里,temperature 的值调成了0,因为在执行搜索和整合信息时,希望模型更注重事实和准确性。在搜索这一步,就借助模型做了一次总结。
然后还会对从 google_search 上获取到的源网页做一些处理:
resolved_urls = resolve_urls(
response.candidates[0].grounding_metadata.grounding_chunks, state["id"]
)
# Gets the citations and adds them to the generated text
citations = get_citations(response, resolved_urls)
modified_text = insert_citation_markers(response.text, citations)
sources_gathered = [item for citation in citations for item in citation["segments"]]
在这段代码中,会将模型返回的搜索结果中的长 URL 转换为短 URL,然后 get_citations 函数会提取引用文本,再用 insert_citation_markers 把引用标记插到文本中。
最后会将本次搜索收集到的所有来源、原始的搜索查询、以及带有引用标记的总结文本,一并返回。于是这个节点既进行了网络搜索,又对搜索结果做了初步处理,并且保留了引用信息,做到有迹可循。我们知道 Deep Research 不是简单的对信息做堆砌,更重要的是做理解总结和归纳,而在这一步中,就已经提炼了网络搜索的结果。
reflection
在这个阶段,主要涉及到两个函数,一个是主导思考的 reflection,还有一个是充当决策的 evaluate_research,决定思考结果是否满足往下走,这两个函数的结合,深刻体现了 Deep Research 中的多轮次迭代式搜索+自我纠正和优化。
reflection 会对上一个节点中网络搜索到的结果与用户的研究主题进行比较,模型会判断现在网络搜索的总结是否足以回答问题,如果满足则不生成后续的查询,如果不满足,就会针对知识空白生成新的查询,这就体现了 Deep Research 所拥有的多轮迭代搜索的能力。
在 prompt 中也给出了一个例子:
{{
"is_sufficient": true, // or false
"knowledge_gap": "The summary lacks information about performance metrics and benchmarks", // "" if is_sufficient is true
"follow_up_queries": ["What are typical performance benchmarks and metrics used to evaluate [specific technology]?"] // [] if is_sufficient is true
}}
可以看到,模型会考虑之前的网络搜索缺失了什么,以及生成新的搜索词。
然后在进入下一个最终回答的节点之前,会借助 evaluate_research 函数来做一个门控:
# Evaluate the research
builder.add_conditional_edges(
"reflection", evaluate_research, ["web_research", "finalize_answer"]
)
这个门控会根据 reflection 中返回的状态来决定要不要做迭代搜索,一个是 is_sufficient 状态,这个状态体现了模型认为当前的网络搜索结果是否足以回答问题;另一个则是循环次数,一开始设置了一个上限,当搜索研究的次数达到上限也会返回答案,这防止 Deep Research 在无休止地进行。
在这个节点中,思考+决策看起来非常的简洁,但已经体现了整个 Agent 在做反思纠正,不断深入思考的能力。
finalize_answer
当模型认为答案已经足够好或者迭代思考次数已达上限,就进入了整个研究流程的“收尾”阶段,将零散的信息点汇集成一篇连贯、可信的报告,并整理好参考文献,最终呈现给用户。在这一步通常会使用一个强大的模型来保证最终报告的质量,比如 gemini-2.5-pro。
在这一步需要收集完整的网络搜索结果和历史会话上下文,将 temperature 调成0,确保生成准确的、事实驱动的报告,而非创造性的回答。
然后这一步就结束了,最终也得到了一个经过 Deep Research 的报告。
总结
可以看到,仅仅使用4个 LangGraph 中的 Node 就可以打造出一个流水线式的 Deep Research 了。在这个架构中,我们也可以观察到 Deep Research 的一些关键的技术要点,其核心在于模型不是仅仅执行预设好的搜索指令然后返回结果,而更像一个有策略的研究者,可以动态调整搜索、思考的过程。
通过上面4个关键节点的解剖,可以总结出如下要点:
- 搜索分解:搜索前模型先对问题进行推理,确定搜索的方向并拆分搜索关键词。
- 知识整合:根据搜索到的结果不是简单的作为语块堆砌,而是会根据对信息的理解进行归纳总结,将零散的知识点整合起来。
- 信息评估筛选:不是被动地接受搜索到的结果,会根据问题评估和筛选搜集到的信息。
- 迭代式搜索:如果当前知识并没有能够很好解决问题,不会强行根据输出,而是会进入新的一轮搜索获取更多信息。
- 自我反思与优化:会根据初步结果判定是否可以解决问题,如果不能则会继续优化问题调整研究路径,进入下一轮迭代。这种反馈机制体现了 Deep Research 不断完善回答内容,追求准确结果的能力。
那么到这里,这篇文章就结束了,但其实 Deep Research 的技术不止于此,至于更多的优化方案,我就放到未来再去研究了。
Loading Comments...