源码深度学习 · 零基础友好 · 20 天

Dify 源码学习

20 天 · 每天 30 分钟 · 逐层读懂 Dify 这套"生成式 AI 应用开发平台"——后端 api/(Flask + Celery)、前端 web/(Next.js),核心逻辑集中在 api/core/:模型运行时、工作流引擎、RAG、工具、Agent、插件。真源码走读(带真实 file:line)+ 逐行大白话 + 设计取舍 + 边界坑点,0 基础也能跟

00

开篇 · 这是个什么平台

Dify 是一个开源的生成式 AI 应用开发平台。它把"做一个 LLM 应用"这件事拆成可视化的积木:你在界面上拖节点搭工作流、配模型供应商、传文档做知识库(RAG)、挂工具Agent,就能发布成一个能对话、能调 API 的应用——不写或少写代码。

🎯 一句话:Dify = 后端 api/(Python/Flask,核心在 api/core/)+ 前端 web/(Next.js)。用户在前端搭好应用,一次对话请求会走"controllers(路由)→ services(编排)→ core/app 生成器(Generator)→ App Runner(跑模型/工作流)→ task_pipeline(把结果流式吐回前端)"这条主线。这 20 天,我们就沿着这条主线一层层读进源码。

🧩

多种应用类型

chat / agent-chat / workflow / completion / advanced-chat,同一套引擎撑起。

🔌

模型运行时

ModelManager + ProviderManager 统一接入几十家供应商,带负载均衡。

🕸️

工作流引擎

core/workflow:节点 + 图 + 变量池,Dify 最核心的编排能力。

📚

RAG 知识库

core/rag + indexing_runner:文档切片、索引、向量/关键词检索。

后端在哪、前端在哪:后端整个在 api/,入口 api/app.py,业务大脑在 api/core/(agent、app、workflow、rag、tools、plugin、mcp、memory、prompt、model_manager.py、provider_manager.py、indexing_runner.py);控制器在 api/controllers/,业务编排在 api/services/,异步任务在 api/tasks/。前端在 web/(Next.js App Router)。本教程 90% 精力在后端 api/core/
01

架构全景(动起来看)

下图那颗发光小球是"一次用户对话请求从进门到吐字"的旅程。从上到下:前端/接口 → 编排层 → 核心引擎 → 底层资源。

L4 · 接入层  ·  web/ + api/controllers/
web/ (Next.js)可视化搭建
controllersconsole/web/service_api
Resource.post路由入口
InvokeFrom来源标记
L2 · 编排层  ·  api/services/ + core/app/apps/
AppGenerateService按类型分发
XxxAppGenerator组装请求
AppRunner后台线程跑
QueueManager事件队列
L3 · 核心引擎  ·  api/core/
model_manager调 LLM
workflow图执行
rag检索增强
tools/agent工具与智能体
L1 · 底层
task_pipeline流式吐字
Celery异步任务
DB/Redis存储缓存
plugin/mcp扩展

Dify 的心智模型是"请求进门 → 按应用类型分发 → 生成器组装 → 后台线程跑引擎 → 事件流吐回前端"——一次 chat 对话就是:

controller收到 POST AppGenerateService看 app.mode ChatAppGenerator组装 + 起线程 ChatAppRunner调模型 task_pipelineSSE 流回
为什么这么分层? 前端只管"画界面 + 发请求",后端 controller 只管"认证 + 取参数",真正的业务在 core。把"接口"和"业务引擎"隔开,才能让同一套引擎同时服务 console 调试、web 应用、service API 三种入口。这和你学过的 LangGraph(引擎/API 分离)思路一脉相承。
02

怎么用这份教程

⏱️

每天 30 分钟

一天一个独立页面,跟着"今日小结 + 10 分钟动手 + 明日预告"收尾。

👶

零基础友好

不假设你懂 Flask/Celery/RAG,术语首次出现都有大白话解释。

📍

真源码 + 行号

关键代码标 文件:行号,逐行走读,可在真源码里跳转对照。

🎨

设计取舍 + 边界

每天讲"为什么这么设计"和"坑在哪",不止是 API 说明。

