Windows本地部署FastGPT
FastGPT+OneAPI+ChatGLM3+M3E+Reranker

上篇《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。结构如下:

o n e - a p i o m r n y e e s d - q i a l s p i 4 3 V 0 3 o 0 0 l 0 6 u : : m 3 3 e 0 3 s 0 0 0 6

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本地模型

模型 自定义模型名称m3etext-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。结构如下:

f a s t g p t f p m a g o s n t g g o p t 3 5 2 0 4 7 0 3 0 0 2 1 : : 7 3 5 : 0 4 2 0 3 7 0 2 0 1 7

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

切换到admindb:

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