1. 背景

Dify 是一个面向 LLM 应用开发的开源平台。它不是单一的聊天应用,也不是单纯的模型调用 SDK,而是一套把 模型接入应用编排知识库/RAGAgent工作流可观测性多租户控制台对外 API 组合在一起的完整工程系统。

如果从“学习一个仓库”转向“理解一个 AI 应用平台”,那么阅读 Dify 的正确方式不应是直接扎进某个文件,而应先建立宏观知识架构,再按主链路逐层下钻。

本文档的目标是:

  • 梳理当前仓库的项目目录与模块职责
  • 建立学习 Dify 的宏观知识地图
  • 给出一条从部署、读代码到二次开发的学习路线

2. 项目目录宏观梳理

2.1 仓库一级目录

当前仓库可以先按“产品运行链路”而不是“技术栈”理解:

  • api/: 后端主服务,Flask + DDD/Clean Architecture,承接应用配置、工作流执行、模型调用、知识库处理、任务调度等核心业务
  • web/: 前端控制台与 Web App,Next.js + TypeScript + React,承接控制台页面、应用配置、数据集、插件、工作流 UI
  • docker/: Docker Compose 部署与中间件配置,是理解系统运行拓扑的最佳入口之一
  • docs/: 多语言文档,偏使用与部署说明
  • sdks/: 面向外部接入方的 SDK
  • scripts/dev/: 开发辅助脚本、启动脚本、测试和本地开发工具
  • images/: README 等文档图片资源

2.2 后端目录重点

api/ 是 Dify 的业务中枢,建议重点关注这些目录:

  • api/controllers/: HTTP 接口入口层
  • api/services/: 应用服务层,连接控制器与领域逻辑
  • api/core/: 真正的核心能力区,包含 workflow、model_runtime、rag 等关键模块
  • api/models/: 数据模型
  • api/repositories/: 数据访问抽象
  • api/tasks/api/schedule/: Celery 异步任务与定时任务
  • api/extensions/: 扩展能力
  • api/tests/: 测试

其中最值得优先读的是:

  • api/core/workflow/: 工作流图引擎,Dify 差异化能力之一
  • api/core/model_runtime/: 模型运行时与多模型供应商抽象层
  • api/core/rag/: 知识库与检索增强相关能力

2.3 前端目录重点

web/ 不是简单的页面层,它承担了控制台、应用编排和部分平台抽象表达。

  • web/app/: Next.js App Router 主目录,包含控制台页面与分享页面
  • web/app/components/: 页面级和领域级组件,覆盖 apps、datasets、workflow、plugins、provider 等
  • web/service/: 面向后端接口的服务层
  • web/contract/: 前端接口契约层
  • web/hooks/: 通用 Hooks
  • web/i18n/: 用户可见文案,多语言资源
  • web/types/web/models/: 类型与前端数据模型
  • web/utils/: 工具函数

从页面组织上看,web/app/(commonLayout) 下聚合了主要控制台能力:

  • app/apps/: 应用与应用编排
  • datasets/: 知识库
  • plugins/: 插件生态
  • tools/: 工具能力
  • explore/: 探索与展示类页面

2.4 部署目录重点

docker/ 对理解 Dify 很重要,因为它直接揭示系统依赖:

  • docker-compose.yaml: 完整部署入口
  • docker-compose.middleware.yaml: 本地开发常用中间件编排
  • 关键依赖包括:
    • PostgreSQL
    • Redis
    • 向量数据库服务,如 Weaviate 等
    • Nginx / Certbot / OpenTelemetry 等外围组件

如果想先从系统全景而不是代码细节入手,优先看 docker/ 会比优先看 api/controllers/ 更高效。

3. Dify 的宏观知识架构

可以把 Dify 拆成 6 个学习层次。

3.1 产品能力层

这是“Dify 是什么”。

  • 应用构建平台
  • Prompt IDE
  • Workflow 编排
  • Agent 能力
  • RAG/知识库
  • 模型管理与供应商接入
  • LLMOps / 观测分析
  • API 化输出能力

这一层决定你阅读代码时的目标感。如果不知道产品能力边界,就很容易把仓库误读成“一个 Flask 项目 + 一个 Next.js 项目”。

3.2 系统运行层

这是“Dify 怎么跑起来”。

  • Web 前端负责控制台与 Web App
  • API 后端负责业务逻辑与对外接口
  • PostgreSQL 负责主业务数据
  • Redis 负责缓存、消息协同、异步支撑
  • Celery 负责异步任务
  • 向量数据库负责检索增强
  • Docker Compose 负责本地或自部署环境编排

这一层建议先建立完整链路:浏览器 -> Web -> API -> DB/Redis/Vector DB -> Worker

3.3 业务域层

这是“Dify 的核心业务对象是什么”。

建议重点围绕以下域来理解:

  • 应用域:聊天应用、工作流应用、Agent 应用
  • 模型域:Provider、Model、凭证、能力类型
  • 知识库域:文档导入、切片、索引、召回、重排
  • 工作流域:Graph、Node、Edge、Runtime State、Event
  • 插件/工具域:内置工具、外部工具、插件接入
  • 运营域:日志、观测、发布、租户与权限

3.4 核心引擎层

这是“Dify 的技术护城河在哪里”。

核心看三块:

  • workflow graph engine
    • 图执行
    • 节点调度
    • 并行/迭代/条件分支
    • 事件传播
    • 暂停、恢复、终止控制
  • model runtime
    • 多模型供应商统一抽象
    • 多模型能力统一调用
    • 凭证校验与参数规则
  • rag pipeline
    • 文档处理
    • 向量化
    • 检索
    • 重排
    • 上下文拼装