一条主线:从"项目全景 + 怎么启动"→"一次对话请求的完整旅程"→"模型怎么被调用(ModelManager/ProviderManager)"→"工作流引擎(Dify 最硬核的部分)"→"RAG 知识库"→"工具/Agent/插件"→"任务队列与收官"。前 5 天(本次已就绪)帮你建立整体地图,后面逐层钻进核心引擎。
S1

阶段 1 · 全景与架构

D01-04 · 前后端分包、启动流程、应用类型、一次请求的旅程
01

项目全景与前后端分包

api/ + web/ 分工、api/core 地图(agent/app/workflow/rag/tools/plugin/mcp/memory/prompt)。

≈30 min · 已就绪 NEW开始学 →
02

环境搭建与启动

docker/、app.py、app_factory.py、dify_app.py:应用工厂 + 扩展加载 + 三种进程角色。

≈30 min · 已就绪 NEW开始学 →
03

应用类型总览

core/app/apps:chat / agent-chat / workflow / completion / advanced-chat 五类应用如何组织。

≈30 min · 已就绪 NEW开始学 →
04

一次对话请求的完整旅程

controllers → services → core/app 生成器 → runner → task_pipeline,端到端串起来。

≈30 min · 已就绪 NEW开始学 →
S2

阶段 2 · 模型运行时

D05-07 · 模型管理、Provider 与实体调用、Prompt 构造与生成
05

模型管理

core/model_manager.py + provider_manager.py:ModelInstance/ModelManager/负载均衡如何调 LLM。

≈30 min · 已就绪 NEW开始学 →
06

Provider 与模型实体调用

ProviderConfiguration、凭据加解密、模型实体类型(LLM/Embedding/Rerank/TTS)。

≈30 min敬请期待
07

Prompt 构造与 LLM 生成

core/prompt、llm_generator:提示词模板如何拼成 PromptMessage 交给模型。

≈30 min敬请期待
S3

阶段 3 · 工作流引擎 (Dify 核心)

D08-12 · Workflow 总览、节点体系、图执行、变量系统、事件流
08

Workflow 总览

core/workflow:workflow_entry.py / graph_topology.py,图怎么被定义和入口化。

≈30 min敬请期待
09

节点体系

core/workflow/nodes、node_factory.py:LLM/工具/条件/代码等节点如何注册与创建。

≈30 min敬请期待
10

图执行引擎

node_runtime.py / generator:节点如何被逐个调度、生成事件。

≈30 min敬请期待
11

变量系统

variable_pool_initializer.py / system_variables.py:节点间怎么传值。

≈30 min敬请期待
12

事件与流式输出

工作流事件如何映射成 SSE,前端如何实时看到节点执行。

≈30 min敬请期待
S4

阶段 4 · RAG 与知识库

D13-15 · RAG 总览与索引、检索、知识库数据流
13

RAG 总览与索引

core/rag、indexing_runner.py:文档如何被切片、清洗、向量化入库。

≈30 min敬请期待
14

检索

向量 / 关键词 / 混合 / rerank:多路召回如何融合排序。

≈30 min敬请期待
15

知识库数据流

dataset / document / segment:三层数据模型与生命周期。

≈30 min敬请期待
S5

阶段 5 · 工具·Agent·插件

D16-18 · 工具系统、Agent、插件与 MCP
16

工具系统

core/tools:内置工具、API 工具、工作流工具的统一抽象。

≈30 min敬请期待
17

Agent

core/agent:cot_agent_runner.py / fc_agent_runner.py,思维链 vs 函数调用两种范式。

≈30 min敬请期待
18

插件与 MCP

core/plugin、core/mcp:外部能力如何以插件/MCP 协议接入。

≈30 min敬请期待
S6

阶段 6 · 工程与收官

D19-20 · 任务队列与可观测、收官知识地图
19

任务队列与可观测

tasks/、Celery、core/ops:异步任务与链路追踪。

≈30 min敬请期待
20

收官 · 知识地图串讲

全 20 天知识地图 + web 前端简介 + 学习/求职建议。

≈30 min敬请期待

🚀 前 5 天已就绪!先建立整体地图(D01-04)再钻模型运行时(D05)。准备好了就从 Day 01 · 项目全景 开始。