0%

大模型应用系列(十八) 大模型RAG项目实战:本地部署Dify实现RAG

介绍如何在Ubuntu22.04服务器上部署Dify并集成本地部署大模型,也介绍了较为简单的Windows部署方式,同时提供示例在Dify平台上快速搭建RAG。

一. 安装Dify

1.1 Dify介绍

Dify是一个基于GPT的AI应用开发平台,支持多种大语言模型(LLM),旨在帮助用户快速创建和运营生成式AI原生应用,它具备以下特点:

多模型支持:兼容OpenAI, Cloude, Hugging Face 等主流模型,并支持私有化部署。

可视化编排:提供prompt模板,工具链等可视化工具,简化应用开发流程。

丰富功能:支持文本生成,对话,知识库问答等,满足多样化需求。

灵活部署:支持云服务器和本地部署,适应不同场景。

持续更新:团队持续优化,确保平台功能与时俱进。

1.2 Docker 安装

Dify要用到Docker,所以先安装Docker, 系统版本可能导致Dify环境配置过程中出现问题, 我这里使用的是:

Ubuntu22.04

Docker version 26.1.3, build 26.1.3-0ubuntu1~22.04.1

docker-compose version 1.29.2, build unknown

准备条件

1
2
3
4
5
6
# 先更新apt工具
sudo apt-get update
# 先卸载操作系统默认安装的Docker
sudo apt-get remove docker docker-engine docker.io containerd runc
# 安装必要支持
sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release

准备安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 添加Docker官方key和官方源(国内网络可能存在问题)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"

# 添加阿里key和源(这里比较推荐)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"

#更新源
sudo apt update
sudo apt-get update

安装docker

1
2
3
4
5
6
# 查找Docker可用版本, 找到26.1.3版本
sudo apt-cache madison docker-ce
# 查找docker-cli可用版本, 找到2.6.13 版本
# 安装对应版本
sudo apt-get install docker-ce=5:26.1.3-1~ubuntu.22.04~jammy docker-ce-cli=5:26.1.3-1~ubuntu.22.04~jammy containerd.io

检验安装

1
sudo docker --version

输出如下:image-20250617223934394

安装docker-compose

1
sudo pip install docker-compose==1.29.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

验证安装

1
sudo docker-compose --version

输出如下:

image-20250617224136819

1.3 Dify安装

Dify代码仓: dify: Dify 是一个易用的 LLMOps 平台,旨在让更多人可以创建可持续运营的原生 AI 应用

1
2
3
4
git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env # 复制环境变量模板
sudo docker compose up -d # 后台启动docker,会自动拉取镜像 如果装的是1.几的docker-compose 则要用docker-compose

就会开始拉取:

image-20250619232446475

二. 本地部署Dify

上述Dify安装后就会启动docker, 默认启动在80端口, 由于我用的是云服务器,所以需要端口转发: 将云服务器的80端口转发到localhost:80

image-20250622224132875

接着在浏览去输入localhost:80

image-20250622224213071

设置好管理员账号后登录。

image-20250622224618263

可以看到Dify可以用于创建RAG, 也可以创建Agent,这里我们用于创建RAG, 主要是设置聊天模型和知识库。

2.1 设置模型

Dify只是一个框架, 我们需要集成大模型, 点击右上角头像->设置->模型供应商, 可以看到Dify支持很多模型供应商,image-20250622225529328

我们只需要选择对应模型供应商,其实它就是在后台有对应的API请求接口, 我们只需要设置好对应参数(比如API-key),Dify就帮我们发起请求。

选择想要的供应商, 然后安装, Dify可能存在bug,我点击供应商后无法点击安装,但先创建聊天助手后从聊天助手进入却可以安装, 这里要多试试。

这里安装DeepSeek,安装后到DS官网生成API-key,然后填入:

image-20250622231349891

保存后选择系统模型设置, 选择想接入DS哪个类型的模型,这里先设置普通的对话模型。

image-20250622231515324

2.2 创建聊天助手

点击创建空白应用->新手适用->聊天助手,选择之前接入的模型

image-20250622231903611

然后就可以进行对话, 但感觉它还是有BUG,我一开始输入后没有反应, 后来重启了服务器的docker, 又可以了, 有几点要注意:浏览器用谷歌;vscode要保持端口转发;服务器连接要保持;

image-20250622233151715

如果老是没有输出,尝试vscode重新连接服务器。

三. 云服务器部署Dify+ollama

这部分还没有成功,建议先根据四在本地电脑部署,云服务器比较麻烦。

Dify同样支持本地部署的大模型, 比如ollama, 或者 vllm/lmdeploy,后两个是类似的,因为它们都是通过Open-AI兼容的API格式调用的。

