赞
踩
本文技术路线为:利用ChatGLM3-6b作为基座大模型,M3E作为向量模型,基于FastGPT建立用户知识库,One-API做统一API接口管理。 其中ChatGLM3和M3E模型都是在windows下部署的,FastGPT和One-API是在Linux下部署。
在私有化和客制化大模型庞大需求推动下,除了从大模型的全量训练和微调这两个模型改动层面上,在大模型外添加一个知识库也是一种解决思路。因为,一方面重新训练模型需要相当多的资源和专业知识,另一方面大模型本身具有知识延迟问题和幻想问题。
目前比较好的方式就是利用大模型极强的语义理解能力,给大模型外挂一个知识库或者搜索引擎去解决这两个问题。基于知识库的定制化服务是独立于大模型的,知识库可以理解为一个用于提示引导大模型,和提供客户特有知识的工具。
详细的步骤可参考这篇文章:【ChatGLM3大模型本地部署】。这小节对ChatGLM3-6b的API调用方式进行补充。在openai_api_demo/api_server.py 中修改本地大模型权重和向量模型地址,(向量模型可先不设置,本文使用的是M3E模型)。
- # set LLM path
- MODEL_PATH = os.environ.get('MODEL_PATH', 'D:/workplaces/github_workplace/ChatGLM3/models/chatglm3-6b/')
- TOKENIZER_PATH = os.environ.get("TOKENIZER_PATH", MODEL_PATH)
-
- # set Embedding Model path
- EMBEDDING_PATH = os.environ.get('EMBEDDING_PATH', 'D:/workplaces/github_workplace/M3E/m3e-base/')
-
- ----------------
-
- if __name__ == "__main__":
- # Load LLM
- tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)
- model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device_map="cuda").eval()
-
- # load Embedding
- embedding_model = SentenceTransformer(EMBEDDING_PATH, device="cuda")
- uvicorn.run(app, host='0.0.0.0', port=8000, workers=1)
使用python api_server.py启动后使用postman工具进行测试。
测试请求体:
- {
- "model": "string",
- "messages": [
- {
- "role": "user",
- "content": "你是谁?",
- "name": "string",
- "function_call": {
- "name": "string",
- "arguments": "string"
- }
- }
- ],
- "temperature": 0.8,
- "top_p": 0.8,
- "max_tokens": 0,
- "stream": false,
- "functions": {},
- "repetition_penalty": 1.1
- }
M3E 是 Moka Massive Mixed Embedding 的缩写,其中:
M3E模型使用场景主要是中文,少量英文的情况,多语言使用场景,并且不介意数据隐私的话,建议使用 openai text-embedding-ada-002。
项目地址:moka-ai/m3e-base · Hugging Face,把项目拉下来即可使用。把项目地址在ChatGLM中openai_api_demo/api_server.py相应修改。
One-API使用Docker进行快速部署,One-API和FastGPT建议使用Linux系统进行部署,本文采用虚拟机安装了CentOS进行部署。
先安装Docker,Docker部署命令:
- # 安装 Docker
- curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
- systemctl enable --now docker
- # 安装 docker-compose
- curl -L https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
- chmod +x /usr/local/bin/docker-compose
- # 验证安装
- docker -v
- docker-compose -v
One-API部署命令:
由于FastGPT也是使用3000端口,这里One-API改用3080端口。
-
- docker run --name one-api -d --restart always -p 3080:3000 -e TZ=Asia/Shanghai -v /home/data/one-api:/data justsong/one-api
利用docker ps查看One-API是否启动
启动后在本地浏览器打开One-API,地址为本地IP地址+3080端口,登录页初始账号为root,密码123456。
由于是本地部署的模型,需要在“渠道”里配置ChatGLM大模型和M3E向量模型的地址。其中Base URL是能访问大模型的地址,密钥是自定义的,可以随意填写。
配置好后测试两个模型是否可以调用,点击测试按钮即可。
设置令牌,后面在配置FastGPT时会用到。
FastGPT 是一个基于大语言模型的知识库问答系统,它为大模型的私有知识库提供便捷的数据处理、和不同模型调用等功能。
先来了解下 FastGPT 是如何进行知识库检索的。首先了解几个基本概念:
结合上述 3 个概念,便有了 “向量搜索 + 大模型 = 知识库问答” 的公式。下图是 FastGPT V3 中知识库问答功能的完整逻辑:
FastGPT本文在Linux系统下使用Docker进行部署,目前这也是官方推荐的部署方式,官网介绍链接
依次执行下面命令,创建 FastGPT 文件并拉取docker-compose.yml
和config.json
,执行完后目录下会有 2 个文件。
- mkdir fastgpt
- cd fastgpt
- curl -O https://raw.githubusercontent.com/labring/FastGPT/main/files/deploy/fastgpt/docker-compose.yml
- curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json
接下来修改docker-compose.yml文件:
主要修改fastgpt/environment下的OPENAI_BASE_URL和CHAT_API_KEY
前者填入One-API的地址和端口号,后者填写设置好的令牌口令。数据库的账号密码可以后面再重新设定。
-
- fastgpt:
- container_name: fastgpt
- image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.7 # git
- # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.7 # 阿里云
- ports:
- - 3000:3000
- networks:
- - fastgpt
- depends_on:
- - mongo
- - pg
- restart: always
- environment:
- # root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
- - DEFAULT_ROOT_PSW=1234
- # AI模型的API地址哦。务必加 /v1。这里默认填写了OneApi的访问地址。
- - OPENAI_BASE_URL=http://192.168.57.129:3080/v1
- # AI模型的API Key。(这里默认填写了OneAPI的快速默认key,测试通后,务必及时修改)
- - CHAT_API_KEY=sk-14W51d6l9bep34TVE52b6dE8EfAf46B8878f9dBb993f7f75
- # 数据库最大连接数
- - 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
- volumes:
- - ./config.json:/app/data/config.json
- - ./fastgpt/tmp:/app/tmp
-
- networks:
- fastgpt:
同时修改config.json文件:
主要修改“llmModels”键值对中“model”和“name”的名字和其它需要的配置,如果不用其它的模型,保留这样一个字典就行,同时也要修改一下向量模型 "vectorModels"的“model”和“name”。
- {
- "systemEnv": {
- "vectorMaxProcess": 15,
- "qaMaxProcess": 15,
- "pgHNSWEfSearch": 100 // 向量搜索参数。越大,搜索越精确,但是速度越慢。设置为100,有99%+精度。
- },
- "llmModels": [
- {
- "model": "chatglm3-6B", // 模型名
- "name": "chatglm3-6B", // 别名
- "maxContext": 16000, // 最大上下文
- "maxResponse": 4000, // 最大回复
- "quoteMaxToken": 13000, // 最大引用内容
- "maxTemperature": 1.2, // 最大温度
- "charsPointsPrice": 0,
- "censor": false,
- "vision": false, // 是否支持图片输入
- "datasetProcess": true, // 是否设置为知识库处理模型(QA),务必保证至少有一个为true,否则知识库会报错
- "usedInClassify": true, // 是否用于问题分类(务必保证至少有一个为true)
- "usedInExtractFields": true, // 是否用于内容提取(务必保证至少有一个为true)
- "usedInToolCall": true, // 是否用于工具调用(务必保证至少有一个为true)
- "usedInQueryExtension": true, // 是否用于问题优化(务必保证至少有一个为true)
- "toolChoice": true, // 是否支持工具选择(分类,内容提取,工具调用会用到。目前只有gpt支持)
- "functionCall": false, // 是否支持函数调用(分类,内容提取,工具调用会用到。会优先使用 toolChoice,如果为false,则使用 functionCall,如果仍为 false,则使用提示词模式)
- "customCQPrompt": "", // 自定义文本分类提示词(不支持工具和函数调用的模型
- "customExtractPrompt": "", // 自定义内容提取提示词
- "defaultSystemChatPrompt": "", // 对话默认携带的系统提示词
- "defaultConfig":{} // LLM默认配置,可以针对不同模型设置特殊值(比如 GLM4 的 top_p
- },
- ],
- "vectorModels": [
- {
- "model": "m3e",
- "name": "m3e",
- "charsPointsPrice": 0,
- "defaultToken": 700,
- "maxToken": 3000,
- "weight": 100,
- "defaultConfig":{} // 默认配置。例如,如果希望使用 embedding3-large 的话,可以传入 dimensions:1024,来返回1024维度的向量。(目前必须小于1536维度)
- }
- ],
- "reRankModels": [],
- "audioSpeechModels": [
- {
- "model": "tts-1",
- "name": "OpenAI TTS1",
- "charsPointsPrice": 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",
- "charsPointsPrice": 0
- }
- }
修改后启动容器:
在 docker-compose.yml 同级目录下执行。同时确保docker-compose
版本最好在2.17以上,否则可能无法执行自动化命令。
- # 启动容器
- docker-compose pull
- docker-compose up -d
用docker ps查看是否正常启动
若oneapi没正常启动
- # 等待10s,OneAPI第一次总是要重启几次才能连上Mysql
- sleep 10
- # 重启一次oneapi(由于OneAPI的默认Key有点问题,不重启的话会提示找不到渠道,临时手动重启一次解决,等待作者修复)
- docker restart oneapi
正常启动后在浏览器上访问fastgpt,本地ip:3000端口。
账号root,初始密码1234。创建应用后即可测试是否正常使用本地部署的大模型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。