一、dify基础介绍

Dify 是一款开源的大语言模型(LLM)应用开发平台,使开发者可以快速搭建生产级的生成式 AI 应用。Dify 内置了构建 LLM 应用所需的关键技术栈,包括对数百个模型的支持、直观的 Prompt 编排界面、高质量的 RAG 引擎、稳健的 Agent 框架、灵活的工作流,并同时提供了一套易用的界面和 API。相教于使用langchain这种工具库去开发AI应用,Dify 提供了更接近生产需要的完整方案,可以为开发者节省许多重复造轮子的时间,使其可以专注在创新和业务需求上。

二、dify部署

dify本身就是按照微服务架构设计的,将各个模块通过http进行调用。所以可以单机通过docker compose将多个微服务docker组合进行部署,也可以直接在k8s集群中进行部署。以下通过一次推理分析整个流程:

  1. 用户访问暴露的api端口(80)进行访问
  2. 首先进入api服务,api服务首先拉去工作流信息、用户信息、聊天日志,这些都存在postgreSql里面。然后启动对应工作流。工作流中遍历各个节点
  3. 当节点是llm节点。由于llm是通过插件引入的,所以会通过http调用插件dify-plugin-daemon服务,插件服务里面才去调用对应的llm
  4. 当节点是代码节点。代码节点运行在sandbox中,dify-sandbox也是一个golang写的用gin编写的微服务,其中通过exec来执行python或nodejs代码。golang可以提供更加细致的管控,保证代码不影响dify服务。

2.1 dify单机部署

  1. clone dify仓库 git clone https://github.com/langgenius/dify
  2. 进入项目docker目录
  3. 创建环境变量 mv .env.example .env
  4. 启动docker docker compose up -d
  5. 访问服务暴露出来的80端口即可,如://http://9.134.53.193/

后续调整.env中如worker节点并发数目后,需要重新跑

1
2
docker compose down
docker compose up -d

2.2 dify集群部署

dify集群部署,需要将dify中各个组件进行分开部署,主要分为如下几个pod:

  • dify-redis:缓存和消息队列,可以使用云上redis资源
  • dify-postgresql:存储元数据,可以使用云上postgresql资源
  • dify-dify-web:前端界面,负责可视化编排和用户交互
  • dify-dify-api:核心后端,处理RESTful请求和业务逻辑,使用Flask框架提供API服务。
  • dify-dify-sandbox: 该节点用于在沙箱中运行用户自定义的 Python/Node.js 代码(如动态模板、函数调用)。
  • dify-dify-worker: Celery 驱动的异步任务消费者。处理耗时操作(如知识库文档解析、向量索引更新)
  • dify-dify-plugin-daemon:plugin-daemon(插件守护进程)是 Dify 架构中一个​​独立的后台服务​​,主要负责管理、加载和执行各种插件。协调插件与API服务的通信(HTTP/进程间通信)
  • dify-proxy: 通过部署nignx暴露web和api接口请求

dify集群搭建如下:
alt text

通过分布式部署,则可以根据请求量进行弹性扩容,如请求较多的时候,可以增加dify-dify-api的pod数量来承接更多请求,流水线中python代码较多,可扩dify-dify-sandboxpod来处理python代码,当异步任务较多的时候也可以相应的扩dify-dify-worker的pod数量

三、桌面整理工作流迁移dify工作流

3.1 桌面整理AI工作流介绍

桌面整理当前已经上线了问答工作流,主要包括如下逻辑:

  1. 意图识别:根据用户多轮问答分析意图(functioncall)
    • 直接回答(根据现有知识可以直接回答)
    • 桌面整理相关(咨询桌面整理相关问题)
    • 知识库级别问答(针对用户云空间进行全部文件摘要问答)
    • 知识问答(检索知识问答)
  2. 问题改写
    • 改写总结用户问题用于知识检索
  3. 知识检索流程
    • 检索用户知识库问题
    • 检索桌面整理手册问题
    • 检索全网知识
  4. checker流程
    • 判断当前知识是否足够回答用户问题,当现有检索资料不足,需要返回上层检索
  5. 流式回答

