学习 Dify 的工作流和对话流应用

在前面的文章中,我们学习了 Dify 的聊天助手、文本生成和 Agent 应用,这些应用虽然功能强大,但在处理一些复杂业务逻辑时仍有局限性。今天,我们将学习 Dify 的 工作流(Workflow)对话流(Chatflow) 应用,了解如何通过可视化编排构建更加复杂和灵活的 AI 应用。

工作流基本概念

工作流是 Dify 提供的一种可视化应用构建方式,它通过将复杂的任务分解成较小的步骤(节点)来降低系统复杂度,减少了对提示词技术和模型推理能力的依赖,提高了 LLM 应用面向复杂任务的性能,同时提升了系统的可解释性、稳定性和容错性。

Dify 将工作流分为两种类型,每种都有不同的适用场景:

  • Workflow(工作流):面向自动化和批处理情景,比如高质量翻译、数据分析、内容生成、电子邮件自动化等,它的交互特点是单次输入输出,无法进行多轮对话;
  • Chatflow(对话流):面向对话类情景,比如客户服务、语义搜索、需要多步逻辑的对话式应用,它的交互特点是支持多轮对话交互,可以调整生成结果;

Workflow 这个单词翻译成中文是工作流,但是在 Dify 的概念中,工作流指的是 Workflow 和 Chatflow 两种。不过我感觉这种分类容易让人混淆,所以我倾向于把 Workflow 就叫做工作流,Chatflow 叫做对话流。

创建工作流

我们进入 "工作室" 页面,点击 "创建空白应用",应用类型选择 "工作流":

我们拿之前学习 Coze Studio 时用过的天气查询的例子,来体验下 Dify 的工作流。填写助手名称,以及可选的图标和描述,进入应用的配置页面:

可以看出 Dify 和 Coze Studio 工作流差不多,也提供了大量的节点可供使用,包括:

基础节点

  • LLM:调用大语言模型的能力,根据给定的提示词处理广泛的任务类型,比如意图识别、文本生成、内容分类、文本转换、代码生成、RAG、图片理解等;
  • 知识检索:从知识库中检索与用户问题相关的文本内容,可作为下游 LLM 节点的上下文来使用,实现 RAG 问答;
  • 结束:每一个工作流在完整执行后都需要至少一个结束节点,用于输出完整执行的最终结果;若流程中出现条件分叉,则需要定义多个结束节点;
  • Agent:通过集成不同的 Agent 推理策略,使大语言模型能够在运行时动态选择并执行工具,从而实现多步推理;

问题理解

  • 问题分类器:通过大模型对用户输入进行分类,类似于条件分支,只不过是用自然语言来定义分支;

逻辑

  • 条件分支:根据 if 条件表达式将工作流程拆分成多个分支;
  • 迭代:对数组中的元素依次执行相同的操作步骤,直至输出所有结果,可以理解为任务批处理器,支持并行模式;
  • 循环:用于执行依赖前一轮结果的重复任务,直到满足退出条件或达到最大循环次数;

转换

  • 代码执行:支持执行 Python 或 JavaScript 代码,对输入变量进行处理;
  • 模版转换:借助 Jinja2 模板引擎灵活地进行数据转换、文本处理等;
  • 变量聚合器:将多路分支的变量聚合为一个变量,确保无论哪个分支被执行,其结果都能通过一个统一的变量来引用和访问;
  • 文档提取器:解析并读取文件,返回文件内容,支持 TXT、Markdown、PDF、HTML、DOCX 等格式;
  • 变量赋值:将工作流内的变量赋值到会话变量中用于临时存储,并可以在后续对话中持续引用;
  • 参数提取器:利用 LLM 从自然语言推理并提取结构化参数,用于后置的工具调用或 HTTP 请求;

工具

  • HTTP 请求:向指定的网络地址发送定制化的 HTTP 请求,实现与各种外部服务的互联互通;
  • 列表操作:对列表进行过滤、排序、取第 N 项或取前 N 项等操作;
  • Dify 工具:支持调用平台上所有的工具,包括插件工具、自定义工具、工作流工具、MCP 工具等;

