深入解析大型应用架构:以dify为例进行分析
原文:https://juejin.cn/post/7437015214351286309
Dify 是一款开源的大语言模型(LLM)应用开发平台,旨在简化和加速生成式 AI 应用的创建和部署。
它融合了后端即服务(Backend as a Service, BaaS)和 LLMOps 的理念,使开发者能够快速搭建生产级的生成式 AI 应用。
即使是非技术人员,也能参与到 AI 应用的定义和数据运营过程中。
本文主要从代码结构上进行分析,以学习其基础架构设计。
开源地址(截止写文章时已有5.1万stars):github.com/langgenius/…
让我们开始看代码吧(先摸清楚代码的“骨骼”)
第一层:最外层(前端与后端的分离)
根据目录结构可以推测:
- 核心代码的可能位置:通常在目录结构中,
api、sdks和web目录是放置核心代码的常见位置。这些目录的功能可能如下:
-
api:通常用于存放后端 API 相关代码,是项目的核心业务逻辑部分。sdks:存放用于与 API 或服务交互的开发工具包或客户端库,这可能包含用于不同编程语言的接口代码。web:通常用于存放前端代码,处理用户界面及相关的逻辑,可能包含 HTML、CSS、JavaScript 或前端框架的代码。
- 辅助文件和目录:
-
docker和docker-legacy:可能包含 Docker 配置文件,用于容器化部署。dev:可能是开发环境相关的配置或脚本。images:可能用于存放图像或媒体文件,但也可能是 Docker 的镜像构建文件。Makefile:通常用于构建和自动化任务。LICENSE和README文件夹:用于项目文档和说明。CONTRIBUTING*文件:包含项目贡献指南。
基于以上推测,api 和 sdks 目录很可能包含了项目的核心逻辑,而 web 则可能负责项目的前端或用户界面逻辑。
第二层:查看/api服务端目录结构基础能力
在这类项目结构中,核心代码通常分布在一些特定的目录中,主要包含业务逻辑、数据模型、控制器以及服务层等部分。以下是对主要目录的解读及其潜在内容:
- app.py / app_factory.py: 这些文件通常是应用程序的入口点。
app.py可能用于直接运行应用,而app_factory.py则可能是用于创建应用实例的工厂函数,适合复杂配置或多实例情况。 - configs: 存储应用的配置文件或配置模块。核心配置代码,例如数据库配置、API密钥和其他环境参数,可能在这里。
- controllers: 这一目录通常存储路由或控制器,负责处理请求和响应。它包含核心业务逻辑的接口层,通过控制器将应用的不同模块整合在一起。
- core: 这个目录通常包含应用的核心功能和逻辑,是较为独立且核心的模块。它可以包含重要的业务逻辑、工具方法或通用的功能模块。
- models: 存储数据模型(可能是数据库表的ORM映射),通常包括核心的数据结构定义。这是涉及数据的核心模块,通常和数据库交互最频繁。
- services: 服务层,用于封装业务逻辑或与第三方服务交互。这部分代码的逻辑复杂度较高,可能包括了应用的核心功能。
- commands / tasks / schedule:
commands:存储管理命令或CLI命令,通常与Flask或Django等框架的命令行工具相关。tasks:用于存储异步任务或批处理任务,可以是核心功能的辅助模块。schedule:存储调度任务,可能用于定时任务。
- libs / extensions / factories:
libs:常见的工具库或自定义功能。extensions:扩展模块,通常包括第三方库或插件的初始化代码。factories:创建对象或服务实例的工厂函数。
基于这些目录的分工,可以初步推测核心业务逻辑代码可能分布在 controllers、core、models、services 四个目录中,其中 models 和 services 尤其可能承载着主要的核心逻辑。
看到这里,熟悉SpringBoot框架的朋友是不是就明白了,即使是Python代码,也是特别传统的基础架构设计模式(和Java一样)。
看前端/web目录结构
这个项目目录结构包含多个文件夹和文件,通常用于一个基于 Next.js 的前端或全栈项目。以下是对每个目录的解释,以及可能包含核心代码的目录。
目录说明
- Dockerfile:用于 Docker 容器的构建文件。
- app:这个目录一般是 Next.js 的应用入口,包含页面、路由和核心逻辑。核心代码通常会在这里,特别是如果这是 Next.js 项目。
- config:存放项目的配置文件,如环境变量、API 端点、应用设置等。
- global.d.ts:类型声明文件,通常用来为 TypeScript 添加全局类型定义。
- jest.config.ts:Jest 测试配置文件。
- next.config.js:Next.js 配置文件,用于设置项目的构建、路由和其他 Next.js 特性。
- public:静态资源目录,存放图像、字体等可公开访问的文件。
- themes:通常存放主题文件(样式、配色方案等),与项目的 UI 相关。
- typography.js:可能是与排版样式相关的配置或逻辑文件。
- README.md:项目说明文档。
- assets:存放项目资源文件,如图片、SVG 图标等。
- context:可能包含 React 的 Context API 定义,用于全局状态管理。
- hooks:自定义 Hook 的文件夹,用于定义和组织项目的自定义逻辑。
- middleware.ts:中间件文件,可能用于处理请求或应用层面的逻辑。
- package.json:项目的依赖和脚本配置。
- service:一般是服务逻辑的目录,可能包含 API 调用或业务逻辑代码。
- tsconfig.json:TypeScript 配置文件。
- utils:通常是通用的实用函数和工具库。
- mocks:用于测试的 mock 文件。
- bin:一般用于存放脚本文件或命令行工具。
- docker:与 Docker 相关的配置或脚本。
- i18n:国际化文件,通常用于多语言支持。
- models:通常是数据模型相关的代码,例如数据库 schema 或数据类型定义。
- postcss.config.js、tailwind.config.js:PostCSS 和 Tailwind CSS 配置文件。
- types:类型定义文件夹,用于定义 TypeScript 的类型。
核心代码所在位置
在这个项目结构中,核心代码通常会集中在以下几个目录中:
- app:包含主要的页面、路由和核心业务逻辑。
- service:如果项目有后端服务逻辑,相关的业务逻辑可能在此目录下。
- models:用于数据模型和 schema 定义,特别是项目涉及数据库的情况。
此外,hooks 和 context 也可能包含项目的一些核心逻辑。
总体来看:
- 很明显,前端是NextJS,后端是类似于SpringBoot(controller-service...)
- 看到这里,你是不是已经学会了如何看一个大型项目的基础架构?
- 由于dify是多人协同的大型产品,因此在读代码时需要前端-后端的思维切换。如果要更易于看懂,当你在看后端代码时,忘掉所有前端范式;当你读前端代码时,要忘掉所有后端范式;当你设计DB或者服务化能力时,忘掉其他无关范式。
- 不要看代码量大,其实每个人自己只是管好自己的‘域’,其实很容易,很简单。就像机器上的一个零件,管好自己、上游、下游就好,机器就能像齿轮一样往前滚。
- 同样的分析方法,你也可以拿langchain、llama_index、elasticsearch、dubbo来试一试。搞明白了基础架构,再去导读代码,会更容易理解一些,花的时间也将会更少。
相关文章:
深入解析大型应用架构:以dify为例进行分析
原文:https://juejin.cn/post/7437015214351286309 Dify 是一款开源的大语言模型(LLM)应用开发平台,旨在简化和加速生成式 AI 应用的创建和部署。 它融合了后端即服务(Backend as a Service, BaaS)和 LLM…...
单片机实现触摸按钮执行自定义任务组件
触摸按钮执行自定义任务组件 项目简介 本项目基于RT8H8K001开发板 RT6809CNN01开发板 TFT显示屏(1024x600) GT911触摸屏实现了一个多功能触摸按钮组件。系统具备按钮控制后执行任务的功能,可用于各类触摸屏人机交互场景。 硬件平台 MCU: STC8H8K64U࿰…...
快速入手-前后端分离Python权限系统 基于Django5+DRF+Vue3.2+Element Plus+Jwt
引用:打造前后端分离Python权限系统 基于Django5DRFVue3.2Element PlusJwt 视频教程 (火爆连载更新中..)_哔哩哔哩_bibili 说明:1、结合个人DRF基础和该视频去根据自己的项目进行开发。 2、引用该视频中作者的思路去升华自身的项…...
【go】slice的浅拷贝和深拷贝
浅拷贝(Shallow Copy) 浅拷贝是指只复制切片本身的结构(指针、长度和容量),而不复制底层数组的元素。 实现方式 直接赋值: slice1 : []int{1, 2, 3} slice2 : slice1 // 浅拷贝切片操作: slice1 : []int{1, 2, 3} s…...
Ai云防护技术解析——服务器数据安全的智能防御体系
本文深度解析AI云防护技术如何通过智能流量分析、动态行为建模、自适应防御策略构建服务器安全体系。结合2023年群联科技实战案例,揭示机器学习算法在识别新型DDoS攻击、加密流量检测、零日漏洞防御中的技术突破,并附Gartner最新防护效果验证数据。 AI驱动的流量特征建模技术…...
科技快讯 | DeepSeek 公布模型新学习方式;Meta发布开源大模型Llama 4;谷歌推出 Android Auto 14.0 正式版
Meta发布开源大模型Llama 4,首次采用“混合专家架构“ 4月6日,Meta推出开源AI模型Llama 4,包括Scout和Maverick两个版本,具备多模态处理能力。Scout和Maverick参数量分别为170亿和4000亿,采用混合专家架构。Meta同时训…...
JSONP跨域访问漏洞
一、漏洞一:利用回调GetCookie <?php$conn new mysqli(127.0.0.1,root,root,learn) or die("数据库连接不成功"); $conn->set_charset(utf8); $sql "select articleid,author,viewcount,creattime from learn3 where articleid < 5"; $result…...
记录一次StarRocks集群迁移的经历
记录一次StarRocks集群迁移的经历 新入职了一家公司,刚去做了两张报表后,接到一个任务,做StarRocks 集群迁移,背景是这样的就是以前是自建的SR,但是这个SR 是给线上业务用的,也就是说不是分析性业务,而是面向产品ToC 的,也了解了一下是因为单表数据量太大了,所以直接…...
图形裁剪算法
1.学习目标 理解区域编码(Region Code,RC) 设计Cohen-Sutherland直线裁剪算法 编程实现Cohen-Sutherland直线裁剪算法 2.具体代码 1.具体算法 /*** Cohen-Sutherland直线裁剪算法 - 优化版* author AI Assistant* license MIT*/// 区域编码常量 - 使用对象枚举…...
Python字典实战: 三大管理系统开发指南(班级+会议+购物车)(附源码)
目录 摘要 一、班级管理系统(含成绩模块) 1. 功能概述 2. 完整代码与解析 3. 代码解析与亮点 二、会议管理系统 1. 功能概述 2. 完整代码 3. 代码解析与亮点 三、购物车管理系统 1. 功能概述 2. 完整代码 3. 代码解析与亮点 四、总结与扩…...
R 语言科研绘图第 36 期 --- 饼状图-基础
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
vue 3 从零开始到掌握
vue3从零开始一篇文章带你学习 升级vue CLI 使用命令 ## 查看vue/cli版本,确保vue/cli版本在4.5.0以上 vue --version ## 安装或者升级你的vue/cli npm install -g vue/cli ## 创建 vue create vue_test ## 启动 cd vue_test npm run servenvm管理node版本&#…...
【R语言绘图】圈图绘制代码
绘制代码 rm(list ls())# 加载必要包 library(data.table) library(circlize) library(ComplexHeatmap) library(rtracklayer) library(GenomicRanges) library(BSgenome) library(GenomicFeatures) library(dplyr)### 数据准备阶段 ### # 1. 读取染色体长度信息 df <- re…...
OCR迁移
一、环境 操作系统:Centos57.6 数据库版本:12.2.0.1 场景:将OCR信息从DATA磁盘组迁移到OCR磁盘组 二、操作步骤 1.查看可用空盘 set lin 200 set pagesize 200 col DGNAME format a15 col DISKNAME format a15 col PATH format a20 col N…...
OpenCV 图形API(17)计算输入矩阵 src 中每个元素的平方根函数sqrt()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 描述 计算数组元素的平方根。 cv::gapi::sqrt 函数计算每个输入数组元素的平方根。对于多通道数组,每个通道会独立处理。其精度大约与内置的 …...
python中的in关键字查找的时间复杂度
列表(List) 对于列表来说, in 运算符的复杂度是 O(n),其中n是列表的长度。这意味着如果列表中有n个元素,那么执行 in 运算符需要遍历整个列表来查找目标元素。 以下是一个示例,演示了在列表中使用 in 运算…...
Python爬虫第6节-requests库的基本用法
目录 前言 一、准备工作 二、实例引入 三、GET请求 3.1 基本示例 3.2 抓取网页 3.3 抓取二进制数据 3.4 添加headers 四、POST请求 五、响应 前言 前面我们学习了urllib的基础使用方法。不过,urllib在实际应用中存在一些不便之处。以网页验证和Cookies处理…...
什么是可靠性工程师?
一、什么是可靠性工程师? 可靠性工程师就是负责确保产品在使用过程中不出故障、不给客户添麻烦。 你可以理解为是那种“挑毛病的人”,但不是事后挑,是提前想清楚产品在哪些情况下可能会出问题,然后解决掉。 比如: …...
linux (CentOS 10)使用传统程序语言(C)进行编译---主,子程序连接:子程序的编译
1 主程序 rootlocalhost:~/testc/testlink3# cat thanks.c #include <stdio.h> // 声明子程序 void thanks_2(void); int main(void) {printf("Hello World\n");thanks_2(); }2 子程序 rootlocalhost:~/testc/testlink3# cat thanks_2.c #include <stdio.…...
如何根据设计稿进行移动端适配:全面详解
如何根据设计稿进行移动端适配:全面详解 文章目录 如何根据设计稿进行移动端适配:全面详解1. **理解设计稿**1.1 设计稿的尺寸1.2 设计稿的单位 2. **移动端适配的核心技术**2.1 使用 viewport 元标签2.1.1 代码示例2.1.2 参数说明 2.2 使用相对单位2.2.…...
【Kafka基础】Kafka 2.8以下版本的安装与配置指南:传统ZooKeeper依赖版详解
对于仍在使用Kafka 2.8之前版本的团队来说,需要特别注意其强依赖外部ZooKeeper的特性。本文将完整演示传统架构下的安装流程,并对比新旧版本差异。 1 版本特性差异说明 1.1 2.8 vs 2.8-核心区别 特性 2.8版本 2.8-版本 协调服务 可选内置KRaft模式 …...
Redis-x64-3.2.100.msi : Windows 安装包(MSI 格式)安装步骤
Redis-x64-3.2.100.msi 是 Redis 的 Windows 安装包(MSI 格式),适用于 64 位系统。 在由于一些环境需要低版本的Redis的安装包。 Redis-x64-3.2.100.msi 安装包下载:https://pan.quark.cn/s/cc4d38262a15 Redis 是一个开源的 内…...
ZoomCharts使用方法
本篇没有讲解,只是自己的小笔记,有看到的网友想明白具体用法的可以来私信我 <div class"zoomChartsComponent"><div id"zoomCharts-demo"></div></div> var ZoomChartsLicense ; var ZoomChartsLicenseKey…...
【云计算】打造高效容器云平台:规划、部署与架构设计
引言 随着移动互联网时代的大步跃进,互联网公司业务的爆炸式增长发展给传统行业带来了巨大的冲击和挑战,被迫考虑转型和调整。对于我们传统的航空行业来说,还存在传统的思维、落后的技术。一项新业务从提出需求到立项审批、公开招标、项目实…...
DeepSeek底层揭秘——《推理时Scaling方法》内容理解
4月初,DeepSeek 提交到 arXiv 上的最新论文正在 AI 社区逐渐升温。 论文核心内容理解 DeepSeek与清华大学联合发布的论文《奖励模型的推理时Scaling方法及其在大规模语言模型中的应用》,核心在于提出一种新的推理时Scaling方法,即通过动态调…...
JavaScript之Json数据格式
介绍 JavaScript Object Notation, js对象标注法,是轻量级的数据交换格式完全独立于编程语言文本字符集必须用UTF-8格式,必须用“”任何支持的数据类型都可以用JSON表示JS内内置JSON解析JSON本质就是字符串 Json对象和JS对象互相转化 前端…...
OBS 中如何设置固定码率(CBR)与可变码率(VBR)?
在使用 OBS 进行录制或推流时,设置“码率控制模式”(Rate Control)是非常重要的一步。常见的控制模式包括: CBR(固定码率):保持恒定的输出码率,适合直播场景。 VBR(可变码率):在允许的范围内动态调整码率,适合本地录制、追求画质。 一、CBR vs. VBR 的差异 项目CBR…...
使用 Rsync + Lsyncd 实现 CentOS 7 实时文件同步
文章目录 🌀使用 Rsync Lsyncd 实现 CentOS 7 实时文件同步前言介绍架构图🧱系统环境🔧Rsync配置(两台都需安装)关闭SELinux(两台都需) 📦配置目标端(client)…...
C# 多线程并发编程基础
1. 线程基础 1.1 线程简介 C# 中的线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程可以并发执行不同的任务。 1.2 线程的创建与启动 在 C# 中,可以使…...
RAG(检索增强生成)系统,提示词(Prompt)表现测试(数据说话)
在RAG(检索增强生成)系统中,评价提示词(Prompt)设计是否优秀,必须通过量化测试数据来验证,而非主观判断。以下是系统化的评估方法、测试指标和具体实现方案: 一、提示词优秀的核心标准 优秀的提示词应显著提升以下指标: 维度量化指标测试方法事实一致性Faithfulness …...