当前工作流采用golang手工编码搭建。

效果如下图:
alt text
alt text
alt text

3.2 dify工作流搭建

将上述工作流在dify上简易搭建
alt text

效果如下:
alt text

四、dify接口调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
curl -X POST 'http://api.dify.woa.com/v1/chat-messages' \
--header 'Authorization: Bearer app-oOO7rxPjUjs9BrWLiEDTFiUL' \
--header 'Content-Type: application/json' \
--data-raw '{
"inputs": {},
"query": "你好,这是一个测试",
"response_mode": "streaming",
"conversation_id": "",
"user": "abc-123",
"files": [
{
"type": "image",
"transfer_method": "remote_url",
"url": "https://cloud.dify.ai/logo/logo-site.png"
}
]
}'

五、dify性能压测

为方便测评,dify流水线中仅部署两个节点,输入节点、输出节点。以此对dify的基础能力进行测评

先说结论

  • 单机部署(1个工作进程)< 单机部署(5个工作进程)
  • tkex分布式部署, 1个pod < 2个pod < 3个pod
  • 分布式下,随着api pod提高,并发能力显著提升(并发从20,提升到45,再到71)

以下是每种部署模式下压测错误率为0%时的最高QPS对比:

  1. 不包含LLM节点的压测数据对比
部署方式 工作进程/Pod数量 最高QPS (错误率0%)
单机部署 1个工作进程 16.20
5个工作进程 20.25
分布式部署 (TKE) 1个Pod 24.90
2个Pod 45.00
3个Pod 61.20
  1. 包含LLM节点的压测数据对比
部署方式 工作进程/Pod数量 最高QPS (错误率0%)
单机部署 1个工作进程 8.50
5个工作进程 14.10
分布式部署 (TKE) 1个Pod 5.30
2个Pod 6.70
3个Pod 10.90
  1. 桌面整理长流程压测数据对比
部署方式 Pod数量 最高QPS (错误率0%)
分布式部署 (TKE) 1个Pod 3.50
2个Pod 6.20
3个Pod 9.30

详细测评数据如下:

5.1 不包含llm节点压测

单机性能评测:

  1. 单机部署dify时,开启1个api工作进程,测评效果如下:
1
2
3
4
5
6
Load Test Summary:
Concurrency 5: QPS=11.90, Error Rate=0.00%, Avg Latency: 0.428s
Concurrency 10: QPS=11.70, Error Rate=0.00%, Avg Latency: 0.861s
Concurrency 20: QPS=12.40, Error Rate=0.00%, Avg Latency: 1.674s
Concurrency 50: QPS=13.50, Error Rate=0.00%, Avg Latency: 4.074s
Concurrency 100: QPS=16.20, Error Rate=0.00%, Avg Latency: 7.524s

评估来看,单机单进程,qps在8.5左右

  1. 单机部署dify时,开启5个api工作进程,测评效果如下:
1
2
3
4
5
Load Test Summary:
Concurrency 5: QPS=11.80, Error Rate=0.00%, Avg Latency: 0.434s
Concurrency 10: QPS=20.25, Error Rate=0.00%, Avg Latency: 0.497s
Concurrency 20: QPS=23.20, Error Rate=3.33%, Avg Latency: 0.654s
Concurrency 50: QPS=23.65, Error Rate=19.69%, Avg Latency: 0.638s

单机并发在qps 23左右

  1. 分布式部署dify,tke集群中部署1个api pod (2核4G),测评效果如下:
1
2
3
4
5
6
7
Load Test Summary:
Concurrency 5: QPS=18.20, Error Rate=0.00%, Avg Latency: 0.280s
Concurrency 10: QPS=19.80, Error Rate=0.00%, Avg Latency: 0.511s
Concurrency 20: QPS=22.00, Error Rate=0.00%, Avg Latency: 0.966s
Concurrency 50: QPS=24.00, Error Rate=0.00%, Avg Latency: 2.488s
Concurrency 100: QPS=24.90, Error Rate=0.00%, Avg Latency: 5.054s
Concurrency 200: QPS=38.70, Error Rate=3.25%, Avg Latency: 7.455s
  1. 分布式部署dify,tke集群中部署2个api pod,测评效果如下:
