个人版知识库FastGPT部署教程

1708073186-image-1708073186820

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景!

记得踩坑前到官方的https://github.com/labring/FastGPT/issues处查看他人遇到的问题

前言

需要准备一台配置不算低且容量大点的云服务器或本地部署,部署前要考虑好对接向量模型是调用在线GPT模型API还是离线化的向量模型,FastGPT文档检索默认对接OPEN AI的text-embedding-ada-002模型,官方也介绍了其他模型的对接,如果你考虑离线化模型可以先部署模型,另外最好先部署好One API 项目【https://github.com/songquanpeng/one-api】

官方接入微软、ChatGLM、本地模型等文档:https://doc.fastgpt.in/docs/development/one-api/

我自己部署的一些容量占比参考:

fastgpt:latest 镜像大小:349.65 MB

mongo:5.0.18 镜像大小:632.08 MB

one-api:latest 镜像大小:46.20 MB

pgvector:v0.5.0 镜像大小:394.77 MB

reranker:v0.1 模型镜像大小:7.65 GB

M3E模型镜像大小:6.95GB

M3E文本转向量模型的部署

M3E 是 Moka Massive Mixed Embedding 的缩写

  • Moka,此模型由 MokaAI 训练,开源和评测,训练脚本使用 uniem ,评测 BenchMark 使用 MTEB-zh
  • Massive,此模型通过千万级 (2200w+) 的中文句对数据集进行训练
  • Mixed,此模型支持中英双语的同质文本相似度计算,异质文本检索等功能,未来还会支持代码检索
  • Embedding,此模型是文本嵌入模型,可以将自然语言转换成稠密的向量+

原项目地址:https://huggingface.co/moka-ai/m3e-large

img

兼容openapi的text-embedding-ada-002接口服务Docker部署(存在容器里):

项目地址:https://github.com/fanfpy/m3e.local

使用方法

1
2
3
4
5
6
git clone https://github.com/fanfpy/m3e.local.git
cd m3e.local
# 这一步会下载镜像 使用的魔搭的模型源,文件下载需要一段时间
# 可以使用docker-compose up 观察输出
docker-compose up -d
# running on http://0.0.0.0:6006 如果端口有冲突请自行更改

1709923780655

1709925467219

验证

request

1
2
3
4
5
6
7
8
curl --location 'http://127.0.0.1:6006/v1/embeddings' \
--header 'Authorization: Bearer sk-aaabbbcccdddeeefffggghhhiiijjjkkk' \
--header 'Content-Type: application/json' \
--data '{
"input": ["hello m3e"],
"model": "text-embedding-ada-002",
"encoding_format": "float"
}'

response

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"data": [
{
"embedding": [
0.04027857258915901,
0.005487577989697456,
-0.025278501212596893,
-0.004541480913758278 ...
],
"index": 0,
"object": "embedding"
}
],
"model": "text-embedding-ada-002",
"object": "list",
"usage": {
"prompt_tokens": 2,
"total_tokens": 4
}
}

接入 One API

在oneapi里填的是IP+docker-compose.yml中设置的端口

秘钥为:sk-aaabbbcccdddeeefffggghhhiiijjjkkk

model-m3e1

接入 FastGPT

修改 config.json 配置文件,在 vectorModels 中加入 M3E 模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"vectorModels": [
{
"model": "text-embedding-ada-002",
"name": "Embedding-2",
"price": 0.2,
"defaultToken": 500,
"maxToken": 3000
},
{
"model": "m3e",
"name": "M3E(测试使用)",
"price": 0.1,
"defaultToken": 500,
"maxToken": 1800
}
]

接入 ChatGLM2-6B及ReRank 重排模型

1709994884307

环境要求

  • Python 3.10.11
  • CUDA 11.7
  • 科学上网环境

