Dify工作流
Dify工作流
基本介绍
工作流通过将复杂的任务分解成较小的步骤(节点)降低系统复杂度,减少了对提示词技术和模型推理能力的依赖,提高了LLM应用面向复杂任务的性能,提升了系统的可解释性、稳定性和容错性。
工作流的类型
-
Chatflow: 面对对话类情景,包括客户服务、语义搜素,以及其他需要在构建响应时进行多步逻辑的对话式应用程序。常见的交互流程: 给出指令->生成内容->就内容进行多次讨论->就内容进行多次讨论->重新生成结果->结束
-
Workflow: 面向自动化和批处理情景,适合高质量翻译、数据分析、内容生成、电子邮件自动化等应用程序。常见的交互流程: 给出指令->生成内容->结束

关键概念
- 节点: 节点是工作流的关键构成,通过连接不同功能的节点,执行工作流的一系列操作。
- 变量: 变量用于串联工作流内前后节点的输入与输出,实现流程中的复杂处理逻辑,包含系统变量、环境变量和会话变量。
变量
如何用一种固定的符合指代动态变化的内容?变量作为一种动态数据容器,能够存储和传递不固定的内容,在不同的节点内被相互引用,实现信息在节点间的灵活通信。
系统变量
系统变量指的是在Chatflow/Workflow应用内预设的系统级参数,可以被其他节点全局读取。系统级变量均以sys开头。
Workflow的系统变量
| 变量名称 | 数据类型 | 说明 |
|---|---|---|
| sys.files | Array[File] | 文件参数,存储用户初始使用应用时上传的图片(此功能需要在应用编排页右上角的"功能"处开启) |
| sys.user_id | String | 用户ID,每个用户在使用工作流应用时,系统会自动向用户分配唯一标识符,用以区分不同的对话用户 |
| sys.app_id | String | 应用ID,系统会向每个Workflow应用分配一个唯一的标识符,用以区分不同的应用,并通过此参数记录当前应用的基本信息 |
| sys.workflow_id | String | Workflow ID,用于记录当前Workflow应用内所包含的所有节点信息 |
| sys.workflow_run_id | String | Workflow应用运行ID,用于记录Workflow应用中的运行情况 |

Chatflow的系统变量
| 变量名称 | 数据类型 | 说明 |
|---|---|---|
| sys.query | String | 用户在对话框中初始输入的内容 |
| sys.files | Array[File] | 用户在对话框内上传的图片(此功能需要在应用编排页右上角的"功能"处开启) |
| sys.dialogue_count | Number | 用户在与Chatflow类型应用交互时的对话轮数。每轮对话后自动计数增加1,可以和if-else节点搭配出丰富的分支逻辑。 例如到第X轮对话时,回顾历史对话开始出分析 |
| sys.conversation_id | String | 对话框交互会话的唯一标识符,将所有相关消息分组到同一个对话中,确保LLM针对同一个主题和上下文持续对话 |
| sys.user_id | String | 分配给每个应用用户的唯一标识符,用以区分不同的对话用户 |
| sys.app_id | String | 应用ID,系统会向每个Workflow应用分配一个唯一的标识符,用以区分不同的应用,并通过此参数记录当前应用的基本信息 |
| sys.workflow_id | String | Workflow ID,用于记录当前Workflow应用内所包含的所有节点信息 |
| sys.workflow_run_id | String | Workflow应用运行ID,用于记录Workflow应用中的运行情况 |

环境变量
环境变量用于保护工作流内所涉及的敏感信息,例如运行工作流时所涉及的API密钥、数据库密码等。它们被存储在工作流程中,而不是代码中,以便在不同环境中共享。

支持的三种数据类型
- String字符串
- Number数字
- Secret密钥
特性
- 环境变量可在大部分节点内全局引用;
- 环境变量命名不可重复;
- 环境变量为只读变量,不可写入;
会话变量
会话变量面向多轮对话场景,而Workflow类型应用的交互是线性而独立的,不存在多次对话交互的情况,因此会话变量仅适用于Chatflow类型应用。
会话变量允许应用开发者在同一个Chatflow会话内,指定需要被临时存储的特定信息,并确保在当前工作流内的多轮对话内都能够引用该信息,如上下文,用户在对话过程中所输入的偏好信息等。好比为LLM提供一个可以被随时查看的“备忘录”,避免因LLM记忆出差而导致信息偏差。
eg: 你可以将用户在首轮对话时输入的语言偏好存储至会话变量中,LLM在回答时将参考会话变量中的信息,并在后续的对话中使用指定的语言回复用户。

