Windows+WSL+Ubuntu+Docker-Desktop+FastGPT+m3e+oneapi+ChatGLM3部署本地AI知识库

慈云数据 12个月前 (04-19) 技术支持 56 0

1. windows wsl Ubuntu(略)

2. 安装docker-destktop并设置wsl(略)

3. 在ubuntu中操作:

  • 下载yml和json文件

    cd ~/
    sudo 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
    
  • 修改yml文件,打开下载的docker-compose.yml文件,修改fastgpt端口为3200:3000(其中外部暴露端口3200可以任意)

  • 拉去镜像,这个过程稍微比较长,如果timeout,重新拉去,或者更改Docker镜像源,如何修改请自行百度

    sudo docker-compose pull && sudo docker-compose up -d
    
  • 手动初始化mongo(fastgpt 4.7版本不需要初始化,可以进入容器先查询)

    • 查看mongo容器是否正常运行

      sudo docker ps
      
    • 进入容器

      sudo docker exec -it mongo bash	
      
    • 链接数据库(这里需要填mongo用户名和密码)

      mongo -u myusername -p mypassword --authenticationDatabase admin	
      
    • 直接查询初始化副本集的状态,如果提示rs0状态,则代表成功

      rs.status()	# 成功则退出
      exit()
      
    • 浏览器访问 http://localhost:3020 则可以访问fastgpt的页面,默认账号是 root,密码是 1234

      4. 下载启动chatglm3的api服务

      • 下载文件和模型:

        • 程序文件下载地址:链接 https://pan.baidu.com/s/1JjIUkQohjDMyurapD5gfqg?pwd=lky0

        • 模型下载(模型文件将整个文件夹的内容都下载,耗时比较长):

          • 官网地址:https://huggingface.co/THUDM/chatglm3-6b-32k/tree/main
          • 百度网盘地址:https://pan.baidu.com/s/12WsiftYvarm7A2VaL_NBHg?pwd=147l
          • 修改chatglm3程序文件的bat

            • 程序文件解压后,鼠标右键编辑02启动api.bat文件

            • 复制下载好模型的绝对路径

            • 将复制好的路径替换bat文件的模型路径(set MODEL_PATH),并保存退出

              @echo off
              chcp 65001 >null
              echo 启动中,请耐心等待
              set PYTHON=..\glut\python.exe
              set SC_PATH=..\glut\Scripts
              set CU_PATH=..\glut\Lib\site-packages\torch\lib
              set PATH=%SC_PATH%;%CU_PATH%;%PATH%
              set HF_ENDPOINT=https://hf-mirror.com
              set HF_HOME=..\huggingface
              set MODEL_PATH=..\..\chatglm3-6b-32k
              # 我上面使用的相对路径,也可以使用绝对路径
              # set MODEL_PATH=E:\LLM\chatglm3-6b-32k
              CD openai_api_demo
              %PYTHON% openai_api.py
              pause
              
            • 双击启动02启动api.bat文件,启动完成之后就能看到使用的是http://0.0.0.0:8000,请勿关闭这个cmd窗口。

              注意:请勿使用右键管理员运行,会报错:The system cannot find the path specified.
              

              5. 使用docker部署m3e

              • 实现本地私有部署,并调用本地LLM,则需要本地的想量化模型处理文本资料,选择M3E小模型,占用资源不高,CPU也可运行。

                • 镜像名: stawky/m3e-large-api:latest
                • 国内镜像: registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api:latest 端口号: 6008 环境变量
                • openai的渠道密码,默认:sk-aaabbbcccdddeeefffggghhhiiijjjkkk
                • 确认端口是否被占用,m3e默认使用6008端口,使用下面命令查看是否被占用

                  netsh int ipv4 show excludedport tcp
                  
                • 部署m3e(本人使用gpu来运算)

                  • 使用cpu运行

                    sudo docker run -d -p 6008:6008 --name=m3e-large-api registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api:latest
                    
                  • 使用gpu运行

                    sudo docker run -d -p 6008:6008 --gpus all --name=m3e-large-api registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api:latest
                    
                  • 源镜像(推荐)

                    sudo docker run -d -p 6008:6008 --gpus all --name=m3e-large-api stawky/m3e-large-api:latest
                    

                    其中 --gpus all 是使用gpu来运行,此过程比较慢,等待部署完成

                    6. 配置oneapi

                    • 运行并访问oneapi:访问 http://localhost:3000/ 并登录。初始账号用户名为 root,密码为 123456

                    • 点击令牌,添加新的令牌 如图所示:

                      在这里插入图片描述

                    • 复制ChatGPT Next Web

                      # 这是我的令牌
                      https://app.nextchat.dev/#/?settings={"key":"sk-kuI2uEsxnJV8XgIN69493c7088D544Aa9b9d645d950e85F7","url":"http://localhost:3000"}
                      # 其中key为:sk-kuI2uEsxnJV8XgIN69493c7088D544Aa9b9d645d950e85F7
                      # url:http://localhost:3000
                      

                      在这里插入图片描述

                    • 通常一般教程会让大家去配置渠道,但是我们是用的windows wsl ubuntu 和docker-desktop,后续配置m3e渠道测试的时候会访问不通,会出现connect: 192.168.0.137:6008 connection refused(如图),所以我们需要重新配置docker-compose.yml

                      在这里插入图片描述

                      在这里插入图片描述

                      7. 重新配置docker-compose.yml和config.json

                      • docker-compose.yml,其中OPENAI_BASE_URL无修修改就是用默认的http://oneapi:3000/v1,CHAT_API_KEY为上面复制ChatGPT Next Web的 key,还需要在oneapi 中增加一个 extra_hosts, 详细配置如下:

                        docker-compose.yml

                        # 数据库的默认账号和密码仅首次运行时设置有效
                        # 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~
                        # 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。
                        version: '3.3'
                        services:
                          pg:
                            image: ankane/pgvector:v0.5.0 # git
                            # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.5.0 # 阿里云
                            container_name: pg
                            restart: always
                            ports: # 生产环境建议不要暴露
                              - 5432:5432
                            networks:
                              - fastgpt
                            environment:
                              # 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
                              - POSTGRES_USER=username
                              - POSTGRES_PASSWORD=password
                              - POSTGRES_DB=postgres
                            volumes:
                              - ./pg/data:/var/lib/postgresql/data
                          mongo:
                            image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18
                            container_name: mongo
                            restart: always
                            ports:
                              - 27017:27017
                            networks:
                              - fastgpt
                            command: mongod --keyFile /data/mongodb.key --replSet rs0
                            environment:
                              - MONGO_INITDB_ROOT_USERNAME=myusername
                              - MONGO_INITDB_ROOT_PASSWORD=mypassword
                            volumes:
                              - ./mongo/data:/data/db
                            entrypoint:
                              - bash
                              - -c
                              - |
                                openssl rand -base64 128 > /data/mongodb.key
                                chmod 400 /data/mongodb.key
                                chown 999:999 /data/mongodb.key
                                echo 'const isInited = rs.status().ok === 1
                                if(!isInited){
                                  rs.initiate({
                                      _id: "rs0",
                                      members: [
                                          { _id: 0, host: "mongo:27017" }
                                      ]
                                  })
                                }' > /data/initReplicaSet.js
                                # 启动MongoDB服务
                                exec docker-entrypoint.sh "$$@" &
                                # 等待MongoDB服务启动
                                until mongo -u myusername -p mypassword --authenticationDatabase admin --eval "print('waited for connection')" > /dev/null 2>;&1; do
                                  echo "Waiting for MongoDB to start..."
                                  sleep 2
                                done
                                # 执行初始化副本集的脚本
                                mongo -u myusername -p mypassword --authenticationDatabase admin /data/initReplicaSet.js
                                # 等待docker-entrypoint.sh脚本执行的MongoDB服务进程
                                wait $$!
                          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:
                              - 3020: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://oneapi:3000/v1
                              # AI模型的API Key。(这里默认填写了OneAPI的快速默认key,测试通后,务必及时修改)
                              - CHAT_API_KEY=sk-kuI2uEsxnJV8XgIN69493c7088D544Aa9b9d645d950e85F7
                              # 数据库最大连接数
                              - 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
                          mysql:
                            image: mysql:8.0.36
                            container_name: mysql
                            restart: always
                            ports:
                              - 3306:3306
                            networks:
                              - fastgpt
                            command: --default-authentication-plugin=mysql_native_password
                            environment:
                              # 默认root密码,仅首次运行有效
                              MYSQL_ROOT_PASSWORD: oneapimmysql
                              MYSQL_DATABASE: oneapi
                            volumes:
                              - ./mysql:/var/lib/mysql
                          oneapi:
                            container_name: oneapi
                            image: ghcr.io/songquanpeng/one-api:latest
                            ports:
                              - 3001:3000
                            depends_on:
                              - mysql
                            networks:
                              - fastgpt
                            # oneapi中测试不通的话,增加下面代码
                            extra_hosts:
                              - host.docker.internal:host-gateway
                            restart: always
                            environment:
                              # mysql 连接参数
                              - SQL_DSN=root:oneapimmysql@tcp(mysql:3306)/oneapi
                              # 登录凭证加密密钥
                              - SESSION_SECRET=oneapikey
                              # 内存缓存
                              - MEMORY_CACHE_ENABLED=true
                              # 启动聚合更新,减少数据交互频率
                              - BATCH_UPDATE_ENABLED=true
                              # 聚合更新时长
                              - BATCH_UPDATE_INTERVAL=10
                              # 初始化的 root 密钥(建议部署完后更改,否则容易泄露)
                              - INITIAL_ROOT_TOKEN=fastgpt
                            volumes:
                              - ./oneapi:/data
                        networks:
                          fastgpt:
                        

                        config.json需要在llmModels中增加chatglm3的模型,在vectorModels中增加m3e,全部配置如下:

                        {
                          "feConfigs": {
                            "lafEnv": "https://laf.dev"
                          },
                          "systemEnv": {
                            "openapiPrefix": "fastgpt",
                            "vectorMaxProcess": 15,
                            "qaMaxProcess": 15,
                            "pgHNSWEfSearch": 100
                          },
                          "llmModels": [
                              {
                              "model": "chatglm3",
                              "name": "chatglm3",
                              "maxContext": 16000,
                              "avatar": "/imgs/model/openai.svg",
                              "maxResponse": 4000,
                              "quoteMaxToken": 13000,
                              "maxTemperature": 1.2,
                              "charsPointsPrice": 0,
                              "censor": false,
                              "vision": false,
                              "datasetProcess": true,
                              "usedInClassify": true,
                              "usedInExtractFields": true,
                              "usedInToolCall": true,
                              "usedInQueryExtension": true,
                              "toolChoice": true,
                              "functionCall": true,
                              "customCQPrompt": "",
                              "customExtractPrompt": "",
                              "defaultSystemChatPrompt": "",
                              "defaultConfig": {}
                            },
                        	{
                        		"model": "qwen",
                        		"name": "qwen",
                        		"maxContext": 32000,
                        		"avatar": "/imgs/model/qwen.svg",
                        		"maxResponse": 5000,
                        		"quoteMaxToken": 5000,
                        		"maxTemperature": 1.2,
                        		"charsPointsPrice": 0,
                        		"censor": false,
                        		"vision": false,
                        		"datasetProcess": true,
                        		"usedInClassify": true,
                        		"usedInExtractFields": true,
                        		"usedInToolCall": true,
                        		"usedInQueryExtension": true,
                        		"toolChoice": true,
                        		"functionCall": false,
                        		"customCQPrompt": "",
                        		"customExtractPrompt": "",
                        		"defaultSystemChatPrompt": "",
                        		"defaultConfig": {}
                        	},
                            {
                              "model": "gpt-3.5-turbo",
                              "name": "gpt-3.5-turbo",
                              "maxContext": 16000,
                              "avatar": "/imgs/model/openai.svg",
                              "maxResponse": 4000,
                              "quoteMaxToken": 13000,
                              "maxTemperature": 1.2,
                              "charsPointsPrice": 0,
                              "censor": false,
                              "vision": false,
                              "datasetProcess": true,
                              "usedInClassify": true,
                              "usedInExtractFields": true,
                              "usedInToolCall": true,
                              "usedInQueryExtension": true,
                              "toolChoice": true,
                              "functionCall": true,
                              "customCQPrompt": "",
                              "customExtractPrompt": "",
                              "defaultSystemChatPrompt": "",
                              "defaultConfig": {}
                            },
                            {
                              "model": "gpt-4-0125-preview",
                              "name": "gpt-4-turbo",
                              "avatar": "/imgs/model/openai.svg",
                              "maxContext": 125000,
                              "maxResponse": 4000,
                              "quoteMaxToken": 100000,
                              "maxTemperature": 1.2,
                              "charsPointsPrice": 0,
                              "censor": false,
                              "vision": false,
                              "datasetProcess": false,
                              "usedInClassify": true,
                              "usedInExtractFields": true,
                              "usedInToolCall": true,
                              "usedInQueryExtension": true,
                              "toolChoice": true,
                              "functionCall": false,
                              "customCQPrompt": "",
                              "customExtractPrompt": "",
                              "defaultSystemChatPrompt": "",
                              "defaultConfig": {}
                            },
                            {
                              "model": "gpt-4-vision-preview",
                              "name": "gpt-4-vision",
                              "avatar": "/imgs/model/openai.svg",
                              "maxContext": 128000,
                              "maxResponse": 4000,
                              "quoteMaxToken": 100000,
                              "maxTemperature": 1.2,
                              "charsPointsPrice": 0,
                              "censor": false,
                              "vision": true,
                              "datasetProcess": false,
                              "usedInClassify": false,
                              "usedInExtractFields": false,
                              "usedInToolCall": false,
                              "usedInQueryExtension": false,
                              "toolChoice": true,
                              "functionCall": false,
                              "customCQPrompt": "",
                              "customExtractPrompt": "",
                              "defaultSystemChatPrompt": "",
                              "defaultConfig": {}
                            }
                          ],
                          "vectorModels": [
                            {
                              "model": "text-embedding-ada-002",
                              "name": "Embedding-2",
                              "avatar": "/imgs/model/openai.svg",
                              "charsPointsPrice": 0,
                              "defaultToken": 512,
                              "maxToken": 3000,
                              "weight": 100,
                              "dbConfig": {},
                              "queryConfig": {}
                            },
                        	{
                              "model": "m3e",
                              "name": "m3e",
                              "avatar": "/imgs/model/openai.svg",
                              "charsPointsPrice": 0,
                              "defaultToken": 700,
                              "maxToken": 3000,
                              "weight": 100
                            }
                          ],
                          "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
                          }
                        }
                        
                      • 保存之后在你的Windows系统或者Ubuntu中运行以下代码:

                        # windows
                        docker-compose down && docker-compose pull && docker-compose up -d
                        
                        # Ubuntu
                        sudo docker-compose down && sudo docker-compose pull && sudo docker-compose up -d
                        

                        8. oneapi配置渠道

                        • 访问 http://localhost:3000/ 并登录。初始账号用户名为 root,密码为 123456,点击渠道 并添加新渠道,如图:

                          在这里插入图片描述

                        • 添加chatglm3和m3e渠道,

                          chatglm3渠道的默认key: sk-key

                          m3e渠道的默认key:sk-aaabbbcccdddeeefffggghhhiiijjjkkk

                          在这里插入图片描述

                          在这里插入图片描述

                        • 切记:Base Url后面的端口要是你docker或者api暴露端口,例如是m3e在docker run -p 6009:6008, 那么m3e模型的端口就是http://host.docker.internal:6009(只是举例)

                        • 在渠道列表页面点击测试,其中m3e没有chat测试,所以返回404为正常。如图所示:

                          在这里插入图片描述

                          9. fastgpt配置私有知识库

                          • 打开浏览器访问 http://localhost:3020, 输入账号root,密码1234

                          • 如图所示

                            在这里插入图片描述

                            这里的索引模型我们选择刚才添加的m3e,文件处理模型选择 chatglm3

                            在这里插入图片描述

                            我的示例文档是一个txt文件,所以我选择文本数据集

                            在这里插入图片描述

                            在这里插入图片描述

                            在这里插入图片描述

                            在这里插入图片描述

                            然后点击下一步,上传。上传之后你的文档会索引,这时候你开启的chatglm3的cmd窗口中会出现如图的训练代码,索引中你的显卡(因为之前m3e是显卡训练)占用率很高,直到训练完成,训练完成之后会出现下图的显示:

                            在这里插入图片描述在这里插入图片描述

                            在这里插入图片描述

                            在这里插入图片描述

                          • 知识库已就绪之后,创建聊天应用。

                            在这里插入图片描述

                            在这里插入图片描述

                            在这里插入图片描述

                            在这里插入图片描述

                            在这里插入图片描述

                            在这里插入图片描述

                            这样我们就完成了整个部署。

微信扫一扫加客服

微信扫一扫加客服