前言
本文章只是分享一下目前 DeepSearch/DeepReseach 的原理介绍和自己对该技术在信息安全领域的垂直应用的一些思考和实现笔记。 上周末的 Jina AI 分享的会议上给我最大的感触就是:没有什么技术掌握了就能持续吃到红利,甚至有时候你实现出来这个技术马上就被落后了。也许在我写完这篇文章之前,或许写完之后没多久,LLM 工程化的项目已经有更好的替代方案。
但即便如此,我认为一个技术的发展历程每一步都是重要的,所以如果你正在读这篇文章到时候已经有新奇的技术,我希望能也能从这篇文章中得到一定的参考意义。
这篇文章篇幅可能会比较长,有一些是我在网上看到的公开解决思路,适合正在从事安全 Agent 开发人员或是正在调研 LLM 在应用上落地的人。
灵感的开始
其实一直都想做一个 LLM 来自动化赋能安全行业的垂直 Agent,为此有在持续关注 LLM 的应用实践场景,甚至思考如何做好一个需求,真正意义上对安全人员能提高效能的需求。
2025.4.1 晚上,突然来了灵感(多半可能来自上周末的 Jina AI 在上海举办的分享会,肖涵博士分享的内容确实给予了我很多思路)。
既然 OpenAI 有 DeepResearch,Jina AI 也有做自己的 DeepSearch,其他的领域包括 Manus、OWL 也都有一些关于自己的 Agentic 落地,那么安全领域有什么专属的落地思路可以实现吗?
从 2023 年有短暂的接触过一些 AI 应用,如 RAG、Cursor(面向自然语言编程)、Langchain、Agent 等,但...大多数实践落地的成品效果也不太理想。但随着 2025 年机缘巧合下,Multi-Agent 的“井喷式”爆发,让我萌生了想尝试写一个信息安全垂直领域的 Multi-Agent。
需求痛点
“需求,永远都是都是市场的核心驱动力!”
其来源是有时候也觉得信息搜集所耗费的实践和成本巨大,尤其是正在做安全测试的时候,如果遇到某一个中间件、或者 CMS ,知道但是却不熟悉其存在的历史漏洞,如果再人工去检索、去求证、最后写 Poc。整个过程极其耗时,但如果DeepResearch如果能针对信息安全领域垂直应用,专门针对信息检索、漏洞研究、以及漏洞的可利用程度,评估总结出一份详细的报告,简短安全研究人员在前期的研究上所耗费的时间成本。
DeepResearch 实现原理
Deep Research 在各个场景中应用广泛,且该应用可以解决很多需要耗费大量人力去审查和找寻资料,这个章节就先简单介绍一下 LLM 上层应用的技术演变以及 Research 的原理。
RAG到DeepResearch技术演变
检索增强生成(RAG)技术是 DeepResearch 实现的技术原理之一,我认为在这里穿插 RAG 的发展历程能够更好的方便我们之后理解 DeepResearch 在工程上所需要优化的一些方向。
朴素 RAG 阶段:这一阶段是 RAG 刚被应用与生成式人工智能上的初步形态,当时为了能减少大模型所出现的幻觉,将用户的 Query 向量化,与知识库中的分块进行查询。我在 23 年的时候发布的公众号文章《用GPT做静态代码扫描实现自动化漏洞挖掘思路分享》文章中就有介绍过,里面贴了一张宝玉老师绘制的架构图。
高级 RAG 阶段:高级阶段本质上还是线性的流程,引入了查询的重写和引申。以及检索后的 Rerank 召回、精简概括等。
模块化 RAG 阶段:将每个阶段划分成一个模块,分别为索引->预检索->检索->后检索->生成。而一次查询,会经过多个模块,在模块内进行处理和检索以及召回。
之后就是 Agentic RAG,本质上就是 DeepResearch 的雏形,就是在模块化的 RAG 上可以调用多种工具来辅助检索。
就在今年年初 2 月份的时候,Google 和 OpenAI 各自推出了他们的 Deep Research ,以及后续 Jina AI、Grok3 等也迅速响应。
从 RAG 发展到 DeepResearch 本质上就是一种技术应用的创新。一开始的传统普通检索,然后慢慢采用工程上的调优,到最后采用循环推理检索和分析的 DeepResearch,未来的搜索正在朝向牺牲一部分等待时间来换取更高质量的结果过程。
DeepResearch的原理介绍
关于谈论 DeepResearch 的原理,绕不开三个最基本的动作:搜索、阅读和分析、推理。然后 Repeat、Repeat、Repeat...
在论文:https://arxiv.org/pdf/2502.04644 中提出了一个Agentic Reasoning 的框架,大概介绍了通过如下三种方式来提高 LLM 的推理能力:
-
Mind Map:构建一个结构化的知识图谱来跟踪相关的逻辑关系,达到让 LLM 提高推理能力。 -
网络搜索能力:检索目前的实时信息,减少模型的幻觉。 -
代码 Agent 能力:可以提供精确计算和编码的任务,以处理推理过程中的计算任务。
所以我们需要一个可以调用网络搜索能力的、能够细致化执行数据处理工作的Agent 能力,具有可循环的 map 工程步骤。
直接说结论,看一个 DeepResearch 是如何实现的:
-
用户输入一个主题或范围来进行研究 -
将用户的主题分解拆分成多个子主题来进行查询和分析,并重写、拓展这些查询主题 -
通过多个权威在线网站检索对应的主题内容,同时识别排名 Rank 靠前的 URL -
将检索到的主题内容进行阅读和分析,同时提取出学习点和关键后续问题 -
基于后续问题继续到步骤2生成新查询,并保存学习点 -
汇总所有的 URL 和学习点,通过 LLM 生成研究报告 -
输出报告格式给用户
上述就是 DeepResearch 的大致原理和步骤,但其实每个步骤中需要考虑的工程细节非常多,比如如何准确重写和扩展用户的主题,识别出用户真正的语义背后的意图?如何分解子主题?网页检索信息的时候如何去除权威语料、广告等无效信息?提出的后续问题应该怎么迭代,广度优先还是深度优先?
这些问题都是后续可能会遇到并需要考虑的,咱们暂时按下不表,先来看看一些优秀的 DRS 项目是如何实现的吧。
一些优秀 Deep Search/Research 产品,他们是怎么解决的?
这里会先从一些工程上的解决方案,到后面的 OpenAI 模型即产品的理念和在笔者撰写此篇文章的时候行业中发布的一些相关新的方案的角度来述说。内容比较多,建议结合 AI 进行双向费曼学习,或阅读我下面指出的 Reference。但有些在文中标注了引用编号,有些因为我太懒了没及时标注,不过总体是按顺序的可以根据编号顺序来对应文章内容。
Jina AI Deep Research
其实Jina并没有对DeepResearch做实现,他们所专注的,是在搜索上的拓展而专门思考如何将 DeepSearch 做的更好。本质上还是与 DeepResearch 输出长报告不同,但其思路还是有许多可以学习的地方。
同时 Jina AI 也有在 GitHub 上开源他们的 DeepReseach 项目:https://github.com/jina-ai/node-DeepResearch
上述流程中,将研究查询的主题先生成一个 TOC(目录),类似 Manus 这种拆解问题成一个个小的子问题目录。
首先需要做的就和之前介绍原理一样,用户的查询有可能是描述不准确的,或者有更深层次的语义,因此最好的办法就是先让模型猜,重写和拓展用户的研究主题。Jina AI 的研究发现:
我们发现,查询重写的重要性远超预期,甚至可以说是决定搜索结果质量的最关键因素之一。 一个优秀的查询重写器,不仅能将用户的自然语言转化为更适合 BM25 算法处理的关键词形式,还能扩展查询,从而覆盖不同语言、语调和内容格式下的更多潜在答案。
这意味着重写这个环节所带来的优化是有决定性的作用
<example-1> Input Query: 宝马二手车价格 <think>宝马二手车价格...哎,这人应该是想买二手宝马吧。表面上是查价格,实际上肯定是想买又怕踩坑。谁不想开个宝马啊,面子十足,但又担心养不起。这年头,开什么车都是身份的象征,尤其是宝马这种豪车,一看就是有点成绩的人。但很多人其实囊中羞涩,硬撑着买了宝马,结果每天都在纠结油费保养费。说到底,可能就是想通过物质来获得安全感或填补内心的某种空虚吧。要帮他的话,得多方位思考一下...二手宝马肯定有不少问题,尤其是那些车主不会主动告诉你的隐患,维修起来可能要命。不同系列的宝马价格差异也挺大的,得看看详细数据和实际公里数。价格这东西也一直在变,去年的行情和今年的可不一样,${currentYear}年最新的趋势怎么样?宝马和奔驰还有一些更平价的车比起来,到底值不值这个钱?宝马是德国车,德国人对这车的了解肯定最深,德国车主的真实评价会更有参考价值。最后,现实点看,肯定有人买了宝马后悔的,那些血泪教训不能不听啊,得找找那些真实案例。 </think> queries: [ { "q": "二手宝马 维修噩梦 隐藏缺陷" }, { "q": "宝马各系价格区间 里程对比" }, { "tbs": "qdr:y", "q": "二手宝马价格趋势" }, { "q": "二手宝马vs奔驰vs奥迪 性价比" }, { "tbs": "qdr:m", "q": "宝马行情" }, { "gl": "de", "hl": "de", "q": "BMW Gebrauchtwagen Probleme" }, { "q": "二手宝马后悔案例 最差投资" }]</example-1>
详细实现:https://github.com/jina-ai/node-DeepResearch/blob/949c34f14f038c26d42ab894fd83201acd7afc96/src/tools/query-rewriter.ts
在使用提示词这一部分,Jina AI系统提示词使用了 XML 的标签来增强生成内容,比如:
你是一个高级 AI 研究助理,擅长多步骤推理...<knowledge>[知识条目]</knowledge><context>[行动历史记录]</context><bad-attempts>[失败的尝试]</bad-attempts><learned-strategy>[改进策略]</learned-strategy><actions>[可用行动定义]</actions>请以有效的 JSON 格式响应,并严格匹配 JSON schema。
经过实践,这种显示的编写提示词的方式也非常可靠。
“知识空白问题”:指的是 LLM 在回答问题之前对相关主题领域的知识并不完全掌握,有空白存在的缺口。如 2024 年初训练出来的模型,或许并不知道 2025 年的美国总统是谁,因此 Agent 需要识别这些子问题(如 2025 年谁获得了选举)并解决。
Jina AI 用一种队列(FIFO)的方式来解决:
-
新的知识会被优先推到队列头部,原始问题始终位于队列尾部。 -
每次从队列的头部获取问题来处理。 当一个“知识空白问题”被解决后,提取出来的知识点也可以帮助我们解决后续的问题,直到最终的原始问题。其实现逻辑也有点像是一个跌规检索的深度优先搜索,先解决最小子问题,然后再慢慢回溯。
之后求解子问题就免不了需要访问网页,这里也是整个 DeepResearch 最重要的部分,大致分为如下几个关键难点:
-
如何搜索网页 -
如何总结过长网页 -
如何对目标 URL 网页信息筛除无效信息和广告
如何搜索网页:这个常见的部分挺好解决,就用目前比较常见的方式调用 SERP(Search Engine Results Pages)API 来检索,集成几个常见的。但最难的地方在于我们之后要做的信息安全领域垂直的应用,因此光集成几个常见的 Google、Baidu 等搜索引擎可能还不够,还需要通过exa、serper、firecrawl、Brave Search等来辅助采集的几个特定漏洞库网站。
curl -X POST 'https://api.exa.ai/search' -H 'Authorization: Bearer YOUR-EXA-API-KEY' -H 'Content-Type: application/json' -d '{ "query": "Latest research in CVE-2025-1974", "text": true }'
搜索这块就不细说了,大致上都是一样的解决方案。来说说 Jina AI 在搜索之后都做了些啥。
如何总结过长网页:经常会遇到在搜索过长中由于某些网页内容过长导致的模型的上下文越来越冗长,从而降低了模型的召回能力,大部分是通过新开一个会话来总结这些页面的内容并添加到上下文里,这种往往并没有更好的效果,会丢失掉页面中与用户提问相关的真正的解决方案。
在每一次 DeepSearch 漫长过程中,你可能会从搜索引擎结果页(SERP)里收集一堆 URL,每打开一个网页,又能顺藤摸瓜找出不少新链接,就算是去重后,也是轻轻松松几百个网址。同样的,一股脑儿全塞给 LLM 肯定不行,浪费宝贵的上下文长度不说,更要命的是,我们发现 LLM 基本上就是瞎选。所以,得想办法引导 LLM 去挑出那些最有可能包含答案的 URL。
我阅读了他们的博客文章,是使用 Reader 读取网页的信息,将对应需要的知识项添加到对应的上下文中再进行推理。
而 Jina AI 专门开发的这么一个 HTML2Markdown 的 reader 功能,可以将页面中杂乱无章的格式、广告等清楚,留下有价值的内容(看着很简单,但要剔除无用的内容是很难清洗的)。其原理是开发了一个参数了只有 1.5b 的 ReaderLM v2 的模型,研究人员人工整理这些数据集并标记训练,好让该模型具备能够专门处理 HTML 到 Markdown 的工作能力。
利用 Reader 分步骤读取 4-5 个页面内容,之后就需要获取与查询相关的连续上下文信息(以保证语义连续且不中断),Jina AI 这里就提出另一个有意思的技术:Late-chunking(Jina 将其命名为迟分技术)。
Late-Chunking 提取关键片段:在之前的 RAG 分块中,基本上是通过给定一个分块长度来把句子拆分开来。不论是固定长度还是滑动窗口,都是有一个给定的 chunk size 长度来划分,有时候语义还没结束就被一刀切了。
先来看看迟分技术的解决思路:
迟分技术增加了一种类似一维卷积Reference[21]的方式来解决,首先将长文本继续通过分词来确保整个句子的连续性。然后通过 Embeddings 模型计算向量后,与用户 Query 的查询向量进行卷积,计算每个块之后的相似度分数。最后利用滑动窗口的选取窗口内相似度平均分最高的一组,这样就把长文本中与查询最相关的片段选取出来。
可以看到,句子中没有包含 Berlin,而是使用代词替代的句子,在similarity_trad没有采用 late chunking 的相似度数值更低。公开复现地址:https://colab.research.google.com/drive/15vNZb6AsU7byjYoaEtXuNu567JWNzXOz
关于迟分技术所解决的问题,可以详细的参看 Reference[18] Reference[19]
URL重排序:从搜索结果中拿到的大量SERP结果数据,需要经过一些重要的筛选,例如URL是否是来自CVE、Github、ProjectDiscovery这类权威机构的博客。
可以使用reranker的模型对标题和摘要做一个重排序的解决。具体实现:https://github.com/jina-ai/node-DeepResearch/blob/main/src/utils/url-tools.ts#L192
上述基本上就是一个 DeepResearch 过程中会遇到的问题,Jina AI 还有在这些方面做细微的优化:
-
内存管理:这个在之前的尝试中大部分是使用向量数据库存储相关检索的知识、网站和失败的尝试。不过随着 Gemini-2.5-Pro 超强的上下文能力,其实可以完全解决这个问题。 -
强制预算:为了防止系统过早返回,Jina 设置了强制预算的方案,在处理子问题的时候如划分 10M Token 数量,则会持续检索直到完成一定的使用量。而如果接近预算还没有停下的意思,则会激活“野兽模式”,强制模型从现有的知识中给出答案,避免无功而返。 -
答案评估:针对问题提出的时候,就给定特定的评估标准,然后逐一评估。
以上就是我的对 Jina AI 的 DeepSearch/DeepResearch 项目的一些解读,如文中有疏漏或存在错误的地方还请各位读者帮忙指正。
Milvus DeepSearcher
Jina AI 所作出的工作确实令人震惊,这给很多的 Agent 开发者或者愿意从事 LLM 的应用开发者们提供了很好的学习思路。正如开头所说,这篇文章不太在乎篇幅长短,尽我可能的多解读几个优秀项目的落地方案,博采众长。
老规矩,上来先来看看 DeepSearcher 的架构图
可以看到在开头还是分割了子问题,不同的是这里使用了一个 Router来连接后续向量数据库中的路径,并通过本地知识库的 RAG 和网络搜索来自适应检索内容。
这种与在线的 DeepResearch 的方案多了一步可以反复检索思考的方式,通过分解问题,检索,最后总结给出答案。这种思路对企业内部的垂直领域也有不错的应用场景。 具体实现详细文章可以参考 Reference[25].
Open Deep Research
项目地址:https://github.com/sentient-agi/OpenDeepSearch Salaheddin Alzubi等人在Open Deep Search上做出了两项创新:分别是 Open Search Tool 和 Open Reasoning Agent
Open Search Tool:这个部分具体实现也是通过查询重写、检索增强SERP API的逻辑来处理外部检索的内容,这部分的实现现在来看比较标准化。
Open Reasoning Agent:其内部分为两个版本:ODS-v1 和 ODS-v2。其中 ODS-v1 使用 CoT 思维链和 ReAct 的框架,类似如下所示。
<Question>法国的首都是哪里?</Question><Thought>我需要确定法国的首都。</Thought><Action>search_internet</Action><Action_Input>“法国首都”</Action_Input><Observation>法国的首都是巴黎。</Observation><Final_Answer>Paris 巴黎</Final_Answer>
在 ODS-v1 中集成的工具分别有:WebSearch、Math 工具、继续 Thinking。ODS 在使用 web 检索的时候也有用到 Crawl4AI 和 Jina 的语义搜索重排序
而在 ODS-v2 中使用的是 CodeAct 框架,且采用了一种Chain of Code (CoC). 的思维链方式
且使用了网页搜索和 smolagents 的结合来实现。
这种有点类似近期知道创宇发布的 AiPY:https://github.com/knownsec/aipyapp。一款 Python-Use 的框架。
Deep-Research
这个和上述的几个解决方案大相径庭,所以没啥好说的,如果有仔细看完上面的解决方案,再看这个流程图大体也知道是什么原理了。但因为这个项目是最早的一批开源解决方案,在 Github 上 2025.2.4 就开源了,所以放到最后来贴一下。
Research 强化学习模型即产品
说完工程化的 DeepResearch,再来谈谈 OpenAI 的 DeepResearch 是如何实现的。
OpenAI 的实现方式完全不同于目前市面上开源的流行 DeepResearch 解决方案,是因为 OpenAI 本身就是在模型上具备了这样的能力,通过端到端的 ReFT(强化微调)的方式,增强模型能够调用 Web Search 的能力,让模型自己来推理和检索。也就是所谓的模型即产品Reference[46]。
ReFT这个概念早在字节团队发布的论文 Reference[33] 中有提出, 也有人称之为 RFT,但国内大部分也是按照这个标准叫 ReFT,用强化学习和奖励模型来增强LLM生成CoT的能力。
通过论文 Reference[34] 中给出的方案,从 DeepSeek 中的强化学习GROP 学习到经验,通过类似的方式重新训练 LLM 使其具有检索的能力,具体实现是通过和标签的方式包含搜索和结果内容。
以及通过 PPO、GROP 的实现论文 Search-R1 中Reference[35]也有提到对应的实现逻辑,训练的部分没有啥太多不同的地方,和传统的 PPO、GROP 一样。
继续看 Search-R1 论文中给出的伪代码,清楚直观的可以看到在多轮检索中判断了模型回答过程中是否有和的标签,然后中该轮中的回答中继续处理对应的动作,如检索网页或是完成回答。并使用的标签来包含检索到的内容。
伪代码中还有给出如果该轮的回答中条件不充分,模型回在最后加一个“My action is not correct. Let me rethink.”在下一轮检索中继续调整思路。
在论文《DeepRetrieval: Hacking Real Search Engines and Retrievers with Large Language Models via Reinforcement Learning》中也有指出 RL 在检索上的强化学习应用。
GLM-Z1-Rumination
模型开源地址:https://modelscope.cn/models/ZhipuAI/GLM-Z1-Rumination-32B-0414
沉思模型是智谱在 2025.4.14晚发布的开源,本质上这个也是一个强化学习的产物,通过训练的时候设定特定的样本,可以通过 Function Calling 调用如下四个工具:
-
Search:执行搜索并返回搜索结果。 -
Click:根据搜索结果返回的 link_id点击导航到对应的页面。 -
Open:打开特定的网页。 -
Finish:完成任务。
这个由于没有找到相应的论文,我就在这里带过一下,猜测具体的实现逻辑和 Search-R1 的伪代码内容可能相似。以及 Search-o1 的实现方式 Reference[43] 和 Reference[44]。
字节MCP Research实现
笔者开始动笔这篇文章的时候是 4 月初,经过大约一周多的样子,MCP 突然好像就被各个大厂和主流 AI 平台所支持了。随之而来的也有很多 MCP 方向的 Deep Research 方案。如 Reference[40] 所述,认为 MCP 的对比传统的 Function Calling 有着更好的扩展性和灵活程度。
之前在二月底的时候也有写过一篇文章用来阐述 MCP 的应用便携性Reference[41]
再来看看字节的 Research 的实现过程就是使用 MCP 来集成多个服务端点,通过 Supervisor 和 Workflow 的方式来管理和编排
这里的Supervisor Agent 是一款可协调多个 Agent 的框架,在 LangGraph 的文章中有详细介绍该框架Reference[47]
从示例中的 Prompt 可以大概看出这个 Supervisor 是一个主管,可以用来协调下属(工具)的任务分配
members = ["researcher", "coder"]# Our team supervisor is an LLM node. It just picks the next agent to process# and decides when the work is completedoptions = members + ["FINISH"]system_prompt = ("You are a supervisor tasked with managing a conversation between the"f" following workers: {members}. Given the following user request,"" respond with the worker to act next. Each worker will perform a"" task and respond with their results and status. When finished,"" respond with FINISH.")
更多 LangGraph Multi-Agent Supervisor 的实现可以看仓库 Reference[48],这里就不继续赘述了,大致可以理解为一个协调多 Agent、决策调用什么 Agent 的主管 Agent。
而整体的调用过程如下图所示
这里就可以直观的看到 Worker 的节点就是封装好的 MCP Client 去调用对应的 Server 服务,最后交由 Supervisor 继续决定下一步怎么做。
分类小结
由于 Deep Research 的解决思路确实能带来一些价值产生,且笔者认为这个方向应该在未来发展某些垂直领域时,会借鉴很多 Deep Research 上的技术实现。正如 Search 的过程也有很多 RAG 的身影。
因其技术的独特性,在想这种生成报告的途中既然能够暂停去调用 Search、Code的 Agent 执行任务,是不是也就可以进一步执行 Docker 容器创建、Scanner、CodeQL的工具任务。如我正在执行某个 CVE 的研究任务,下发检索 NVD、Synk 等漏洞库,进一步搭建 Docker 靶场,调用 Fetch MCP 发送恶意 Payload 进行复现?
实现自己的Vulner DeepResearch
上一章节介绍了一些主流的 Deep Research 的产品解决方案,大致对整个流程有一定的认识基础。笔者认为 MCP 还是学习的主流方向,至少在我撰写本文的时候还具有一定的研究价值。
研究本质上就是前人的项目经验基础上继续做探索、尝试,这里我选择用 LangGraph 来编写一个大致的 Demo,一来是LangGraph 有着非常好的可编排性,二者是我正好借此机会详细的看一下 LangGraph 在开发过程中的实践原理。如果你愿意用 n8n、Dify 的方式来编排剧本也是可以,重点在解决工程上的问题,而不一定局限某个工具或者框架。
首先通过 LangGraph 的框架要创建一个 Supervisor 的项目,这个模板已经有现成的了Reference[55],先来跑一个大概的 Demo 来认识一下。
from langchain_openai import ChatOpenAIfrom langchain_deepseek import ChatDeepSeekfrom langchain_community.llms import Tongyifrom langgraph_supervisor import create_supervisorfrom langgraph.prebuilt import create_react_agentimport osos.environ["DASHSCOPE_API_KEY"] = "sk-xxxxx"model = ChatOpenAI( model="qwen3-30b-a3b", temperature=0, max_tokens=4096, timeout=None, max_retries=2, api_key=os.environ.get('DASHSCOPE_API_KEY'), base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", streaming=True# 必须启用流式模式,因为模型只支持流式模式)# model = ChatOpenAI(model="gpt-4o")# model = ChatDeepSeek(# model="deepseek-chat", # DeepSeek API 支持的模型名称# temperature=0.7, # 控制输出的随机性# max_tokens=2048, # 最大输出长度# api_key=os.getenv("DEEPSEEK_API_KEY") # 从环境变量加载API key# )# Create specialized agentsdefadd(a: float, b: float) -> float:"""Add two numbers."""return a + bdefmultiply(a: float, b: float) -> float:"""Multiply two numbers."""return a * bdefweb_search(query: str) -> str:"""Search the web for information."""return ("Here are the headcounts for each of the FAANG companies in 2024:n""1. **Facebook (Meta)**: 67,317 employees.n""2. **Apple**: 164,000 employees.n""3. **Amazon**: 1,551,000 employees.n""4. **Netflix**: 14,000 employees.n""5. **Google (Alphabet)**: 181,269 employees." )math_agent = create_react_agent( model=model, tools=[add, multiply], name="math_expert", prompt="You are a math expert. Always use one tool at a time.")research_agent = create_react_agent( model=model, tools=[web_search], name="research_expert", prompt="You are a world class researcher with access to web search. Do not do any math.")# Create supervisor workflowworkflow = create_supervisor( [research_agent, math_agent], model=model, prompt=("You are a team supervisor managing a research expert and a math expert. ""For current events, use research_agent. ""For math problems, use math_agent." ))# Compile and runapp = workflow.compile()# 使用流式输出for s in app.stream( {"messages": [ {"role": "user","content": "what's the combined headcount of the FAANG companies in 2024?" } ] }, subgraphs=True): print(s) print("-----")
上面的例子是一个Supervisor 协调两个工具[research_agent, math_agent]的例子,建议可以读一下代码稍微理解个大概。
但这里我会用 MCP 的方式来实现具体的操作,因此还要LangChain MCP Adapters 的平台来链接我需要到 MCP 服务Reference[56]
pip install langchain-mcp-adapters
具体实现的代码如下,应用到了两个 MCP 的工具:
asyncwith MultiServerMCPClient( {"sequential-thinking": {"command": "npx","args": ["-y","@modelcontextprotocol/server-sequential-thinking"],"transport": "stdio", },"playwright": {"command": "npx","args": ["@playwright/mcp@latest"],"transport": "stdio", } } )
然后配置.env文件
DASHSCOPE_API_KEY=...LANGSMITH_API_KEY=...
以及 langgraph.json 的文件
{"dependencies": ["."],"graphs": {"agent": "./graph.py:make_graph" },"env": ".env"}
完整的代码如下:
import asyncioimport osfrom langchain_openai import ChatOpenAIfrom contextlib import asynccontextmanagerfrom langchain_mcp_adapters.client import MultiServerMCPClientfrom langgraph.prebuilt import create_react_agentfrom datetime import datetimefrom langgraph_supervisor import create_supervisormodel = ChatOpenAI( model="qwen3-235b-a22b", temperature=0, max_tokens=4096, timeout=None, max_retries=2, api_key=os.environ.get('DASHSCOPE_API_KEY'), base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", streaming=True# 必须启用流式模式,因为模型只支持流式模式)@asynccontextmanagerasyncdefmake_graph():# Configure MCP clients for different servicesasyncwith MultiServerMCPClient( {"sequential-thinking": {"command": "npx",# Make sure to update to the full absolute path to your math_server.py file"args": ["-y","@modelcontextprotocol/server-sequential-thinking"],"transport": "stdio", },"playwright": {"command": "npx",# Make sure to update to the full absolute path to your math_server.py file"args": ["@playwright/[email protected]"],"transport": "stdio", },"filesystem": {"command": "npx",# Make sure to update to the full absolute path to your math_server.py file"args": ["-y","@modelcontextprotocol/server-filesystem","/Users/test/Desktop"],"transport": "stdio", }, } ) as mcp_client:# Get MCP tools mcp_tools = mcp_client.get_tools()# Create agents with both custom and MCP tools sequential_agent = create_react_agent( model=model, tools=mcp_tools, name="sequential_agent", prompt=("你是任务规划代理,负责拆分Supervisor传递的任务。请始终一次只使用一种工具,并且仅在必要时使用。重要提示:请向Supervisor简要汇报您的任务完成情况或发现。请勿直接与用户交谈。""请你拆分用户的主题和意图,还可以根据用户想检索中间件或CVE编号等研究的 Topics 分别调用,并且在所有检索之前需通过 Google、Baidu 等搜索引擎先检索一番资料!""中间件的检索可以调用如下网页:https://www.cvedetails.com、https://security.snyk.io""CVE编号的检索可以调用如下网页:https://cve.mitre.org、https://security.snyk.io、https://avd.aliyun.com/search?q=、https://nvd.nist.gov、https://www.oscs1024.com/hd/CVE-xxxx-xxxx" ) ) fetch_agent = create_react_agent( model=model, tools= mcp_tools, name="fetch_agent", prompt=f"你是网页检索代理,负责检索网页和搜索资料。请始终一次只使用一种工具,并且仅在必要时使用。重要提示:请向Supervisor简要汇报您的任务完成情况或发现。请勿直接与用户交谈。" ) filesystem_agent = create_react_agent( model=model, tools= mcp_tools, name="filesystem_agent", prompt=f"你是文件系统访问代理,负责保存文件。请始终一次只使用一种工具,并且仅在必要时使用。重要提示:请向Supervisor简要汇报您的任务完成情况或发现。请勿直接与用户交谈。" )# Create supervisor workflow workflow = create_supervisor( [sequential_agent, fetch_agent, filesystem_agent], model=model, output_mode="full_history", # or it can be "last_message" for last message only prompt=("你是一位私人助理,负责帮助用户检索相关漏洞主题或 CVE 编号的报告及内容。""用户的输入可能是某个中间件主题或者 CVE 编号,需要根据特定的情况规划任务和检索,并最后总结成报告输出给用户。""你负责管理团队并直接与用户沟通。""编排任务和计划,请委托给sequential_agent. ""检索网页和搜索资料,请委托给fetch_agent. ""子代理只需回复您,而您是最终将信息传递给用户的人。""确保您的回复有用、清晰,并保持一致的语气,以提升用户体验。" ) )# Compile and yield the workflow app = workflow.compile()yield app
如果要运行上面的代码,则还需要安装终端的 Server
pip install --upgrade "langgraph-cli[inmem]"
然后使用 langgraph dev 的方式直接运行
在 Message 哪里添加一个 Human 的提问:
帮我检索最近的“ingress”有什么严重漏洞,并给我一份专业的研究报告,针对该漏洞的原理、影响范围、利用方式、修复方案,以及如何搭建对应的 K8S 环境复现该漏洞。 将输出的报告写到 ingress-cve-xxxx-xxxx.md文档中
这个时间有点长,最后可以看到如下的内容
Content 部分的内容因与本文篇幅无关,我用 LLM 帮忙翻译并上传到了我的博客,方便读者参考: https://www.cnblogs.com/wh4am1/p/18850821
Deep Research这个思路在安全上还是有很多可以拓展的空间,应用在只要重复检索资料、总结归纳的场景,基本上都是能够很大程度上减轻漏洞研究人员的时间成本。或者针对日志类型的调研取证、风险复盘等应该也有不错的可行性。
CRAB-自动化的最后一公里?
最近热度又有点起来的 Dia 和 Fellou 的超智能体浏览器在网络上广为传播,我拿到一个邀请码测了一下 Fellou,整体工程上来确实还不错,就是最后的结果感觉还欠缺一点点火候(可能是我测试的案例检索的深度不够)。
看着 Fellou 这类的智能体浏览器,猜想如果按照发展往 AI PC 方向发展,可能会类似 Camel AI 发布的 CRAB(Cross-environment Agent Benchmark,跨环境代理基准)一样Reference[62]?在未来类比 CRAB 提供了一个端到端且易于使用的框架来构建代理、操作环境并创建基准来评估吧。
如何真正用好Deep Research
这里引用总结了宝玉老师的如何真正用好 Deep Research 智能体文章 Reference[64],宝玉老师总结的方面还比较全面,大致分为如下几个方向:
-
个人学习和知识研究:支持拆解知识点、提炼要点、关联逻辑和翻译等工作,可以生成知识图谱和“比兴”的方式更好的辅助用户理解和学习。 -
内容创作和知识输出:撰写某个领域的博客和报告,可以快速的归纳总结某个方向的所需知识点、案例、专家的观点,节省用户整合资料的时间成本。 -
消费决策与产品分析:选购某个产品或性价比的服务时候可以通过 Research 帮忙检索总结,通过检索的优势收集多个产品用户的参数和用户评价,提供专业的推荐理由和替代方案。 -
日常生活规划:检索小红书、常见旅游攻略平台,可以定制性规划行程任务和拆解任务步骤。 -
决策参考与事实核查:可以审查合同、解读政策、通过检索数据来支撑某个决策的可行性,让检索到的内容能更好的支撑现有的观点,同时通过批判性思维提出那些容易产生误区的地方。
总结与拓展
全文大致讲了 Deep Research 的技术实现原理,以及一些优秀的 Research 项目在发展过程中是如何精细化输出的内容,使研究检索的报告内容更具权威性。且随着 MCP 的发展,可能后续很多的多 Agentic 协作工作的场景应该会更加简单、标准化,只需通过引入几个 MCP 和提示词工程即可完成目前很多 Multi-Agents 的应用场景。
还通过 LangGraph + Supervisor + MCP 的方式实现了一个简单的 Vulner Deep Research 的功能,通过议题快速获取漏洞的详细报告信息。并在文末借鉴宝玉老师提出的几个使用大致方向,可参考并快速上手应用。
我在这里略陈管见,提几个我能想到的可以扩展 Research 技术的方向:
-
清洗筛选高质量的漏洞应急数据,可以根据日志信息快速定位应急报告,辅助安全人员响应。 -
通过强化学习相关逆向的知识体系作为模型基础,调用工具自动化逆向并生成报告。 -
清洗筛选 SAST、DAST、SCA、IAST 等漏洞工单数据,结合私有仓库检索相关漏洞函数生成自动化修复 Issue 报告。(长久以来 SAST 和 DAST 的结合使用一直有着天然的屏障:无法根据代码提供专业的 Payload,希望 LLM 可以打破缩小这个差距) -
VPT 漏洞评估,通过特定的网页信息上的数据和漏洞库评估某个漏洞是否存在真实可以利用的 Poc/Exp,好提高漏洞的优先级。(这个和之前实现 Vulner Research 的章节很相似)
不论未来 Deep Research 是否会被淘汰,但绝对能够称得上是 LLM 应用场景开发历程上的一个重大里程碑,值得深入学习研究的一大课题!
Reference
[1].https://mp.weixin.qq.com/s/-pPhHDi2nz8hp5R3Lm_mww [2].https://mp.weixin.qq.com/s/UrTS7evWZeZp8mnjQiKEuQ [3].https://arxiv.org/pdf/2502.04644 [4].https://github.com/Agent-RL/ReSearch [5].https://jina.ai/models/ReaderLM-v2 [6].https://www.perplexity.ai/hub/blog/introducing-perplexity-deep-research [7].https://gemini.google/overview/deep-research/ [8].https://mp.weixin.qq.com/s/LHm4lktBYSxpmSC5_Ifuqw [9].https://arxiv.org/pdf/2501.09136 [10].https://www.firecrawl.dev/blog/open-deep-research-explainer [11].https://www.firecrawl.dev/blog/deep-research-api [12].https://github.com/nickscamara/open-deep-research [13].https://github.com/jina-ai/node-DeepResearch [14].https://jina.ai/zh-CN/news/a-practical-guide-to-implementing-deepsearch-deepresearch/ [15].https://learn.microsoft.com/zh-cn/azure/developer/ai/advanced-retrieval-augmented-generation [16].https://dev.to/rogiia/build-an-advanced-rag-app-query-rewriting-h3p [17].https://colab.research.google.com/drive/1-NT0_mmyoSnaDQJ1Zuo0XX613TG5lzjZ?usp=sharing [18].https://arxiv.org/pdf/2409.04701 [19].https://mp.weixin.qq.com/s/JOS-4FGYAL7ydUfhJDH6uQ [20].https://colab.research.google.com/drive/15vNZb6AsU7byjYoaEtXuNu567JWNzXOz [21].https://blog.csdn.net/qq_42018521/article/details/128777853 [22].https://github.com/jina-ai/node-DeepResearch/blob/main/src/tools/jina-latechunk.ts [23].https://jina.ai/zh-CN/news/snippet-selection-and-url-ranking-in-deepsearch-deepresearch/ [24].https://mp.weixin.qq.com/s/qhpzEjzg4zCA41EWk9K7Gw [25].https://refly.ai/share/code/cod-zht713g7qo230gkrba40omhm [26].https://mp.weixin.qq.com/s/N-oPDmkb3EKqB2IM_reO1A [27].https://mp.weixin.qq.com/s/Bhxv3OyYkCuGO6gTyrKI5g [28].https://github.com/huggingface/smolagents [29].https://arxiv.org/pdf/2312.04474 [30].https://arxiv.org/abs/2503.20201 [31].https://github.com/knownsec/aipyapp [32].https://mp.weixin.qq.com/s/oX9zAK0McpSOiPZm_tjnzw [33].https://arxiv.org/pdf/2401.08967 [34].https://arxiv.org/pdf/2503.19470 [35].https://arxiv.org/pdf/2503.09516 [36].https://zhuanlan.zhihu.com/p/31606277904 [37].https://arxiv.org/abs/2503.00223 [38].https://zhuanlan.zhihu.com/p/1896865601495999275 [39].https://mp.weixin.qq.com/s/mnMTlhbIk2Ncgd1n10XrNg [40].https://mp.weixin.qq.com/s/2D_NavaqxYd45aN3ZxX_Jw [41].https://mp.weixin.qq.com/s/t2cBqCSssRGhGUhrT56uOQ [42].https://mp.weixin.qq.com/s/fg9EbOfDVrpbAflxJORMvQ [43].https://zhuanlan.zhihu.com/p/1894165477963571214 [44].https://mp.weixin.qq.com/s/2zlrVmiXHJ6bv12YLD68FA [45].https://github.com/sunnynexus/Search-o1 [46].https://vintagedata.org/blog/posts/model-is-the-product [47].https://langchain-ai.github.io/langgraph/tutorials/multi_agent/agent_supervisor/ [48].https://github.com/langchain-ai/langgraph-supervisor-py [49].https://mp.weixin.qq.com/s/OwlfEdqvmfX9fOnSKhsr1w [50].https://mp.weixin.qq.com/s/9nrIhqs5JHkAlgWkDFlYrQ [51].https://mp.weixin.qq.com/s/h8HJsfU1CErgJHJwzRpqIw [52].https://mp.weixin.qq.com/s/Ho3gGGRuAZpt9_zg2vrFwg [53].https://zhuanlan.zhihu.com/p/1898295379990132543 [54].https://github.com/jurnea/LangGraph-Chinese/blob/master/QuickStart.md [55].https://github.com/langchain-ai/langgraph-supervisor-py [56].https://github.com/langchain-ai/langchain-mcp-adapters [57].https://github.com/lpetralli/mcp-supervisor [58].https://www.cnblogs.com/wh4am1/p/18850821 [59].https://mp.weixin.qq.com/s/dkxy833x04857IajYElWeA [60].https://github.com/philschmid/gemini-samples/blob/main/scripts/gemini-mcp-agent [61].https://github.com/smithery-ai/reference-servers/tree/main/src/sequentialthinking [62].https://crab.camel-ai.org/ [63].https://mp.weixin.qq.com/s/CQTFgXoGLbGUaqbG0FtHXg [64].https://mp.weixin.qq.com/s/eFMC-8le3VyK6FHw3TsTQQ
原文始发于微信公众号(小陈的Life):剖析DeepResearch及在Vuln Report上的实践
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论