Dify 源码学习
20 天 · 每天 30 分钟 · 逐层读懂 Dify 这套"生成式 AI 应用开发平台"——后端 api/(Flask + Celery)、前端 web/(Next.js),核心逻辑集中在 api/core/:模型运行时、工作流引擎、RAG、工具、Agent、插件。真源码走读(带真实 file:line)+ 逐行大白话 + 设计取舍 + 边界坑点,0 基础也能跟。
开篇 · 这是个什么平台
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/。架构全景(动起来看)
下图那颗发光小球是"一次用户对话请求从进门到吐字"的旅程。从上到下:前端/接口 → 编排层 → 核心引擎 → 底层资源。
Dify 的心智模型是"请求进门 → 按应用类型分发 → 生成器组装 → 后台线程跑引擎 → 事件流吐回前端"——一次 chat 对话就是:
怎么用这份教程
每天 30 分钟
一天一个独立页面,跟着"今日小结 + 10 分钟动手 + 明日预告"收尾。
零基础友好
不假设你懂 Flask/Celery/RAG,术语首次出现都有大白话解释。
真源码 + 行号
关键代码标 文件:行号,逐行走读,可在真源码里跳转对照。
设计取舍 + 边界
每天讲"为什么这么设计"和"坑在哪",不止是 API 说明。
项目全景与前后端分包
api/ + web/ 分工、api/core 地图(agent/app/workflow/rag/tools/plugin/mcp/memory/prompt)。
环境搭建与启动
docker/、app.py、app_factory.py、dify_app.py:应用工厂 + 扩展加载 + 三种进程角色。
应用类型总览
core/app/apps:chat / agent-chat / workflow / completion / advanced-chat 五类应用如何组织。
一次对话请求的完整旅程
controllers → services → core/app 生成器 → runner → task_pipeline,端到端串起来。
模型管理
core/model_manager.py + provider_manager.py:ModelInstance/ModelManager/负载均衡如何调 LLM。
Provider 与模型实体调用
ProviderConfiguration、凭据加解密、模型实体类型(LLM/Embedding/Rerank/TTS)。
Prompt 构造与 LLM 生成
core/prompt、llm_generator:提示词模板如何拼成 PromptMessage 交给模型。
Workflow 总览
core/workflow:workflow_entry.py / graph_topology.py,图怎么被定义和入口化。
节点体系
core/workflow/nodes、node_factory.py:LLM/工具/条件/代码等节点如何注册与创建。
图执行引擎
node_runtime.py / generator:节点如何被逐个调度、生成事件。
变量系统
variable_pool_initializer.py / system_variables.py:节点间怎么传值。
事件与流式输出
工作流事件如何映射成 SSE,前端如何实时看到节点执行。
RAG 总览与索引
core/rag、indexing_runner.py:文档如何被切片、清洗、向量化入库。
检索
向量 / 关键词 / 混合 / rerank:多路召回如何融合排序。
知识库数据流
dataset / document / segment:三层数据模型与生命周期。
工具系统
core/tools:内置工具、API 工具、工作流工具的统一抽象。
Agent
core/agent:cot_agent_runner.py / fc_agent_runner.py,思维链 vs 函数调用两种范式。
插件与 MCP
core/plugin、core/mcp:外部能力如何以插件/MCP 协议接入。
任务队列与可观测
tasks/、Celery、core/ops:异步任务与链路追踪。
收官 · 知识地图串讲
全 20 天知识地图 + web 前端简介 + 学习/求职建议。
🚀 前 5 天已就绪!先建立整体地图(D01-04)再钻模型运行时(D05)。准备好了就从 Day 01 · 项目全景 开始。