返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

Dify 开源DeepResearch工作流实现本地和Web混合搜索并探索工作流图的正确解析方法(一)

[复制链接]
链载Ai 显示全部楼层 发表于 2 小时前 |阅读模式 打印 上一主题 下一主题

往期文章回顾:
dify内置DeepResearch工作流溯源——来看看Dify官方博客对它的介绍" data-itemshowtype="0" target="_blank" linktype="text" data-linktype="2">Dify内置DeepResearch工作流溯源——来看看Dify官方博客对它的介绍
Dify内置DeepResearch深度体验,抽丝剥茧带大家瞧瞧它的真实水准
Dify 实现DeepResearch工作流拆解并再看升级版Dify能否搭建出Manus?
深度解析:Dify能否复刻Deep Research与Manus?三大工具深度对比
普通打工人变身研究员还有多远?——2025年AI深度研究工具生死竞速,谁将主宰你的未来?


ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;padding: 0.3em 1.2em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);border-radius: 8px 24px;box-shadow: rgba(0, 0, 0, 0.06) 0px 2px 6px;">1、Open-Deep-Research-workflow-on-Dify简介

在之前的文章中,我介绍了Dify内置DeepResearch工作流,深入剖析了它的构成并体验了它的运行效果。发现不足还是挺多的,比如信源配置单一,只有Tavily一种信源输入,最头痛的是不能检索和使用本地文献进行研究。今天,带大家看看另一个开源实现(Open-Deep-Research-workflow-on-Dify),它正好解决了本地信源导入问题。

项目链接:https://github.com/AdamPlatin123

这个工作流是对DeepResearch进行了复现,但是没有介绍参考了哪个项目。从作者github首页看到follow了一个DeepResearch开源项目——open-deep-research,是参照这个了吗?

不妨打开这个项目看下:

翻看主页,原来是Firecrawl的创始人搞的。其实我在两周前已经在本地部署Firecrawl了,还没来得及集成,没想到它真的可以用到DeepResearch里面,看来我之前的判断还是没错的。
但是open-deep-research并没有搜索本地资源功能,另外从它的demo视频(https://x.com/nickscamara_/status/1886459999905521912)来看,它的流程和工作流Open-Deep-Research-workflow-on-Dify也是不一致的。今天暂时就不深入探索这个项目(open-deep-research)了,这次集中讲讲这个工作流的具体实现。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;padding: 0.3em 1.2em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);border-radius: 8px 24px;box-shadow: rgba(0, 0, 0, 0.06) 0px 2px 6px;">2、工作流解析成Mermaid代码

Open-Deep-Research-workflow-on-Dify工作流如上。像这种工作流图,看起来还是很让人头痛的,因为用户拖拉拽随意性比较高,另外工作流还进行了折叠,当然用“整理节点”调整后可读性会提高一些,但是作者设置的标注信息会混乱,同时画布是横向布置,超出屏幕显示范围,很难轻易读懂。
我们还有什么方法可以得到更加友好、一看就懂的工作流图呢?

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;padding-left: 12px;color: rgb(63, 63, 63);border-radius: 6px;background: color-mix(in srgb, rgb(15, 76, 129) 8%, transparent);">2.1、采用大模型对直接对配置文件进行解析

之前尝试过让大模型(DeepSeek-V3-0324)直接从工作流配置文件整理出mermaid图形代码,这次我也试了,得到的效果如下:
我们把它和下面这个图的部分截图对照可以发现,大模型整理的工作流图是不完全准确的,它把工作流中部重要的串行结构错误识别为并行结构。
那么,为啥会出现这么大的偏差呢?
个人认为原因,主要原因有:
(1)工作流配置文件太大了,看下图,达到3401行,约9.7万字符,从这么多字符里面梳理出完整的图结构信息,难度可想而知。
(2)工作流配置文件中包含很多冗余字段,造成工作流图的节点关系很容易被混淆。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;padding-left: 12px;color: rgb(63, 63, 63);border-radius: 6px;background: color-mix(in srgb, rgb(15, 76, 129) 8%, transparent);">2.2、采用代码对配置文件进行解析

为了解决以上问题,暂时能想到的最好的方式就是用代码进行解析了。
直接上代码解析结果:
#DeepResearcherOnDify工作流图```mermaidgraphTDn1["开始start"]n2["sub主题1分析llm"]n3["问题4answer"]n4["条件分支if-else"]n5["问题2answer"]n6["问题分解llm"]n7["变量赋值assigner"]n8["问题参数提取parameter-extractor"]n9["第一次回复&问题1answer"]n10["上下文变量赋值assigner"]n11["问题变量赋值assigner"]n12["问题3answer"]n13["最终回复answer"]n14["上下文变量赋值assigner"]n15["上下文变量赋值assigner"]n16["上下文变量赋值assigner"]n17["输出:正在生成最终回答answer"]n18["sub主题提取llm"]n19["sub主题提取parameter-extractor"]n20["回答优化llm"]n21["回答优化llm"]n22["回答优化llm"]n23["回答优化llm"]n24["sub主题2分析llm"]n25["sub主题3分析llm"]n26["sub主题4分析llm"]n27["总结文档template-transform"]n28["变量赋值assigner"]n29["主题提取llm"]n30["回答记录1assigner"]n31["回答记录2assigner"]n32["回答记录3assigner"]n33["回答记录4assigner"]n34["输出:研究主题answer"]n35["输出:构建研究角度answer"]n36["输出:研究角度answer"]n37["迭代搜索1iteration"]n38["sub关键词提取1parameter-extractor"]n39["sub关键词提取2parameter-extractor"]n40["sub关键词提取3parameter-extractor"]n41["sub关键词提取4parameter-extractor"]n42["迭代搜索2iteration"]n43["迭代搜索3iteration"]n44["迭代搜索4iteration"]n45["起始段llm"]n46["结尾段llm"]n47["条件分支2if-else"]n48["条件分支3if-else"]n49["直接回复10answer"]n4-->|sys.dialogue_count=1|n5n4-->|sys.dialogue_count=0|n7n7-->n6n6-->n8n8-->n9n4-->|sys.dialogue_count=2|n12n4-->|sys.dialogue_count=3|n3n18-->n19n20-->n14n23-->n16n22-->n10n21-->n15n29-->n28n4-->|sys.dialogue_count=4|n17n4-->|sys.dialogue_count=4|n29n5-->n30n12-->n31n3-->n32n17-->n33n28-->n34n19-->n36n1-->n4n19-->n38n8-->n11n4-->|sys.dialogue_count=4|n21n4-->|sys.dialogue_count=4|n20n4-->|sys.dialogue_count=4|n23n2-->n24n26-->n46n24-->n25n46-->n27n37-->n42n42-->n43n38-->n39n40-->n41n39-->n37n41-->n37n19-->n40n43-->n44n25-->n26n27-->n47n47-->|17391136443240.te...|n13n44-->n45n45-->n2n10-->n48n48-->|conversation.quer...|n35n35-->n18n47-->|其他情况|n49n16-->n22```
结果和原工作流能完全对应上,并且采用竖向布局,一眼能看清全貌,对于人类这种严重依赖视觉进行记忆和理解的动物来说,相对dify的横向布局图,要容易理解多了,可以说,有了这个,几乎再也不用担心看不懂复杂的Dify工作流图了(到目前为止,这个工作流图几乎是我遇到过的最复杂的了)。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;padding-left: 12px;color: rgb(63, 63, 63);border-radius: 6px;background: color-mix(in srgb, rgb(15, 76, 129) 8%, transparent);">2.3、Mermaid工作流图对工作流自动优化的意义

相对于LangChain、MetaGPT等大模型和Agent编排框架来说,Dify工作流对于开发者来说是非常友好了,拖拉拽加很少的代码就能实现生产级的功能或应用。但是,作为一个Dify重度使用者,还是觉得工作流的搭建和维护非常繁琐,自己一直在思考,如何能够更近一步,实现动动嘴就能把工作流优化好或者甚至从零到一把它搭建出来。
可是,我们上面已经讲过,对于比较复杂的工作流,它的配置文件太大,冗余信息太多了,大模型难以一次性读懂读透澈。我看到有人也在尝试用Cursor对Dify工作流进行优化,但是实际效果却并不好。
那是不是暂时就没有比较简单又有效的办法来自动优化大型工作流呢?
我觉得还是有的:让大模型结合Mermaid工作流图和工作流配置文件一起,进行工作流优化或创建。
为啥这样能行得通呢?
首先,Mermaid图涵盖了工作流最关键信息,信息进行了充分压缩,少量字符就能表达很复杂的图形结构,结构信息非常明确,大模型容易透彻理解。
其次,修改或优化过的工作流配置,可以重新提取Mermaid图,并与原Mermaid(或大模型基于原Mermaid图进行优化后的Mermaid)进行对照、校核,极大提高优化结果准确性。
后续我会单独用一篇文章,结合实际例子来验证以上判断,暂时先不展开讲了。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;padding: 0.3em 1.2em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);border-radius: 8px 24px;box-shadow: rgba(0, 0, 0, 0.06) 0px 2px 6px;">3、工作流运行流程解析