会话变量支持的六种数据类型
- String字符串
- Number数值
- Object对象
- Array[String]字符串数组
- Array[number]数值数组
- Array[object]对象数组
会话变量的特性
- 会话变量可在大部分节点内全局引用
- 会话变量的写入需要使用变量赋值节点
- 会话变量为可读写变量
节点
节点是工作流中的关键构成,通过连接不同功能的节点,执行工作流的一系列操作
所有节点列表
| 节点名称 | 说明 |
|---|---|
| 开始(Start) | 定义一个workflow流程启动的初始参数。 |
| 结束(End) | 定义一个workflow流程结束的最终输出内容。 |
| 回复(Answer) | 定义一个Chatflow流程中的回复内容。 |
| 大预言模型(LLM) | 调用大语言模型回答问题或者对自然语言进行处理。 |
| 知识检索(Knowledge Retrieval) | 从知识库中检索与用户问题相关的文本内容,可作为下游LLM节点的上下文。 |
| 问题分类(Question Classifier) | 通过定义分类描述,LLM能够根据用户输入选择与之相匹配的分类。 |
| 条件分支(IF/ELSE) | 允许你根据if/else条件将workflow拆分成两个分支 |
| 代码执行(Code) | 运行Python/NodeJS代码以在工作流程中执行数据转换等自定义逻辑。 |
| 模型转换(Template) | 允许借助Jinja2的Python模版语言灵活地进行数据转换、文本处理等。 |
| 变量聚合(Variable Aggregator) | 将多路分支的变量聚合为一个变量,以实现下游节点统一配置 |
| 参数提取器(Parameter Extractor) | 利用LLM从自然语言推理并提取结构化参数,用于后置的工具调用或HTTP请求。 |
| 迭代(Iteration) | 对列表对象执行多次步骤直至输出所有结果。 |
| HTTP请求(HTTP Request) | 允许通过HTTP协议发送服务器请求,适用于获取外部检索结果、webhook、生成图片等情景。 |
| 工具(Tools) | 允许在工作流内调用Dify内置工具、自定义工具、子工作流等。 |
| 变量赋值(Variable Assigner) | 变量赋值节点用于向可写入变量(例如会话变量)进行变量赋值 |
| 循环(Loop) | 循环节点用于执行依赖前一轮结果的重复任务,直到满足退出条件或达到最大循环次数。 |
开始节点
开始节点是每个工作流应用必备的预设节点,为后续工作流节点以及应用的正常流转提供必要的初始信息,例如应用使用者所输入的内容,以及上传的文件等。
开始节点的设置页中,可以看到两部分设置,分别是输入字段和预设的系统变量。由于系统变量之前已经提及,下面只讲解输入字段
输入字段
输入字段功能由应用开发者设置,通常用于让应用使用者主动补全更多信息。例如在周报应用中要求使用者按照格式预先提供更多背景信息,如姓名,工作日期区间,工作详情等。这些前置信息将有助于LLM生成质量更高的答复。
支持以下六种类型输入变量,所有变量均可设置为必填项:
- 文本
短文本,由应用使用者自行填写内容,最大长度256字符。
- 段落
长文本,允许应用使用者输入较长字符。
- 下拉选项
由应用开发者固定选项,应用使用者仅能选择预设选项,无法自行填写内容。
- 数字
仅允许用户输入数字。
- 单文件
允许应用使用者单独上传文件,支持文档类型文件、图片、音频、视频和其他文件类型。支持通过本地上传文件或粘贴文件URL。
- 文件列表
允许应用使用者批量上传文件,支持文档类型文件、图片、视频和其他文件类型。支持通过本地上传文件或粘贴文件URL。

LLM节点
调用大语言模型的能力,处理用户在开始节点中输入的信息(自然语言、上传的文件或图片),给出有效的回应信息。
应用场景
LLM节点是工作流应用的核心节点。该节点能够利用大语言模型的对话/生成/分类/处理等能力,根据给定的提示词处理广泛的任务类型,并能够在工作流的不同环节使用
- 意图识别: 在客服对话情景中,对用户问题进行意图识别和分类,导向下游不同的流程。
- 文本生成: 在文章生成情景中,作为内容生成的节点,根据主题、关键词生成符合的文本内容。
- 内容分类: 在邮件批处理情景中,对邮件的类型进行自动化分类,如咨询,投诉,垃圾邮件。
- 文本转换: 在文本翻译情景中,将用户提供的文本内容翻译成指定语言。
- 代码生成: 在辅助编程情景中,根据用户的要求生成指定的业务代码,编写测试用例。
- RAG: 在知识库问答情景中,将检索到的相关知识和用户问题重新组织回复问题。
- 图片理解: 使用具备vision能力的LLM,理解与问答图像内的信息。
- 文件分析: 在文件处理场景中,使用LLM识别并分析文件包含的信息。
配置节点流程

