上篇《ChatGLM3(一) Windows部署和踩坑》部署完成之后,继续尝试部署带知识库和问答编排功能的FastGPT。
简介
FastGPT是一个开源基于LLM的RAG应用,最重要的是知识库功能。但是FastGPT默认是调用openai的api的,要转为调用本地部署的ChatGLM3,需要一个中间件OneAPI
来转发,FastGPT把本来发给openai的api请求发到OneAPI里,OneAPI根据配置把请求发到本地部署的ChatGLM3 api中。
FastGPT原调用流程:
graph LR A(FastGPT) A --> B(OpenAI gpt模型) A --> C(OpenAI text-embedding模型) A --> E(本地rerank模型)
加入OneAPI后的调用:
graph LR A(FastGPT) A --> B(OneAPI) A --> E(本地 rerank模型) B --> C(本地 ChatGLM3模型) B --> D(本地 M3e-embedding模型)
知识库拆分文档内容后,需要使用Embedding模型转换成向量存入向量数据库,所以还需要部署一个Embedding模型,这里也使用开源本地部署的M3E-large
模型。
用户问题和知识库向量比对结果需要筛选,目前使用Rerank模型进行比对评分重排序,这里也使用开源本地部署bge-reranker-large
模型。
之前本地部署的ChatGLM3
是基于Web直接使用的,也需要改成API方式部署。
开工!
1. Docker Desktop安装
为了安装和管理方便,这里使用Windows版本的Docker进行管理。
到官网<www.docker.com>下载Docker Desktop安装程序。
安装后,如果是Win10或Win11,安装完后会启用WSL2的Linux虚拟机环境。
在Windows的Terminal(Command或Powershell都可以)里执行docker命令测试安装完成。
C:\Users\user> docker -v
Docker version 25.0.2, build 29cf629
2. OneAPI部署
2.1 下载OneAPI
克隆官方GitHub 仓库
git clone https://github.com/songquanpeng/one-api.git
2.2 修改docker端口
打开\one-api\docker-compose.yml
文件
修改默认的3000端口,改为4000,因为3000端口是之后安装的FastGPT默认端口。
ports:
- "4000:3000"
2.3 docker运行
docker-compose pull
等待拉取下载完成。
docker-compose up -d
如果一切正常,在DockerDesktop的客户端界面里可以就看到运行的Container了。
one-api的group下应该成功启动了3个服务one-api、mysql、redis。结构如下:
2.4 测试
浏览器打开 http://127.0.0.1:4000
用户名为 root
密码为 123456
首次登录需要修改密码。
2.5 配置令牌
在这里配置一个可以调用oneapi接口的token。
顶上菜单令牌
- 添加新的令牌
名称: FastGPT令牌
过期时间: 永不过期
额度: 设为无限额度
提交保存后,返回渠道,在FastGPT令牌右边点击复制
,即复制出token,这样一串字符sk-xxxxxxxxxx,后面配置FastGPT时会用到。
2.6 配置渠道
目前本地模型的API还没有部署,在后面部署模型时会进行渠道添加。
3. ChatGLM3模型API部署
3.1 部署api
按照《ChatGLM3(一) Windows部署和踩坑》 这篇写的安装部署好ChatGLM3,最后一步不用运行
streamlit run main.py`命令启动Web界面。
如果和我一样显卡只有苦逼的12G显存,需要改为量化8bit启动。
修改api_server.py
文件内容:
#model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device_map="auto").eval()
model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True).quantize(8).cuda().eval()
运行api服务:
cd openai_api_demo
python api_server.py
3.2 测试api
这里使用Postman进行测试,可以去官网下载安装。
新建API请求:
请求方式: POST
URL: http://127.0.0.1:8000/v1/chat/completions
Body:
{
"model": "chatglm3-6b",
"messages": [
{
"role": "user",
"content": "你是谁"
}
],
"stream": false,
"max_tokens": 100,
"temperature": 0.8,
"top_p": 0.8
}
点击Send
发送请求,正常的话可以收到返回内容。
3.3 配置到one-api
打开http://127.0.0.1:4000,渠道
- 添加新渠道
类型 自定义渠道
BaseURL http://127.0.0.1:8000
名称 ChatGLM3本地
模型 自定义模型名称chatglm3
填入
密钥 123456
(本地ChatGLM3不验证密钥,随意填)
3.4 测试通过one-api访问
同样使用Postman进行测试。
请求方式: POST
URL: http://127.0.0.1:4000/v1/chat/completions
Authentication: 选择Bearer Token
,token值设置为sk-xxxxxxxxxx
(OneAPI Web里复制的令牌)
Body:
{
"model": "chatglm3",
"messages": [
{
"role": "user",
"content": "你是谁"
}
],
"stream": false,
"max_tokens": 100,
"temperature": 0.8,
"top_p": 0.8
}
点击Send
发送请求,正常的话可以收到返回内容。
将JSON里的"stream": false
改为"stream": true
可以测试流式输出,回答会按生成多少返回多少一直输出。
4. M3E-large模型部署
也采用简单的docker方式部署
4.1 docker部署
拉取镜像(镜像内已经包含模型下载):
docker pull registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api
GPU方式运行镜像:
docker run -d -p 6008:6008 --gpus all registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api
CPU方式运行镜像:
docker run -d -p 6008:6008 registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api
4.2 测试api
使用Postman进行测试。
请求方式: POST
URL: http://127.0.0.1:6008/v1/embeddings
Authentication: 选择Bearer Token
,token值设置为sk-aaabbbcccdddeeefffggghhhiiijjjkkk
Body:
{
"model": "m3e",
"input": ["hello world"]
}
点击Send
发送请求,正常的话可以收到返回内容。
4.3 配置到one-api
打开http://127.0.0.1:4000,渠道
- 添加新渠道
类型 自定义渠道
BaseURL http://127.0.0.1:6008
名称 Embedding本地模型
模型 自定义模型名称m3e
和text-embedding-ada-002
填入
密钥 sk-aaabbbcccdddeeefffggghhhiiijjjkkk
4.4 测试通过one-api访问
同样使用Postman进行测试。
请求方式: POST
URL: http://127.0.0.1:4000/v1/embeddings
Authentication: 选择Bearer Token
,token值设置为sk-aaabbbcccdddeeefffggghhhiiijjjkkk
Body:
{
"model": "m3e",
"input": ["hello world"]
}
点击Send
发送请求,正常的话可以收到类似返回内容。
{
"data": [
{
"embedding": [
0.03476172313094139,
-0.02664785459637642,
-0.024446291849017143,
0.03853733092546463,
-0.011446488089859486,
-0.03146049380302429,
0.0018535606795921922,
0.005742138717323542
],
"index": 0,
"object": "embedding"
}
],
"model": "m3e",
"object": "list",
"usage": {
"prompt_tokens": 2,
"total_tokens": 2
}
}
5. Rerank模型部署
5.1 下载模型
这里采用FastGPT使用的rerank模型bge-reranker-large
克隆大文件前先确定安装了git-lfs,在官网https://git-lfs.com/下载安装包安装。
下载模型(huggingface源):
git clone https://huggingface.co/BAAI/bge-reranker-large.git
下载模型(国内源):
git clone https://www.modelscope.cn/quietnight/bge-reranker-large.git
等待下载完成,模型文件有4G以上。
5.2 部署api
rerank模型的启动程序在FastGPT的工程里。
克隆工程:
git clone https://github.com/labring/FastGPT.git
进入rerank路径:
cd FastGPT/python/reranker/bge-reranker-base
安装python环境略过
安装依赖包(如果之前有使用conda环境,先用conda activate xxx
)切换环境
pip install -r requirement.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install sentencepiece
移动bge-reranker-large
模型文件夹到程序目录
修改模型路径,编辑app.py
:
#RERANK_MODEL_PATH = os.path.join(os.path.dirname(__file__), "bge-reranker-base")
RERANK_MODEL_PATH = os.path.join(os.path.dirname(__file__), "bge-reranker-large")
运行api服务:
python app.py
没有报错运行成功。
5.3 测试api
使用Postman进行测试。
请求方式: POST
URL: http://127.0.0.1:6006/api/v1/rerank
Authentication: 选择Bearer Token
,token值设置为ACCESS_TOKEN
Body:
{
"query": "What is the capital of France?",
"inputs": [
{"id": "1", "text": "The capital of France is Paris."},
{"id": "2", "text": "Berlin is the capital of Germany."}
]
}
点击Send
发送请求,正常的话可以收到返回内容。
{
"code": 200,
"message": "重排成功",
"data": [
{"id": "1", "score": 0.9985534559008095},
{"id": "2", "score": 0.025102072990210177}
],
"time": "2024-03-14 17:04:36.515287"
}
Rerank api地址目前是直接在FastGPT中配置,不用在OneAPI中配置。
6. FastGPT部署
6.1 下载
git clone https://github.com/labring/FastGPT.git
6.2 拷贝配置文件
复制FastGPT\projects\app\data\config.json
文件到FastGPT\files\deploy\fastgpt\config.json
6.3 修改oneapi地址
打开FastGPT\files\deploy\fastgpt\docker-compose.yml
文件
修改内容填入oneapi的地址和令牌token:
services:
fastgpt:
environment:
# - OPENAI_BASE_URL=https://api.openai.com/v1
- OPENAI_BASE_URL=http://127.0.0.1:4000/v1/
- CHAT_API_KEY=sk-xxxxxxxxxx
6.4 docker运行
docker-compose pull
等待拉取下载完成。
docker-compose up -d
如果一切正常,在DockerDesktop的客户端界面里可以就看到运行的Container了。
fastgpt的group下应该成功启动了3个服务fastgpt、pgvector、mongo。结构如下:
6.5 测试
浏览器打开 http://127.0.0.1:3000
用户名为 root
密码为 1234
第一次应该是无法登录成功的,因为新版本用的mongo会报错,下面会让mongo正常启动和正常初始化。
6.6 mongo启动问题
在DesktopDocker点击mongo,在Logs里查看mongo的日志报错信息。或者命令行docker logs mongo
查看日志。
结合官方mongo初始化和mongo问题解决。
如果日志报错是mongodb.key文件无法打开。
停止docker的mongo容器后,删除FastGPT\files\deploy\fastgpt\mongodb.key
文件或文件夹。
使用openssl命令生成一个新的mongodb.key
文件
openssl rand -base64 756 > ./mongodb.key
如果日志报错是permissions on /data/mongodb.key are too open
文件权限太开放,修改文件属性-安全,改为只有只读。
linux下可以执行
chmod 600 ./mongodb.key
如果日志报错是error opening file: /data/mongodb.key: bad file
是文件所属用户的问题,修改文件属性安全为当前用户。
linux下可以执行
chown 999:root ./mongodb.key
6.7 mongo初始化
mongo容器可以正常启动后,在fastgpt打开webhttp://127.0.0.1:3000登录的时候,mongo容器报错初始化错误。
需要手动执行初始化命令,在DesktopDocker中选择mongo容器,点击Exec在容器里执行命令。或者使用docker exec -it mongo bash
命令行进入。
连接mongo,进入mongo命令行:
mongo
切换到admin
db:
use admin;
返回switched to db admin
验证用户:
db.auth("myname","mypassword");
返回1
初始化副本集:
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "mongo:27017" }
]
});
返回{ “ok” : 1 }
查询rs0状态:
rs.status();
返回很多状态信息
初始化用户:
db.createUser({
user: "admin",
pwd: "password",
roles: [{ role: "root", db: "admin" }]
});
返回Successfully added user ....
上面一通操作后,再次打开webhttp://127.0.0.1:3000登录fastgpt,用户名为 root
密码为 1234
没有意外的话就可以登入到系统里。
6.8 config.json模型配置
默认的config.json配置的模型是ChatGPT的模型,需要修改FastGPT\files\deploy\fastgpt\config.json
文件,添加本地的模型的配置信息。
在llmModels下添加一个新的LLM模型:
{
"llmModels": [
{
"model": "chatglm3",
"name": "ChatGLM3开源本地",
"datasetProcess": true,
"maxToken": 8000,
"price": 0,
"maxTemperature": 1.0,
"functionCall": true,
"functionPrompt": ""
},
{
}
]
}
在vectorModels下添加一个新的M3E模型:
{
"vectorModels": [
{
"model": "m3e",
"name": "M3E-embedding",
"price": 0,
"defaultToken": 500,
"maxToken": 1800
},
{
}
]
}
在reRankModels下添加一个新的rerank模型:
{
"reRankModels": [
{
"model": "bge-reranker-large",
"name": "检索重排-reranker-large",
"inputPrice": 0,
"requestUrl": "http://127.0.0.1:6006/api/v1/rerank",
"requestAuth": "ACCESS_TOKEN"
}
]
}
保存后,重启fastgpt容器。可以通过在容器里发命令查看加载的config.json是否修改成功。
docker exec -it fastgpt cat /app/data/config.json
PS:这里llmmodels可以不改配置,用一个取巧的方法,使用oneapi渠道配置里的模型重定向
功能,把fastgpt默认的chatgpt的几个模型,添加到chtglm3的渠道里,然后再配置模型重定向{"gpt-3.5-turbo-1106": "chatglm3"}
,把chatgpt的模型改成chatglm3的模型名称,这样在fastgpt看似使用的是chatGPT模型,但是在oneapi里还在被转发到chatglm3里了。
7. 使用测试
进入FastGPT后,知识库 - 新建 - 知识库 - 取名 - 选择M3E模型 - 确认创建
点击知识库名称 - 数据集 - 新建/导入 - 文本数据集 - 本地文件 - 拖入一个txt文件 - 下一步 - 直接拆分 - 下一步 - 开始上传 - 左侧 搜索测试。 可以输入txt文件相关内容进行测试。
知识库索引成功后,新建应用测试知识库。
应用 - 新建 - 取名 - 知识库+对话引导 - AI模型选择ChatGLM3开源本地
- 关联知识库 - 选择 - 选择知识库 - 完成 - 参数 - 语义检索 - 结果重排 - 完成 - 保存并预览。 右侧可以输入问题询问txt文件里的内容。
更多FastGPT的功能参见官方文档啦。
收工!
Last modified on 2024-03-04