3.5 工程支撑层

这是“为什么这个平台能持续演进”。

  • DDD / Clean Architecture 的分层约束
  • 前后端分仓式目录组织但单仓协作
  • 测试体系
  • i18n 约束
  • Docker 化部署
  • SDK 对外能力输出

3.6 扩展生态层

这是“Dify 为什么适合作为平台而不是 Demo”。

  • Provider 可扩展
  • Workflow Node 可扩展
  • Tool / Plugin 可扩展
  • API / SDK 可集成到外部业务

4. 推荐学习路线

4.1 第一阶段:先建立全局认知

目标:知道 Dify 解决什么问题、由哪些大模块组成。

建议顺序:

  1. 阅读根目录 README.md
  2. 阅读 docker/README.md
  3. 阅读 api/README.mdweb/README.md
  4. 浏览仓库一级目录与 api/web/ 的二级目录

此阶段产出应该是:

  • 你能讲清 Dify 的产品定位
  • 你能画出主要运行架构图
  • 你知道前后端和中间件分别承担什么职责

4.2 第二阶段:跑通系统主链路

目标:理解一个请求是如何穿过整个系统的。

建议动作:

  1. docker/ 看部署依赖
  2. dev/ 脚本看本地开发启动顺序
  3. 启动 Web、API、Middleware
  4. 在浏览器里完成初始化
  5. 创建一个最简单的应用,观察前后端交互

此阶段重点不是“改代码”,而是“建立运行感”。

4.3 第三阶段:按核心能力分专题学习

目标:从“会跑”升级到“知道为什么这样设计”。

建议优先级如下:

  1. 工作流
    • api/core/workflow/README.md
    • 重点理解 Graph、Node、Edge、Event、Layer、Command Channel
    • 这是 Dify 最值得深挖的部分
  2. 模型运行时
    • api/core/model_runtime/README.md
    • 理解 Provider 和 Model 的双层抽象
    • 这是多模型接入能力的基础
  3. 知识库 / RAG
    • 继续下钻 api/core/rag/
    • 理解导入、切片、索引、召回、重排链路
  4. 前端控制台
    • web/app/ 的页面分区
    • web/app/components/ 的领域组件组织
    • web/service/web/contract/ 如何对接后端

4.4 第四阶段:按真实需求反向读代码

目标:把“目录认知”转成“问题驱动认知”。

推荐选 4 类题目:

  1. 新增一个模型供应商
  2. 新增一个工作流节点
  3. 修改一个知识库召回相关逻辑
  4. 在前端新增一个配置入口或表单项

每做一题,就倒推它涉及:

  • 页面入口
  • 接口契约
  • 控制器/服务层
  • 核心域模块
  • 数据存储
  • 异步任务

这比机械式从头到尾读代码更有效。

5. 宏观阅读顺序建议

如果你的目标是“尽快掌握 Dify”,推荐以下顺序:

  1. README.md
  2. docker/README.md
  3. api/README.md
  4. web/README.md
  5. api/core/workflow/README.md
  6. api/core/model_runtime/README.md
  7. api/core/rag/ 相关目录
  8. web/app/web/app/components/
  9. api/controllers/api/services/api/repositories/
  10. api/tasks/api/schedule/

不建议一开始就大量阅读:

  • 过深的实现细节文件
  • 大段 UI 组件代码
  • 零散工具函数

因为这些内容会快速淹没全局结构感。

6. 可操作的学习里程碑

6.1 入门里程碑

  • 能说出 Dify 的 3 个核心卖点:Workflow、RAG、Model Runtime
  • 能说出系统最关键的运行依赖:Web、API、DB、Redis、Vector DB、Worker
  • 能在本地把系统跑起来

6.2 进阶里程碑

  • 能画出一个请求从前端到后端再到模型/知识库的链路
  • 能解释工作流为什么需要 Graph Engine、Event、Layer、Command Channel
  • 能说明模型运行时为何要拆成 factory / provider / model 三层

6.3 实战里程碑

  • 能独立加一个后端接口
  • 能独立改一个前端配置页面
  • 能定位一个工作流执行问题
  • 能看懂一个 RAG 数据处理链路

7. 学习过程中的常见误区

  • 误区 1:把 Dify 当成普通 Web 管理后台
    • 实际上它的核心复杂度在 AI 运行时、工作流图执行和 RAG,而不是页面本身
  • 误区 2:一开始就从 Controller 往下读
    • 更高效的方式是先理解部署拓扑和业务域
  • 误区 3:只看前端或只看后端
    • Dify 的核心体验来自前后端协同编排
  • 误区 4:只追踪单个接口,不建立概念模型
    • 最后容易“会改代码,但不理解平台”

8. 总结

学习 Dify,最重要的不是先掌握某个文件,而是先形成一张稳定的知识地图:

  • 横向看:产品能力、系统运行、业务域、核心引擎、工程支撑、扩展生态
  • 纵向看:部署启动 -> 请求链路 -> 核心模块 -> 定向改造

如果按这个路线推进,Dify 不会再是一个“目录很多的大仓库”,而会变成一个结构清晰的平台型系统:

  • docker/ 帮你理解系统怎么跑
  • api/core/ 帮你理解系统为什么强
  • web/app/ 帮你理解能力如何被配置和表达
  • api/services/repositories/tasks/ 帮你理解业务如何落地
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