- 选择模型
Dify提供了全球主流模型的支持,包括OpenAI的GPT系列、Anthropic的Claude系列、Google的Gemini系列等,选择一个模型取决于其推理能力、成本、响应速度、上下文窗口等因素,你需要根据场景需求和任务类型选择合适的模型。
注: 如果初次使用dify,在LLM节点选择模型之前,需要在系统设置-模型提供商内提前完成模型配置。
- 配置模型参数
模型参数用于控制模型的生成结果,例如温度、TopP、最大标记、回复格式等,为了方便使选择系统同时提供了3套预设参数:创意、平衡、精确。如果你对以上参数并不熟悉,建议选择默认设置。若希望应用具备图片分析能力,请选择具备视觉能力的模型。
- 填写上下文(可选)
上下文可以理解为向LLM提供的背景信息,常用于填写知识检索的输出变量。
- 编写提示词
LLM节点提供了一个易用的提示词编排页面,选择聊天模型或补全模型,会显示不同的提示词编排结构。如果选择聊天模式(Chat model),你可以自定义系统提示词(SYSTEM)/用户(USER)/助手(ASSISTANT)三部分内容。
在提示词编辑器中,你可以通过输入"/"或者"{"呼出变量插入菜单,将特殊变量块或者上游节点变量插入到提示词中作为上下文内容。
- 高级设置
可以开关记忆功能并设置记忆窗口、开关Vision功能或者使用Jinja-2模版语言来进行更复杂的提示词等。
特殊变量说明
1.上下文变量
上下文变量是一种特殊变量类型,用于向LLM提供背景信息,常用于在知识检索场景下使用。
2.图片变量
具备视觉能力的LLM可以通过变量读取应耐用使用者所上传的图片。开启VISION后选择图片文件的输出变量完成设置。
3.文件变量
部分LLMs已支持直接处理并分析文件内容,因此系统提示词已允许输入文件变量。为了避免潜在异常,应用开发者在使用该文件变量前需要前往LLM官网确认LLM支持何种文件类型。
4.会话历史(不常用)
为了在文本补全类模型内实现聊天型应用的对话记忆,Dify在Chatflow的LLM节点设计了会话历史变量,用于在提示词中插入AL与用户之间聊天历史,帮助LLM理解对话上文。
5.模型参数
模型的参数会影响模型的输出效果。不同模型的参数会有所区别,其中主要的参数名称解释如下:
a.温度(temperature): 用于控制随机性和多样性的程度。具体来说,温度值控制了生成文本时对每个候选词的概率分布进行平滑的程度。较高的温度值会降低概率分布的峰值,使得更多的底概率词被选择,生成结果更加多样化;而较低的温度值则会增强概率分布的峰值,使得高概率词更容易被选择,生成结果更加确定。
b.最大标记: 用于指定模型在生成内容时token的最大数量,它定义了生成的上限,但不保证每次都会生成到这个数量。
c.Top P: 生成过程中核采样方法概率阈值,取值范围为(0,1.0),取值越大,生成的随机性越高;取值越低,生成的确定性越高。
d.取样数量: 生成时,采集候选集的大小。例如取值为50时,仅将单次生成中得分最高的50个token组成随机采样的候选集。取值越大,生成的随机性越高;取值越小,生成的确定性越高。
e.随机种子: 生成时使用的随机种子,用户控制模型生成内容的随机性。在使用随机种子时,模型将尽可能生成相同或相似的结果,但目前不保证每次生成的结果完全相同。
f.重复惩罚: 用于控制模型生成时的重复度。提高重复惩罚值时可以降低模型生成的重复度。1.0表示不做惩罚。
知识检索节点
从知识库中检索与用户问题相关的文本内容,可作为下游LLM节点的上下文来使用。
应用场景
构建基于外部数据/知识的AI问答系统(RAG)。
eg: 知识库检索节点作为LLM节点的前置步骤,在用户问题传递至LLM节点之前,先在知识检索节点内将匹配用户问题最相关的文本内容并召回,随后在LLM节点内将用户问题与检索到的上下文一同作为输入,让LLM根据检索内容来回复问题。
配置流程
- 选择查询变量。查询变量通常代表用户输入的问题,该变量可以作为输入项并检索知识库中的相关文本分段。一般将开始节点的问题作为查询变量。
- 选择需要查询的知识库,可选知识库需要在Dify知识库内预先创建。
- 在元数据筛选板块中配置元数据的筛选条件,使用元数据功能筛选知识库内的文档。
- 连接并配置下游节点,一般为LLM节点。

输出变量
知识检索的输出变量result为知识库中检索到的相关文本分段。其变量数据结果中包含了分段内容、标题、链接、图片、元数据信息。
问题分类节点
通过定义分类描述,问题分类器能够根据用户输入,使用LLM推理与之相匹配的分类并输出分类结果,向下游节点提供更加精确的信息。
应用场景
客服对话意图分类、产品评价分类、邮件批量分类。
eg: 在一个典型的产品客服问答场景中,问题分类器可以作为知识库检索的前置步骤,对用户输入问题意图进行分类处理,分类后导向下游不同的知识库查询相关的内容,以精确回复用户的问题。
在该场景中我们设置了3个分类标签/描述:
分类1:与售后相关的问题
分类2: 与产品操作使用相关的问题
分类3: 其他问题
当用户输入不同的问题时,问题分类器会根据已设置的分类标签|描述自动完成分类:
与售后相关的问题 -> 保修期限是多久?
与产品操作使用相关的问题 -> 如何设置通信录联系人?
其他问题 -> 今天天气怎么样?
配置步骤
- 选择输入变量,指用于分类的输入内容,支持输入文件变量。客服问答场景下一般为用户输入的问题。
- 选择推理模型,问题分类器基于大语言模型的自然语言分类和推理能力,选择合适的模型将有助于提升分类效果。
- 编写分类标签/描述,可以手动添加多个分类,通过编写分类的关键词或者描述语句,让大语言模型更好的理解分类依据。
- 选择分类对应的下游节点,问题分类节点完成分类之后,可以根据分类与下游节点的关系选择后续的流程路径。
输出变量
class_name存储了分类模型的预测结果。当分类完成后,这个变量会包含具体的类别标签,你可以在后续的处理节点中引用这个分类结果来执行相应的逻辑。
条件分支节点
根据if/else/elif条件将Chatflow/Workflow流程拆分多个分支。
节点功能
IF条件: 选择变量,设置条件和满足条件的值
IF条件判断为True,执行IF路径
IF条件判断为False,执行ELSE路径
ELIF条件判断为True,执行ELIF路径
ELIF条件判断为False,继续判断下一个ELIF路径或执行最后的ELSE路径
注:
多重添加判断: 设计复杂的条件判断时,可以设置多重条件判断,在条件之间设置AND或者OR,即在条件之间取交集或者并集。
支持设置以下条件类型:
- 包含(Contains)
- 不包含(Not contains)
- 开始是(Start with)
- 结束是(End with)
- 是(Is)
- 不是(Is not)
- 为空(Is empty)
- 不为空(Is not empty)

