当前位置:   article > 正文

【大模型本地知识库搭建】ChatGLM3,M3E,FastGPT,One-API_docker 部署 m3e

docker 部署 m3e

目录

引言        

一、ChatGLM3大模型本地部署

二、部署M3E模型

三、部署One-API

四、部署FastGPT

引言        

        本文技术路线为:利用ChatGLM3-6b作为基座大模型,M3E作为向量模型,基于FastGPT建立用户知识库,One-API做统一API接口管理。 其中ChatGLM3和M3E模型都是在windows下部署的,FastGPT和One-API是在Linux下部署。

        在私有化和客制化大模型庞大需求推动下,除了从大模型的全量训练和微调这两个模型改动层面上,在大模型外添加一个知识库也是一种解决思路。因为,一方面重新训练模型需要相当多的资源和专业知识,另一方面大模型本身具有知识延迟问题幻想问题。

  • 知识延迟问题是训练大模型需要一定的时间,从而训练数据就不可能具有实时性,而且相当耗费资源。
  • 幻想问题问题则由于LLM采用的概率模型,即预测生成下一个字符概率是多少,所有或多或少的它在生成结果的时候都有定的可能出现错误。

        目前比较好的方式就是利用大模型极强的语义理解能力,给大模型外挂一个知识库或者搜索引擎去解决这两个问题。基于知识库的定制化服务是独立于大模型的,知识库可以理解为一个用于提示引导大模型,和提供客户特有知识的工具。 

一、ChatGLM3大模型本地部署

        详细的步骤可参考这篇文章:【ChatGLM3大模型本地部署】。这小节对ChatGLM3-6b的API调用方式进行补充。在openai_api_demo/api_server.py 中修改本地大模型权重和向量模型地址,(向量模型可先不设置,本文使用的是M3E模型)。

  1. # set LLM path
  2. MODEL_PATH = os.environ.get('MODEL_PATH', 'D:/workplaces/github_workplace/ChatGLM3/models/chatglm3-6b/')
  3. TOKENIZER_PATH = os.environ.get("TOKENIZER_PATH", MODEL_PATH)
  4. # set Embedding Model path
  5. EMBEDDING_PATH = os.environ.get('EMBEDDING_PATH', 'D:/workplaces/github_workplace/M3E/m3e-base/')
  6. ----------------
  7. if __name__ == "__main__":
  8. # Load LLM
  9. tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)
  10. model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device_map="cuda").eval()
  11. # load Embedding
  12. embedding_model = SentenceTransformer(EMBEDDING_PATH, device="cuda")
  13. uvicorn.run(app, host='0.0.0.0', port=8000, workers=1)

使用python api_server.py启动后使用postman工具进行测试。

api_server.py启动后监听8000端口
Postman工具使用post方式进行测试
ChatGLM3返回报文

测试请求体:

  1. {
  2. "model": "string",
  3. "messages": [
  4. {
  5. "role": "user",
  6. "content": "你是谁?",
  7. "name": "string",
  8. "function_call": {
  9. "name": "string",
  10. "arguments": "string"
  11. }
  12. }
  13. ],
  14. "temperature": 0.8,
  15. "top_p": 0.8,
  16. "max_tokens": 0,
  17. "stream": false,
  18. "functions": {},
  19. "repetition_penalty": 1.1
  20. }

二、部署M3E模型

M3E 是 Moka Massive Mixed Embedding 的缩写,其中:

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

       M3E模型使用场景主要是中文,少量英文的情况,多语言使用场景,并且不介意数据隐私的话,建议使用 openai text-embedding-ada-002。

项目地址:moka-ai/m3e-base · Hugging Face,把项目拉下来即可使用。把项目地址在ChatGLM中openai_api_demo/api_server.py相应修改。

三、部署One-API

One-API使用Docker进行快速部署,One-API和FastGPT建议使用Linux系统进行部署,本文采用虚拟机安装了CentOS进行部署。

先安装Docker,Docker部署命令:

  1. # 安装 Docker
  2. curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
  3. systemctl enable --now docker
  4. # 安装 docker-compose
  5. curl -L https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  6. chmod +x /usr/local/bin/docker-compose
  7. # 验证安装
  8. docker -v
  9. docker-compose -v