1
2
3
4
5
6
7
Load Test Summary:
Concurrency 5: QPS=20.80, Error Rate=0.00%, Avg Latency: 0.244s
Concurrency 10: QPS=30.70, Error Rate=0.00%, Avg Latency: 0.329s
Concurrency 20: QPS=35.80, Error Rate=0.00%, Avg Latency: 0.576s
Concurrency 50: QPS=40.80, Error Rate=0.00%, Avg Latency: 1.328s
Concurrency 100: QPS=45.00, Error Rate=0.00%, Avg Latency: 2.742s
Concurrency 200: QPS=46.30, Error Rate=0.00%, Avg Latency: 5.445s
  1. 分布式部署dify,tke集群中部署3个api pod,测评效果如下:
1
2
3
4
5
6
Concurrency 5: QPS=9.30, Error Rate=0.00%, Avg Latency: 0.552s
Concurrency 10: QPS=29.20, Error Rate=0.00%, Avg Latency: 0.346s
Concurrency 20: QPS=47.50, Error Rate=0.00%, Avg Latency: 0.428s
Concurrency 50: QPS=54.40, Error Rate=0.00%, Avg Latency: 0.986s
Concurrency 100: QPS=61.20, Error Rate=0.00%, Avg Latency: 1.861s
Concurrency 200: QPS=71.60, Error Rate=0.00%, Avg Latency: 3.359s

5.2 包含llm节点压测

dify流水线中仅部署三个节点,输入节点、llm节点、输出节点。然后对其进行测评

为避免llm的调用影响,将llm调用mock到测试机器,直接流式返回。

llm mock节点的压测数据如下:

1
2
3
4
5
6
7
8
9
10
11
QPS测试结果:
并发数 1: QPS=5.32, 错误率=0.00%
并发数 2: QPS=11.11, 错误率=0.00%
并发数 4: QPS=21.08, 错误率=0.00%
并发数 8: QPS=37.22, 错误率=0.00%
并发数 16: QPS=62.44, 错误率=0.00%
并发数 32: QPS=82.95, 错误率=0.00%
并发数 64: QPS=107.11, 错误率=0.00%
并发数 128: QPS=111.05, 错误率=0.00%
并发数 256: QPS=74.85, 错误率=0.00%
并发数 512: QPS=0.00, 错误率=100.00%

可见,当前llm的流式返回qps可以达到110。足以满足测评dify的需求

单机性能评测:

  1. 单机部署dify时,开启1个api工作进程,测评效果如下:
1
2
3
4
5
6
Load Test Summary:
Concurrency 5: QPS=6.25, Error Rate=0.00%, Avg Latency: 0.808s
Concurrency 10: QPS=6.50, Error Rate=0.00%, Avg Latency: 1.592s
Concurrency 20: QPS=7.20, Error Rate=0.00%, Avg Latency: 3.042s
Concurrency 50: QPS=8.50, Error Rate=0.00%, Avg Latency: 7.034s
Concurrency 100: QPS=3.25, Error Rate=75.00%, Avg Latency: 5.991s
  1. 单机部署dify,开启5个api工作进程,测评效果如下:
1
2
3
4
5
Load Test Summary:
Concurrency 5: QPS=6.95, Error Rate=0.00%, Avg Latency: 0.744s
Concurrency 10: QPS=14.10, Error Rate=0.00%, Avg Latency: 0.729s
Concurrency 20: QPS=18.60, Error Rate=2.11%, Avg Latency: 0.951s
Concurrency 50: QPS=17.10, Error Rate=22.10%, Avg Latency: 0.999s
  1. tkex部署dify,开启1个pod,测评效果如下:
1
2
3
4
5
6
7
8
Load Test Summary:
Concurrency 5: QPS=3.20, Error Rate=0.00%, Avg Latency: 1.709s
Concurrency 10: QPS=3.10, Error Rate=0.00%, Avg Latency: 3.457s
Concurrency 20: QPS=4.40, Error Rate=0.00%, Avg Latency: 6.127s
Concurrency 30: QPS=5.30, Error Rate=0.00%, Avg Latency: 8.399s
Concurrency 40: QPS=5.30, Error Rate=15.87%, Avg Latency: 9.838s

Maximum supported QPS (with 0% error rate): 5.30
  1. tkex部署dify,开启2个pod,测评效果如下:
1
2
3
4
5
6
7
8
Load Test Summary:
Concurrency 5: QPS=4.50, Error Rate=0.00%, Avg Latency: 1.134s
Concurrency 10: QPS=5.60, Error Rate=0.00%, Avg Latency: 1.884s
Concurrency 20: QPS=6.70, Error Rate=0.00%, Avg Latency: 3.604s
Concurrency 50: QPS=8.90, Error Rate=1.11%, Avg Latency: 7.656s
Concurrency 100: QPS=6.50, Error Rate=54.23%, Avg Latency: 9.267s

Maximum supported QPS (with 0% error rate): 6.70
  1. tkex部署dify,开启3个pod,测评效果如下:
1
2
3
4
5
6
7
8
Load Test Summary:
Concurrency 5: QPS=5.70, Error Rate=0.00%, Avg Latency: 0.911s
Concurrency 10: QPS=6.50, Error Rate=0.00%, Avg Latency: 1.642s
Concurrency 20: QPS=8.40, Error Rate=0.00%, Avg Latency: 2.746s
Concurrency 50: QPS=10.90, Error Rate=0.00%, Avg Latency: 6.364s
Concurrency 100: QPS=11.30, Error Rate=25.66%, Avg Latency: 8.762s

Maximum supported QPS (with 0% error rate): 10.90

5.3 桌面整理长流程压测

使用桌面整理测试最长链路,包括以下组件:

  • llm调用(3个)
  • python脚本执行(4个:意图分类、知识检索、充分性校验、外网检索)
  • 输出节点(3个)

llm调用同样采用mock方式,避免直接调用大模型

流程如下:
alt text

  1. tkex部署dify,开启1个pod,测评效果如下:
1
2
3
4
5
6
7
Load Test Summary:
Concurrency 5: QPS=2.30, Error Rate=0.00%, Avg Latency: 2.377s
Concurrency 10: QPS=2.60, Error Rate=0.00%, Avg Latency: 4.438s
Concurrency 20: QPS=3.50, Error Rate=0.00%, Avg Latency: 7.793s
Concurrency 30: QPS=3.70, Error Rate=15.91%, Avg Latency: 10.095s

Maximum supported QPS (with 0% error rate): 3.50
  1. tkex部署dify,开启2个pod,测评效果如下:
1
2
3
4
5
6
7
8
9
Load Test Summary:
Concurrency 5: QPS=3.10, Error Rate=0.00%, Avg Latency: 1.851s
Concurrency 10: QPS=3.30, Error Rate=0.00%, Avg Latency: 3.298s
Concurrency 20: QPS=5.20, Error Rate=0.00%, Avg Latency: 4.652s
Concurrency 30: QPS=6.20, Error Rate=0.00%, Avg Latency: 6.655s
Concurrency 40: QPS=7.00, Error Rate=1.41%, Avg Latency: 8.351s
Concurrency 50: QPS=7.40, Error Rate=6.33%, Avg Latency: 9.449s

Maximum supported QPS (with 0% error rate): 6.20
  1. tkex部署dify,开启3个pod,测评效果如下:
1
2
3
4
5
6
7
8
9
10
Load Test Summary:
Concurrency 5: QPS=3.50, Error Rate=0.00%, Avg Latency: 1.537s
Concurrency 10: QPS=5.00, Error Rate=0.00%, Avg Latency: 2.148s
Concurrency 20: QPS=6.70, Error Rate=0.00%, Avg Latency: 3.415s
Concurrency 30: QPS=6.50, Error Rate=0.00%, Avg Latency: 5.694s
Concurrency 40: QPS=8.40, Error Rate=0.00%, Avg Latency: 6.064s
Concurrency 50: QPS=9.30, Error Rate=0.00%, Avg Latency: 7.350s
Concurrency 100: QPS=8.40, Error Rate=40.00%, Avg Latency: 9.262s