代码执行节点
代码执行节点支持运行Python/NodeJS代码以在工作流程中执行数据转换。它可以简化你的工作流程,适用于Arithmetic、JSON transform、文本处理等情景。
该节点极大地增强了开发人员的灵活性,使他们能够在工作流程中嵌入自定义的Python或Javascript脚本,并以预设节点无法达到的方式操作变量。通过配置选项,你可以指明所需的输入和输出变量,并转写相应的执行代码。

使用场景
结构化数据处理
在工作流中,经常要面对非结构化的数据处理,如JSON字符串的解析、提取、转换等。最典型的例子就是HTTP节点的数据处理,在常见的API返回结构中,数据可能会被嵌套在多层JSON对象中,而我们需要提取其中的某些字段。代码执行节点可以帮助我们完成这些操作。
eg: 从HTTP节点返回JSON字符串中提取了data.name字段
def main(http_response: str) -> str:
import json
data = json.loads(http_response)
return {
'result': data['data']['name']
}
数学计算
当工作流中需要进行一些复杂的数学计算时,也可以使用代码执行节点。例如,计算一个复杂的数学公式,或者对数据进行一些统计分析。
eg: 计算了一个数组的平方差:
def main(x: list) -> float:
return {
'result' : sum([i-sum(x)/len(x) **2 for i in x]) /len(x)
}
拼接数据
有时会需要拼接多个数据源,如多个知识检索、数据搜索、API调用等,代码节点可以帮助你将这些数据源整合在一起。
eg: 将两个知识库的数据合并在一起:
def main(knowledge1: list, knowledge2: list) -> list:
return {
'result': knowledge1 + knowledge2
}
安全策略
无论是Python3还是Javascript代码执行器,它们的执行环境都被严格隔离(沙箱化),以确保安全性。这意味着开发者不能使用那些消耗大量系统资源或可能引发安全问题的功能,例如直接访问文件系统、进行网络请求或执行操作系统级别的命令。这些限制保证了代码的安全执行,同时避免了对系统资源的过度消耗。
模版转换节点
允许借助Jinja2的Python模版语言灵活地进行数据转换、文本处理等。

Jinja是什么?
Jinja是一个快速、表达力强、可扩展的模版引擎。
应用场景
模版转换节点允许你借助Jinja2这一强大的Python模版语言,在工作流内实现轻量、灵活的数据转换,适用于文本处理、JSON转换等情景。例如灵活地格式化并合并来自前面步骤的变量,创建出单一的文本输出。这非常适用于将多个数据源的信息汇总成一个特定格式,满足后续步骤的需求。
eg:
1.将多个输入(文章标题、介绍、内容)拼接为完整文本。
2.将知识检索节点获取的信息及其相关的元数据,整理成一个结构化的Markdown格式。
文档提取器节点
LLM自身无法直接读取或解释文档的内容。因此需要将用户上传的文档,通过文档提取器节点解析并读取文档文件中的信息,转化文本之后再将内容传给LLM以实现对于文件内容的处理。
应用场景
- 构建能够与文件进行互动的LLM应用,例如ChatPDF或ChatWord
- 分析并检查用户上传的文件内容
节点功能
文档提取器节点可以理解为一个信息处理中心,通过识别并读取输入变量中的文件,提取信息后并转化为string类型输出变量,供下游节点调用。文档提取器节点结构分为输入变量、输出变量。
输入变量
文档提取器仅接收单独一个文件(File)和多个文件(Array[File])的数据结构,文档提取器仅能够提取文档类型文件中的信息,例如TXT、Markdown、PDF、HTML、DOCX格式文件的内容,无法处理图片、音频、视频等格式文件。
输出变量
输出变量固定命名为text。输出的变量类型取决于输入变量,输入变量为单独一个文件(File),输出变量为字符串(string);输入变量为多个文件(Array[File]),输出变量为字符串数组(array[string])。

列表操作节点
文件类别变量支持同时上传文档文件、图片、音频与视频文件等多种文件。应用使用者在上传文件时,所有文件都存储在同一个Array[File]数组类型变量内,不利于后续单独处理文件。列表操作节点可以在数组变量内提取单独的元素,便于后续节点处理。
节点功能
列表操作节点可以对文件的格式类型、文件名、大小等属性进行过滤与提取,将不同格式的文件传递给对应的处理节点,以实现对不同文件处理流的精确控制。
列表操作节点一般用于提取数组变量中的信息,通过设置条件将其转化为能够被下游节点所接受的变量类型。它的结构分为输入变量、过滤条件、排序(可选)、取前N项(可选)、输出变量。