相比于 Coze Studio 的工作流,Dify 的工作流少了文本处理(字符串拼接和分割)、知识库写入以及一些数据库相关的组件。

编排工作流

接下来我们开始创建 "天气小助手" 工作流,我们首先在 "开始节点" 上定义输入字段 city 表示要查询的城市名称:

在 "开始节点" 中,除了我们定义的输入字段外,还有很多内置的系统变量,都以 sys 开头:

  • sys.files:用户上传的文件
  • sys.user_id:用户唯一标识
  • sys.app_id:应用唯一标识
  • sys.workflow_id:工作流标识
  • sys.workflow_run_id:工作流运行标识

这些参数面向具备开发能力的用户,以区分调用工作流的用户和应用或查询工作流或工作流的运行情况。

假设我们要对接高德的天气查询接口,这个接口通过城市编码查询该城市的天气详情。因此第二步是想办法将用户输入的城市名称转换为城市编码,这可以通过 "代码执行" 节点实现:

这个节点的输入参数为 city_name 引用自 "开始节点",输出参数为 city_id,转换的代码如下:

python 复制代码
# 城市编码表,可以从高德官网下载
city_list = [
  "北京市,110000",
  "天津市,120000",
  "石家庄市,130100",
  # ...
]
def main(city_name: str) -> dict:
  city_id = '110000'
  for city_info in city_list:
    city_info = city_info.split(',')
    if city_name in city_info[0]:
      city_id = city_info[1]
      break
  return {
    'city_id': city_id
  }

代码写好后,可以点击上面的小三角测试该节点,验证没问题后,接着再在代码节点后面加一个 "HTTP 请求" 节点,调用高德的天气查询接口:

  • 接口方式 - GET
  • API 地址 - https://restapi.amap.com/v3/weather/weatherInfo
  • 请求参数
    • city - 引用自代码节点的 city_id 参数;
    • extensions - 填写 all,表示返回的天气类型,base 返回实况天气,all 返回预报天气;
    • output - 填写 json 表示希望接口返回 JSON 格式;
    • key - 填写高德 API KEY,可以从高德开放平台免费申请;

这里的 key 我并没有直接填写 API KEY,而是使用了环境变量,可以点击上面的 "ENV" 按钮创建,类型选择 "Secret":

使用环境变量的好处是,可以保护工作流内所涉及的敏感信息,例如运行工作流时所涉及的 API 密钥、数据库密码等。导出工作流时会提示用户,可以剔除掉 "Secret" 类型的变量值。

同样点击小三角验证,测试通过后,在 "HTTP 请求" 节点后再接一个 "LLM" 节点:

使用大模型将 HTTP 返回的 JSON 结果转换为自然语言,方便用户查看。最后将 "LLM" 节点和 "结束" 节点连接起来,在结束节点上添加 text 参数,并引用 "LLM" 节点的出参:

至此,整个工作流搭建完成:

可以点击上方的 "运行" 按钮,对整个工作流进行测试:

在输出面板上,我们还可以点击 "详情" 查看工作流完整的入参和出参:

以及工作流中每个节点的执行情况:

调试完成后,点击右上角的发布按钮:

可以将工作流发布为不同形式:

  • 直接运行:通过 Web 界面直接使用
  • 批量运行:支持 CSV 文件批量处理
  • 在 "探索" 中打开:在 "探索" 页面使用
  • API 访问:通过 REST API 调用
  • 发布为工具:这是工作流和其他应用的一大区别,可以将其发布成工具,可以在其他应用中复用

创建对话流

接下来我们再看看对话流。我们进入 "工作室" 页面,点击 "创建空白应用",应用类型选择 "Chatflow":

还是以天气助手为例,填写助手名称,以及可选的图标和描述,进入应用的配置页面:

可以看出,对话流和工作流的节点几乎一样,只不过工作流的 "结束" 节点在这里变成了 "直接回复" 节点,它和 "结束" 节点的最大区别在于,"直接回复" 节点可以不作为最终的输出节点,作为流程过程节点时,可以在中间步骤流式输出结果。

编排对话流

由于对话流直接是以对话框的形式交互,因此我们无需在 "开始节点" 定义输入字段:

其实,对话流的 "开始节点" 也可以添加输入字段,如果添加的话,就会在对话框的上方多出一个表单,供用户填写。

和工作流一样,对话流的 "开始节点" 也有很多以 sys 开头的系统变量,相比于工作流,它还多了几个和会话相关的变量:

  • sys.query:用户输入内容
  • sys.dialogue_count:对话的轮次,每轮对话后自动加 1
  • sys.conversation_id:会话唯一标识

除此之外,对话流还多了一个 "会话变量" 的功能,用于临时存储一些信息,比如上下文、用户偏好等,确保在多轮对话中都能够引用该信息。会话变量为可读写变量,我们可以通过 "变量赋值" 节点修改会话变量的内容。

然后再 "开始节点" 后加入一个 "问题分类" 节点:

我们添加两个分类,分类 1 为天气查询,分类 2 为其他。天气查询分类后接一个参数提取器:

该节点的作用是从用户问题中提取出城市名称,这样后面的流程就和之前的工作流一样了,通过代码节点转换城市编码,再通过高德接口查询天气,最后通过大模型输出润色结果,这里不再赘述。

其他分类后接 "LLM" 节点:

对话流的 "LLM" 节点和工作流也有一点区别,多了一个 "记忆" 选项,可以开启,这样在多轮对话时,大模型就能记住之前的对话内容。

至此,对话版的天气小助手就开发好了:

点击上面的 "预览" 按钮,和小助手进行对话:

调试完成后,点击右上角的发布按钮,可以将对话流发布为不同形式:

  • 直接运行:通过 Web 界面直接使用
  • 嵌入网站:通过 iframe 嵌入到其他网站
  • 在 "探索" 中打开:在 "探索" 页面使用
  • API 访问:通过 REST API 调用

小结

我们今天学习了 Dify 的工作流和对话流应用,通过可视化拖拽的方式连接各个节点,实现复杂的业务逻辑:

  • Workflow(工作流):单次输入输出,适用于自动化和批处理场景;
  • Chatflow(对话流):支持会话变量、对话记忆等功能,更适合多轮交互场景;

至此,我们已经完整体验了 Dify 的 5 种应用类型(聊天助手、文本生成、Agent、工作流、对话流),每种类型都有其独特的优势和适用场景。接下来,我们将进入 Dify 的源码,看看这些应用的实现原理,同时我们还会学习 Dify 的其他高级特性,比如知识库、工具、插件系统等,这些模块为应用提供了更强大的功能,为我们构建企业级 AI 应用提供技术基础。

欢迎关注

如果这篇文章对您有所帮助,欢迎关注我的同名公众号:日习一技,每天学一点新技术

我会每天花一个小时,记录下我学习的点点滴滴。内容包括但不限于:

  • 某个产品的使用小窍门
  • 开源项目的实践和心得
  • 技术点的简单解读

目标是让大家用5分钟读完就能有所收获,不需要太费劲,但却可以轻松获取一些干货。不管你是技术新手还是老鸟,欢迎给我提建议,如果有想学习的技术,也欢迎交流!

相关推荐
aneasystone本尊3 小时前
学习 Dify 的代码结构
人工智能
无风听海3 小时前
神经网络之函数真的可以表达世界的复杂性吗
人工智能·深度学习·神经网络
wwlsm_zql3 小时前
MITRE ATLAS 对抗威胁矩阵与 LLM 安全
人工智能·线性代数·安全·矩阵·大模型
AiTop1003 小时前
百度Qianfan-VL系列上线:推出3B/8B/70B三款视觉理解模型,覆盖不同算力需求
人工智能·百度·ai·aigc
嘀咕博客3 小时前
绘想 - 百度推出的AI视频创作平台
人工智能·百度·音视频·ai工具
Elastic 中国社区官方博客4 小时前
使用 TwelveLabs 的 Marengo 视频嵌入模型与 Amazon Bedrock 和 Elasticsearch
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
stbomei4 小时前
AI 治理的 2025 突围:从假新闻狙击到隐私防线重构
人工智能·重构
IT_陈寒4 小时前
SpringBoot性能翻倍!这5个隐藏配置让你的应用起飞🚀
前端·人工智能·后端