3.1 本地部署大模型

参考 大模型应用系列(六) ollama,vllm,LMDeploy 部署大模型 | 乌漆嘛黑

在GPU不多的情况下,我们一般选择ollama,因为ollama可以在一张GPU上部署多个模型(RAG需要chat模型,embedding模型,甚至rerank模型),如果有多张卡,也可以用vllm。

3.2 Dify+ollama

首先安装ollama插件,接着配置ollama,这里安装后页面改变可能有点慢,要等一下,多刷新页面。配置界面中主要配置url和模型名称

image-20250623004347877

如果配置我们云服务器的公网IP和端口,会报错找不到。

image-20250623004627502

需要进行额外配置。

接入本地部署的大模型需要更多的配置, 先停止docker。注意:一定要在dify/docker目录下执行:

1
sudo docker compose down

image-20250622234819920

这里部署deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B。

安装好ollama环境后,按照上面的教程拉取模型

image-20250623003324781

并测试OpenAI风格的API调用正常:

image-20250623005321174

接下来要将本地模型接入到Dify, 修改刚才的dify/docker/.env文件,首先在文本最后新增如下内容:

它的意思是使用自定义的模型, 并设置ollama的IP和端口, 另一个是vllm的ip和端口,这里设置为默认端口, 如果在部署的时候指定了端口,对应改变,另外IP也要改为云服务器的公网IP。

1
2
3
4
5
6
# 启用自定义模型
CUSTOM_MODEL_ENABLED=true
# 将 OLLAMA_API_BASE_URL 改为宿主机的物理 IP
OLLAMA_API_BASE_URL=http://117.50.174.219:11434
# vLLM 的 OpenAI 兼容 API 地址
CUSTOM_OPENAI_API_BASE_URL=http://117.50.174.219:8000

接着修改dify/docker/docker-compose.yaml, 定位到services的位置,要更改这部分代码:(大概在400行左右)

注意:下面代码主要新增了两部分,一个是新增一个函数(在后面定义),networks最后加上- dify-net, 并新增extra_hosts字段,目的是把docker的IP映射为本地IP。这里IP要改为自己的公网IP:

1
2
3
4
5
6
networks:
- ssrf_proxy_network
- default
- dify-net
extra_hosts:
- "host.docker.internal:117.50.174.219" # 直接映射宿主机 IP

再定位到networks字段, 定位到如下字段:(大概在1200行左右)

1
2
3
4
5
6
7
8
9
10
networks:
# create a network between sandbox, api and ssrf_proxy, and can not access outside.
ssrf_proxy_network:
driver: bridge
internal: true
milvus:
driver: bridge
opensearch-net:
driver: bridge
internal: true

在后面新增一个字段dify-net

1
2
3
4
5
6
7
8
9
10
11
12
13
networks:
# create a network between sandbox, api and ssrf_proxy, and can not access outside.
ssrf_proxy_network:
driver: bridge
internal: true
milvus:
driver: bridge
opensearch-net:
driver: bridge
internal: true
dify-net:
driver: bridge
attachable: true

然后重新启动docker, 在dify/docker目录下:

1
sudo docker compose up -d

然后重新打开网页, 可能有点慢,多等会,多刷新。

image-20250623013250100

配置好url和名称,一般就能成功了,但由于用的云服务器,网络很容易出问题,我这里就出问题了。

首先排查本地能否访问到云服务器上的ollama, 打开本地cmd,url访问

1
2
3
4
#验证跨网络访问
curl http://117.50.174.219:11434/api/chat -H "Content-Type: application/json" -d '{"model": "deepseek-r1:1.5b"}'

curl http://localhost:11434/api/chat -H "Content-Type: application/json" -d '{"model": "bge-large:latest"}'

我这里就是访问不上:

image-20250623013912531

ollama启动是ip要是0.0.0.0, 如果不是, 要修改。

这里的部署老是不成功,主要是云服务器IP比较难配置,后买你再更新,为了方便,我选择在本地电脑的windows系统搭建Dify+Ollama

四. windows部署Dify+Ollama

4.1 安装wsl

windows要安装wsl,并安装ubuntu22.04。安装 WSL | Microsoft Learn

Docker Desktop: The #1 Containerization Tool for Developers | Docker

4.2 安装Docker Desktop

按装Dokcer Desktop, 安装dify需要用到docker。

image-20250626215244316

如果显示WSL integration with distro 'Ubuntu-22.04' unexpectedly stopped. Do you want to restart it?, 是因为wsl ubuntu 版本和docker不一致,打开cmd,输入

1
wsl --list --verbose

如果版本不一致,输入:其中系统名要和上面查出来的Name一致,等待几分钟。