输入变量
列表操作节点仅接受以下数据结构变量:
- Array[string]
- Array[number]
- Array[file]
过滤条件
处理输入变量中的数组,添加过滤条件。从数组中分拣所有满足条件的数组变量,可以理解为对变量的属性进行过滤。
支持提取以下变量:
type-文件类别:包含图片、文档、音频、视频类型
size-文件大小
name-文件名
url-应用使用者通过URL上传的文件,可填写完整URL进行筛选
extension-文件后缀名
mime_type-用来标识文件内容类型的标准化字符串,例如"text/html"表示HTML文档。
transfer_method-文件上传方式,分为本地上传或通过URL上传
排序
提供对于输入变量中数组的排序能力,支持根据文件属性进行排序。
升序排列: 默认排序选项,按照从小到大排序。对于字母和文本,按字母表顺序排列(A-Z)
降序排列: 由大到小排序,对于字母和文本,按字母表倒序排列(Z-A)
该选项常用于配合输出变量中的first_record及last_record使用。
取前N项
可以在1-20中选值,用途是为了选中数组变量的前n项
输出变量
满足各项过滤条件的数值元素。过滤条件、排序和限制可以单独开启。如果同时开启,则返回符合所有条件的数值元素。
Result: 过滤结果,数据类型为数组变量。
first_record: 筛选完的数组的首元素,即result[0]。
last_record: 筛选完的数组的尾元素,即result[array.length-1]。
变量聚合节点
将多路分支的变量聚合为一个变量,以实现下游节点统一配置。
变量聚合节点(原变量赋值节点)是工作流程中的一个关键节点,它负责整合不同分支的输出结果,确保无论哪个分支被执行,其结果都能通过一个统一的变量来引用和访问。在这多分支的情况下非常有用,可将不同分支下相同作用的变量映射为一个输出变量,避免下游节点重复定义。
注:实际变量聚合节点会按照参数的顺序选择输出,会输出第一个非空的变量值,不会将两个同一类型的数据做字符串拼接。主要还是针对分支条件的场景,后续分支条件节点需要复用同一节点时通过变量聚合节点将第一个非空变量放入复用节点中。

应用场景
通过变量聚合,可以将诸如问题分类或条件分支等多路输出聚合为单路,供流程下游的节点使用和操作,简化了数据流的管理。
格式要求
变量聚合器支持聚合多种数据类型,包括字符串(String)、数字(Number)、文件(File)、对象(Object)以及数组(Array)
变量聚合器只能聚合同一种数据类型的变量。若第一个添加至变量聚合节点内的变量数据格式为String,后续连线时会自动过滤可添加变量为String类型。
开启聚合分组后,变量聚合器可以聚合多组变量,各组内聚合时要求同一种数据类型。
变量赋值节点
变量赋值节点用于向可写入变量进行变量赋值,已支持以下可写入变量:会话变量、循环变量。可以将工作流内的变量赋值到会话变量中用于临时存储,并可以在后续对话中持续引用。
应用场景
自动判断提取并存储对话中的信息
在会话内通过会话变量数组记录用户输入的重要信息,并在后续对话中让LLM基于会话变量中存储的历史信息进行个性化回复。
示例: 开始对话后,LLM会自动判断用户输入是否包含需要记住的事实、偏好或历史记录。如果有,LLM会先提取并存储这些信息,然后再用这些信息作为上下文来回答。如果没有新的信息需要保存,LLM会直接使用自身的相关记忆知识来回答问题。
记录用户的初始编号信息
在会话内记住用户输入的语言偏好,在后续对话中持续使用该语言类型进行回复。
示例:用户在对话开始前,在language输入框内指定了中文,该语言将会被写入会话变量,LLM在后续进行答复时会参考会话变量中的信息,在后续对话中持续使用中文进行回复。
辅助Checklist检查
在会话内通过会话变量记录用户的输入项,更新Checklist中的内容,并在后续对话中检查遗漏项。
示例: 开始对话后,LLM会要求用户在对话框内输入Checklist所涉及的事项,用户一旦提及了Checklist中的内容,将会更新并存储至会话变量内。LLM会在每轮对话后提醒用户继续补充遗漏项。
变量赋值节点设置变量
变量: 选择需要被赋值的变量。
设置变量: 选择需要赋值的变量,即指定需要被转换的源变量。
eg:将用户在初始页面填写的语言偏好变量赋值至系统级会话变量内。
指定变量的写入模式
目标变量(被赋值的变量)的数据类型将影响变量的写入模式
1.目标变量的数据类型为String
覆盖模式: 将源变量直接覆盖至目标变量
清空模式: 清空所选中变量中的内容
设置模式: 手动指定一个值,无需设置源变量
2.目标变量的数据类型为Number
覆盖模式: 将源变量直接覆盖至目标变量
清空模式: 清空所选中变量中的内容
设置模式: 手动指定一个值,无需设置源变量
数字处理: 对目标变量进行加减乘除操作
3.目标变量的数据类型为Object
覆盖模式: 将源变量直接覆盖至目标变量
清空模式: 清空所选中变量中的内容
设置模式: 手动指定一个值,无需设置源变量
4.目标变量的数据类型为Array
覆盖模式: 将源变量直接覆盖至目标变量
清空模式: 清空所选中变量中的内容
追加模式: 在目标的数值变量中添加一个新的元素
扩展模式: 在目标的数值变量中添加新的数值,即一次性添加多个元素