One-API部署命令:

由于FastGPT也是使用3000端口,这里One-API改用3080端口。

  1. 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。

One-API登录界面

由于是本地部署的模型,需要在“渠道”里配置ChatGLM大模型M3E向量模型的地址。其中Base URL是能访问大模型的地址,密钥是自定义的,可以随意填写。

配置大模型渠道

配置M3E模型渠道

配置好后测试两个模型是否可以调用,点击测试按钮即可。

测试响应

设置令牌,后面在配置FastGPT时会用到。 

配置令牌

四、部署FastGPT

        FastGPT 是一个基于大语言模型的知识库问答系统,它为大模型的私有知识库提供便捷的数据处理、和不同模型调用等功能。

FastGPT功能结构示意图

先来了解下 FastGPT 是如何进行知识库检索的。首先了解几个基本概念:

  • 向量:将人类直观的语言(文字、图片、视频等)转成计算机可识别的语言(数组)。
  • 向量相似度:两个向量之间可以进行计算,得到一个相似度,即代表:两个语言相似的程度。
  • 语言大模型的一些特点:上下文理解、总结和推理。

结合上述 3 个概念,便有了 “向量搜索 + 大模型 = 知识库问答” 的公式。下图是 FastGPT V3 中知识库问答功能的完整逻辑:

FastGPT本文在Linux系统下使用Docker进行部署,目前这也是官方推荐的部署方式,官网介绍链接

依次执行下面命令,创建 FastGPT 文件并拉取docker-compose.ymlconfig.json,执行完后目录下会有 2 个文件。

  1. mkdir fastgpt
  2. cd fastgpt
  3. curl -O https://raw.githubusercontent.com/labring/FastGPT/main/files/deploy/fastgpt/docker-compose.yml
  4. curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json

接下来修改docker-compose.yml文件:

主要修改fastgpt/environment下的OPENAI_BASE_URLCHAT_API_KEY

前者填入One-API的地址和端口号,后者填写设置好的令牌口令。数据库的账号密码可以后面再重新设定。

  1. fastgpt:
  2. container_name: fastgpt
  3. image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.7 # git
  4. # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.7 # 阿里云
  5. ports:
  6. - 3000:3000
  7. networks:
  8. - fastgpt
  9. depends_on:
  10. - mongo
  11. - pg
  12. restart: always
  13. environment:
  14. # root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
  15. - DEFAULT_ROOT_PSW=1234
  16. # AI模型的API地址哦。务必加 /v1。这里默认填写了OneApi的访问地址。
  17. - OPENAI_BASE_URL=http://192.168.57.129:3080/v1
  18. # AI模型的API Key。(这里默认填写了OneAPI的快速默认key,测试通后,务必及时修改)
  19. - CHAT_API_KEY=sk-14W51d6l9bep34TVE52b6dE8EfAf46B8878f9dBb993f7f75
  20. # 数据库最大连接数
  21. - DB_MAX_LINK=30
  22. # 登录凭证密钥
  23. - TOKEN_KEY=any
  24. # root的密钥,常用于升级时候的初始化请求
  25. - ROOT_KEY=root_key
  26. # 文件阅读加密
  27. - FILE_TOKEN_KEY=filetoken
  28. # MongoDB 连接参数. 用户名myusername,密码mypassword。
  29. - MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin
  30. # pg 连接参数
  31. - PG_URL=postgresql://username:password@pg:5432/postgres
  32. volumes:
  33. - ./config.json:/app/data/config.json
  34. - ./fastgpt/tmp:/app/tmp
  35. networks:
  36. fastgpt:

同时修改config.json文件:

主要修改“llmModels”键值对中“model”和“name”的名字和其它需要的配置,如果不用其它的模型,保留这样一个字典就行,同时也要修改一下向量模型 "vectorModels"的“model”和“name”。

  1. {
  2. "systemEnv": {
  3. "vectorMaxProcess": 15,
  4. "qaMaxProcess": 15,
  5. "pgHNSWEfSearch": 100 // 向量搜索参数。越大,搜索越精确,但是速度越慢。设置为100,有99%+精度。
  6. },
  7. "llmModels": [
  8. {
  9. "model": "chatglm3-6B", // 模型名
  10. "name": "chatglm3-6B", // 别名
  11. "maxContext": 16000, // 最大上下文
  12. "maxResponse": 4000, // 最大回复
  13. "quoteMaxToken": 13000, // 最大引用内容
  14. "maxTemperature": 1.2, // 最大温度
  15. "charsPointsPrice": 0,
  16. "censor": false,
  17. "vision": false, // 是否支持图片输入
  18. "datasetProcess": true, // 是否设置为知识库处理模型(QA),务必保证至少有一个为true,否则知识库会报错
  19. "usedInClassify": true, // 是否用于问题分类(务必保证至少有一个为true
  20. "usedInExtractFields": true, // 是否用于内容提取(务必保证至少有一个为true
  21. "usedInToolCall": true, // 是否用于工具调用(务必保证至少有一个为true
  22. "usedInQueryExtension": true, // 是否用于问题优化(务必保证至少有一个为true
  23. "toolChoice": true, // 是否支持工具选择(分类,内容提取,工具调用会用到。目前只有gpt支持)
  24. "functionCall": false, // 是否支持函数调用(分类,内容提取,工具调用会用到。会优先使用 toolChoice,如果为false,则使用 functionCall,如果仍为 false,则使用提示词模式)
  25. "customCQPrompt": "", // 自定义文本分类提示词(不支持工具和函数调用的模型
  26. "customExtractPrompt": "", // 自定义内容提取提示词
  27. "defaultSystemChatPrompt": "", // 对话默认携带的系统提示词
  28. "defaultConfig":{} // LLM默认配置,可以针对不同模型设置特殊值(比如 GLM4 的 top_p
  29. },
  30. ],
  31. "vectorModels": [
  32. {
  33. "model": "m3e",
  34. "name": "m3e",
  35. "charsPointsPrice": 0,
  36. "defaultToken": 700,
  37. "maxToken": 3000,
  38. "weight": 100,
  39. "defaultConfig":{} // 默认配置。例如,如果希望使用 embedding3-large 的话,可以传入 dimensions:1024,来返回1024维度的向量。(目前必须小于1536维度)
  40. }
  41. ],
  42. "reRankModels": [],
  43. "audioSpeechModels": [
  44. {
  45. "model": "tts-1",
  46. "name": "OpenAI TTS1",
  47. "charsPointsPrice": 0,
  48. "voices": [
  49. { "label": "Alloy", "value": "alloy", "bufferId": "openai-Alloy" },
  50. { "label": "Echo", "value": "echo", "bufferId": "openai-Echo" },
  51. { "label": "Fable", "value": "fable", "bufferId": "openai-Fable" },
  52. { "label": "Onyx", "value": "onyx", "bufferId": "openai-Onyx" },
  53. { "label": "Nova", "value": "nova", "bufferId": "openai-Nova" },
  54. { "label": "Shimmer", "value": "shimmer", "bufferId": "openai-Shimmer" }
  55. ]
  56. }
  57. ],
  58. "whisperModel": {
  59. "model": "whisper-1",
  60. "name": "Whisper1",
  61. "charsPointsPrice": 0
  62. }
  63. }

 修改后启动容器:

在 docker-compose.yml 同级目录下执行。同时确保docker-compose版本最好在2.17以上,否则可能无法执行自动化命令。

  1. # 启动容器
  2. docker-compose pull
  3. docker-compose up -d

用docker ps查看是否正常启动

若oneapi没正常启动

  1. # 等待10s,OneAPI第一次总是要重启几次才能连上Mysql
  2. sleep 10
  3. # 重启一次oneapi(由于OneAPI的默认Key有点问题,不重启的话会提示找不到渠道,临时手动重启一次解决,等待作者修复)
  4. docker restart oneapi

正常启动后在浏览器上访问fastgpt,本地ip:3000端口。

账号root,初始密码1234。创建应用后即可测试是否正常使用本地部署的大模型。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/593699
推荐阅读
相关标签
  

闽ICP备14008679号