1
wsl --set-version Ubuntu-22.04 2

重新查询,版本一致

image-20250626223013599

配置镜像源

点击docker desktop右上角设置, Docker Engine,在json中加入字段:

1
2
3
4
5
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com",
"https://mirrors.aliyun.com"
]

然后点击Apply&restart

image-20250626223232194

验证换源成功, 输入以下命令,

1
docker info

显示如下, 说明换源成功:

image-20250626223554294

4.3 结合WSL与Docker Desktop

进入设置->Resources->WSL integration,勾选Ubuntu,点击Apply & restart。

image-20250626223840589

检验docker是否正常工作,打开cmd,输入

1
2
wsl
docker --version

显示如下,说明docker正常工作

image-20250626224113839

安装dify, 在想要放置dify源码的文件夹中输入

1
2
wsl
git clone https://github.com/langgenius/dify.git
4.4 安装ollama

直接到官网下载Ollama ,安装,可能有点慢。

安装后cmd输入

1
ollama --version

显示如下,说明安装正确

image-20250627220935102

下载模型

在官网搜索想要的模型,复制命令后在本地执行即可。

五. Dify集成Ollama

在Dify/docker目录下输入:

1
2
cp .env.example .env # 复制环境变量模板
sudo docker compose up -d # 后台启动docker,会自动拉取镜像 如果装的是1.几的docker-compose 则要用docker-compose

启动dify,打开浏览器(最好谷歌), 输入 http://localhost:80启动Dify

Dify集成Ollama主要填写以下信息

image-20250627234656002

所以要先设置ollama的地址,在环境变量中添加如下变量

image-20250627234815805

ip地址可以cmd输入ipconfig查找,设置后如果IP变了要更改,不然会出错。

设置后重启电脑,重新启动dify和ollama,在dify中设置其中url填写http://(IP地址):11434,模型名称要写ollama list 中对应模型名, 由于搭建知识库需要chat模型和Embedding模型,所以我加载了两个模型:

image-20250627235414845

测试

Dify集成了模型输出对比功能, 这里对比Ollama部署的qwen3-0.6b和在线API调用的glm-4-0520,输出如下:

可以看出,glm-4-0520给出了正确答案,而qwen3-0.6b证了个寂寞。

image-20250627235901627

六.创建知识库

根据五的步骤完成Dify集成chat模型和Embedding后,就可以在Dify中创建知识库了。

6.1 新建知识库

准备好自己的知识库,我这里使用如下文本: 可从下载

部分数据示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"中国电信5G套餐": [
{
"套餐名称": "5G畅享套餐",
"月费": "158元起",
"流量": "60GB起,最高可达1TB",
"通话": "2000分钟通话",
"适用人群": "适合对流量和通话有极高需求的用户",
"优惠信息": "赠送一年视频会员,每月赠送10GB流量"
}
],
...
}

找到: 知识库->创建知识库

image-20250628225934097

接着设置参数,Dify虽然搭建RAG简单,但文档切分只支持分块处理,这里所有参数都用预置参数,点击开始后开始处理文档

image-20250630215458981

这里如果rerank如果配本地模型还会有问题,在线API可以,这里就不适用rerank。接着在聊天助手中接入知识库,点击创建好的聊天助手,点击添加知识库,添加刚才创建好的知识库,

image-20250630220509317

6.2 RAG测试

创建好RAG后,在聊天框输入问题,聊天模型会根据知识库内容进行回答。

image-20250630220706199

对比下面没有知识库时的模型输出,可以看出添加知识库后模型的输出更有意义,即RAG可以减少大模型幻觉。

image-20250630220845572

但这里我们知识库只分为一个段,其实RAG精度不高。

6.3 总结

总的来说,Dify支持快速构建RAG,但只支持文档的固定分块大小,RAG效果其实不好,在实际应用中,我们更多地是要做定制化处理,比如其他的文档分块方式,这时候Dify效果并不好。

6.4 问题

1.GPT模型本身就会对文本进行嵌入,那能不能直接用GPT模型作为Embedding模型?

可以,但是相比起来,GPT除了嵌入层,还多了后续的模型层,所以更大,不如直接使用嵌入模型快,如果我们在添加GPT模型时把它作为嵌入模型,也是可以的。

image-20250630222614405

2.更改Embedding是否需要重新处理文档?

需要,更改Embedding需要对文档重新嵌入处理。

3.Dify的缺点

在Windows上比较简单,但在Linux上很麻烦,主要是Dify运行在Docker中,需要做端口映射。

构建知识库时,文档分块方式比较固定。

如果您读文章后有收获,可以打赏我喝咖啡哦~