迭代节点
对数组中的元素依次执行相同的操作步骤,直到输出所有结果,可以理解为任务批处理器。迭代节点通常配合数组变量使用。
节点功能
使用迭代的条件是确保输入值已格式化为列表对象;迭代节点将依次处理迭代开始节点数组变量内的所有元素,每个元素遵循相同的处理步骤,每轮处理被成为一个迭代,最终输出处理结果。
迭代节点的结构通常包含输入变量、迭代工作流、输出变量三个功能单元。
输入变量: 仅接受Array数组变量类型数据。
迭代工作流: 你可以在迭代节点中使用多个工作流节点,编排不同的任务步骤。
输出变量: 仅支持输出数组变量Array[List]。

应用场景示例-长文章迭代生成器
思路一:
1.在开始节点内添加输入故事标题、大纲变量、提示用户手动输入初始信息
2.使用LLM节点基于用户输入的故事标题和大纲,让LLM开始编写内容
3.使用参数提取节点将LLM输出的完整内容转换成数组格式
4.通过迭代节点包裹的LLM节点循环多次生成各章节内容
5.将直接回复节点添加在迭代节点内部,实现在每轮迭代生成之后流式输出
思路二:
1.在开始节点内输入故事标题和大纲
2.使用LLM节点生成文章小标题,以及小标题对应的内容
3.使用代码节点将完整内容转换成数组格式
4.通过迭代节点包裹的LLM节点循环多次生成各章节内容
5.使用模版转换节点将迭代节点输出的字符串数组转换为字符串
6.在最后添加直接回复节点将转换后的字符串直接输出
高级功能
并行模式
迭代节点支持并行模式,开启后将有效提升迭代节点的整体运行效率。
并行模式下的最高并行轮数为10,这意味着单位时间内最多可以同时运行10个任务。如果需要处理超过10个任务,前10个元素将率先同时运行,前排任务处理完成后将继续处理剩余任务。
注: 开启并行模式后,不再建议在迭代节点内放置直接回答、变量赋值和工具节点,容易造成异常情况。
错误响应方法
迭代节点通常需要处理大量任务,有时会在处理某个元素时发生错误。为了避免某个元素异常而中断所有任务,你可以在错误响应方法中设置异常的应对方法:
1.错误时终止: 如果发现异常输出,终止迭代节点,输出错误信息。
2.忽略错误并继续: 忽略异常信息,继续处理剩余元素。输出的信息中包含正确信息,异常信息为空值。
3.移除错误输出: 忽略异常信息,继续处理剩余元素。输出的信息中仅包含正确信息。
参数提取节点
参数提取的定义
利用LLM从自然语言推理并提取结构化参数,用于后置的工具调用或HTTP请求。
Dify工作流内提供了丰富的工具选择,其中大多数工具的输入为结构化参数,参数提取器可以将用户的自然语言转换为工具可识别的参数,方便工具调用。
工作流内的部分节点有特定的数据格式传入要求,如迭代节点的输入要求为数组格式,参数提取器可以方便的实现结构化参数的转换。

应用场景
1.从自然语言中提供工具所需的关键参数提取
示例: 构建一个简单的对话式Arxiv论文检索应用
Arxiv论文检索工具的输入参数要求为论文作者或论文编号,参数提取器从问题"这篇论文中讲了什么内容: 2405.10739"中提取出论文编号2405.10739,并作为工具参数进行精确查询。
2.将文本转换为结构化数据
长故事迭代生成应用中,作为迭代节点的前置步骤,将文本格式的章节内容转换为数组格式,方便迭代节点进行多轮生成处理。
3.提取结构化数据并使用HTTP请求
可请求任意可访问的URL,适用于获取外部检索结果、webhook、生成图片等情景。
配置流程
- 选择输入变量,一般为用于提取参数的变量输入。输入变量支持file
- 选择模型,参数提取器的提取依靠的是LLM的推理和结构化生成能力
- 定义提取参数,可以手动添加需要提取的参数,也可以从已有工具中快捷导入
- 编写指令,在提取复杂的参数时,编写示例可以帮助LLM提升生成的效果和稳定性
高级设置
推理模型
部分模型同时支持两种推理模型,通过函数/工具调用或是纯提示词的方式实现参数提取,在指令遵循能力上有所差别。例如某些模型在函数调用效果欠佳的情况下可以切换成提示词推理。
HTTP请求节点
HTTP请求节点的定义
允许通过HTTP协议发送服务器请求,适用于获取外部数据、webhook、生成图片、下载文件等情景。它让你能够向指定的网络地址发送定制化的HTTP请求,实现与各种外部服务互联互通。
该节点支持常见的HTTP请求方式:
- GET: 用于请求服务器发送某个资源
- POST: 用于向服务器提交数据,通常用于提交表单或上传文件
- HEAD: 类似于GET请求,但服务器不返回请求的资源主体,只返回响应头
- PATCH: 用于在请求-响应链上的每个节点获取传输路径
- PUT: 用于向服务器上传资源,通常用于更新已存在的资源或创建新的资源