Maximum supported QPS (with 0% error rate): 9.30

桌面整理test

使用真实hunyuan-turbo模型

5个pod进程部署:

1
2
3
4
5
6
7
8
9
Full Answer: ### 初始问题分析
> 用户在咨询全局云文件相关问题,我将读取用户知识库全部文件,必要时我也会进行额外检索。
> 检索内容:中美GDP数据对比
---
请等客服回应
Testing concurrency level: 5
Concurrency: 5, QPS: 1.50, Error Rate: 0.00%, Avg Latency: 3.837s

Maximum supported QPS (with 0% error rate): 1.5

txadp部署:

1
2
3
4
5
6
7
8
Full Answer: ['中美gdp', '\\### 初始问题分析  \n\\> 用户在咨询全局云文件相关问题,我将读取用户知识库全部文件,必要时我也会进行额外检索。  \n\\> 检索内容:\n中美GDP对比\n\\---', '\n请等客服回应', '']
Testing concurrency level: 5
Concurrency: 5, QPS: 2.00, Error Rate: 0.00%, Avg Latency: 3.028s

Load Test Summary:
Concurrency 5: QPS=2.00, Error Rate=0.00%, Avg Latency: 3.028s

Maximum supported QPS (with 0% error rate): 2.00

六、dify和tcadp对比

6.1 桌面整理业务测试

压测流程如下:
alt text
大模型不再mock、直接使用hunyuan-turbo。由于使用真实模型,同时各个平台有并发限制,所以仅对比并发为5的情况下各平台的性能,而非最高QPM

5个pod进程部署:

1
2
3
4
5
6
7
8
9
Full Answer: ### 初始问题分析
> 用户在咨询全局云文件相关问题,我将读取用户知识库全部文件,必要时我也会进行额外检索。
> 检索内容:中美GDP数据对比
---
请等客服回应
Testing concurrency level: 5
Concurrency: 5, QPS: 1.50, Error Rate: 0.00%, Avg Latency: 3.837s

Maximum supported QPS (with 0% error rate): 1.5

txadp部署:

1
2
3
4
5
6
7
8
Full Answer: ['中美gdp', '\\### 初始问题分析  \n\\> 用户在咨询全局云文件相关问题,我将读取用户知识库全部文件,必要时我也会进行额外检索。  \n\\> 检索内容:\n中美GDP对比\n\\---', '\n请等客服回应', '']
Testing concurrency level: 5
Concurrency: 5, QPS: 2.00, Error Rate: 0.00%, Avg Latency: 3.028s

Load Test Summary:
Concurrency 5: QPS=2.00, Error Rate=0.00%, Avg Latency: 3.028s

Maximum supported QPS (with 0% error rate): 2.00

以下是在并发为5的情况下,llm使用hunyuan-turbo的对比数据,包含并发数、QPM(QPS * 60)和平均延迟:

平台 并发数 QPS QPM (QPS * 60) 平均延迟 (秒)
txadp平台 5 2.00 120 3.028
5个pod进程部署dify 5 1.50 90 3.837

六、总结

1、了解了dify的整个研发流程,包括:单机部署,集群部署,搭建agent的流程
2、把桌面管家AI能力迁移到dify集群,正常运行
3、dify集群部署进行压力测试,目前最大可以压测到3000qpm(随着节点增加,qpm可以继续提升,可以满足电脑管家请求量需要)
4、dify可以快速搭建原型,部署上线。不过性能比手工编码agent流程,性能会差很多,我们线上单节点,复杂流程可以轻松支持50+pqs,但相同节点,使用dify,用桌面整理正式case测试下来只能支持10不到
5、接下来根据电脑管家agent相关需求,进行开发评估