源码部署

  1. 根据上面的环境配置配置好环境,具体教程自行 GPT;
  2. 下载 python 文件
  3. 在命令行输入命令 pip install -r requirements.txt
  4. 按照https://huggingface.co/BAAI/bge-reranker-base下载模型仓库到app.py同级目录
  5. 添加环境变量 export ACCESS_TOKEN=XXXXXX 配置 token,这里的 token 只是加一层验证,防止接口被人盗用,默认值为 ACCESS_TOKEN
  6. 执行命令 python app.py

然后等待模型下载,直到模型加载完毕为止。如果出现报错先问 GPT。

启动成功后应该会显示如下地址:

img

这里的 http://0.0.0.0:6006 就是连接地址。

docker 部署

  • 镜像名: luanshaotong/reranker:v0.1
  • 端口号: 6006
  • 大小:约8GB

设置安全凭证(即oneapi中的渠道密钥)

1
ACCESS_TOKEN=mytoken

运行命令示例

  • 无需GPU环境,使用CPU运行
1
docker run -d --name reranker -p 6006:6006 -e ACCESS_TOKEN=mytoken luanshaotong/reranker:v0.1
  • 需要CUDA 11.7环境
1
docker run -d --gpus all --name reranker -p 6006:6006 -e ACCESS_TOKEN=mytoken luanshaotong/reranker:v0.1

docker-compose.yml示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: "3"
services:
reranker:
image: luanshaotong/reranker:v0.1
container_name: reranker
# GPU运行环境,如果宿主机未安装,将deploy配置隐藏即可
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
ports:
- 6006:6006
environment:
- ACCESS_TOKEN=mytoken

接入 FastGPT

1
2
3
4
5
6
7
8
9
"reRankModels": [
{
"model": "Rerank",
"name": "Rerank-base",
"charsPointsPrice": 0,
"requestUrl": "部署url/api/v1/rerank",
"requestAuth": "Bearer 你的TOKEN"
}
]

ChatGLM2-6B部署

推荐配置

依据官方数据,同样是生成 8192 长度,量化等级为 FP16 要占用 12.8GB 显存、int8 为 8.1GB 显存、int4 为 5.1GB 显存,量化后会稍微影响性能,但不多。

因此推荐配置如下:

类型 内存 显存 硬盘空间 启动命令
fp16 >=16GB >=16GB >=25GB python openai_api.py 16
int8 >=16GB >=9GB >=25GB python openai_api.py 8
int4 >=16GB >=6GB >=25GB python openai_api.py 4

环境要求

  • Python 3.8.10
  • CUDA 11.8
  • 科学上网环境

源码部署

  1. 根据上面的环境配置配置好环境,具体教程自行 GPT;
  2. 下载 python 文件
  3. 在命令行输入命令 pip install -r requirements.txt
  4. 打开你需要启动的 py 文件,在代码的 verify_token 方法中配置 token,这里的 token 只是加一层验证,防止接口被人盗用;
  5. 执行命令 python openai_api.py --model_name 16。这里的数字根据上面的配置进行选择。

然后等待模型下载,直到模型加载完毕为止。如果出现报错先问 GPT。

启动成功后应该会显示如下地址:

img

这里的 http://0.0.0.0:6006 就是连接地址。

docker 部署

镜像和端口

  • 镜像名: stawky/chatglm2:latest
  • 国内镜像名: registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/chatglm2:latest
  • 端口号: 6006
1
2
3
# 设置安全凭证(即oneapi中的渠道密钥)
默认值:sk-aaabbbcccdddeeefffggghhhiiijjjkkk
也可以通过环境变量引入:sk-key。有关docker环境变量引入的方法请自寻教程,此处不再赘述。

接入 One API

为 chatglm2 添加一个渠道,参数如下:

img

这里填入 chatglm2 作为语言模型

测试

curl 例子:

1
2
3
4
5
6
7
curl --location --request POST 'https://domain/v1/chat/completions' \
--header 'Authorization: Bearer sk-aaabbbcccdddeeefffggghhhiiijjjkkk' \
--header 'Content-Type: application/json' \
--data-raw '{
"model": "chatglm2",
"messages": [{"role": "user", "content": "Hello!"}]
}'