应用场景
将应用互动内容发送至特定服务器
可以在HTTP请求的不同部分动态插入变量。例如在处理客户评价请求时,可以将用户名或客户ID、评价内容等变量嵌入到请求中,以定制化自动回复信息或获取特定客户信息并发送相关资源至特定的服务器。
HTTP请求的返回值包括响应体、状态码、响应头和文件。值得注意的是,如果响应中包含了文件,这个节点能够自动保存文件,供流程后续步骤使用。这样不仅能提高处理效率,也可以更加简单直接地处理带有文件的响应。
发送文件
你可以使用HTTP PUT请求将应用内的文件发送至其他API服务。在请求的Body中,可以在binary内选中文件变量。这种方式常用于文件传输、文档存储或媒体处理等场景。
示例: 假设你正在开发一个文档管理应用,需要将用户上传的PDF文件同步发送第三方服务,可以通过HTTP请求节点通过文件变量进行传递。
高级功能
错误重试
针对节点发生的部分异常情况,通常情况下再次重试运行节点即可解决。开启错误重试功能后,节点将在发生错误的时候按照预设策略进行自动重试。你可以调整最大重试次数和每次重试间隔以设置重试策略。
最大重试次数为10次
最大重试间隔时间为5000ms
异常处理
HTTP节点处理信息时有可能会遇到网络请求超时、请求限制等异常情况。节点提供了异常处理配置来处理异常。
1.无:当发生异常且未处理时,节点将停止运行
2.默认值:当发生异常时,指定默认输出内容
3.异常分支:当发生异常时,将执行异常分支
Agent节点
Agent节点定义
Agent节点是Dify Chatflow/Workflow中用于实现自主工具调用的组件。它通过集成不同的Agent推理策略,使大预言模型能够在运行时动态选择并执行工具,从而实现多多推理。

配置流程
添加节点
在Dify的工作流中,从组件栏拖拽Ageent节点至画布。
注: 1.0之前的版本未引入到工作流当中。
选择Agent策略
在节点配置面板中点击Agent策略,从下拉菜单选择所需的Agetn推理策略。Dify内置了Function Calling和ReAct两种策略,可在Marketplace->Agent策略分类中安装使用。
Function Calling
通过将用户指令映射到预定义函数或工具,LLM先识别用户意图,在决定调用哪个函数并提取所需参数,它的核心是调用外部函数或工具,属于一种明确的工具调用机制。
优点:
1.精确: 对于明确的任务,可以直接调用相应的工具,无需复杂的推理过程。
2.易于集成外部功能: 可以将各种外部API或工具封装成函数供模型调用。
3.结构化输出: 模型输出的是结构化的函数调用信息,方便下游节点处理。
ReAct(Reason+Act)
ReAct策略使Agent交替进行思考和行动: LLM首先思考当前状态和目标,然后选择并调用合适的工具,工具的输出结果又将引导LLM进行下一步的思考和行动,如此循环,直到问题解决。
优点:
1.有效利用外部信息: 能够有效地利用外部工具获取信息,解决仅靠模型自身无法完成的任务。
2.可解释性较好: 思考和行动的过程是交织的,可以一定程度上追踪Agent的推理路径。
3.适用范围广: 适用于需要外部知识或需要执行特定操作的场景,例如问答、信息检索、任务执行等。
配置节点参数
选择Agent策略后,配置面板会显示对应的配置项。Dify官方内置的Function Calling和ReAct策略的配置项包括:
-
模型: 选择驱动Agent的大语言模型。
-
工具: 工具的使用方式由Agent策略定义,点击"+"添加并配置Agent可调用的工具。
- 搜索: 在下来框中选择已安装的工具插件
- 授权: 填写API密钥等授权信息后启动工具
- 工具描述和参数设置: 提供工具描述,帮助LLLM理解工具用途并选择调用,同时设置工具的功能参数。
-
指令: 定义Agent的任务目标和上下文。支持使用Jinja语法引用上游节点变量
-
查询: 接收用户输入
-
最大迭代次数: 设定Agent的最大执行步数
-
输出变量: 提示节点输出的数据结构
查看日志
Agent节点执行过程中将生成详细日志。显示节点执行的总体信息,包括输入和输出、token开销、耗时和状态。点击"详情"查看Agent策略执行的每一轮输出信息。
工具节点
工具节点可以为工作流提供强大的第三方能力支持,分为以下三种类型:
- 内置工具: Dify第一方提供的工具,使用该工具前可能需要先给工具进行授权。
- 自定义工具: 通过OpenAPI/Swagger 标准格式导入或配置的工具。如果内置工具无法满足使用需求,你可以在Dify菜单导航--工具内创建自定义工具。
- 工作流: 你可以编排一个更复杂的工作流,并将其发布为工具。

配置工具节点
- 对工具授权/创建自定义工具/将工作流发布为工具
- 配置工具输入和参数
结束节点
定义一个工作流程结束的最终输出内容。每一个工作流在完整执行后都需要至少一个结束节点,用于输出完整执行的最终结果。
结束节点为流程终止节点,后面无法再添加其他节点,工作流应用中只有运行到结束节点才会输出执行结果。若流程中出现条件分叉,则需要定义多个结束节点。
结束节点需要声明一个或多个输出变量,声明时可以引用任意上游节点的输出变量。

