“Dify 工作流”(即 Dify 的 Workflow)是 Dify 平台最核心的功能之一,它在 AI 应用中负责 流程编排(orchestration) —— 让多个模型调用、工具调用、逻辑节点、变量流转有序地运行。
用一个架构师视角来讲解:
Dify 工作流的原理、执行机制、核心组件与数据流动。
🧩 一、Dify 工作流是什么?
Dify 的工作流是一种 可视化的多节点任务编排系统,允许用户:
- 拖拽组件(如 LLM 调用、条件判断、API 调用、Python 脚本等)
- 设置输入输出参数
- 形成一条从“输入 → 推理 → 输出”的流程图
最终可以发布成一个 API接口、对话机器人或后台自动任务。
类似于:
LangChain + Airflow + UI 编排器 + 状态管理系统 的综合体。
⚙️ 二、工作流执行的基本原理
Dify 的工作流是基于 有向无环图(DAG, Directed Acyclic Graph) 原理构建的。
每一个节点(Node)代表一个任务单元,每条边(Edge)代表数据流。
工作流执行时遵循以下过程:
用户输入
↓
Start Node (开始节点)
↓
[Node1] → [Node2] → [Node3]
↓
End Node (结束节点)
执行引擎根据依赖关系:
- 解析整个 DAG;
- 从 可执行的节点 开始执行;
- 将节点输出注入后续节点;
- 直到流程结束或异常中断。
🧠 三、核心原理模块详解
1️⃣ Workflow Engine (工作流执行引擎)
负责解析、执行整个流程:
- 构建 DAG(每个节点、输入输出变量)
- 管理执行上下文(Context)
- 控制节点并行/串行执行
- 捕获异常与中断
- 调用 LLM、工具、插件、API
底层实现类似于“状态机” + “任务调度器”。
2️⃣ Node (节点类型)
| 节点类型 | 功能说明 |
|---|---|
| Start / End | 工作流的入口与出口 |
| LLM Node | 调用语言模型(OpenAI、Claude、Moonshot、DeepSeek等) |
| Tool Node | 使用工具(RAG检索、HTTP请求、函数调用) |
| Condition Node | 条件分支判断(if/else) |
| Loop Node | 循环执行(例如批量处理) |
| Code Node | 运行自定义 Python 代码(安全沙箱) |
| Knowledge Node | 检索知识库数据(向量数据库) |
| Parallel Node | 并行执行多个子节点 |
每个 Node 都定义了:
- 输入参数(inputs)
- 执行逻辑(handler)
- 输出参数(outputs)
- 执行状态(pending / running / done / failed)
3️⃣ Context & Variables (上下文与变量)
工作流执行时,会维护一个 上下文(context) 对象,类似于全局字典:
{
"user_input": "帮我总结这篇文章",
"retrieved_docs": [...],
"summary": "文章主要讲...",
}
节点之间通过变量引用来传递数据:
${ { user_input }}${ { llm_output.text }}${ { loop.item.name }}
这个机制与 Jinja 模板语法非常相似。
4️⃣ 数据流与执行流
Dify 的数据流是单向的:
- 上游节点的输出 → 下游节点的输入。
- 节点之间通过变量引用而非直接函数调用。
执行流是 事件驱动 的:
- 当前节点执行完毕 → 触发事件 → 通知可执行节点。
- 异常时进入“错误流”或重试机制。
5️⃣ State & Storage (状态管理)
Dify 工作流的执行状态会被持久化在数据库中(如 PostgreSQL),包括:
- 每个节点的执行状态(运行中 / 完成 / 错误)
- 上下文变量(Context Snapshot)
- 日志信息(LLM 调用日志、Token 消耗等)
- 用户会话信息(用于对话式工作流)
这保证了工作流可以:
- 恢复中断执行
- 支持回放调试
- 查看历史运行轨迹
🔄 四、运行机制流程(可视化理解)
┌──────────────┐
│ Workflow JSON│ ← 用户在可视化界面定义的DAG
└──────┬───────┘
│
▼
┌──────────────┐
│ Workflow Engine│ ← 解析JSON为执行图
└──────┬───────┘
│
▼
┌──────────────┐
│ Execution Context│ ← 保存变量、状态
└──────┬───────┘
│
▼
┌──────────────┐
│ Node Executor│ ← 执行LLM、工具、条件分支等
└──────┬───────┘
│
▼
┌──────────────┐
│ State Recorder│ ← 持久化执行结果和日志
└──────────────┘
🔌 五、与其他系统的关系
| 模块 | 在 Dify 中的作用 |
|---|---|
| LLM Provider | 执行智能推理(OpenAI、Anthropic、DeepSeek等) |
| RAG(检索增强生成) | 从知识库中取内容注入上下文 |
| Celery / Worker | 异步任务执行(执行工作流节点) |
| PostgreSQL / Redis | 状态存储、缓存、幂等性控制 |
| API Gateway | 对外暴露执行接口(/v1/workflows/run) |
🧩 六、技术栈
Dify 的核心是 Python + FastAPI + Celery + PostgreSQL
关键技术模块如下:
| 模块 | 说明 |
|---|---|
| FastAPI | 提供 RESTful API 接口 |
| Celery | 异步任务调度器(工作流节点执行) |
| SQLAlchemy | ORM 数据访问 |
| Redis | 任务缓存与锁 |
| JSON Schema | 定义工作流节点结构 |
| Jinja2 | 模板变量解析 |
| Pydantic | 参数验证与模型管理 |
🚀 七、实际运行举例
假设一个简单工作流:
用户输入一句话 → 检索知识 → 让 LLM 总结 → 输出结果。
流程:
- Start Node
接收输入"什么是金融评估?" - Knowledge Node
查询向量数据库,得到相关资料。 - LLM Node
把资料和问题拼成 prompt 调用 GPT。 - End Node
输出 LLM 的回答。
运行时会生成执行日志:
{
"workflow_id": "12345",
"run_id": "r-20251014-001",
"status": "success",
"context": {
"input": "什么是金融评估?",
"retrieved_docs": ["金融评估是..."],
"answer": "金融评估是指..."
}
}
📘 八、小结
| 模块 | 功能 |
|---|---|
| Workflow Engine | 管理执行流程 |
| Node | 执行单元(LLM、API、条件、循环等) |
| Context | 保存变量与状态 |
| Storage | 记录执行结果 |
| Orchestrator | 控制并发与依赖关系 |
| UI Editor | 可视化编排 |
一句话总结:
Dify 工作流是一个基于 DAG 的智能任务编排系统,结合 LLM 推理、工具调用与上下文管理,实现了“低代码 AI 应用编排引擎”。
dataset(数据集)是 Dify 中非常关键的一个核心概念 —— 它是 RAG(检索增强生成, Retrieval-Augmented Generation)机制的基础,相当于 Dify 的“知识库”或“语料源”。
下面我会用一个系统架构 + 实战结合的角度,详细讲清楚:
💡 什么是 Dify 的 dataset、它的内部原理、作用、在工作流中的角色、以及与 LLM/RAG 的关系。
🧩 一、Dataset 是什么?
在 Dify 中,Dataset(数据集) 就是一个经过结构化管理的“知识库”,
用于支持 LLM 的“带知识生成”(RAG)。
简单来说:
Dataset = 文档集合 + 分块规则 + 向量索引 + 检索策略。
例如:
- 你上传一份《金融评估准则.pdf》
- Dify 会将其拆分、嵌入成向量,存入数据库和向量存储
- 当模型回答与“金融评估”相关的问题时,会先从该 dataset 中检索出相关片段
- 然后将这些内容注入 prompt,让模型“带知识回答”
⚙️ 二、Dataset 的结构组成
Dify 的 dataset 由多层对象构成(在数据库中有独立表结构):
| 组件 | 作用 | 典型表 |
|---|---|---|
| Dataset | 数据集本体,元信息 | dataset |
| Document | 上传的文档(PDF、TXT、网页等) | dataset_document |
| Document Segment / Chunk | 文档分块后的文本片段 | dataset_document_segment |
| Vector | 文本嵌入后的向量表示 | 存储在向量库(如 Milvus, PgVector, Qdrant) |
| Index / Embedding Model | 向量化的模型与参数信息 | dataset_process_rule, dataset_index |
| Query / Record | 每次检索与生成的历史记录 | dataset_query, dataset_query_result |
🧠 三、Dataset 的工作原理(RAG 流程)
当一个用户的问题涉及 dataset 时,Dify 的流程如下 👇
1️⃣ 文档入库阶段
当你上传或导入一个文档时:
- 文件被切分成多个小片段(chunk)
- 每个 chunk 被调用嵌入模型(embedding model)向量化
- 向量和原文被存入向量数据库(Vector Store)
例如:
{
"chunk_id": "C001",
"text": "金融评估是指在特定目的下...",
"vector": [0.123, 0.987, ...],
"metadata": {
"source": "准则.pdf", "page": 5}
}
2️⃣ 问答阶段(检索增强生成)
当 LLM 收到用户问题时:
- 将用户问题向量化
- 从 dataset 的向量库中检索出最相似的内容
- 将检索结果拼接进 prompt 模板中
- 把完整 prompt 发给模型生成回答
示意图:
User Question → Embedding → Vector Search → Relevant Chunks
↓ ↓
Prompt 构造 ←--------------------------+
↓
LLM 生成 → 输出增强答案
3️⃣ 内部执行节点示意(在工作流中)
在 Dify Workflow 里,dataset 对应一个特殊节点类型:
🔹
Knowledge Retrieval Node(知识检索节点)
其输入:
{
"query": "{
{ user_input }}"
}
其输出:
{
"retrieved_documents": [
{
"content": "金融评估是指在特定目的下...", "source": "准则.pdf"},
{
"content": "评估结果应当反映市场价值...", "source": "标准第3章"}
]
}
这些输出会传入下一个节点(通常是 LLM Node):
请根据以下资料回答问题:
{
{ retrieved_documents | join('\n') }}
问题:{
{ user_input }}
🧩 四、Dataset 的关键参数与策略
| 配置项 | 含义 | 示例 |
|---|---|---|
| Chunk Size | 每次分块的字符数 | 500 / 1000 |
| Overlap | 分块之间的重叠字符数 | 50 |
| Embedding Model | 向量化模型 | text-embedding-3-large, bge-m3, m3e-base |
| Search Top-K | 检索返回片段数量 | 3 / 5 |
| Similarity Threshold | 相似度阈值 | 0.7 |
| Retrieval Mode | 向量检索 / 关键词检索 / 混合模式 | Hybrid |
1万+




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



