模板转换
定义
允许借助 Jinja2 的 Python 模板语言灵活地进行数据转换、文本处理等。
什么是 Jinja?
Jinja is a fast, expressive, extensible templating engine.
Jinja 是一个快速、表达力强、可扩展的模板引擎。
场景
模板节点允许你借助 Jinja2 这一强大的 Python 模板语言,在工作流内实现轻量、灵活的数据转换,适用于文本处理、JSON 转换等情景。例如灵活地格式化并合并来自前面步骤的变量,创建出单一的文本输出。这非常适合于将多个数据源的信息汇总成一个特定格式,满足后续步骤的需求。
示例1: 将多个输入(文章标题、介绍、内容)拼接为完整文本
拼接文本
示例2: 将知识检索节点获取的信息及其相关的元数据,整理成一个结构化的 Markdown 格式
{% for item in chunks %}
### Chunk {{ loop.index }}.
### Similarity: {{ item.metadata.score | default('N/A') }}
#### {{ item.title }}
##### Content
{{ item.content | replace('\n', '\n\n') }}
---
{% endfor %}
知识检索节点输出转换为 Markdown
你可以参考 Jinja 的官方文档,创建更为复杂的模板来执行各种任务。
示例 3: 支持渲染 HTML 的表单
<form data-format="json"> // Default to text
<label for="username">Username:</label>
<input type="text" name="username" />
<label for="password">Password:</label>
<input type="password" name="password" />
<label for="content">Content:</label>
<textarea name="content"></textarea>
<label for="date">Date:</label>
<input type="date" name="date" />
<label for="time">Time:</label>
<input type="time" name="time" />
<label for="datetime">Datetime:</label>
<input type="datetime" name="datetime" />
<label for="select">Select:</label>
<input type="select" name="select" data-options='["hello","world"]'/>
<input type="checkbox" name="check" data-tip="By checking this means you agreed"/>
<button data-size="small" data-variant="primary">Login</button>
</form>
文档提取器
定义
LLM 自身无法直接读取或解释文档的内容。因此需要将用户上传的文档,通过文档提取器节点解析并读取文档文件中的信息,转化文本之后再将内容传给 LLM 以实现对于文件内容的处理。
应用场景
1)构建能够与文件进行互动的 LLM 应用,例如 ChatPDF 或 ChatWord;
2)分析并检查用户上传的文件内容;
节点功能
文档提取器节点可以理解为一个信息处理中心,通过识别并读取输入变量中的文件,提取信息后并转化为 string 类型输出变量,供下游节点调用。
文档提取器节点结构分为输入变量、输出变量。
输入变量
文档提取器仅接受以下数据结构的变量:
File
,单独一个文件Array[File]
,多个文件
文档提取器仅能够提取文档类型文件中的信息,例如 TXT、Markdown、PDF、HTML、DOCX 格式文件的内容,无法处理图片、音频、视频等格式文件。
输出变量
输出变量固定命名为 text。输出的变量类型取决于输入变量:
- 输入变量为
File
,输出变量为string
- 输入变量为
Array[File]
,输出变量为array[string]
Array 数组变量一般需配合列表操作节点使用,详细说明请参考 列表操作。
配置示例
在一个典型的文件交互问答场景中,文档提取器可以作为 LLM 节点的前置步骤,提取应用的文件信息并传递至下游的 LLM 节点,回答用户关于文件的问题。
本章节将通过一个典型的 ChatPDF 示例工作流模板,介绍文档提取器节点的使用方法。
配置流程:
1、为应用开启文件上传功能。在 “开始” 节点中添加单文件变量并命名为 pdf
。
2、添加文档提取节点,并在输入变量内选中 pdf
变量。
3、添加 LLM 节点,在系统提示词内选中文档提取器节点的输出变量。LLM 可以通过该输出变量读取文件中的内容。
4、配置结束节点,在结束节点中选择 LLM 节点的输出变量。
配置完成后,应用将具备文件上传功能,使用者可以上传 PDF 文件并展开对话。
如需了解如何在聊天对话中上传文件并与 LLM 互动,请参考 附加功能。
列表操作
文件列表变量支持同时上传文档文件、图片、音频与视频文件等多种文件。应用使用者在上传文件时,所有文件都存储在同一个 Array[File]
数组类型变量内,不利于后续单独处理文件。 列表操作节点可以在数组变量内提取单独的元素,便于后续节点处理。
Array
数据类型意味着该变量的实际值可能为 [1.mp3, 2.png, 3.doc],大语言模型(LLM)仅支持读取图片文件或文本内容等单一值作为输入变量,无法直接读取数组变量,通常需要配合列表操作节点一起使用。
节点功能
列表操作节点可以对文件的格式类型、文件名、大小等属性进行过滤与提取,将不同格式的文件传递给对应的处理节点,以实现对不同文件处理流的精确控制。
例如在一个应用中,允许用户同时上传文档文件和图片文件两种不同类型的文件。需要使用列表操作节点进行分拣,将不同的文件类型交由不同流程处理。
列表操作节点一般用于提取数组变量中的信息,通过设置条件将其转化为能够被下游节点所接受的变量类型。它的结构分为输入变量、过滤条件、排序(可选)、取前 N 项(可选)、输出变量。
输入变量
列表操作节点仅接受以下数据结构变量:
- Array[string]
- Array[number]
- Array[file]
过滤条件
处理输入变量中的数组,添加过滤条件。从数组中分拣所有满足条件的数组变量,可以理解为对变量的属性进行过滤。
举例:文件中可能包含多重维度的属性,例如文件名、文件类型、文件大小等属性。过滤条件允许设置筛选条件,选择并提取数组变量中的特定文件。
支持提取以下变量:
-
type 文件类别,包含图片,文档,音频和视频类型
-
size 文件大小
-
name 文件名
-
url 指的是应用使用者通过 URL 上传的文件,可填写完整 URL 进行筛选
-
extension 文件拓展名
-
mime_type
MIME 类型是用来标识文件内容类型的标准化字符串。示例: “text/html” 表示 HTML 文档。
-
transfer_method
文件上传方式,分为本地上传或通过 URL 上传
排序
提供对于输入变量中数组的排序能力,支持根据文件属性进行排序。
-
升序排列
默认排序选项,按照从小到大排序。对于字母和文本,按字母表顺序排列(A - Z)
-
降序排列
由大到小排序,对于字母和文本,按字母表倒序排列(Z - A)
该选项常用于配合输出变量中的 first_record 及 last_record 使用。
取前 N 项
可以在 1-20 中选值,用途是为了选中数组变量的前 n 项。
输出变量
满足各项过滤条件的数组元素。过滤条件、排序和限制可以单独开启。如果同时开启,则返回符合所有条件的数组元素。
- Result,过滤结果,数据类型为数组变量。若数组中仅包含 1 个文件,则输出变量仅包含 1 个数组元素;
- first_record,筛选完的数组的首元素,即 result[0];
- last_record,筛选完的数组的尾元素,即 result[array.length-1]。
配置案例
在文件交互问答场景中,应用使用者可能会同时上传文档文件或图片文件。LLM 仅支持识别图片文件的能力,不支持读取文档文件。此时需要用到 列表操作 节点预处理文件变量的数组,将不同的文件类型并发送至对应的处理节点。编排步骤如下:
1、开启 Features 功能,并在文件类型中勾选 “图片” + “文档文件” 类型。
2、添加两个列表操作节点,在 “过滤” 条件中分别设置提取图片与文档变量。
3、提取文档文件变量,传递至 “文档提取器” 节点;提取图片文件变量,传递至 “LLM” 节点。
4、在末尾添加 “直接回复” 节点,填写 LLM 节点的输出变量。
应用使用者同时上传文档文件和图片后,文档文件自动分流至文档提取器节点,图片文件自动分流至 LLM 节点以实现对于混合文件的共同处理。
变量聚合
定义
将多路分支的变量聚合为一个变量,以实现下游节点统一配置。
变量聚合节点(原变量赋值节点)是工作流程中的一个关键节点,它负责整合不同分支的输出结果,确保无论哪个分支被执行,其结果都能通过一个统一的变量来引用和访问。这在多分支的情况下非常有用,可将不同分支下相同作用的变量映射为一个输出变量,避免下游节点重复定义。
场景
通过变量聚合,可以将诸如问题分类或条件分支等多路输出聚合为单路,供流程下游的节点使用和操作,简化了数据流的管理。
问题分类后的多路聚合
未添加变量聚合,分类1 和 分类 2 分支经不同的知识库检索后需要重复定义下游的 LLM 和直接回复节点。
问题分类(无变量聚合)
添加变量聚合,可以将两个知识检索节点的输出聚合为一个变量。
问题分类后的多路聚合
IF/ELSE 条件分支后的多路聚合
IF/ELSE 条件分支后的多路聚合
格式要求
变量聚合器支持聚合多种数据类型,包括字符串(String
)、数字(Number
)、文件(File
)对象(Object
)以及数组(Array
)
变量聚合器只能聚合同一种数据类型的变量。若第一个添加至变量聚合节点内的变量数据格式为 String
,后续连线时会自动过滤可添加变量为 String
类型。
聚合分组
开启聚合分组后,变量聚合器可以聚合多组变量,各组内聚合时要求同一种数据类型。
变量赋值
定义
变量赋值节点用于向可写入变量进行变量赋值,已支持以下可写入变量:
用法:通过变量赋值节点,你可以将工作流内的变量赋值到会话变量中用于临时存储,并可以在后续对话中持续引用。
会话变量示例
使用场景示例
通过变量赋值节点,你可以将会话过程中的上下文、上传至对话框的文件(即将上线)、用户所输入的偏好信息等写入至会话变量,并在后续对话中引用已存储的信息导向不同的处理流程或者进行回复。
场景 1
自动判断提取并存储对话中的信息,在会话内通过会话变量数组记录用户输入的重要信息,并在后续对话中让 LLM 基于会话变量中存储的历史信息进行个性化回复。
示例:开始对话后,LLM 会自动判断用户输入是否包含需要记住的事实、偏好或历史记录。如果有,LLM 会先提取并存储这些信息,然后再用这些信息作为上下文来回答。如果没有新的信息需要保存,LLM 会直接使用自身的相关记忆知识来回答问题。
自动判断提取并存储对话中的信息
配置流程:
1、设置会话变量:首先设置一个会话变量数组 memories
,类型为 array[object],用于存储用户的事实、偏好和历史记录。
2、判断和提取记忆:
- 添加一个条件判断节点,使用 LLM 来判断用户输入是否包含需要记住的新信息。
- 如果有新信息,走上分支,使用 LLM 节点提取这些信息。
- 如果没有新信息,走下分支,直接使用现有记忆回答。
3、变量赋值/写入:
- 在上分支中,使用变量赋值节点,将提取出的新信息追加(append)到
memories
数组中。 - 使用转义功能将 LLM 输出的文本字符串转换为适合存储在 array[object] 中的格式。
4、变量读取和使用:
- 在后续的 LLM 节点中,将
memories
数组中的内容转换为字符串,并插入到 LLM 的提示词 Prompts 中作为上下文。 - LLM 使用这些历史信息来生成个性化回复。
图中的 code 节点代码如下:
1、将字符串转义为 object
import json
def main(arg1: str) -> object:
try:
# Parse the input JSON string
input_data = json.loads(arg1)
# Extract the memory object
memory = input_data.get("memory", {})
# Construct the return object
result = {
"facts": memory.get("facts", []),
"preferences": memory.get("preferences", []),
"memories": memory.get("memories", [])
}
return {
"mem": result
}
except json.JSONDecodeError:
return {
"result": "Error: Invalid JSON string"
}
except Exception as e:
return {
"result": f"Error: {str(e)}"
}
2、将 object 转义为字符串
import json
def main(arg1: list) -> str:
try:
# Assume arg1[0] is the dictionary we need to process
context = arg1[0] if arg1 else {}
# Construct the memory object
memory = {"memory": context}
# Convert the object to a JSON string
json_str = json.dumps(memory, ensure_ascii=False, indent=2)
# Wrap the JSON string in <answer> tags
result = f"<answer>{json_str}</answer>"
return {
"result": result
}
except Exception as e:
return {
"result": f"<answer>Error: {str(e)}</answer>"
}
场景 2
记录用户的初始偏好信息,在会话内记住用户输入的语言偏好,在后续对话中持续使用该语言类型进行回复。
示例:用户在对话开始前,在 language
输入框内指定了 “中文”,该语言将会被写入会话变量,LLM 在后续进行答复时会参考会话变量中的信息,在后续对话中持续使用”中文”进行回复。
记录用户的初始偏好信息
配置流程:
设置会话变量:首先设置一个会话变量 language
,在会话流程开始时添加一个条件判断节点,用来判断 language
变量的值是否为空。
变量写入/赋值:首轮对话开始时,若 language
变量值为空,则使用 LLM 节点来提取用户输入的语言,再通过变量赋值节点将该语言类型写入到会话变量 language
中。
变量读取:在后续对话轮次中 language
变量已存储用户语言偏好。在后续对话中,LLM 节点通过引用 language 变量,使用用户的偏好语言类型进行回复。
场景 3
辅助 Checklist 检查,在会话内通过会话变量记录用户的输入项,更新 Checklist 中的内容,并在后续对话中检查遗漏项。
示例:开始对话后,LLM 会要求用户在对话框内输入 Checklist 所涉及的事项,用户一旦提及了 Checklist 中的内容,将会更新并存储至会话变量内。LLM 会在每轮对话后提醒用户继续补充遗漏项。
辅助 Checklist 检查
配置流程:
1、设置会话变量: 首先设置一个会话变量 ai_checklist
,在 LLM 内引用该变量作为上下文进行检查。
2、变量赋值/写入: 每一轮对话时,在 LLM 节点内检查 ai_checklist
内的值并比对用户输入,若用户提供了新的信息,则更新 Checklist 并将输出内容通过变量赋值节点写入到 ai_checklist
内。
3、变量读取: 每一轮对话读取 ai_cheklist
内的值并比对用户输入直至所有 checklist 完成。
使用变量赋值节点
点击节点右侧 + 号,选择”变量赋值”节点,填写”赋值的变量”和”设置变量”。
变量赋值节点设置
设置变量:
赋值的变量:选择被赋值变量,即指定需要被赋值的目标会话变量。
设置变量:选择需要赋值的变量,即指定需要被转换的源变量。
以上图赋值逻辑为例:将上一个节点的文本输出项 Language Recognition/text
赋值到会话变量 language
内。
指定变量的写入模式
目标变量的数据类型将影响变量的写入模式。以下是不同变量间的写入模式:
1、目标变量的数据类型为 String
。
- 覆盖,将源变量直接覆盖至目标变量
- 清空,清空所选中变量中的内容
- 设置,手动指定一个值,无需设置源变量
2、目标变量的数据类型为 Number
。
- 覆盖,将源变量直接覆盖至目标变量
- 清空,清空所选中变量中的内容
- 设置,手动指定一个值,无需设置源变量
- 数字处理,对目标变量进行
加减乘除
操作
3、目标变量的数据类型为 Object
。
- 覆盖,将源变量的内容直接覆盖至目标变量
- 清空,清空所选中变量中的内容
- 设置,手动指定一个值,无需设置源变量
4、目标变量的数据类型为 Array
。
- 覆盖,将源变量的内容直接覆盖至目标变量
- 清空,清空所选中变量中的内容
- 追加,在目标的数组变量中添加一个新的元素
- 扩展,在目标的数组变量中添加新的数组,即一次性添加多个元素
迭代
定义
对数组中的元素依次执行相同的操作步骤,直至输出所有结果,可以理解为任务批处理器。迭代节点通常配合数组变量使用。
例如在长文翻译迭代节点内,如果将所有内容输入至 LLM 节点,有可能会达到单次对话限制。上游节点可以先将长文拆分为了多个片段,配合迭代节点对各个片段执行批量翻译,以避免达到 LLM 单次对话的消息限制。
功能简介
使用迭代的条件是确保输入值已格式化为列表对象;迭代节点将依次处理迭代开始节点数组变量内的所有元素,每个元素遵循相同的处理步骤,每轮处理被称为一个迭代,最终输出处理结果。
迭代节点的结构通常包含输入变量、迭代工作流、输出变量三个功能单元。
输入变量: 仅接受 Array 数组变量类型数据。如果你不了解什么是数组变量,请阅读 扩展阅读:数组。
迭代工作流: 你可以在迭代节点中使用多个工作流节点,编排不同的任务步骤。
输出变量: 仅支持输出数组变量 Array[List]
。如果你想要输出其它变量格式,请阅读 扩展阅读:如何将数组转换为文本。
场景
示例1:长文章迭代生成器
1、在 开始节点 内添加输入故事标题、大纲变量,提示用户手动输入初始信息
2、使用 LLM 节点 基于用户输入的故事标题和大纲,让 LLM 开始编写内容
3、使用 参数提取节点 将 LLM 输出的完整内容转换成数组格式
4、通过 迭代节点 包裹的 LLM 节点 循环多次生成各章节内容
5、将 直接回复 节点添加在迭代节点内部,实现在每轮迭代生成之后流式输出
具体配置步骤
1、在 开始节点 配置故事标题(title)和大纲(outline);
2、选择 LLM 节点 基于用户输入的故事标题和大纲,让 LLM 开始编写文本;
3、选择 参数提取节点,将故事文本转换成为数组(Array)结构。提取参数为 sections
,参数类型为 Array[Object]
参数提取效果受模型推理能力和指令影响,使用推理能力更强的模型,在指令内增加示例可以提高参数提取的效果。
4、将数组格式的故事大纲作为迭代节点的输入,在迭代节点内部使用 LLM 节点 进行处理
在 LLM 节点内配置输入变量 GenerateOverallOutline/output
和 Iteration/item
迭代的内置变量:items[object]
和 index[number]
items[object] 代表以每轮迭代的输入条目;
index[number] 代表当前迭代的轮次;
5、在迭代节点内部配置 直接回复节点 ,可以实现在每轮迭代生成之后流式输出。
6、完整调试和预览
示例 2:长文章迭代生成器(另一种编排方式)
1、在 开始节点 内输入故事标题和大纲
2、使用 LLM 节点 生成文章小标题,以及小标题对应的内容
3、使用 代码节点 将完整内容转换成数组格式
4、通过 迭代节点 包裹的 LLM 节点 循环多次生成各章节内容
5、使用 模板转换 节点将迭代节点输出的字符串数组转换为字符串
6、在最后添加 直接回复节点 将转换后的字符串直接输出
高级功能
并行模式
迭代节点支持并行模式,开启后将有效提升迭代节点的整体运行效率。
下图是迭代节点开启或关闭并行模式的运行效果对比。
并行模式下的最高并行轮数为 10,这意味着单位时间内最多可以同时运行 10 个任务。如果需要处理超过 10 个任务,前 10 个元素将率先同时运行,前排任务处理完成后将继续处理剩余任务。
开启并行模式后,不再建议在迭代节点内放置直接回答、变量赋值和工具节点。此举可能会造成异常情况。
错误响应方法
迭代节点通常需要处理大量任务,有时会在处理某个元素时发生错误。为了避免某个元素异常而中断所有任务,你可以在错误响应方法中设置异常的应对方法:
- 错误时终止。如果发现异常输出,终止迭代节点,输出错误信息。
- 忽略错误并继续。忽略异常信息,继续处理剩余元素。输出的信息中包含正确信息,异常信息为空值。
- 移除错误输出。忽略异常信息,继续处理剩余元素。输出的信息中仅包含正确信息。
迭代节点的输入变量与输出变量相对应。例如输入变量为 [1,2,3] ,则输出变量同样为 [result-1, result-2, result-3]。
如果选择了忽略错误并继续, 异常情况的输出值为 null 值,例如 [result-1, null, result-3];
如果选择了移除错误输出, 将不会输出异常变量,例如 [result-1, result-3]。
扩展阅读
如何生成数组变量?
你可以通过以下节点生成数组变量,用以充当迭代节点的输入变量:
1、代码节点
2、参数提取
3、知识库检索
4、迭代
6、HTTP 请求
如何将数组转换为文本
迭代节点的输出变量为数组格式,无法直接输出 String 字符串内容。你可以使用一个简单的步骤将数组转换回文本。
使用代码节点转换
代码示例:
def main(articleSections: list):
data = articleSections
return {
"result": "\n".join(data)
}
使用模板节点转换
代码示例:
{{ articleSections | join("\n") }}
参数提取
定义
利用 LLM 从自然语言推理并提取结构化参数,用于后置的工具调用或 HTTP 请求。
Dify 工作流内提供了丰富的工具选择,其中大多数工具的输入为结构化参数,参数提取器可以将用户的自然语言转换为工具可识别的参数,方便工具调用。
工作流内的部分节点有特定的数据格式传入要求,如迭代节点的输入要求为数组格式,参数提取器可以方便的实现结构化参数的转换。
场景
1、从自然语言中提供工具所需的关键参数提取,如构建一个简单的对话式 Arxiv 论文检索应用。
在该示例中:Arxiv 论文检索工具的输入参数要求为 论文作者 或 论文编号,参数提取器从问题”这篇论文中讲了什么内容:2405.10739”中提取出论文编号 2405.10739,并作为工具参数进行精确查询。
2、将文本转换为结构化数据,如长故事迭代生成应用中,作为迭代节点的前置步骤,将文本格式的章节内容转换为数组格式,方便迭代节点进行多轮生成处理。
3、提取结构化数据并使用 HTTP 请求 ,可请求任意可访问的 URL ,适用于获取外部检索结果、webhook、生成图片等情景。
如何配置
配置步骤
1、选择输入变量,一般为用于提取参数的变量输入。输入变量支持 file
2、选择模型,参数提取器的提取依靠的是 LLM 的推理和结构化生成能力
3、定义提取参数,可以手动添加需要提取的参数,也可以从已有工具中快捷导入
4、编写指令,在提取复杂的参数时,编写示例可以帮助 LLM 提升生成的效果和稳定性
高级设置
推理模式
部分模型同时支持两种推理模式,通过函数/工具调用或是纯提示词的方式实现参数提取,在指令遵循能力上有所差别。例如某些模型在函数调用效果欠佳的情况下可以切换成提示词推理。
1)Function Call/Tool Call
2)Prompt
记忆
开启记忆后问题分类器的每次输入将包含对话中的聊天历史,以帮助 LLM 理解上文,提高对话交互中的问题理解能力。
图片
开启图片
输出变量
- 提取定义的变量
- 节点内置变量
__is_success Number 提取是否成功
成功时值为 1,失败时值为 0。
__reason String
提取错误原因
HTTP 请求
定义
允许通过 HTTP 协议发送服务器请求,适用于获取外部数据、webhook、生成图片、下载文件等情景。它让你能够向指定的网络地址发送定制化的 HTTP 请求,实现与各种外部服务的互联互通。
该节点支持常见的 HTTP 请求方法:
1)GET,用于请求服务器发送某个资源。
2)POST,用于向服务器提交数据,通常用于提交表单或上传文件。
3)HEAD,类似于 GET 请求,但服务器不返回请求的资源主体,只返回响应头。
4)PATCH,用于在请求-响应链上的每个节点获取传输路径。
5)PUT,用于向服务器上传资源,通常用于更新已存在的资源或创建新的资源。
6)DELETE,用于请求服务器删除指定的资源。
你可以通过配置 HTTP 请求的包括 URL、请求头、查询参数、请求体内容以及认证信息等。
场景
这个节点的一个实用特性是能够根据场景需要,在请求的不同部分动态插入变量。比如在处理客户评价请求时,你可以将用户名或客户ID、评价内容等变量嵌入到请求中,以定制化自动回复信息或获取特定客户信息并发送相关资源至特定的服务器。
HTTP 请求的返回值包括响应体、状态码、响应头和文件。值得注意的是,如果响应中包含了文件,这个节点能够自动保存文件,供流程后续步骤使用。这样不仅能提高处理效率,也可以更加简单直接地处理带有文件的响应。
发送文件
你可以使用 HTTP PUT 请求将应用内的文件发送至其它 API 服务。在请求的 Body 中,可以在 binary
内选中文件变量。这种方式常用于文件传输、文档存储或媒体处理等场景。
示例: 假设你正在开发一个文档管理应用,需要将用户上传的 PDF 文件同步发送第三方服务,可以通过 HTTP 请求节点通过文件变量进行传递。
配置示例如下:
高级功能
错误重试
针对节点发生的部分异常情况,通常情况下再次重试运行节点即可解决。开启错误重试功能后,节点将在发生错误的时候按照预设策略进行自动重试。你可以调整最大重试次数和每次重试间隔以设置重试策略。
- 最大重试次数为 10 次
- 最大重试间隔时间为 5000 ms
异常处理
HTTP 节点处理信息时有可能会遇到网络请求超时、请求限制等异常情况。应用开发者可以参考以下步骤配置异常分支,在节点出现异常时启用应对方案,而避免中断整个流程。
- 在 HTTP 节点启用 “异常处理”
- 选择异常处理方案并进行配置
需了解更多应对异常的处理办法,请参考异常处理。
Agent
定义
Agent 节点是 Dify Chatflow/Workflow 中用于实现自主工具调用的组件。它通过集成不同的 Agent 推理策略,使大语言模型能够在运行时动态选择并执行工具,从而实现多步推理。
配置步骤
添加节点
在 Dify Chatflow/Workflow 编辑器中,从组件栏拖拽 Agent 节点至画布。
选择 Agent 策略
在节点配置面板中,点击 Agent 策略。
从下拉菜单选择所需的 Agent 推理策略。Dify 内置了 Function Calling 和 ReAct 两种策略,可在 Marketplace → Agent 策略分类中安装使用。
1. Function Calling
通过将用户指令映射到预定义函数或工具,LLM 先识别用户意图,再决定调用哪个函数并提取所需参数。它的核心是调用外部函数或工具,属于一种明确的工具调用机制。
优点:
1)精确: 对于明确的任务,可以直接调用相应的工具,无需复杂的推理过程。
2)易于集成外部功能: 可以将各种外部 API 或工具封装成函数供模型调用。
3)结构化输出: 模型输出的是结构化的函数调用信息,方便下游节点处理。
2、ReAct (Reason + Act)
ReAct 策略使 Agent 交替进行思考和行动:LLM 首先思考当前状态和目标,然后选择并调用合适的工具,工具的输出结果又将引导 LLM 进行下一步的思考和行动,如此循环,直到问题解决。
优点:
1)有效利用外部信息: 能够有效地利用外部工具获取信息,解决仅靠模型自身无法完成的任务。
2)可解释性较好: 思考和行动的过程是交织的,可以一定程度上追踪 Agent 的推理路径。
3)适用范围广: 适用于需要外部知识或需要执行特定操作的场景,例如问答、信息检索、任务执行等。
开发者可以向公开仓库贡献 Agent 策略插件,经过审核后将在 Marketplace 上架,供其他用户安装使用。
配置节点参数
选择 Agent 策略后,配置面板会显示对应的配置项。Dify 官方内置的 Function Calling 和 ReAct 策略的配置项包括:
1、模型: 选择驱动 Agent 的大语言模型。
2、工具: 工具的使用方式由 Agent 策略定义,点击 ”+” 添加并配置 Agent 可调用的工具。
- 搜索: 在下拉框中选择已安装的工具插件。
- 授权: 填写 API 密钥等授权信息后启用工具。
- 工具描述和参数设置: 提供工具描述,帮助 LLM 理解工具用途并选择调用,同时设置工具的功能参数。
3、指令: 定义 Agent 的任务目标和上下文。支持使用 Jinja 语法引用上游节点变量。
4、查询: 接收用户输入。
5、最大迭代次数: 设定 Agent 的最大执行步数。
6、输出变量: 提示节点输出的数据结构。
查看日志
Agent 节点执行过程中将生成详细日志。显示节点执行的总体信息,包括输入和输出、token 开销、耗时和状态。点击 “详情” 查看 Agent 策略执行的每一轮输出信息。
记忆
启用记忆开关可以为 Agent 提供对话上下文记忆能力。通过调整记忆窗口滑块,你可以控制 Agent 能够“记住”的对话历史消息数量。这使 Agent 能够理解和引用先前的交流内容,从而提供连贯且上下文相关的回答,大幅提升多轮对话体验。
例如,当用户在后续消息中使用代词(如“它”、“这个”或“他们”)时,启用了记忆功能的 Agent 能够理解这些代词所指代的前文实体,无需用户重复提及完整信息。
工具
“工具”节点可以为工作流提供强大的第三方能力支持,分为以下三种类型:
1)内置工具,Dify 第一方提供的工具,使用该工具前可能需要先给工具进行 授权。
2)自定义工具,通过 OpenAPI/Swagger 标准格式导入或配置的工具。如果内置工具无法满足使用需求,你可以在 Dify 菜单导航 —工具 内创建自定义工具。
3)工作流,你可以编排一个更复杂的工作流,并将其发布为工具。详细说明请参考工具配置说明。
添加并使用工具节点
添加节点时,选择右侧的 “工具” tab 页。配置工具节点一般分为两个步骤:
1、对工具授权/创建自定义工具/将工作流发布为工具
2、配置工具输入和参数
工具选择
工具节点可以连接其它节点,通过变量处理和传递数据。
配置 Google 搜索工具检索外部知识
高级功能
错误重试
针对节点发生的部分异常情况,通常情况下再次重试运行节点即可解决。开启错误重试功能后,节点将在发生错误的时候按照预设策略进行自动重试。你可以调整最大重试次数和每次重试间隔以设置重试策略。
- 最大重试次数为 10 次
- 最大重试间隔时间为 5000 ms
错误重试配置
异常处理
工具节点处理信息时有可能会遇到异常情况,导致流程中断。应用开发者可以参考以下步骤配置异常分支,在节点出现异常时启用应对方案,而避免中断整个流程。
- 在工具节点启用 “异常处理”
- 选择异常处理方案并进行配置
异常处理配置
需了解更多应对异常的处理办法,请参考异常处理。
将工作流应用发布为工具
工作流应用可以被发布为工具,并被其它工作流内的节点所应用。关于如何创建自定义工具和配置工具,请参考工具配置说明。
结束
定义
定义一个工作流程结束的最终输出内容。每一个工作流在完整执行后都需要至少一个结束节点,用于输出完整执行的最终结果。
结束节点为流程终止节点,后面无法再添加其他节点,工作流应用中只有运行到结束节点才会输出执行结果。若流程中出现条件分叉,则需要定义多个结束节点。
结束节点需要声明一个或多个输出变量,声明时可以引用任意上游节点的输出变量。
Chatflow 内不支持结束节点。
场景
在以下长故事生成工作流中,结束节点声明的变量 Output
为上游代码节点的输出,即该工作流会在 Code3 节点执行完成之后结束,并输出 Code3 的执行结果。
单路执行示例:
多路执行示例:
直接回复
定义
定义一个 Chatflow 流程中的回复内容。
你可以在文本编辑器中自由定义回复格式,包括自定义一段固定的文本内容、使用前置步骤中的输出变量作为回复内容、或者将自定义文本与变量组合后回复。
可随时加入节点将内容流式输出至对话回复,支持所见即所得配置模式并支持图文混排,如:
1、输出 LLM 节点回复内容
2、输出生成图片
3、输出纯文本
示例1: 输出纯文本
示例2: 输出图片+LLM回复
直接回复节点可以不作为最终的输出节点,作为流程过程节点时,可以在中间步骤流式输出结果。
循环
简介
循环(Loop)节点用于执行依赖前一轮结果的重复任务,直到满足退出条件或达到最大循环次数。
循环节点与迭代节点有什么区别?
循环节点和迭代节点在任务处理上的定位不同:
类型 | 特点 | 适用场景 |
---|---|---|
循环(Loop) | 轮次之间存在依赖关系的优化型任务。即任务的每一轮执行都依赖上一轮的结果。 | 需要前一轮的计算结果。 |
迭代(Iteration) | 轮次之间无依赖关系的批处理任务。即每一轮任务可以独立运行,无需依赖前一轮。 | 每轮独立执行。 |
如何配置循环节点?
循环节点包含以下三个关键配置项和一个子节点:
配置项/子节点 | 作用 | 示例 |
---|---|---|
循环终止条件(Loop Termination Condition) | 设置循环何时停止。 | 例:当变量 x < 50 时,停止循环。 |
最大循环次数(Maximum Loop Count) | 限制最多执行的轮次,避免无限循环。 | 例:最多执行 10 轮,不管是否满足退出条件。 |
循环变量(Loop Variables) | 用于在循环的不同轮次间传递数据,并在循环结束后继续供下游节点使用。 | 例:变量 x < 50 在每轮循环中递增 1,循环体内部可以基于 x < 50 进行计算,循环结束后,x < 50 的最终值可用于后续流程。 |
退出循环节点(Exit Loop) | 当循环体内运行到此节点后,循环终止。 | 例:最多执行 10 轮,不管是否满足退出条件。 |
退出循环节点 与 循环终止条件 均可作为循环的终止触发点,满足任意一个条件时,循环都会提前退出。
如果未配置任何退出条件,则循环将持续运行(相当于 while (true)),直到达到 最大循环次数。
示例一:如何使用循环节点?
需求:生成 1-100 的随机数,直到随机数小于 50 时停止。
实现步骤:
1、在 循环 节点中,配置 循环终止条件,为 模板转换 节点输出 done
。
2、使用 代码执行 节点生成 1-100
的随机数。
3、使用 条件分支 节点判断随机数是否大于 50
:
-
如果大于或等于 50,输出
当前数字
并继续循环,生成新的随机数。 -
如果小于 50,输出
最终输出数字
,并经由 模板转换 节点输出done
,结束循环。
4、循环将在随机数小于 50
时自动停止。
示例二:如何使用循环变量与退出循环节点?
需求:通过一个循环工作流生成并逐步重写一首诗,每次输出都基于上一轮的结果。循环执行 4 次后自动停止。
实现步骤:
1、在 循环 节点中,配置 循环变量,用于在每次迭代中传递数据:
-
num(循环次数):初始值为 0,每次循环 +1。
-
verse(诗歌内容):初始值
I haven’t started creating yet
,后续每次循环更新。
2、使用 条件分支 节点判断循环次数是否大于 3
:
-
如果大于 3,则进入 退出循环 节点,结束循环。
-
如果小于或等于 3,则进入 LLM 节点继续循环。
3、使用 LLM 节点,要求模型根据用户的输入和过往的创作输出诗歌内容。
参考 Prompt:
-
使用用户的输出
sys.query
作为灵感,创作一首欧洲长诗。 -
参考你上一次的创作
verse
,尝试在新的诗句中展现进步和创新。 -
确保你的诗句符合欧洲文学的风格和传统,注重诗歌的韵律和意境。
在第一次循环时,verse 为 I haven’t started creating yet
,之后每次循环根据上一轮的输出更新诗歌。每次模型生成的新诗歌都会覆盖 verse 变量,供下一次循环使用。
4、使用 变量赋值 节点,在每次循环后更新循环中的变量:
-
更新 num 变量,每次循环 +1。
-
更新 verse 变量为模型新生成的诗歌内容,直接覆盖前一轮循环的诗歌内容。
5、输入你的诗歌灵感,模型将输出四个版本的诗歌,每一篇诗歌都以前一篇为基础而产生。