Authorization 为 sk-aaabbbcccdddeeefffggghhhiiijjjkkk。model 为刚刚在 One API 填写的自定义模型。

接入 FastGPT

修改 config.json 配置文件,在 llmModels 中加入 chatglm2 模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
"llmModels": [
//已有模型
{
"model": "chatglm2",
"name": "chatglm2",
"maxContext": 4000,
"maxResponse": 4000,
"quoteMaxToken": 2000,
"maxTemperature": 1,
"vision": false,
"defaultSystemChatPrompt": ""
}
]

FASTGPT本体部署

1709994847584

第一步:修改docker-compose.yml 代码

修改docker-compose.yml 里mongo部分的代码,补上command和mongodb.key

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mongo:
image: mongo:5.0.18
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云
container_name: mongo
ports:
- 27017:27017
networks:
- fastgpt
command: mongod --keyFile /data/mongodb.key --replSet rs0
environment:
# 下面的用户名和密码如果你之前用的username/password,就仍然用之前的。
- MONGO_INITDB_ROOT_USERNAME=myname
- MONGO_INITDB_ROOT_PASSWORD=mypassword
volumes:
- ./mongo/data:/data/db
- ./mongodb.key:/data/mongodb.key

windows下不能修改权限时将内容替换为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mongo:
image: mongo:5.0.18
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云
container_name: mongo
ports:
- 27017:27017
networks:
- fastgpt
command: mongod --keyFile /data/mongodb.key --replSet rs0
environment:
# 默认的用户名和密码,只有首次允许有效
- MONGO_INITDB_ROOT_USERNAME=myname
- MONGO_INITDB_ROOT_PASSWORD=mypassword
volumes:
- ./mongo/data:/data/db
- ./mongodb.key:/data/mongodb.key
entrypoint:
- bash
- -c
- |
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
exec docker-entrypoint.sh $$@

第二步:修改config.json代码:

直接复制以下代码替换掉原来的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
{
"systemEnv": {
"openapiPrefix": "fastgpt",
"vectorMaxProcess": 15,
"qaMaxProcess": 15,
"pgHNSWEfSearch": 100
},
"llmModels": [
{
"model": "gpt-3.5-turbo-1106",
"name": "gpt-3.5-turbo",
"maxContext": 16000,
"maxResponse": 4000,
"quoteMaxToken": 13000,
"maxTemperature": 1.2,
"inputPrice": 0,
"outputPrice": 0,
"censor": false,
"vision": false,
"datasetProcess": false,
"toolChoice": true,
"functionCall": false,
"customCQPrompt": "",
"customExtractPrompt": "",
"defaultSystemChatPrompt": "",
"defaultConfig": {}
},
{
"model": "gpt-3.5-turbo-16k",
"name": "gpt-3.5-turbo-16k",
"maxContext": 16000,
"maxResponse": 16000,
"quoteMaxToken": 13000,
"maxTemperature": 1.2,
"inputPrice": 0,
"outputPrice": 0,
"censor": false,
"vision": false,
"datasetProcess": true,
"toolChoice": true,
"functionCall": false,
"customCQPrompt": "",
"customExtractPrompt": "",
"defaultSystemChatPrompt": "",
"defaultConfig": {}
},
{
"model": "gpt-4-0125-preview",
"name": "gpt-4-turbo",
"maxContext": 125000,
"maxResponse": 4000,
"quoteMaxToken": 100000,
"maxTemperature": 1.2,
"inputPrice": 0,
"outputPrice": 0,
"censor": false,
"vision": false,
"datasetProcess": false,
"toolChoice": true,
"functionCall": false,
"customCQPrompt": "",
"customExtractPrompt": "",
"defaultSystemChatPrompt": "",
"defaultConfig": {}
},
{
"model": "gpt-4-vision-preview",
"name": "gpt-4-vision",
"maxContext": 128000,
"maxResponse": 4000,
"quoteMaxToken": 100000,
"maxTemperature": 1.2,
"inputPrice": 0,
"outputPrice": 0,
"censor": false,
"vision": false,
"datasetProcess": false,
"toolChoice": true,
"functionCall": false,
"customCQPrompt": "",
"customExtractPrompt": "",
"defaultSystemChatPrompt": "",
"defaultConfig": {}
}
],
"vectorModels": [
{
"model": "text-embedding-ada-002",
"name": "Embedding-2",
"inputPrice": 0,
"outputPrice": 0,
"defaultToken": 700,
"maxToken": 3000,
"weight": 100,
"defaultConfig": {}
}
],
"reRankModels": [],
"audioSpeechModels": [
{
"model": "tts-1",
"name": "OpenAI TTS1",
"inputPrice": 0,
"outputPrice": 0,
"voices": [
{ "label": "Alloy", "value": "alloy", "bufferId": "openai-Alloy" },
{ "label": "Echo", "value": "echo", "bufferId": "openai-Echo" },
{ "label": "Fable", "value": "fable", "bufferId": "openai-Fable" },
{ "label": "Onyx", "value": "onyx", "bufferId": "openai-Onyx" },
{ "label": "Nova", "value": "nova", "bufferId": "openai-Nova" },
{ "label": "Shimmer", "value": "shimmer", "bufferId": "openai-Shimmer" }
]
}
],
"whisperModel": {
"model": "whisper-1",
"name": "Whisper1",
"inputPrice": 0,
"outputPrice": 0
}
}

