Ch16: Dify 架构精读——工作流编排与 RAG 模块
Part 3 续:平台专章 前置:Ch07 四大平台总览 后续:Ch17: RAGFlow 完整精读:精读: Dify
结论先行:Dify 的护城河是 Workflow Engine + Model Runtime + Agent Framework,RAG 是标准双路混合(BM25+向量),深度不及 WeKnora,但 「Dify 编排 + WeKnora 检索」 是生产界常见组合。改 WeKnora 时,应向 Dify 学的是:可视化 DAG、条件分支、HTTP 节点集成外部检索。
调研元信息
| 项目 | 值 |
|---|---|
| 仓库 | langgenius/dify |
| Stars | ~144K |
| 栈 | Python Flask + Celery + Next.js |
| 许可 | Apache-2.0(含反 SaaS 竞品条款) |
| RAG 定位 | 能力模块之一,非核心差异化 |
一、设计哲学:低代码 LLM 应用工厂
三个层面:
- 拖拽即开发——产品经理搭「检索 → 判分 → 分支 → 生成」无需写代码。
- 模型即配置——100+ Provider 统一
invoke(),换模型不改业务。 - 生态即壁垒——插件市场形成网络效应。
代价:RAG 深度让位于广度——无图谱第三路、无 RRF、分块较粗、六组件部署重。
二、六组件微服务架构
Web(Next.js) ──► API Server(Flask) ──► PostgreSQL
│
├── Celery Worker(文档摄入、Embedding 异步)
├── Redis(队列/缓存/会话)
└── Nginx
核心引擎层(api/core/)四子系统:
| 子系统 | 职责 | 关键路径 |
|---|---|---|
| Workflow Engine | DAG 执行、13 种节点 | core/workflow/ |
| RAG Pipeline | 摄入、分块、混合检索 | core/rag/ |
| Model Runtime | 多模型适配 | core/model_runtime/ |
| Agent Framework | ReAct / Function Calling | core/agent/ |
三、Workflow Engine:13 种节点
节点以 JSON DSL 存储,数据传递:{{#node_id.output_key#}}。
| 节点 | RAG 场景用途 |
|---|---|
| 知识检索 | 内置 BM25+向量 |
| LLM | 生成答案 |
| 条件分支 | 检索分数低于阈值 → 改写 query |
| HTTP 请求 | 调用 WeKnora API 替代内置检索 |
| 迭代 | 多文档批处理 |
| 问题分类器 | 路由到不同知识库 |
| 代码执行 | 自定义后处理 |
限制:无原生循环(防死循环),复杂 Agentic 需迭代节点或 Agent 模式。
半 Agentic 工作流示例(概念)
开始 → 问题分类器 → [技术FAQ] 知识检索(WeKnora HTTP)
→ [闲聊] 直接 LLM
→ LLM 生成 → 条件分支(faithfulness?)
→ [低] 参数提取(子问题) → 迭代检索 → LLM
→ [高] 结束
四、RAG Pipeline 四模式
| 模式 | 机制 | 适用 |
|---|---|---|
| 向量 | 纯 embedding | 概念问答 |
| 全文 | BM25 | 错误码、参数名 |
| 混合 | 可调权重 BM25+向量 + 可选 Rerank | 默认推荐 |
| 经济 | 先关键词过滤再向量 | 大库降本 |
与 WeKnora 差距:加权融合 vs RRF;单 Rerank vs 复合三信号;无双路外的图谱路。
五、Agent Framework
| 模式 | 特点 | 何时用 |
|---|---|---|
| ReAct | 思考-行动可解释 | 调试、复杂工具链 |
| Function Calling | 结构化 tool call | 模型能力强、要低延迟 |
Agent 可挂载知识库 Tool——本质是封装检索节点。与 Ch12 Agentic RAG 对照:Dify 把 Agent 产品化,WeKnora 通过 MCP 暴露 Tool 给外部 Agent。
六、Dify + WeKnora 集成模式
# Dify HTTP 节点配置示意
method: POST
url: https://weknora.example/api/v1/search
headers:
Authorization: Bearer ${WEKNORA_KEY}
body:
query: "{{#start.query#}}"
top_k: 5
工作流内可对 score 做条件分支,实现 WeKnora 裸 API 难表达的 检索质量门控。
七、贡献与学习路径
| 目标 | 建议 |
|---|---|
| 学编排 | 本地 Docker Compose 搭 Dify,复现「检索-分支-生成」 |
| 改 WeKnora | 借鉴条件分支与 HTTP 集成文档,非 fork Dify |
| 犀牛鸟 | WeKnora 为主;Dify 作竞品分析引用 |
章末自检
- 画出 Dify 六组件及数据流
- 列出 Workflow 中 4 种与 RAG 直接相关的节点
- 说明混合检索与 WeKnora 三路+RRF 的三处差异
- 设计一个 HTTP 节点调用 WeKnora 的最简工作流(5 节点内)