在网上评论说dify的知识库的回答不准确,相比fastGPT会差很多,尝试在本地跑一跑试,由于官方文档更新不及时以及最新版本的大模型配置做了变更,网上的文档在配置模型时都是老版本的配置,在实际部署过程中,踩了几个坑,有想本地化部署的可以拿本文做参考。
官网的安装文档:Docker Compose 快速部署 | FastGPTGitHub微信群
也可以先体验他的线上版本(https://cloud.fastgpt.cn/)再考虑要不要装在本地体验。
先看看本地部署后的运行效果图:
黑色区域是我本地的服务部署环境,用了两个虚拟机。
部署步骤如下:
一,确定ollama/docker/docker compose已安装成功,并且下载了deepseek相关版本的大模型。
二,下载dify的两个安装文件并安装。
三,配置模型。
四,重新构建docker并在FastGPT中引入模型。
五,在fastGPT中使用本地知识库。
六,安装总结。
一,确定ollama/docker/docker compose已安装成功,并且下载了deepseek相关版本的大模型。
1.1,先确认ollama的安装是否成功(未下载请执行以下命令 ),
ollama run deepseek-r1:14b
ollama run nomic-embed-text:latest
执行ollama list,
再执行 ollama run deepseek-r1:14b 。(注意deepseek-r1:14b是我电脑上能跑的最大的版本,可能你的版本不一致,请换成你下载的版本。)
1.2,确认可以用本地IP来访问ollama(
http://172.24.77.26:11434/)。具体的IP地址根据你的电脑做替换,如果不能用IP访问,需要改一下ollama的配置文件,可以在线问一下deepseek,“其它电脑可以访问本机的ollama”,即更改config.json中的bind改成0.0.0.0即可。
1.3,docker/docker compose请自行参考其它资料安装(或者问deepseek,使用国内网络快速安装docker(win11或ubuntu))。
二,下载dify的两个安装文件并安装。
这两个文件下载时可能会有网络问题,特意贴出来:
2.1,config.json
// 已使用 json5 进行解析,会自动去掉注释,无需手动去除
{
"feConfigs": {
"lafEnv": "https://laf.dev" // laf环境。 https://laf.run (杭州阿里云) ,或者私有化的laf环境。如果使用 Laf openapi 功能,需要最新版的 laf 。
},
"systemEnv": {
"vectorMaxProcess": 10, // 向量处理线程数量
"qaMaxProcess": 10, // 问答拆分线程数量
"vlmMaxProcess": 10, // 图片理解模型最大处理进程
"tokenWorkers": 30, // Token 计算线程保持数,会持续占用内存,不能设置太大。
"pgHNSWEfSearch": 100, // 向量搜索参数。越大,搜索越精确,但是速度越慢。设置为100,有99%+精度。
"customPdfParse": {
"url": "", // 自定义 PDF 解析服务地址
"key": "", // 自定义 PDF 解析服务密钥
"doc2xKey": "", // doc2x 服务密钥
"price": 0 // PDF 解析服务价格
}
}
}
2,2,docker-compose.yml
# 数据库的默认账号和密码仅首次运行时设置有效
# 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~
# 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。
# 如何无法访问 dockerhub 和 git,可以用阿里云(阿里云没有arm包)
version: '3.3'
services:
# db
pg:
# image: pgvector/pgvector:0.8.0-pg15 # docker hub
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云
container_name: pg
restart: always
# ports: # 生产环境建议不要暴露
# - 5432:5432
networks:
- fastgpt
environment:
# 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
- POSTGRES_USER=username
- POSTGRES_PASSWORD=password
- POSTGRES_DB=postgres
volumes:
- ./pg/data:/var/lib/postgresql/data
mongo:
# image: mongo:5.0.18 # dockerhub
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云
# image: mongo:4.4.29 # cpu不支持AVX时候使用
container_name: mongo
restart: always
# ports:
# - 27017:27017
networks:
- fastgpt
command: mongod --keyFile /data/mongodb.key --replSet rs0
environment:
- MONGO_INITDB_ROOT_USERNAME=myusername
- MONGO_INITDB_ROOT_PASSWORD=mypassword
volumes:
- ./mongo/data:/data/db
entrypoint:
- bash
- -c
- |
openssl rand -base64 128 > /data/mongodb.key
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
echo 'const isInited = rs.status().ok === 1
if(!isInited){
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "mongo:27017" }
]
})
}' > /data/initReplicaSet.js
# 启动MongoDB服务
exec docker-entrypoint.sh "$@" &
# 等待MongoDB服务启动
until mongo -u myusername -p mypassword --authenticationDatabase admin --eval "print('waited for connection')" > /dev/null 2>&1; do
echo "Waiting for MongoDB to start..."
sleep 2
done
# 执行初始化副本集的脚本
mongo -u myusername -p mypassword --authenticationDatabase admin /data/initReplicaSet.js
# 等待docker-entrypoint.sh脚本执行的MongoDB服务进程
wait $!
# fastgpt
sandbox:
container_name: sandbox
# image: ghcr.io/labring/fastgpt-sandbox:v4.9.0 # git
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.9.0 # 阿里云
networks:
- fastgpt
restart: always
fastgpt:
container_name: fastgpt
# image: ghcr.io/labring/fastgpt:v4.9.0 # git
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.9.0 # 阿里云
ports:
- 3000:3000
networks:
- fastgpt
depends_on:
- mongo
- pg
- sandbox
restart: always
environment:
# 前端外部可访问的地址,用于自动补全文件资源路径。例如 https:fastgpt.cn,不能填 localhost。这个值可以不填,不填则发给模型的图片会是一个相对路径,而不是全路径,模型可能伪造Host。
- FE_DOMAIN=
# root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
- DEFAULT_ROOT_PSW=1234
# AI Proxy 的地址,如果配了该地址,优先使用
- AIPROXY_API_ENDPOINT=http://aiproxy:3000
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
- AIPROXY_API_TOKEN=aiproxy
# 模型中转地址(如果用了 AI Proxy,下面 2 个就不需要了,旧版 OneAPI 用户,使用下面的变量)
# - OPENAI_BASE_URL=http://oneapi:3000/v1
# - CHAT_API_KEY=sk-fastgpt
# 数据库最大连接数
- DB_MAX_LINK=30
# 登录凭证密钥
- TOKEN_KEY=any
# root的密钥,常用于升级时候的初始化请求
- ROOT_KEY=root_key
# 文件阅读加密
- FILE_TOKEN_KEY=filetoken
# MongoDB 连接参数. 用户名myusername,密码mypassword。
- MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin
# pg 连接参数
- PG_URL=postgresql://username:password@pg:5432/postgres
# sandbox 地址
- SANDBOX_URL=http://sandbox:3000
# 日志等级: debug, info, warn, error
- LOG_LEVEL=info
- STORE_LOG_LEVEL=warn
# 工作流最大运行次数
- WORKFLOW_MAX_RUN_TIMES=1000
# 批量执行节点,最大输入长度
- WORKFLOW_MAX_LOOP_TIMES=100
# 自定义跨域,不配置时,默认都允许跨域(多个域名通过逗号分割)
- ALLOWED_ORIGINS=
# 是否开启IP限制,默认不开启
- USE_IP_LIMIT=false
volumes:
- ./config.json:/app/data/config.json
# AI Proxy
aiproxy:
image: 'ghcr.io/labring/sealos-aiproxy-service:latest'
container_name: aiproxy
restart: unless-stopped
depends_on:
aiproxy_pg:
condition: service_healthy
networks:
- fastgpt
environment:
# 对应 fastgpt 里的AIPROXY_API_TOKEN
- ADMIN_KEY=aiproxy
# 错误日志详情保存时间(小时)
- LOG_DETAIL_STORAGE_HOURS=1
# 数据库连接地址
- SQL_DSN=postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy
# 最大重试次数
- RetryTimes=3
# 不需要计费
- BILLING_ENABLED=false
# 不需要严格检测模型
- DISABLE_MODEL_CONFIG=true
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:3000/api/status']
interval: 5s
timeout: 5s
retries: 10
aiproxy_pg:
# image: pgvector/pgvector:0.8.0-pg15 # docker hub
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云
restart: unless-stopped
container_name: aiproxy_pg
volumes:
- ./aiproxy_pg:/var/lib/postgresql/data
networks:
- fastgpt
environment:
TZ: Asia/Shanghai
POSTGRES_USER: postgres
POSTGRES_DB: aiproxy
POSTGRES_PASSWORD: aiproxy
healthcheck:
test: ['CMD', 'pg_isready', '-U', 'postgres', '-d', 'aiproxy']
interval: 5s
timeout: 5s
retries: 10
networks:
fastgpt:
2.3,创建一个fastgpt的目录,把上面两个文件放在一起,注意系统原来是使用官网的镜像,发现下载速度特别慢,已把所有的镜像都改成阿里云,基本上半小时就能完成下载。
2.4,在fastgpt目录中使用docker-compose up -d安装,成功安装后有5个docker;
2.5,如果有服务无法启动,有可能是端口被占用了,尤其是3000,3306,5432的端口,很有可能您的其它docker或应用已开启了,碰到这种情况,也可以直接更改docker-compose.yml文件中对应镜像的ports,只要改前面的宿主机端口就可以了,我的机器上跑了dify,发现5432已占用,就像如下做更改(只改前一个,其它地方都不要动):
2.6,打开http://127.0.0.1:3000,初始化的用户/密码:root/1234,安装好的版本是V4.8.23。
3,配置模型
这是部署后最大的难题,资料多但又没说清楚,对于新手特别不友好。他的帮助文档中是写了有四种方式可以配置模型,对于新用户来说很难理解,我们遵守一个原则,全部用ollama下载开源本地模型实现,你会发现你 不知道用那一种,然后说这个V4.8.23已经支持AI Proxy接入,然后你打开对应的功能进去,发现和他帮助文档中的截图不一样,很多新人在这一步基本上就不想再往下安装体验了。
这是官网帮助文档中说有应该有四个页签,实际后面两个是没有的。
这是安装后的界面,实际后面两个页签是没有的
建议先按我的简单方法来用:
3.1,使用OneAPI来配置模型:
流程:大致就是打开http://127.0.0.1:3001,进入One API,在渠道中配置本地或在线的大模型,再在令牌中配置一个新令牌,复制令牌的的KEY,再返回到第2步中,更改docker-compose.yml,再用docker重新compose,然后再进入http://127.0.0.1:3000,进入帐号-模型提供商进行配置与测试。
如果你在下面的步骤中迷失了,请返回看上一段说的流程。
3.1.1,开源的本地模型的调用原理可以这样理解:
3.1.2,打开http://127.0.0.1:3001,默认用户名/密码:root/1234,第一次可能会要求更改密码,按要求操作即可。
3.1.3,进入渠道,点创建新的渠道,参照下面的图片进行配置(5
个小步骤):
当右上角出现成功的提示时,表示One API与Ollama中的模型已经配置好了。
如果不成功,一般检查模型中的名称是否与ollama list出来的是否一致,或者是更换代理的地址,如上面图中的第4步,你可以用http://localhost:11434,或http://172.17.0.0.1:11434,或http://127.0.0.1:11434,可能你在网页或别的地方是可以用的,但是测试就是通不过,那是因为网页上能打开ollama的网址实际上docker在调用ollama时并不一致的。总结一句话就是换着你本地IP与上面三个都试试。
3.1.4,因为知识库还要用到 nomic-embed-text:latest 的模型,你按上述步骤再操作一次即可。
3.1.5,进入令牌,按下面5步操作:
令牌的操作步骤
展示操作结果
注意同时选择 nomic-embed-text:latest 模型。
3.1.5,复制令牌:
如我复制后的结果:sk-f3Qp2qEWjFKo6VZh0395Cc650d9b4791A138Be7c3b0993B3
4,重新构建docker并在FastGPT中引入模型。
4.1,更改docker-compose.yml
我们在安装模型的2.2的步骤中,就是下载了docker-compose.yml,现在要把上一步复制的KEY替换该文件中的CHAT_API_KEY=后面。
4.2,运行更新docker的命令。
docker compose down && docker-compose up -d
如果有出错,就是刚才复制的内容不对,复制的KEY应该是sk-开头的。
4.3,重新打开http://127.0.0.1:3000,帐号-模型供应商,模型配置,新增模型,语言模型,填写模型ID(ollama list列出的名称,不能有错,本示例如:deepseek-r1:14b),模型提供商(ollama),别名(建议与模型ID一样),然后点确认。后面的自定义请求地址,自定义请求KEY一定要空白。我在这里折腾了半个晚上。网上的资料都没有说,官网也没有说的,反正让你去慢慢摸。
4.4,fastGPT连接OneAPI模型测试:
按下图所示进行操作。
这里也是有坑的:
A,如果你在OneAPI中测试是通过的(即3.1.3的步骤),那么在这里测试不通过,可以先检查一下模型的名称,确认一下4.3步骤中说的自定义请求地址,自定义请求KEY一定要空白。
B,只要是按我上面的步骤来,配置肯定是没有问题的,可能是电脑网络或性能的问题,把docker的主机和ollama的主机都重启一下,如果有其它程序也是用ollama,可能你连接超时导致的。
4.5,把nomic-embed-text:latest模型按4.3的步骤操作,新增模型时要选择索引模型,其它操作类似。
五,在fastGPT中使用本地知识库。
5.1,新建知识库:知识库 - 新建 - 通用知识库 - 在这里可以配置前面步骤安装好的两个模型。名称可以输入中文,如我的资料。
5.2,导入相关的pdf文件,新建/导入 - 文本数据集 - 本地文件 - 再选择下一步。
5.3,数据处理配置先用默认,再下一步,点开始上传,完成对文档的分析之后,上传文件显示已就绪就表示可以来使用了。
这里会有坑就是一开始我们不要用高级配置,也有可能你的文档是图片内容,他还无法解决,最好的办法就是先用一个简单的表格或文档来测试。
5.4,创建简易应(对话):点工作台 - 新建 - 简易应用 - 填入应用的名称,选择知识库+对话引导。在关联知识库中点选择按钮,可以选择你刚刚添加好的文件,在右边的对话框中就可以问你上传内容的知识了。
5.5,保存并发布。
具体的知识库的调优和测试我就不在此展示了,有兴趣的可以看我dify中的知识库测试例子。
DeepseekR1+ollama+dify1.0.0搭建企业/个人知识库(入门避坑版)
六,安装总结。
6.1,两个安装文件很多网络环境下载不下来;可以用本文中的内容。
6.2,从官网下载下来的docker-compose.yml默认是用官网的镜像,下载非常慢,建议开启阿里云的镜像,在他的文件中有,只是被注释掉了。
6.3,官网帮助文档中说的AIProxy看起来简单,但是目前下载下来的镜像是不支持的,掉到这个坑里就要浪费很多时间。
6.4,OneAPI配置模型时,测试不通过,建议更换以下三个代理试试:http://127.0.0.1:11434 http://172.17.0.1:11434 http://localhost:114343,只要你的ollama是正常运行,而且是可以用本机IP地址访问的,那么以上三个IP肯定能测试通过。
6.5,OneAPI配置模型的令牌,是可以添加多个本地或线上模型的,但是是有限制的,可能超过6个后就无法保存,需要再添加一个令牌,如果再添加一个令牌现在的方式是还不知道如何解决。
6.6,按他的在线帮助文档AIProxy是更简单能配置大模型的,但是目前尝试过是无法配置的。
6.7,因为我们就是要本地化部署,所以模型比较小的情况下,知识库回答的质量是比较差的,但是基本上用了32B或以上的模型后,质量都比较好。
具体dify的功能与fastGPT的功能对比,在此也不展开了,建议有兴趣的先装在本机上体验一下。