第三步:创建 mongo 密钥,赋予密钥文件权限:

打开终端, CD 进项目的目录,如果安装了宝塔,直接在项目的目录界面点击终端

file

在终端输入代码:

1
openssl rand -base64 756 > ./mongodb.key

接着再输入:chmod 600 ./mongodb.key

接着再输入:chown 999:root ./mongodb.key

(!!!这一步很关键,如果不输入这一步,就无法启动Mongo容器)

第四步:重启所有容器。

依次在终端输入以下代码:

1
2
3
# 重启 Mongo
docker-compose down
docker-compose up -d

此时,可以去Docker界面看看mongo是否正常启动,如果没有启动,就手动启动一下。

第五步:进入容器初始化部分集合

  1. 先在终端输入:docker exec -it mongo bash

  2. 再输入:mongo -u myname -p mypassword --authenticationDatabase admin

  3. (注意这里的mynamemypassword,要和docker-compose.ymlmongo部分的代码一致。)

  4. 初始化副本集。在终端输入以下代码:

    1
    2
    3
    4
    5
    6
    rs.initiate({
    _id: "rs0",
    members: [
    { _id: 0, host: "mongo:27017" }
    ]
    })
  5. 检查状态。
    输入:rs.status() 如果提示 rs0 状态,则代表运行成功

第六步:更新容器

在终端输入以下代码:

1
docker-compose down && docker-compose pull && docker-compose up -d

其它问题:

1、导入知识库时提示null value in column "tmb_id" of relation "modeldata" violates not-null constraint

这可能是因为没有初始化4.6.7,或初始化4.6.7出现了某首错误,比如rootkey不正确;

2、已经显示4.6.8,但对话或导入模型时提示没有模型。

需要重新拉取最新的容器:

1
docker-compose down && docker-compose pull && docker-compose up -d

3、初始化mongo副本集提示This node was not started with the replSet option

这是因为mongodb.key的权限不够,需要再在终端输入:chown 999:root ./mongodb.key

4、Docker部署m3e向量模型时报错【选择国内镜像或从huggingface下载后调用】

5、部署FAST-GPT时登录报错【一般是key权限问题】

6、MongoDB 容器并配置副本集初始化报错【docker exec -it mongo mongo 然后,在 MongoDB Shell 中执行 rs.initiate() 命令来初始化副本集:rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "localhost:27017" }
]
})

6、报错:Operation users.findOne() buffering timed out after 10000ms
mongo运行失败的结果,需要初始化副本集后再启动