手把手教你用 Dify 搭建“一键生成调研报告”工作流
手把手教你用 Dify 搭建“一键生成调研报告”工作流
——输入一个主题,自动搜索、抓取、让 AI 写报告
不用写复杂代码,全是拖拽和填配置。跟着这篇做,你也能搭出来。
一、准备工作:先搞定三个服务的 API Key
Dify 工作流需要调用三个外部服务:大模型、搜索、网页抓取。提前注册好拿到 Key,后面才不会卡住。
1. 大模型 —— 我用的是 DeepSeek
去 DeepSeek 官网 注册,在「API Keys」里生成一个 Key,复制下来。
然后在 Dify 里:设置 → 模型供应商 → OpenAI-API-compatible,填上 Key,模型名写 deepseek-chat。
如果后面测试总超时,可以把模型换成 Dify 内置的
gpt-4o-mini(需要绑一张信用卡,但非常稳,花钱极少)。
2. 搜索工具 —— Google Search(底层是 SerpAPI)
Dify 自带的 Google Search 工具实际上调用的是 SerpAPI 的服务。
- 去 SerpAPI 官网 注册,免费版每月 100 次搜索,够测试用。
- 登录后拿到你的 API Key。
- 在 Dify 里点「工具」→ 搜索
google→ 选择 Google Search 工具 → 添加,然后填入 API Key。
3. 网页抓取工具 —— Firecrawl
去 Firecrawl 官网 注册,拿到 API Key。
在 Dify 工具里搜索 firecrawl 并添加,API URL 填 https://api.firecrawl.dev,再填上 Key。
Firecrawl 抓取网页时,记得把「等待时间」设成
5000毫秒(5 秒),不然页面还没加载完,抓到的全是导航栏。
二、开始搭建工作流
新建一个 Workflow,按顺序往下拖节点。
节点1:开始节点(Start)
这个是默认就有的,不用拖。
我们定义一个输入变量,名字叫 target,类型选「文本」。
运行时会弹出一个输入框,用户填什么主题,后面就按这个主题去搜索和写报告。
节点2:搜索节点(Google Search)
从左侧「工具」里拖一个 Google Search 节点到画布。
- 如果之前没授权,节点上会有「去授权」按钮,点一下把第一步拿到的 SerpAPI Key 填进去。
- 在节点的「输入」框里,按
/键唤起变量菜单,选择target。 - 点击「运行测试」,输入一个主题比如「中美AI发展现状」,应该能看到返回的搜索结果(标题、链接、摘要片段)。
这一步成功,说明你的 Google 搜索 Key 没问题。
节点3:代码执行节点 —— 提取链接列表
搜索节点返回的数据结构比较深,有用的结果藏在 json[0]['organic_results'] 里。
我们需要用一段极简的 Python 代码把这层数据「提」出来。
拖一个「代码执行」节点(Code),语言选 Python3,写入:
def main(json: list) -> dict:
return { "result": json[0]['organic_results'] }
- 输入变量:
json选上一个 Google Search 节点的json输出。 - 输出变量名写
result,类型一定要选 Array[Object]。
点击测试,你会看到输出是一个数组,里面每个对象都有 link、title、snippet。
这一步就是把我们后续要用的链接单独拿出来了。
节点4:迭代节点 —— 循环处理每一个链接
现在我们有大约 10 个链接,要对每个链接单独做「抓取网页 → AI 提炼摘要」。
这就要用到 迭代节点(相当于编程里的 for 循环)。
拖一个「迭代」节点(Iteration),输入数组选上一步代码节点的 result。
迭代节点下面会出现一个「循环体」区域,我们要在里面放两个节点。
4.1 在循环体里放「网页抓取」节点(Firecrawl)
拖一个 Firecrawl 节点到循环体内。
- 要抓取的 URL:点击输入框,按
/键,选择item.link(item代表当前循环里的单个搜索结果)。 - 「等待时间(毫秒)」填
5000(重要!否则抓不到正文)。 - 输出变量里,我们主要用到
text(抓到的网页纯文本内容)。
4.2 再放大模型节点 —— 让 AI 提炼摘要
拖一个大模型节点到循环体内,跟在 Firecrawl 节点后面。
- 模型选择:如果 DeepSeek 容易超时,就换成 Dify 内置的
gpt-4o-mini。 - 系统提示词:
只输出用户需要的内容,不要添加额外说明。 - 用户提示词:
其中基于以下文本总结与 {{target}} 相关的核心内容,如果与 {{target}} 无关则输出空字符串。{{target}}选开始节点的target,「文本」选 Firecrawl 输出的text。
测试迭代节点:可以先只跑一个链接,看看大模型能不能输出一段 100~200 字的摘要。
节点5:参数提取节点 —— 自动生成报告大纲
迭代完所有链接后,你手里有 10 段摘要(可能有的为空)。
接下来需要一个「报告大纲」,比如:引言、产业概述、专利对比、政策建议、结论等。
拖一个「参数提取」节点(Parameter Extractor)。
- 模型任选一个(建议用
gpt-4o-mini)。 - 在「提取参数」里添加一个字段:
- 名称:
subtitles - 类型:
Array[string] - 描述:
报告大纲的一级标题数组
- 名称:
- 提示词:
输入变量暂时留空(后面再连)。根据上述资料,提取一份关于 {{target}} 的综述大纲的一级标题,放在 subtitles 数组中。
节点6:合并所有摘要(代码执行节点)
参数提取节点需要一个「所有摘要合并后的长文本」作为输入。
所以我们要先把迭代节点输出的 10 段摘要拼成一个字符串。
拖一个「代码执行」节点,写:
def main(arg1: list) -> dict:
result = ""
for i in arg1:
result += i
return { "result": result }
- 输入变量
arg1选 第一个迭代节点 的输出(这个输出是一个列表,每个元素是一段摘要)。 - 输出变量
result就是合并后的长文本。
然后把 参数提取节点 的输入变量改成这个代码节点的 result。
测试参数提取节点,你应该会得到一个数组,例如:["引言","中美人工智能产业概述","专利与技术创新比较","政策环境与治理挑战","结论"]
节点7:第二个迭代节点 —— 按大纲章节写内容
有了大纲数组,我们就可以遍历每个章节标题,让 AI 写出该章节的具体内容。
拖第二个「迭代」节点,输入数组选参数提取节点的 subtitles。
循环体里再放一个大模型节点。
- 用户提示词:
其中:根据参考资料 {{all_summaries}},完成章节 {{item}} 的内容撰写,要求详细、有数据支撑。{{all_summaries}}选刚才合并摘要的代码节点的result{{item}}是当前循环的章节标题
测试一下:让这个迭代节点先跑一个章节(比如「引言」),看看能不能写出几百字的段落。
节点8:合并所有章节内容(又一个代码执行节点)
第二个迭代跑完后,输出是一个数组,每个元素是一个章节的内容。
我们需要把它们拼成一份完整的报告。
拖一个「代码执行」节点,用和节点6完全一样的代码:
def main(arg1: list) -> dict:
result = ""
for i in arg1:
result += i
return { "result": result }
输入变量选第二个迭代节点的输出,输出变量 result 就是完整的报告文本。
节点9:结束节点(End)
拖一个「结束」节点,输出变量选上一个代码执行节点的 result。
运行后,在 Dify 的右侧面板里就能看到生成的完整调研报告。你可以直接复制出来用。
三、常见踩坑点和解决办法
坑1:大模型一直超时
Dify 免费版服务器在国外,调用 DeepSeek 经常超时。
解决:在大模型节点里把模型换成 Dify 内置的 gpt-4o-mini。虽然要绑信用卡,但费用极低,一个工作流跑下来可能不到 1 毛钱。
坑2:Firecrawl 只抓到导航栏,没有正文
默认等待时间为 0 毫秒,页面还没加载完就抓了。
解决:在 Firecrawl 节点里把「等待时间」改成 5000 毫秒。
坑3:参数提取节点返回的数组是空的
检查两点:
- 输入文本(合并后的摘要)不是空的。
- 提示词写清楚「放在 subtitles 数组中」,并且类型写对了
Array[string]。
坑4:迭代节点报错「输入不是数组」
检查:上一个代码执行节点的输出变量类型是否选成了 Array[Object],并且返回的确实是 Python 列表。
四、最终效果
全部配置好后,你只需要:
- 在开始节点输入一个主题(比如「新能源汽车行业现状」)
- 点击运行
- 等 2~5 分钟
Dify 会自动完成:
- Google 搜索 → 抓取 10 个网页 → AI 提炼每个网页摘要
- 自动生成报告大纲 → 按大纲逐章写作 → 合并成完整报告
- 在右侧面板显示出来,你可以直接复制或保存。
五、写在最后
作为 Python 小白,我第一次跑通这个工作流的时候,还是挺有成就感的。
可视化工作流的好处就是,你不用从头写几百行代码,只要理解「数据怎么从一个节点流到另一个节点」,就能搭建出很实用的自动化工具。
如果你照着这篇博客做,卡在了某一步,记得检查:
- API Key 有没有填错
- 等待时间有没有设够
- 大模型节点里的提示词是不是抄对了
祝你一次运行成功。
更多推荐
所有评论(0)