Dify 系统架构文档
概述
Dify 是一个易于使用的 LLMOps 平台,旨在帮助开发者构建、测试和部署 AI 应用。系统采用前后端分离的架构,后端基于 Python Flask 框架构建,前端使用 Next.js 技术栈。
整体架构图
graph TBsubgraph "前端层"A[Web 浏览器] --> B[Next.js 前端]endsubgraph "API 网关层"C[API 网关/负载均衡]endsubgraph "应用服务层"B --> CC --> D[Flask 应用服务器]C --> E[Flask 应用服务器]C --> F[Flask 应用服务器]endsubgraph "核心服务层"D --> G[任务队列 (Celery)]D --> H[缓存系统 (Redis)]D --> I[数据库 (PostgreSQL)]D --> J[向量数据库]D --> K[对象存储]G --> HG --> IG --> JG --> Kendsubgraph "第三方服务"D --> L[大语言模型 API]D --> M[外部数据源]D --> N[监控服务]end
核心组件
1. Web 前端 (Next.js)
- 基于 Next.js 构建的单页应用
- 提供用户友好的界面用于创建和管理 AI 应用
- 通过 RESTful API 与后端通信
2. API 网关
- 负载均衡请求到多个应用服务器实例
- 处理 SSL 终止
- 提供限流和安全防护
3. 应用服务器 (Flask)
- 基于 Python Flask 框架构建
- 处理 HTTP 请求和业务逻辑
- 包含多个组件模块
3.1 控制器层 (Controllers)
处理 HTTP 请求,包括:
- Console API: 管理后台接口
- Service API: 服务接口
- Web API: 前端接口
- Inner API: 内部接口
- Files API: 文件处理接口
3.2 服务层 (Services)
实现核心业务逻辑:
- Account Service: 账户管理
- App Service: 应用管理
- Dataset Service: 数据集管理
- Model Service: 模型管理
- Workflow Service: 工作流管理
- Plugin Service: 插件管理
3.3 核心层 (Core)
提供核心功能实现:
- Model Runtime: 模型运行时
- RAG: 检索增强生成
- Agent: 智能代理
- Workflow Engine: 工作流引擎
- Plugin System: 插件系统
- Tools: 工具系统
4. 数据层
4.1 关系数据库 (PostgreSQL)
存储系统的核心数据:
- 用户账户信息
- 应用配置
- 对话历史
- 数据集元数据
4.2 向量数据库
存储向量化的文档数据:
- 文档段落的向量表示
- 相似性检索
4.3 缓存系统 (Redis)
- 会话存储
- 缓存热点数据
- 任务队列支持
4.4 对象存储
- 存储上传的文件
- 存储处理后的文档
5. 异步任务处理 (Celery)
- 处理耗时任务如文档处理、向量索引等
- 通过消息队列分发任务
- 支持任务重试和监控
6. 第三方集成
- 大语言模型 API (OpenAI, Anthropic等)
- 外部数据源 (Notion, Google Docs等)
- 监控服务 (Sentry, OpenTelemetry等)
组件调用关系
graph TDA[客户端] --> B[API 网关]B --> C[Flask 应用]C --> D[控制器层]D --> E[服务层]E --> F[核心层]E --> G[数据访问层]F --> H[模型运行时]F --> I[RAG引擎]F --> J[工作流引擎]F --> K[代理系统]G --> L[数据库]G --> M[向量数据库]G --> N[缓存系统]G --> O[对象存储]C --> P[异步任务队列]P --> Q[Celery Worker]Q --> LQ --> MQ --> NQ --> OC --> R[第三方服务]H --> RI --> R
数据流向
1. 用户请求处理流程
- 用户通过 Web 前端发起请求
- 请求通过 API 网关路由到 Flask 应用服务器
- 控制器接收请求并进行参数验证
- 服务层处理业务逻辑
- 核心层执行具体功能(如调用 LLM、RAG 检索等)
- 数据访问层与数据库交互
- 返回响应给用户
2. 异步任务处理流程
- 应用服务器将耗时任务发送到任务队列
- Celery Worker 从队列中获取任务
- Worker 执行任务并与数据存储交互
- 任务完成后更新数据库状态
- 通过回调或轮询方式通知前端
部署架构
graph LRsubgraph "负载均衡器"A[Load Balancer]endsubgraph "Web 服务"B[Next.js App]endsubgraph "API 服务集群"C1[Flask API 1]C2[Flask API 2]C3[Flask API N]endsubgraph "Worker 集群"D1[Celery Worker 1]D2[Celery Worker 2]D3[Celery Worker N]endsubgraph "存储层"E[(PostgreSQL)]F[(向量数据库)]G[(Redis)]H[(对象存储)]endA --> BA --> C1A --> C2A --> C3C1 --> EC2 --> FC3 --> GC1 --> HD1 --> ED2 --> FD3 --> GD1 --> H
扩展性设计
水平扩展
- 应用服务器可水平扩展以处理更多请求
- Worker 可以根据任务负载动态扩展
- 数据库可通过读写分离和分片扩展
插件系统
- 支持自定义工具和插件
- 提供标准接口用于集成第三方服务
- 支持自定义模型提供商
微服务潜力
- 当前为单体架构,但模块化设计便于未来拆分为微服务
- 核心组件间通过明确定义的接口交互
安全设计
认证与授权
- 基于 JWT 的身份验证
- 角色基础访问控制 (RBAC)
- 租户隔离
数据安全
- 敏感数据加密存储
- HTTPS 通信
- API 限流和防护
审计与监控
- 操作日志记录
- 性能监控
- 错误追踪
总结
Dify 采用分层架构设计,各层之间职责明确,便于维护和扩展。通过异步任务处理耗时操作,保证系统的响应性。模块化的核心层设计使得系统功能易于扩展,支持多种大语言模型和第三方服务集成。