直接回复节点
定义一个Chatflow流程中的回复内容。
可以在文本编辑器中自由定义回复格式,包括自定义一段固定的文本内容、使用前置步骤中的输出变量作为回复内容、或者将自定义文本与变量组合后回复。
可随时加入节点将内容流式输出至对话回复,支持所见即所得配置模式并支持图文混排如:
1.输出LLM节点回复内容
2.输出生成图片
3.输出纯文本

循环节点
循环(Loop)节点用于执行依赖前一轮结果的重复任务,直到满足退出条件或达到最大循环次数
循环节点与迭代节点的区别
| 类型 | 特点 | 适用场景 |
|---|---|---|
| 循环(Loop) | 轮次之间存在依赖关系的优化型任务。即任务的每一轮执行都依赖上一轮的结果。 | 需要前一轮的计算结果 |
| 迭代(Iteration) | 轮次之间无依赖关系的批处理任务。即每一轮任务可以独立运行,无需依赖前一轮 | 每轮独立执行 |
配置循环节点
循环节点包含以下三个关键配置项和一个子节点
| 配置项/子节点 | 作用 | 示例 |
|---|---|---|
| 循环终止条件(Loop Termination Condition) | 设置循环何时停止 | 当变量x<50时,停止循环 |
| 最大循环次数(Maximum Loop Count) | 限制最多执行的轮次,避免无限循环 | 最多执行10轮,不管是否满足退出条件 |
| 循环变量(Loop Variables) | 用于在循环的不同轮次间传递数据,并在循环结束后继续供下游节点使用 | 变量x<50在每轮循环中递增1,循环体内部可以基于x<50进行计算,循环结束后,x<50的最终值可用于后续流程 |
| 退出循环节点(Exit Loop) | 当循环体内运行到此节点后,循环终止 | 最多执行10轮,不管是否满足退出条件 |
快捷键
Chatflow/Workflow应用编排页支持一下快捷键,帮助你提升编排节点的效率
| Windows快捷键 | 说明 |
|---|---|
| Ctrl+C | 复制节点 |
| Ctrl+V | 粘贴节点 |
| Ctrl+D | 复制并新建节点 |
| Ctrl+O | 整理节点 |
| Ctrl+Z | 撤销 |
| Ctrl+Y | 重做 |
| Ctrl+Shift+Z | 重做 |
| Ctrl+1 | 画布适合视图 |
| Ctrl+(-) | 画布缩小 |
| Ctrl+(=) | 画布放大 |
| Shift+1 | 将画布视图重置为100% |
| Shift+5 | 将画布缩放至50% |
| H | 画布切换至手动模式 |
| V | 画布切换至指针模式 |
| Delete/Backspace | 删除选定节点 |
| Alt+R | 工作流开始运行 |
编排节点
Chatflow和Workflow类型应用内的节点均可以通过可视化拖拉拽的形势进行编排,支持串行和并行两种设计模式
串行设计
该结构要求节点按照预设顺序依次执行,每个节点需等待前一个节点完成并输出结构后才能开始工作,有助于确保任务按照逻辑顺序执行。
例如在一个采用串行结构设计的"小说生成"AI应用内,用户输入小说风格、节奏和角色后,LLM按照顺序补全小说大纲、小说剧情和结尾;每个节点都基于前一个节点的输出结果展开工作,确保小说的风格一致性。
设计串行结构
点击两个节点中间连线的+号即可在中间添加一个串行节点;按照顺序将节点依次串行连接,最后将线收拢至"结束"节点(Workflow)/"直接回复"节点(Chatflow)完成设计。
查看串行结构应用日志
串行结构应用内的日志将安装顺序展示各个节点的运行情况。点击对话框右上角的[查看日志-追踪],查看工作流完整运行过程各节点的输入/输出、Token消耗、运行时长等。
并行设计
该设计模式允许多个节点在同一时间内共同执行,前置节点可以同时触发位于并行结构内的多个节点。并行结构内的节点不存在依赖关系,能够同时执行任务,更好地提升节点的任务执行效率。
例如,在某个并行设计的翻译工作流应用内,用户输入源文本触发工作流后,位于并行结构内的节点将共同收到前置节点的流转指令,同时开展多语言的翻译任务,缩短任务的处理耗时。
设计并行结构应用
- 普通并行
普通并行指的是开始|并行结构|结束三层关系也是并行结构的最小单元。这种结构较为直观,用户输入内容后,工作流能同时执行多条任务。
注: 并行分支的上限数为10个。
- 嵌套并行
嵌套并行指的是开始|多个并行结构|结束多层关系,它适用于内部较为复杂的工作流,例如需要再某个节点内请求外部API,将返回的结果同时交给下游节点处理。
注: 一个工作流内最多支持3层嵌套关系。
- 条件分支+并行
并行结构也可以和条件分支共同使用。
- 迭代分支+并行
迭代分支内同样支持编排并行结构,加速迭代内各节点的执行效率。
查看并行结构应用日志
包含并行结构的应用的运行日志支持以树状结构进行展示,你可以折叠并行节点组以更好地查看各个节点的运行日志。

浙公网安备 33010602011771号