1. 为什么你需要Dify工作流?
如果你尝试过直接用大模型API或者一些简单的AI工具来构建应用,大概率会遇到一个头疼的问题:当任务稍微复杂一点,比如需要先查资料、再分析、最后生成报告时,一个简单的提示词就显得力不从心了。要么模型“跑偏”,要么输出结果七零八落,调试起来更是让人抓狂。
这就像让你一口气盖一栋大楼,而不是先打地基、再砌墙、最后封顶。Dify工作流(Workflow)和对话流(Chatflow)就是来解决这个问题的。它们把复杂的AI任务,像搭积木一样,拆解成一个个清晰、独立的小步骤(我们称之为“节点”)。你只需要把这些节点按逻辑连起来,一个稳定、可控的AI应用流程就搭建好了。
我刚开始接触时也觉得这概念有点抽象,但上手后发现,这简直是AI应用开发的“降维打击”。以前需要写一堆代码、处理各种异常的逻辑,现在拖拖拽拽就能搞定。无论是想做一个能理解上下文、还能查知识库的智能客服,还是想自动化处理每天的数据报表,工作流都能让你用更直观的方式实现。
2. 核心概念:Chatflow与Workflow,到底选哪个?
这是新手最容易困惑的地方。Dify提供了两种主要的工作流类型,它们看着像,但内核和适用场景完全不同。选错了,轻则效率低下,重则整个应用逻辑跑不通。
2.1 Chatflow:你的智能对话管家
想象一下你正在和一个贴心的助手聊天。你问:“附近有什么好吃的川菜馆?”助手推荐了几家。你接着问:“哪家有包间?”助手能记住你刚才在问川菜馆,并在此基础上筛选出有包间的。这就是Chatflow的核心。
Chatflow是为多轮、有状态的对话场景而生的。 它的设计目标是模拟人与人之间的自然交流。
核心特性:
- 对话记忆(Memory):这是它的灵魂。系统内置了
sys.conversation_id和sys.query等变量,能自动关联同一会话中的所有历史消息。这意味着你的AI能记住之前聊过什么,实现真正的上下文理解。 - 流式输出:回答不是一次性蹦出来的,而是像打字一样逐步显示。这在生成长文本(如方案、故事)时体验极佳,用户可以中途打断或调整。
- 专用节点:它配备了问题分类、意图识别、追问引导和Answer(回答) 节点。特别是Answer节点,专门用于向用户流式输出最终答案,是Chatflow流程的终点。
适合什么场景?
- 智能客服:用户问题可能涉及多个步骤,需要结合历史对话和知识库来回答。
- 教育问诊:需要多轮问答来逐步明确用户的问题细节。
- 创意协作:比如和AI一起写文章,你先给大纲,它写一段,你提意见,它再修改。
我踩过的坑:曾经有个朋友想用Workflow做客服,结果用户每次追问,机器人都像失忆了一样,需要用户重复描述问题,体验非常糟糕。这就是用错了工具。
2.2 Workflow:你的自动化任务执行引擎
再想象另一个场景:你每天上午9点,需要把销售系统里昨天的订单数据导出来,分析一遍,生成一个带图表的PDF报告,然后邮件发给团队。这个过程是固定的、一次性的、不需要中途和你聊天的。这就是Workflow的舞台。
Workflow是为自动化、批处理、单次执行的任务设计的。 它的核心是“执行”,而不是“对话”。
核心特性:
- 无状态执行:每次运行都是独立的,不保留上一次运行的历史。输入必须一次性给全。
- 强大的逻辑控制:提供了代码节点(可以直接写Python/JavaScript处理复杂逻辑)、IF/ELSE节点(条件分支)、迭代节点(循环处理列表,比如批量翻译100篇文章)、变量聚合器等。
- 多种触发方式:除了手动触发,未来还将支持定时触发(如每天凌晨2点运行)和事件触发(如收到一封特定邮件时自动启动)。
- 明确的终点:流程必须由一个 End(结束) 节点来终止,输出结果。
适合什么场景?
- 数据清洗与报表生成:定时从数据库拉取数据,清洗、分析、生成图表和报告。
- 内容批量处理:一次性将100篇中文新闻稿翻译成英文。
- 邮件自动化:当CRM系统有新客户录入时,自动生成并发送一封个性化的欢迎邮件。
- API串联:调用A接口获取数据,处理后,再调用B接口提交结果。
快速决策指南: 当你纠结选哪个时,问自己四个问题:
- 任务需要用户多次输入、来回调整吗?(是 -> Chatflow)
- 结果需要分步骤、实时展示给用户看吗?(是 -> Chatflow)
- 处理过程需要依赖之前的对话历史吗?(是 -> Chatflow)
- 任务是定时、批量、或由事件自动触发的吗?(是 -> Workflow)
如果前三个问题有两个以上回答“是”,果断用Chatflow。如果第四个问题回答“是”,或者任务输入一次性完成、输出也是个最终成品,就用Workflow。
3. 从零搭建:你的第一个智能客服(Chatflow实战)
光说不练假把式,我们直接动手,用一个最经典的场景——智能客服,来走通一个完整的Chatflow。这个客服能做到:理解用户问题 -> 检索知识库 -> 结合对话历史生成友好回答。
3.1 环境准备与创建流程
首先,你需要一个Dify账号。可以去Dify官方云平台(cloud.dify.ai)直接注册使用,也可以在自己的服务器上部署社区版。这里我们以云平台为例。
登录后,点击“创建新应用”,在应用类型里,毫不犹豫地选择 “对话流(Chatflow)”。给它起个名字,比如“我的第一个智能客服”。
创建成功后,你会进入一个空白的画布,中间已经有一个 “开始” 节点了。这个节点就是用户对话的入口。
3.2 核心节点配置详解
一个基础的智能客服流程,通常包含以下几个关键节点,我们来一个个配置:
-
开始节点:
- 点击“开始”节点,右侧会展开配置面板。
- 除了系统自带的
sys.query(用户问题)和sys.conversation_id(会话ID),我们暂时不需要额外添加变量。这些内置变量会自动传递下去。
-
问题分类/意图识别节点(可选但推荐):
- 在画布空白处右键,选择“添加节点” -> “分类”或“LLM”。
- 我更喜欢用LLM节点来做意图识别,更灵活。拖一个LLM节点出来,用线把它连接到“开始”节点。
- 配置这个LLM节点:
- 模型:选一个速度快、成本低的模型,比如
gpt-3.5-turbo就行,这个节点不需要太强的创造力。 - 系统提示词(System Prompt):这里写清楚任务。例如:
你是一个意图分类器。请根据用户输入,判断其属于以下哪一类: 1. 产品功能咨询 2. 价格与套餐咨询 3. 技术支持与故障排查 4. 账户与账单问题 5. 其他通用问题 请只输出类别编号(1-5)。 - 用户提示词(User Prompt):填入
{{#start.query#}}(这是引用开始节点的用户输入变量)。 - 关闭“记忆”功能:这个节点不需要历史对话。
- 模型:选一个速度快、成本低的模型,比如
- 这个节点的输出(比如
分类结果 / text)就是一个数字,代表了用户意图。我们后面可以用它来走不同的处理分支。
-
知识库检索节点:
- 添加一个“知识库”节点,连接到意图识别节点之后。
- 前提:你需要在Dify中先创建并上传好你的客服知识文档(产品手册、FAQ等)。
- 配置:在节点中选择你创建好的知识库。设置检索模式(如“向量检索”)、返回条数(通常3-5条)。
- 输入查询文本:这里不能直接再用
{{#start.query#}},因为经过意图识别后,我们可能希望对查询进行优化。一个更好的做法是:用另一个LLM节点,根据分类结果重写查询词。例如,如果用户问“这个软件卡死了怎么办?”,经过分类是“技术支持”,我们可以让LLM将查询重写为更具体的“软件[产品名] 卡顿 崩溃 解决方案”,再传给知识库检索,效果更好。
-
LLM生成答案节点:
- 这是核心。添加一个LLM节点,连接知识库节点。
- 开启“记忆”功能:务必勾选!这样模型才能看到整个对话历史。
- 系统提示词:这里定义客服的角色和回答风格。
你是一个专业、友好、耐心的客服助手。请严格根据提供的知识库内容来回答用户问题。 如果知识库中有明确答案,请用清晰、易懂的语言组织回答。 如果知识库中没有相关信息,请如实告知用户“暂时没有找到相关信息”,并建议其通过其他渠道(如电话)联系人工客服。 回答时请保持热情、积极的语气。 - 用户提示词:这里要组装上下文。一个经典的模板是:
(注意:变量名需要根据你实际节点的输出变量名调整,比如知识库节点的输出变量可能是历史对话: {{#context.memory#}} 当前用户问题: {{#start.query#}} 根据以下知识库内容回答问题: {{#知识库检索节点.内容#}}retriever.retrieved_content)
-
Answer(回答)节点:
- 这是Chatflow的终点,必须要有。添加一个“Answer”节点,连接到LLM生成答案节点。
- 配置:非常简单,在“回答内容”中,引用上一个LLM节点的输出即可,例如
{{#LLM生成答案.text#}}。 - 这个节点负责将最终答案流式地输出给聊天界面。
3.3 调试、预览与发布
搭建好流程后,千万别急着发布。点击右上角的 “调试与预览” 按钮。
- 输入测试:在右侧弹出的聊天窗里,输入各种问题测试,比如“你们的产品有什么功能?”、“我怎么付费?”。
- 查看节点运行:在调试面板,你可以看到流程经过的每一个节点,点击节点可以展开查看其输入和输出。这是排查问题的神器!如果答案不对,你可以清晰地看到是知识库没检索到相关内容,还是LLM理解错了。
- 迭代优化:根据测试结果,回去调整提示词、优化知识库、甚至调整流程逻辑(比如增加一个“当知识库检索为空时,直接调用网络搜索工具”的分支)。
调试满意后,点击右上角的 “发布”。只有发布后,你的智能客服才能被真正的用户访问,或者通过API集成到你的网站、APP里。
4. 进阶实战:构建自动化日报生成系统(Workflow实战)
聊完了交互式的Chatflow,我们再来搞点“后台自动化”的。假设你是运营,每天需要看前一天的销售数据,并生成一份摘要。我们用一个Workflow来自动完成:获取数据 -> 分析 -> 生成报告 -> 发送到钉钉/飞书群。
4.1 设计流程与选择触发器
这个任务的特点很符合Workflow:输入(日期范围)固定,处理过程无需交互,输出一个最终报告。
- 创建Workflow:新建应用时,选择“工作流(Workflow)”。
- 开始节点配置:在开始节点,我们定义输入变量。比如添加一个“日期”变量,类型为“文本”,并设置默认值为“昨天”的动态值(Dify支持
{{date}}等函数)。再添加一个“接收人”变量,用于指定报告发送给谁。 - 触发器选择:目前我们可以手动触发测试。未来理想状态是配置定时触发,比如每天上午9点自动运行。
4.2 关键逻辑节点应用
Workflow的强大,在于其丰富的逻辑节点。
-
代码节点(获取数据):
- 添加一个“代码”节点。这里我们可以写Python脚本。
- 假设你的销售数据在某个数据库里。你可以在这个节点里,使用
requests库调用公司内部的数据查询API,或者用pandas连接数据库执行SQL。 - 代码执行后,将查询结果(比如一个DataFrame的JSON字符串,或一个字典)赋值给一个输出变量,比如
data_result。 - 小贴士:代码节点运行在Dify的沙箱环境里,如果需要安装第三方库(如
pandas,sqlalchemy),需要在部署Dify时配置好沙箱的依赖。
-
LLM节点(数据分析与报告撰写):
- 添加一个LLM节点,连接代码节点。
- 系统提示词:
你是一个资深数据分析师,请根据提供的销售数据,生成一份简洁的日报摘要。重点包括:销售额趋势、热门商品、异常波动(如果有)。 - 用户提示词:
以下是{{#开始.日期#}}的销售数据:{{#代码节点.data_result#}}。请生成报告。 - 这个节点会输出一段文本格式的报告。
-
模板转换节点(格式化报告):
- 为了让报告更美观,我们可以用“模板转换”节点来格式化。
- 在模板中,我们可以使用Markdown语法:
# {{#开始.日期#}} 销售日报 **生成时间:** {{current_time}} **数据概览:** {{#LLM节点.report_text#}} --- *本报告由自动化系统生成* - 这个节点输出一个格式优美的报告文本。
-
HTTP请求节点(发送到协作工具):
- 添加一个“HTTP请求”节点。
- 方法:POST
- URL:填入钉钉或飞书机器人的Webhook地址。
- Headers:
Content-Type: application/json - Body:根据钉钉/飞书的消息格式组装JSON。例如飞书:
{ "msg_type": "text", "content": { "text": "{{#模板转换节点.formatted_report#}}" } } - 这样,报告就能自动发送到群聊了。
-
End(结束)节点:
- 最后,务必添加一个“End”节点,连接HTTP请求节点(或任何你认为是流程终点的地方)。Workflow必须以此节点结束。
4.3 错误处理与优化
自动化流程最怕出错无人知。我们需要增加一些健壮性设计。
- 条件分支(IF/ELSE):在代码节点后,可以加一个IF/ELSE节点,判断
data_result是否为空或出错。如果出错,走另一个分支,调用HTTP请求节点发送告警消息给管理员。 - 重试机制:对于调用外部API的节点(如HTTP请求),可以在节点高级设置中配置重试次数和重试间隔。
- 日志与监控:发布后,在应用的“日志与标注”页面,可以查看每一次工作流运行的详细记录,包括每个节点的输入输出,便于后期排查。
5. 高手技巧:让工作流更强大、更智能
当你熟悉了基础操作,下面这些技巧能让你的工作流如虎添翼。
5.1 利用“变量”串联复杂逻辑
变量是工作流的血液。除了每个节点自带的输入输出变量,你还可以主动创建和使用变量。
- 会话变量:在Chatflow中特别有用。比如,用户在第一轮对话中说“我叫张三”,你可以用一个“变量分配器”节点,将“用户姓名=张三”存入一个会话变量。在后续所有节点中,都可以用
{{session.用户姓名}}来引用,实现个性化对话。 - 变量聚合器:这是Workflow 0.13.0之后的神器。它可以从前面多个节点的输出中,提取、组合你需要的数据,形成一个新的结构化变量,喂给后面的节点。比如,从A节点取“销售额”,从B节点取“客户数”,聚合成一个“核心指标”变量。
5.2 迭代节点处理批量任务
这是Workflow处理批量数据的核心。假设你需要翻译一个包含100条产品描述的列表。
- 在开始节点,定义一个“产品描述列表”的变量(类型选“段落”或通过代码节点生成一个数组)。
- 添加一个“迭代”节点,连接到这个列表变量。
- 在迭代节点的循环体内,放置你的翻译子流程(比如一个LLM节点,提示词是“将以下中文翻译成英文:{{#current_item#}}”)。
- 迭代节点会自动遍历列表的每一项,执行循环体内的流程,并将所有结果汇总成一个新的数组输出。
- 最后再用一个LLM节点或模板节点,将这个翻译后的数组整理成最终格式。
效率对比:如果用Chatflow人工一条条处理,100条数据会让你点到手抽筋。而Workflow的迭代节点,可能一杯咖啡的时间就全搞定了。
5.3 将工作流发布为“工具”,实现模块化复用
这是Dify一个非常强大的特性。你可以把一个调试好的、功能独立的工作流(比如“生成周报摘要”)发布为一个“工具”。
发布后,这个工具会出现在你的“工具”列表中。之后,你在构建新的、更复杂的工作流或Agent时,就可以像调用一个普通函数一样,直接插入这个“工具节点”,传入参数,获取结果。
这极大地促进了代码(流程)的复用。你可以像搭乐高一样,用一个个封装好的工具工作流,快速组装出超级复杂的应用。比如,一个智能销售助手Agent,可以依次调用“客户画像分析工具”、“产品推荐工具”、“生成跟进话术工具”。
5.4 提示词工程的最佳实践
在工作流中,提示词被分散到了各个LLM节点,编写起来更有针对性,但也需要一些技巧:
- 角色扮演要清晰:在每个LLM节点的系统提示词中,明确它的角色。“你是一个严谨的数据分析师”和“你是一个幽默的客服”,输出的风格天差地别。
- 上下文注入要精准:通过变量
{{#前驱节点.输出变量名#}}精确地将上游信息传递给下游。避免一股脑把所有信息都塞进一个提示词。 - 善用“知识库”节点:对于需要基于固定资料回答的场景,一定要用知识库节点做检索增强生成(RAG),而不是指望模型的内部知识。这能极大提高答案的准确性和可控性。
- 为复杂任务设计“思维链”:对于推理任务,可以在提示词中要求模型“逐步思考”。例如:“首先,分析用户的核心诉求;其次,从知识库中找到相关依据;最后,组织语言进行回答。” 这能提升模型输出的逻辑性。
从我自己的经验来看,Dify工作流最大的价值在于它将AI应用的构建从“炼丹艺术”变成了“系统工程”。你不再需要去赌一个超级提示词能否成功,而是通过设计可靠的流程,让每个环节各司其职,最终稳定地产出高质量结果。无论是想快速验证一个AI点子,还是构建一个投入生产环境的复杂系统,它都是一个值得你深入研究的利器。
2342



被折叠的 条评论
为什么被折叠?



