Dify笔记
一、变量
在 Dify 工作流(Workflow 和 Chatflow)的实现中,“变量”做为最基础、最核心的组件发挥着不可或缺的作用,因为它承载了不同节点间数据传递的作用。
1、用户变量
开始节点的输入字段。文本类型限制最大长度256,如果需要长文本(比如提示词)则选择字段类型为段落。
2、系统变量
系统变量是由 Dify 预设的系统级参数,可以被其它节点全局读取,用于记录和管理应用运行过程中的关键信息,以 sys. 前缀开头。
3、环境变量
环境变量用于保护工作流内所涉及的敏感信息,例如运行工作流时所涉及的 API 密钥、数据库密码等。它们被存储在工作流程中,而不是代码中,以便在不同环境中共享。
环境变量支持以下三种数据类型:
- String 字符串
- Number 数字
- Secret 密钥
其中,Secret 密钥用于定义敏感信息或数据,导出 DSL 时设置了防泄露机制。
环境变量拥有以下特性:
环境变量可在大部分节点内全局引用;
环境变量命名不可重复;
环境变量为只读变量,不可写入。
4、节点输出变量
LLM节点、HTTP节点等节点输出变量名和格式固定。
代码执行节点,可以自定义输出变量格式:
- String
- Number
- Array[Number]
- Array[String]
- Array[Object] 通常为字典列表。需要注意,如果代码执行节点输出result类型为Array[Object],则通过/ 确定输入变量时,该变量不会显示。所以需要先将其类型修改为可识别类型,后续节点识别成功之后,再修改回原格式
- Object 即一个字典
二、节点
Dify 工作流,是多个节点的组合。下面对每个节点进行总结:
1、开始
“开始” 节点是每个工作流应用(Chatflow / Workflow)必备的预设节点,为后续工作流节点以及应用的正常流转提供必要的初始信息,例如应用使用者所输入的内容、以及上传的文件等。
在开始节点的设置页,你可以看到两部分设置,分别是 “输入字段” 和预设的系统变量。
2、LLM节点
作为一个 AI Workflow 构建平台,LLM 节点就是 Dify 中最「AI」的一块拼图。Dify 发展至今,LLM 节点已经支持了文字、图片、音频等多模态的输入输出,具备相当高的可用性。
并且,足以与同类竞品拉开差距的一点是,Dify 官方通过 Plugin 的形式维护模型提供商及其模型列表。常见的模型提供商如 OpenAI,Dify 官方已经将提供商的所有可用模型及其参数写入 Plugin 中,用户只需要添加 Key 即可使用,无需像竞品一样手动为模型逐个配置参数。
1.1、构建提示词
在 Dify 的 LLM 节点内,你可以通过 System、User 和 Assistant 三种身份,构建若干轮上文。这一设计非常方便为 LLM 提供 Few-Shots 示例,以更好符合我们的输出要求。
这其中,System 即系统提示词,User 即用户输入的请求。Assistant 即 LLM 做出的回答。在真正的 User Prompt 之前先提供若干轮高质量的 User-Assistant 对话示例,可以极大提高 LLM 输出的稳定性和质量。这种被称为 Few-shots 的方法有点像在提示词里为 LLM 进行临场「训练」,可以让 LLM 对提示词的把握更加精准。
在任何一个提示词文本框内,输入 / 都可以唤起变量面板,以便快速选择需要插入到提示词中的变量。提示词文本框内的所有内容(包括变量)都可被复制、粘贴。当然,变量的粘贴必须确保在相同 Workflow 中,且被粘贴节点的前序调用路径中必须包含这个变量的来源节点。
需要注意的是,尽管你可以在提示词文本框内添加 Array [File] 类型的变量,但是这种用法实际上并不会往提示词中插入内容。如果你需要往提示词中插入文件,你需要先使用「文档提取器」节点或同类插件,将文件解析为字符串。
1.2、结构化输出
结构化输出是将大模型能力应用到实际业务中时,一个非常重要的依赖。传统意义上,大模型输出的内容倾向于非结构化的 Markdown 文本,这方便了作为用户的人类阅读,但对于程序解析却极为不利。
为了解决这个问题,OpenAI 等大模型厂商自很早开始就在增强模型的结构化输出能力。从最原始的 Prompt 约束到后训练对齐,再到通过强制选择 Token 的方式强制模型输出符合要求的 JSON,模型的结构化输出能力越来越稳定,越来越可靠。和参数解析器依赖 Function Call 不同,Dify 的结构化输出没有使用独立节点,而是直接放置在了 LLM 节点中,直接调用模型原生的 Structured Output 能力。对于不支持 Structured Output 能力的模型,Dify 会降级通过 Prompt 方式引导模型,并由 LLM 节点完成 Parse 的任务。
在结构化输出折叠菜单展开后,即可进入 LLM 节点的结构化输出配置选项。我建议通过 JSON Schema 的方式,更明确地规定每一个字段的属性和描述。和代码生成节点类似地,结构化输出的编辑对话框也支持使用 LLM 辅助生成 JSON Schema,但是你同样可以使用任意大模型生成的 JSON Schema,切换到「JSON Schema」选项卡导入,并切换回「可视化编辑」选项卡检查解析结果。
我个人不太推荐直接使用现有的 JSON 导入,因为这样做会丢失 JSON Schema 中每一字段的属性和描述,可能不利于模型生成符合条件的 JSON Output。如果你确有这个需要,可以考虑使用带有推理能力的模型,从现有的 JSON 和你的描述中反推一个 JSON Schema,但请务必亲自检查校对 LLM 提供的 JSON Schema。
当一个 LLM 节点使用 Structured Output 后,其输出除 text 外,还会提供一个 array [object] 类型的变量,后续节点可随时引用。
3、知识检索
从知识库中检索与用户问题相关的文本内容,可作为下游 LLM 节点的上下文来使用。
基本需要设置两个字段:
- 查询变量。即向量库输入query,经过向量化之后,进行向量相似度匹配召回
- 知识库。 即查询向量在哪些知识库进行检索
4、结束
定义一个工作流程结束的最终输出内容。每一个工作流在完整执行后都需要至少一个结束节点,用于输出完整执行的最终结果。
结束节点为流程终止节点,后面无法再添加其他节点,工作流应用中只有运行到结束节点才会输出执行结果。若流程中出现条件分叉,则需要定义多个结束节点。
结束节点需要声明一个或多个输出变量,声明时可以引用任意上游节点的输出变量。
5、Agent
Dfiy文档
Dify 内置了 Function Calling 和 ReAct 两种策略
6、问题分类器
通过定义分类描述,问题分类器能够根据用户输入,使用 LLM 推理与之相匹配的分类并输出分类结果,向下游节点提供更加精确的信息。
官方说明