ingFang SC", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", "Source Han Sans CN", sans-serif;font-optical-sizing: inherit;font-kerning: inherit;font-feature-settings: inherit;font-variation-settings: inherit;vertical-align: baseline;word-break: break-word;overflow-wrap: break-word;color: rgba(0, 0, 0, 0.9);letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(252, 252, 252);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">第一阶段【问题初始化】

ingFang SC", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", "Source Han Sans CN", sans-serif;font-optical-sizing: inherit;font-kerning: inherit;font-feature-settings: inherit;font-variation-settings: inherit;vertical-align: baseline;word-break: break-word;overflow-wrap: break-word;color: rgba(0, 0, 0, 0.9);letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(252, 252, 252);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">通过对话轮次判断(sys.dialogue_count),首次进入时由LLM分解用户问题,提取关键参数并生成首个回复。

通过sys.dialogue_count=0触发:变量赋值(n7)→问题分解LLM(n6)→参数提取(n8)→生成首问(n9)

ingFang SC", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", "Source Han Sans CN", sans-serif;font-optical-sizing: inherit;font-kerning: inherit;font-feature-settings: inherit;font-variation-settings: inherit;vertical-align: baseline;word-break: break-word;overflow-wrap: break-word;color: rgba(0, 0, 0, 0.9);letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(252, 252, 252);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">第二阶段【渐进式信息收集】

ingFang SC", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", "Source Han Sans CN", sans-serif;font-optical-sizing: inherit;font-kerning: inherit;font-feature-settings: inherit;font-variation-settings: inherit;vertical-align: baseline;word-break: break-word;overflow-wrap: break-word;color: rgba(0, 0, 0, 0.9);letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(252, 252, 252);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">分三轮对话(dialogue_count=1-3)依次处理预设问题,通过assigner节点记录每轮回答,构建研究基础数据。

分轮次处理:dialogue_count=1→问题2(n5)dialogue_count=2→问题3(n12)dialogue_count=3→问题4(n3)通过assigner节点(n30-n33)逐步记录回答

第三阶段【并行化内容精炼】

第4轮触发并行处理:Gemini模型提取核心主题,4个优化LLM同步精炼内容,输出研究方向和优化中间结果。

dialogue_count=4触发:主题提取LLM(n29)→输出研究主题(n34)4个优化LLM并行运作(n20-n23)→变量赋值节点(n10,n14-n16)存储中间结果

第四阶段【循环式知识拓展】

通过子主题分析LLM拆解4个维度,混合检索引擎(本地知识库+网络迭代搜索)获取细分领域数据

    起始段LLM(n45)启动sub主题分析链(n2→n24→n25→n26)每个sub主题触发3级迭代搜索(n37→n42→n43→n44网络搜索)结尾段LLM(n46)衔接文档总结(n27)

    第五阶段【条件化输出】

    整合所有分析结果,由起始段/结尾段LLM生成首尾内容,经template-transform模板引擎格式化,最终输出万字级Markdown研究报告。

    模板引擎(n27)根据搜索有效性分支:✅有效结果→生成最终报告(n13)❌无效结果→触发直接回复(n49)

    4、结语


    后面我会继续深入探索DifyDeepResearch,包括对它的补充、完善、优化,如扩充信源(本地文献、开源Firecrawl、百度和bing等)、工作流优化,以及Dify Agent相关功能,欢迎持续关注。

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
    • 官方手机版

    • 微信公众号

    • 商务合作

    • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
    • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