从浅到深阅读Dify源码

了解项目整体架构:

  • Dify是一个开源的LLM应用开发平台,包含前端(Web)和后端(API)两大部分
  • 它支持工作流,RAG,代理能力,模型管理和观测性等特性

分析项目目录结构:

  • 根目录包含:api(后端),web(前端),docker(部署相关)等
  • 后端使用的是Python Flask架构
  • 前端使用Next.js框架

深入核心概念:

  • 从Model Runtime开始,了解如何连接各种模型
  • 查看服务层(service)了解业务逻辑
  • 查看控制器(controllers)了解API接口

步骤1:理解项目概述 -  Readme

  • Dify一个开源的LLM应用开发平台
  • 提供直观界面,结合代理AI工作流,RAG管道,代理功能,模型管理和可观测性功能

核心功能

  • 工作流:可视化画布上构建和测试AI工作流
  • 全面模型支持:支持各种类型的LLM,如GPT、Llama3等等
  • Prompt IDE:用于创建提示和比较模型性能
  • RAG Pipeline:从文档提取到检索的全面RAG能力
  • Agent能力:基于LLM Function Calling或React定义代理
  • LLMOps:监控和分析应用日志和性能
  • 后端即服务:所有功能都有对应的API

部署方式

  • 通过Docker Compose最简单的启动Dify服务器
  • 需要满足:CPU >= 2核 , RAN >= 4GB

步骤2:了解项目结构

  1. Web/:前端代码,负责用户界面
  2. api/:后端代码,实现核心功能
  3. docker/:Docker部署相关配置
  4. dev/:开发工具和脚本
  5. sdks/:软件开发工具包
  6. tests/:测试代码

步骤3:后端架构

应用入口(/api/app.py):

  • 根据运行环境决定是创建普通应用还是迁移应用
  • 在非调试模式下使用gevent进行异步处理
  • 程序启动在0.0.0.0:5001端口

应用工厂(/api/app_factory.py):

  • 使用工厂模式创建Flask应用
  • 通过initialize_extensions加载各种扩展功能
  • 通过create_migrations_app创建用于数据库迁移的简化应用

应用类(/api/dify_app.py):

  • 继承自Flask类的DifyApp类,可能在未来扩展功能

步骤4:深入核心模块 - Model Runtime

位置: /api/core/model_runtime

查看Model Runtime的README:

位置: /api/core/model_runtime/README.md

看看Model Runtime的实体:

位置: /api/core/model_runtime/entities

查看主要实体类:

位置: /api/core/model_runtime/entities/model_entities.py

看看模型提供者:

位置: /api/core/model_runtime/model_providers

查看模型提供者工厂:

位置: /api/core/model_runtime/model_providers/model_provider_factory.py

步骤5:搜索工作流模块

位置: /api/core/workflow

查看工作流的主要入口:

位置: /api/core/workflow/workflow_entry.py

Read workflow_entry.py

查看工作流的节点类型:

位置: /api/core/workflow/nodes

查看节点映射关系:

位置: /api/core/workflow/nodes/node_mapping.py

步骤6:探索RAG模块

位置: /api/core/rag

查看RAG实体:

位置: /api/core/rag/entities

查看检索模块:

位置: /api/core/rag/retrieval

步骤7:探索控制器和服务层

查看控制器:

位置: /api/controllers

查看控制台API:

位置: /api/controllers/console

查看应用控制器:

位置: /api/controllers/console/app

查看服务层:

位置: /api/services

步骤8:探索前端架构

位置: /web/app

查看通用布局:

位置: /web/app/(commonLayout)

查看前端应用组件:

位置: /web/app/(commonLayout)/app

位置: /web/app/(commonLayout)/app/(appDetailLayout)/[appId]

总结

项目整体分为前端和后端两大部分

  • 前端(/web):使用Next.js框架构建
  • 后端(/api):使用Flask框架构建

后端核心架构

  • 采用工厂模式创建应用(app_factory.py)
  • 使用扩展机制加载各种功能(extensions/)
  • 核心模块包括:Model Runtime (/api/core/model_runtime):模型运行时,支持各种LLM模型,Workflow (/api/core/workflow):工作流引擎,支持构建复杂的AI工作流,RAG (/api/core/rag):检索增强生成,支持知识库功,Agent (/api/core/agent):代理能力,支持工具调用
  • 采用MVC架构:控制器(/api/controllers):处理HTTP请求;服务(/api/services):实现业务逻辑;模型(/api/models):数据模型定义。

Model Runtime架构

  • 三层架构:工厂方法层:提供获取所有提供者和模型列表的方法;提供者层:提供特定提供者的模型列表和认证;模型层:提供直接调用各种模型类型的能力。
  • 支持多种模型类型:LLM、Embedding、Rerank、Speech2Text、TTS、Moderation

工作流引擎架构

  • 基于有向图的工作流执行引擎
  • 节点类型丰富,包括:Start、End、LLM、KnowledgeRetrieval、IfElse、Code等
  • 支持变量池,用于节点间数据传递
  • 提供回调机制,用于事件通知

RAG系统架构

  • 提取器(extractor/):从文档中提取文本
  • 分割器(splitter/):将文本分割成块
  • 嵌入(embedding/):将文本块转换为向量
  • 检索(retrieval/):从向量库中检索相关文本块
  • 重排(rerank/):对检索结果进行重新排序

前端架构

  • 基于Next.js的现代React应用
  • 页面组织结构清晰,分为共享布局、应用详情等
  • 组件化设计,方便复用

服务层架构

  • 应用服务(app_service.py):处理应用创建、更新、删除等
  • 工作流服务(workflow_service.py):处理工作流的创建、执行等
  • 模型服务(model_provider_service.py):处理模型提供者相关功能
  • 数据集服务(dataset_service.py):处理数据集相关功能
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