DeepResearch的第一次实战

本次我们看下最近比较火的框架,DeepResearch,在这个框架之中

目的是让大模型更加贴近人一样去搜索并整理回复给客户。

首先我们说下什么是DeepResearch

其是一个自主的Agent框架,核心逻辑就是收集需求,自主性的迭代信息,反思,并最终汇总输出。

可以分为三个步骤,收集需求

收集信息

最后完成报告

对于这三个阶段的,更加细粒度的划分为

  1. 收集需求

针对用户的输入,首先是判断用户是否会追加问题,进行多轮对话后,判断完成完整的用户问题收集后汇总进行下一步。

  1. 收集信息

开始进行迭代,基于目前这一轮的需求,和已经存在的信息,进行汇总后生成新问题,查询后进行保存在已有信息之中,最终完成所有信息的搜索并返回。

  1. 最后考虑输出报告

这一部分是基于已有信息,一方面可以直接输出报告,另一方面可以考虑先输出当前的信息给用户,用户确认完成之后,按照章节进行报告输出,最终进行完成。

这里我们就考虑进行DeepResearch的集成

这里使用Dify框架进行,

在Dify的官方建议工作流之中,

选择这个DeepResearch进行集成

而在这个DeepResearch工作流之中,我们可以依次看下不同节点的实现

首先是开始节点

用户输入一个搜索问题,并且给出对应的深度

理论上这个节点可以模仿我们上面说的,在这里和用户进行多轮对话,从而实现深度且完整的用户问题搜集。

之后进入第二部,也就是迭代进行深度搜索,获得用户搜索的结果

首先是一个LLM

在第一个节点,LLM之中,我们看下系统提示词。

您是一个研究代理,负责调查以下主题。

您发现了什么?还有哪些问题尚未解答?下一步应该调查哪些具体方面?

## 输出

– 请不要输出与已搜索主题完全相同的主题

– 如果需要进一步搜索信息,请设置nextSearchTopic

– 如果已获得足够信息,请将shouldContinue设置为false

– 请以json格式输出

“`json

nextSearchTopic: str | None

shouldContinue: bool

“`

其次是在User之中,声明一方面获取到user的input。以及将之前迭代轮数之中的findings和topics一并进行了传入。

总结这一步骤,在这一步骤之中,我们将信息进行输入,之后要求大模型以JSON的方式进行输出。

之后第二步通过Dify提供的变量提取器,获取到JSON格式的输出。

将提取出来的结果放入到全局变量之中。

并通过一个默认的IF/ELSE

判断是否进行搜索还是进行聚合

如果需要进行搜索的话,那么就进行调用相关的搜索引擎,这里采用TAVILY SEARCH作为实现。

并且将结果存入到findings全局变量数组之中。

之后进行判断是否大于了递归深度。

之后为了提高用户体验将findings之中的数据进行了输出展示。

最后在完成递归或者判断不需要继续之后,进行相关的报告输出。

这里并没有选择我们上图中展示的一个通过和用户多轮迭代,修改并输出的方式

也没有考虑采用报告章节式的分章节导出。

而是直接采用直接输出的方式,详情如下

提示词之中,说明以Markdown方式输出文档

并且将用户输入以及findings发现的内容一并输出了出来。

那么这就是一个最简单版本的DeepResearch。

除了Dify之外,还有一些框架可以生成DeepResearch

诸如:

huggingface-deepsearch:https://huggingface.co/blog/open-deep-research

node-deepsearch:https://github.com/jina-ai/node-DeepResearch

zilliz-deepsearch:https://github.com/zilliztech/deep-searcher

langchain deepsearch:https://github.com/langchain-ai/open_deep_research

deepsearch-shandu: https://github.com/astordu/shandu

在这里,个人觉着可以主要关注 langchain和dify 以及 huggingface的DeepResearch框架。