基于FastGPT搭建RAG问答系统课程复现 #168

Open
opened 2024-10-09 15:02:14 +08:00 by 12390900721cs · 0 comments

部署 FastGPT 和 OneAPI 的大致步骤如下:

  1. 部署 OneAPI
    • 可以通过 Docker 部署 OneAPI。首先创建目录并下载 docker-compose.yml 文件,然后启动容器。
    • 访问 OneAPI 应用,进行渠道配置,设置类型、名称、分组、模型、模型重定向、密钥等。
    • 创建接口令牌(API Key)以用于后续的模型调用。
  2. 部署 FastGPT
    • FastGPT 支持 Docker 部署。创建目录,下载 docker-compose.ymlconfig.json 文件,然后启动容器。
    • 修改 config.json 文件,加入 OneAPI 的 baseurl 和令牌值。
    • 重启 FastGPT 容器以应用新的配置。
  3. 配置 FastGPT 与 OneAPI
    • 在 FastGPT 的配置文件中,设置环境变量 OPENAI_BASE_URLCHAT_API_KEY,分别对应 OneAPI 的地址和 API 密钥。
    • 确保 OPENAI_BASE_URL/v1 结尾。
  4. 测试和使用
    • 通过 FastGPT 的界面新建对话应用和知识库应用,选择对应的模型进行测试。
    • 如果需要使用特定的大模型,可以在 OneAPI 中添加渠道,并在 FastGPT 的配置文件中添加相应的模型配置。

通过这种方式,用户可以利用 OneAPI 作为网关来管理和调用不同的大模型,而 FastGPT 则作为前端应用来实现具体的问答功能。这种集成可以极大地简化大模型的部署和管理过程,同时提高开发效率和应用性能。

环境准备

安装docker

#移除 Docker 相关的软件包和容器运行时
apt remove docker-ce docker-ce-cli containerd.io docker-compose-plugin docker docker-engine docker.io containerd runc

# 切换国内源
sed -i -r 's#http://(archive|security).ubuntu.com#https://mirrors.aliyun.com#g' /etc/apt/sources.list && apt update -y

### 安装docker
# 安装ca-certificates curl gnupg lsb-release
apt install ca-certificates curl gnupg lsb-release -y
#下载 Docker 的 GPG 密钥,并将其添加到 apt-key 中
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
# 为Docker 添加阿里源
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 更新系统的软件包
apt -y update
# 安装docker相关的包
apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y

安装成功后:输入docker --version,显示如下:

安装docker-compose

apt-get install docker-compose-plugin

安装成功后输如docker compose version,显示如下:

部署FastGPT + OneAPI系统

OneAPI 与 FastGPT

OneAPI 是一个接口管理和分发系统,它支持多种大型语言模型(如 Azure、Anthropic Claude、Google PaLM 2 & Gemini、智谱 ChatGLM、百度文心一言、讯飞星火认知、阿里通义千问、360 智脑以及腾讯混元等)。OneAPI 允许用户通过标准的 OpenAI API 格式访问所有这些大模型,实现开箱即用。它可以用来二次分发管理 key,并且已经打包成 Docker 镜像,可以一键部署,开箱即用。

FastGPT是一个基于 LLM 的知识库问答系统,提供数据处理、模型调用等能力,并且可以通过 Flow 可视化进行工作流编排,实现复杂的问答场景。FastGPT 可以通过接入 OneAPI 来实现对不同大模型的支持,包括私有化部署和配置大模型。

准备配置文件

这里需要准备两个文件:docker-compose.yml以及config.json,其中config.json是FastGPT的配置文件。

首先创建目录,将所有关于fastgpt的文件放在一个新的文件夹下:

mkdir fastgpt_11
cd fastgpt_11

然后准备docker-compose.yml:

#使用vim进行编辑
vim docker-compose.yml
# 数据库的默认账号和密码仅首次运行时设置有效
# 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~
# 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。
# 如何无法访问 dockerhub 和 git,可以用阿里云(阿里云没有arm包)

version: '3.3'
services:
  # db
  pg:
    #image: pgvector/pgvector:0.7.0-pg15 # docker hub
    image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.7.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: mongo:5.0.18 # dockerhub
    image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云
    # image: mongo:4.4.29 # cpu不支持AVX时候使用
    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
  sandbox:
    container_name: sandbox
    # image: ghcr.io/labring/fastgpt-sandbox:latest # git
    image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:latest # 阿里云
    networks:
      - fastgpt
    restart: always
  fastgpt:
    container_name: fastgpt
    # image: ghcr.io/labring/fastgpt:v4.8.8-fix2 # git
    image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.8-fix2 # 阿里云
    ports:
      - 3000:3000
    networks:
      - fastgpt
    depends_on:
      - mongo
      - pg
      - sandbox
    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-fastgpt
      # 数据库最大连接数
      - 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
      # sandbox 地址
      - SANDBOX_URL=http://sandbox:3000
      # 日志等级: debug, info, warn, error
      - LOG_LEVEL=info
      - STORE_LOG_LEVEL=warn
    volumes:
      - ./config.json:/app/data/config.json

  # oneapi
  mysql:
    image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mysql:8.0.36 # 阿里云
    # 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:v0.6.7
    image: registry.cn-hangzhou.aliyuncs.com/fastgpt/one-api:v0.6.6 # 阿里云
    ports:
      - 3001:3000
    depends_on:
      - mysql
    networks:
      - fastgpt
    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:

同样使用vim进行编辑
vim config.json
{
  "feConfigs": {
    "lafEnv": "https://laf.dev"
  },
  "systemEnv": {
    "vectorMaxProcess": 15,
    "qaMaxProcess": 15,
    "pgHNSWEfSearch": 100
  },
  "llmModels": [
    {
        "model": "llama-3.1-instruct",
        "name": "llama-3.1-instruct",
        "maxContext": 128000,
        "maxResponse": 128000,
        "quoteMaxToken": 32000,
        "maxTemperature": 1.2,
      "charsPointsPrice": 0,
      "censor": false,
      "vision": false,
      "datasetProcess": false,
      "usedInClassify": true,
      "usedInExtractFields": true,
      "usedInToolCall": true,
      "usedInQueryExtension": true,
      "toolChoice": false,
      "functionCall": false,
      "customCQPrompt": "",
      "customExtractPrompt": "",
      "defaultSystemChatPrompt": "",
      "defaultConfig": {}
    },
    {
        "model": "qwen2-instruct",
        "name": "qwen2-instruct",
        "avatar": "/imgs/model/qwen.svg",
        "maxContext": 128000,
        "maxResponse": 128000,
        "quoteMaxToken": 32000,
        "maxTemperature": 1.2,
        "charsPointsPrice": 0,
        "censor": false,
        "vision": false,
        "datasetProcess": true,
        "usedInClassify": true,
        "usedInExtractFields": true,
        "usedInToolCall": true,
        "usedInQueryExtension": true,
        "toolChoice": false,
        "functionCall": false,
        "customCQPrompt": "",
        "customExtractPrompt": "",
        "defaultSystemChatPrompt": "",
        "defaultConfig": {}
    },
    {
        "model": "glm-4v",
        "name": "glm-4v",
        "avatar": "/imgs/model/chatglm.svg",
        "maxContext": 128000,
        "maxResponse": 128000,
        "quoteMaxToken": 32000,
        "maxTemperature": 1.2,
        "charsPointsPrice": 0,
        "censor": false,
        "vision": true,
        "datasetProcess": true,
        "usedInClassify": true,
        "usedInExtractFields": true,
        "usedInToolCall": true,
        "usedInQueryExtension": true,
        "toolChoice": true,
        "functionCall": false,
        "customCQPrompt": "",
        "customExtractPrompt": "",
        "defaultSystemChatPrompt": "",
        "defaultConfig": {}
    },
    {
        "model": "ERNIE-Speed-128K",
        "name": "ERNIE-Speed-128K",
	"avatar": "/imgs/model/ernie.svg",
        "maxContext": 128000,
        "maxResponse": 128000,
        "quoteMaxToken": 32000,
        "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-4o-mini",
      "name": "gpt-4o-mini",
      "avatar": "/imgs/model/openai.svg",
      "maxContext": 125000,
      "maxResponse": 4000,
      "quoteMaxToken": 120000,
      "maxTemperature": 1.2,
      "charsPointsPrice": 0,
      "censor": false,
      "vision": true,
      "datasetProcess": true,
      "usedInClassify": true,
      "usedInExtractFields": true,
      "usedInToolCall": true,
      "usedInQueryExtension": true,
      "toolChoice": true,
      "functionCall": false,
      "customCQPrompt": "",
      "customExtractPrompt": "",
      "defaultSystemChatPrompt": "",
      "defaultConfig": {}
    },
    {
      "model": "gpt-4o",
      "name": "gpt-4o",
      "avatar": "/imgs/model/openai.svg",
      "maxContext": 125000,
      "maxResponse": 4000,
      "quoteMaxToken": 120000,
      "maxTemperature": 1.2,
      "charsPointsPrice": 0,
      "censor": false,
      "vision": true,
      "datasetProcess": false,
      "usedInClassify": true,
      "usedInExtractFields": true,
      "usedInToolCall": true,
      "usedInQueryExtension": true,
      "toolChoice": true,
      "functionCall": false,
      "customCQPrompt": "",
      "customExtractPrompt": "",
      "defaultSystemChatPrompt": "",
      "defaultConfig": {}
    }
  ],
  "vectorModels": [
    {
      "model": "m3e-base",
      "name": "m3e-base",
      "charsPointsPrice": 0,
      "defaultToken": 256,
      "maxToken": 512,
      "weight": 100,
      "defaultConfig": {},
      "dbConfig": {},
      "queryConfig": {}
    },
    {
      "model": "text-embedding-ada-002",
      "name": "Embedding-2",
      "avatar": "/imgs/model/openai.svg",
      "charsPointsPrice": 0,
      "defaultToken": 700,
      "maxToken": 3000,
      "weight": 100,
      "defaultConfig": {},
      "dbConfig": {},
      "queryConfig": {}
    },
    {
      "model": "text-embedding-3-large",
      "name": "text-embedding-3-large",
      "avatar": "/imgs/model/openai.svg",
      "charsPointsPrice": 0,
      "defaultToken": 512,
      "maxToken": 3000,
      "weight": 100,
      "defaultConfig": {
        "dimensions": 1024
      }
    },
    {
      "model": "embeding3",
      "name": "embeding3",
      "avatar": "/imgs/model/chatglm.svg",
      "charsPointsPrice": 0,
      "defaultToken": 512,
      "maxToken": 3000,
      "weight": 100
    }
  ],
  "reRankModels": [
    {
      "model": "bge-reranker-v2-m3",
      "name": "bge-reranker-v2-m3"
    }
  ],
  "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
  }
}

全部编辑完成后进入下一步。

启动系统

在fastgpt_11目录下执行如下命令:

docker-compose up -d

此时表示部署完毕,查看当前目录:

此时通过浏览器就可以访问OneAPI和FastGPT了,访问方式如下:

OneAPI接入模型

先准备百度千帆大模型

开通几个不要钱的就行,我这里开通的是**ERNIE-Speed-128KERNIE-Speed-8K**这两个服务。

随后再openapi中接入渠道:

回到百度文心的界面,在 '应用接入' 里找到API Key 以及 Secret Key,将这两个密钥按照复制粘贴到One API界面中的密钥里 (注意:这里的格式要求用 '|' 将两个密钥分开)

回到渠道页面,点击测试:

接入本地模型

这里使用xinference来部署本地应用。

首先使用docker部署xinference:

mkdir xinference
cd xinference
docker run \
  -d \
  -e XINFERENCE_MODEL_SRC=modelscope \
  -v $(pwd)/.xinference:/root/.xinference \
  -v $(pwd)/.cache/huggingface:/root/.cache/huggingface \
  -v $(pwd)/.cache/modelscope:/root/.cache/modelscope \
  -p 9997:9997 \
  --gpus all \
  registry.cn-hangzhou.aliyuncs.com/xprobe_xinference/xinference \
  xinference-local -H 0.0.0.0

成功后显示如下:

然后部署xinference部署自带模型:

通过ip地址+:9997端口号进入,选择模型llama-3.1-instruct。

点击模型打开后点击【launche】按钮,即可开始部署模型,如果本地没有该模型会自动下载模型:

注册到oneapi中:

这里部署模型为:

创建一个简易的聊天应用

通过浏览器访问FastGPT:http://127.0.0.1:3000/并登陆(注意将127.0.0.1修改成自己服务器对应的IP地址),点击新建,选择简易应用;

输入名称,选择简易机器人。

点击配置AI模型,这里AI模型选择ERNIE-Speed-128K, 注意将回复上线调整到4096以下,否则就会出现:LLM model respose empty的错误,最后点击确认即可

模型配置成功之后,点击发布应用;

配置之后就可以开始聊天了

可以在工作台通过调试预览开始进行对话:

创建一个带知识库的聊天应用

创建知识库

点击知识库;

选择通用知识库,取名;这里设置为实验室规章制度。

导入数据集中选择文本数据集;

选择文本拆分方式:

聊天应用添加知识库

点击【关联知识库】;

选择知识库;

点击【参数】;

可以选择知识库搜索匹配模式

可以添加工具供大模型使用

## <font style="color:rgb(6, 6, 7);">部署 FastGPT 和 OneAPI 的大致步骤如下:</font> 1. **<font style="color:rgb(6, 6, 7);">部署 OneAPI</font>**<font style="color:rgb(6, 6, 7);">:</font> - <font style="color:rgb(6, 6, 7);">可以通过 Docker 部署 OneAPI。首先创建目录并下载</font><font style="color:rgb(6, 6, 7);"> </font>`docker-compose.yml`<font style="color:rgb(6, 6, 7);"> </font><font style="color:rgb(6, 6, 7);">文件,然后启动容器。</font> - <font style="color:rgb(6, 6, 7);">访问 OneAPI 应用,进行渠道配置,设置类型、名称、分组、模型、模型重定向、密钥等。</font> - <font style="color:rgb(6, 6, 7);">创建接口令牌(API Key)以用于后续的模型调用。</font> 2. **<font style="color:rgb(6, 6, 7);">部署 FastGPT</font>**<font style="color:rgb(6, 6, 7);">:</font> - <font style="color:rgb(6, 6, 7);">FastGPT 支持 Docker 部署。创建目录,下载</font><font style="color:rgb(6, 6, 7);"> </font>`docker-compose.yml`<font style="color:rgb(6, 6, 7);"> </font><font style="color:rgb(6, 6, 7);">和</font><font style="color:rgb(6, 6, 7);"> </font>`config.json`<font style="color:rgb(6, 6, 7);"> </font><font style="color:rgb(6, 6, 7);">文件,然后启动容器。</font> - <font style="color:rgb(6, 6, 7);">修改</font><font style="color:rgb(6, 6, 7);"> </font>`config.json`<font style="color:rgb(6, 6, 7);"> </font><font style="color:rgb(6, 6, 7);">文件,加入 OneAPI 的</font><font style="color:rgb(6, 6, 7);"> </font>`baseurl`<font style="color:rgb(6, 6, 7);"> </font><font style="color:rgb(6, 6, 7);">和令牌值。</font> - <font style="color:rgb(6, 6, 7);">重启 FastGPT 容器以应用新的配置。</font> 3. **<font style="color:rgb(6, 6, 7);">配置 FastGPT 与 OneAPI</font>**<font style="color:rgb(6, 6, 7);">:</font> - <font style="color:rgb(6, 6, 7);">在 FastGPT 的配置文件中,设置环境变量</font><font style="color:rgb(6, 6, 7);"> </font>`OPENAI_BASE_URL`<font style="color:rgb(6, 6, 7);"> </font><font style="color:rgb(6, 6, 7);">和</font><font style="color:rgb(6, 6, 7);"> </font>`CHAT_API_KEY`<font style="color:rgb(6, 6, 7);">,分别对应 OneAPI 的地址和 API 密钥。</font> - <font style="color:rgb(6, 6, 7);">确保</font><font style="color:rgb(6, 6, 7);"> </font>`OPENAI_BASE_URL`<font style="color:rgb(6, 6, 7);"> </font><font style="color:rgb(6, 6, 7);">以</font><font style="color:rgb(6, 6, 7);"> </font>`/v1`<font style="color:rgb(6, 6, 7);"> </font><font style="color:rgb(6, 6, 7);">结尾。</font> 4. **<font style="color:rgb(6, 6, 7);">测试和使用</font>**<font style="color:rgb(6, 6, 7);">:</font> - <font style="color:rgb(6, 6, 7);">通过 FastGPT 的界面新建对话应用和知识库应用,选择对应的模型进行测试。</font> - <font style="color:rgb(6, 6, 7);">如果需要使用特定的大模型,可以在 OneAPI 中添加渠道,并在 FastGPT 的配置文件中添加相应的模型配置。</font> <font style="color:rgb(6, 6, 7);">通过这种方式,用户可以利用 OneAPI 作为网关来管理和调用不同的大模型,而 FastGPT 则作为前端应用来实现具体的问答功能。这种集成可以极大地简化大模型的部署和管理过程,同时提高开发效率和应用性能。</font> ## 环境准备 ### 安装docker ```plain #移除 Docker 相关的软件包和容器运行时 apt remove docker-ce docker-ce-cli containerd.io docker-compose-plugin docker docker-engine docker.io containerd runc # 切换国内源 sed -i -r 's#http://(archive|security).ubuntu.com#https://mirrors.aliyun.com#g' /etc/apt/sources.list && apt update -y ### 安装docker # 安装ca-certificates curl gnupg lsb-release apt install ca-certificates curl gnupg lsb-release -y #下载 Docker 的 GPG 密钥,并将其添加到 apt-key 中 curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - # 为Docker 添加阿里源 add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # 更新系统的软件包 apt -y update # 安装docker相关的包 apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y ``` 安装成功后:输入docker --version,显示如下: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728443518952-95aa9ddc-9a78-43cd-bcf8-a8d7d6a26a5d.png) ### 安装docker-compose ```plain apt-get install docker-compose-plugin ``` 安装成功后输如docker compose version,显示如下: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728444442316-4e42fd9b-2747-4558-a7ca-0039ef4cd510.png) ## 部署FastGPT + OneAPI系统 ### OneAPI 与 <font style="color:rgb(6, 6, 7);">FastGPT </font> <font style="color:rgb(6, 6, 7);">OneAPI 是一个接口管理和分发系统,它支持多种大型语言模型(如 Azure、Anthropic Claude、Google PaLM 2 & Gemini、智谱 ChatGLM、百度文心一言、讯飞星火认知、阿里通义千问、360 智脑以及腾讯混元等)。OneAPI 允许用户通过标准的 OpenAI API 格式访问所有这些大模型,实现开箱即用。它可以用来二次分发管理 key,并且已经打包成 Docker 镜像,可以一键部署,开箱即用。</font> <font style="color:rgb(6, 6, 7);">FastGPT是一个基于 LLM 的知识库问答系统,提供数据处理、模型调用等能力,并且可以通过 Flow 可视化进行工作流编排,实现复杂的问答场景。FastGPT 可以通过接入 OneAPI 来实现对不同大模型的支持,包括私有化部署和配置大模型。</font> ### <font style="color:rgb(6, 6, 7);">准备配置文件</font> <font style="color:#333333;">这里需要准备两个文件:docker-compose.yml以及</font><font style="color:#333333;">config.json,其中config.json是FastGPT的配置文件。</font> <font style="color:#333333;">首先创建目录,将所有关于fastgpt的文件放在一个新的文件夹下:</font> ```plain mkdir fastgpt_11 cd fastgpt_11 ``` 然后准备docker-compose.yml: ```plain #使用vim进行编辑 vim docker-compose.yml ``` ```plain # 数据库的默认账号和密码仅首次运行时设置有效 # 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~ # 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。 # 如何无法访问 dockerhub 和 git,可以用阿里云(阿里云没有arm包) version: '3.3' services: # db pg: #image: pgvector/pgvector:0.7.0-pg15 # docker hub image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.7.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: mongo:5.0.18 # dockerhub image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云 # image: mongo:4.4.29 # cpu不支持AVX时候使用 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 sandbox: container_name: sandbox # image: ghcr.io/labring/fastgpt-sandbox:latest # git image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:latest # 阿里云 networks: - fastgpt restart: always fastgpt: container_name: fastgpt # image: ghcr.io/labring/fastgpt:v4.8.8-fix2 # git image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.8-fix2 # 阿里云 ports: - 3000:3000 networks: - fastgpt depends_on: - mongo - pg - sandbox 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-fastgpt # 数据库最大连接数 - 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 # sandbox 地址 - SANDBOX_URL=http://sandbox:3000 # 日志等级: debug, info, warn, error - LOG_LEVEL=info - STORE_LOG_LEVEL=warn volumes: - ./config.json:/app/data/config.json # oneapi mysql: image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mysql:8.0.36 # 阿里云 # 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:v0.6.7 image: registry.cn-hangzhou.aliyuncs.com/fastgpt/one-api:v0.6.6 # 阿里云 ports: - 3001:3000 depends_on: - mysql networks: - fastgpt 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: ```plain 同样使用vim进行编辑 vim config.json ``` ```plain { "feConfigs": { "lafEnv": "https://laf.dev" }, "systemEnv": { "vectorMaxProcess": 15, "qaMaxProcess": 15, "pgHNSWEfSearch": 100 }, "llmModels": [ { "model": "llama-3.1-instruct", "name": "llama-3.1-instruct", "maxContext": 128000, "maxResponse": 128000, "quoteMaxToken": 32000, "maxTemperature": 1.2, "charsPointsPrice": 0, "censor": false, "vision": false, "datasetProcess": false, "usedInClassify": true, "usedInExtractFields": true, "usedInToolCall": true, "usedInQueryExtension": true, "toolChoice": false, "functionCall": false, "customCQPrompt": "", "customExtractPrompt": "", "defaultSystemChatPrompt": "", "defaultConfig": {} }, { "model": "qwen2-instruct", "name": "qwen2-instruct", "avatar": "/imgs/model/qwen.svg", "maxContext": 128000, "maxResponse": 128000, "quoteMaxToken": 32000, "maxTemperature": 1.2, "charsPointsPrice": 0, "censor": false, "vision": false, "datasetProcess": true, "usedInClassify": true, "usedInExtractFields": true, "usedInToolCall": true, "usedInQueryExtension": true, "toolChoice": false, "functionCall": false, "customCQPrompt": "", "customExtractPrompt": "", "defaultSystemChatPrompt": "", "defaultConfig": {} }, { "model": "glm-4v", "name": "glm-4v", "avatar": "/imgs/model/chatglm.svg", "maxContext": 128000, "maxResponse": 128000, "quoteMaxToken": 32000, "maxTemperature": 1.2, "charsPointsPrice": 0, "censor": false, "vision": true, "datasetProcess": true, "usedInClassify": true, "usedInExtractFields": true, "usedInToolCall": true, "usedInQueryExtension": true, "toolChoice": true, "functionCall": false, "customCQPrompt": "", "customExtractPrompt": "", "defaultSystemChatPrompt": "", "defaultConfig": {} }, { "model": "ERNIE-Speed-128K", "name": "ERNIE-Speed-128K", "avatar": "/imgs/model/ernie.svg", "maxContext": 128000, "maxResponse": 128000, "quoteMaxToken": 32000, "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-4o-mini", "name": "gpt-4o-mini", "avatar": "/imgs/model/openai.svg", "maxContext": 125000, "maxResponse": 4000, "quoteMaxToken": 120000, "maxTemperature": 1.2, "charsPointsPrice": 0, "censor": false, "vision": true, "datasetProcess": true, "usedInClassify": true, "usedInExtractFields": true, "usedInToolCall": true, "usedInQueryExtension": true, "toolChoice": true, "functionCall": false, "customCQPrompt": "", "customExtractPrompt": "", "defaultSystemChatPrompt": "", "defaultConfig": {} }, { "model": "gpt-4o", "name": "gpt-4o", "avatar": "/imgs/model/openai.svg", "maxContext": 125000, "maxResponse": 4000, "quoteMaxToken": 120000, "maxTemperature": 1.2, "charsPointsPrice": 0, "censor": false, "vision": true, "datasetProcess": false, "usedInClassify": true, "usedInExtractFields": true, "usedInToolCall": true, "usedInQueryExtension": true, "toolChoice": true, "functionCall": false, "customCQPrompt": "", "customExtractPrompt": "", "defaultSystemChatPrompt": "", "defaultConfig": {} } ], "vectorModels": [ { "model": "m3e-base", "name": "m3e-base", "charsPointsPrice": 0, "defaultToken": 256, "maxToken": 512, "weight": 100, "defaultConfig": {}, "dbConfig": {}, "queryConfig": {} }, { "model": "text-embedding-ada-002", "name": "Embedding-2", "avatar": "/imgs/model/openai.svg", "charsPointsPrice": 0, "defaultToken": 700, "maxToken": 3000, "weight": 100, "defaultConfig": {}, "dbConfig": {}, "queryConfig": {} }, { "model": "text-embedding-3-large", "name": "text-embedding-3-large", "avatar": "/imgs/model/openai.svg", "charsPointsPrice": 0, "defaultToken": 512, "maxToken": 3000, "weight": 100, "defaultConfig": { "dimensions": 1024 } }, { "model": "embeding3", "name": "embeding3", "avatar": "/imgs/model/chatglm.svg", "charsPointsPrice": 0, "defaultToken": 512, "maxToken": 3000, "weight": 100 } ], "reRankModels": [ { "model": "bge-reranker-v2-m3", "name": "bge-reranker-v2-m3" } ], "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 } } ``` 全部编辑完成后进入下一步。 ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728444750137-11a5b0c3-a980-4d30-8fbe-5d0122155d2e.png) ## 启动系统 <font style="color:#333333;">在fastgpt_11目录下执行如下命令:</font> ```plain docker-compose up -d ``` ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728445086735-7189e368-533b-4ff2-bea7-8c1e241bd9fe.png) 此时表示部署完毕,查看当前目录: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728445122488-66e56e2a-3ae5-4813-a9f8-e6aa40711268.png) <font style="color:#333333;">此时通过浏览器就可以访问OneAPI和FastGPT了,访问方式如下:</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728445150382-a93c194d-d200-4da1-8d4e-f411a3328914.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728445207669-c9622930-4a8d-4a1c-9881-764c76addcbf.png)![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728445199008-e81ce581-b994-43a4-8a4d-f8bd2cf0e810.png) ## OneAPI接入模型 ### 先准备百度千帆大模型 ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728446110107-36b7182a-0ed6-420d-a93d-77f3fc58f9c0.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728446124536-c371a7e2-3e0b-4fd0-83aa-c64e7748a7e2.png) 开通几个不要钱的就行,我这里开通的是**<font style="color:#000000;">ERNIE-Speed-128K</font>**<font style="color:#000000;">和</font>**<font style="color:#000000;">ERNIE-Speed-8K</font>**<font style="color:#000000;">这两个服务。</font> 随后再openapi中接入渠道: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728450940299-2f87e52f-70d4-4694-bf97-cf35609fd1c8.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728452943013-03f2c84b-fa95-4047-843e-2c81aee48737.png) <font style="color:rgb(24, 28, 33);">回到百度文心的界面,在 '应用接入' 里找到API Key 以及 Secret Key,将这两个密钥按照复制粘贴到One API界面中的密钥里 (注意:这里的格式要求用 '|' 将两个密钥分开)</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728451902079-946f9ed7-a6e1-46b4-9994-53d3f24ce680.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728453246593-83b5a4e0-13ee-47b3-89f2-7b8c537614f3.png) 回到渠道页面,点击测试: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728453217615-844b70ca-482b-483e-8370-5f37b2a46deb.png) ### 接入本地模型 <font style="color:#333333;">这里使用xinference来部署本地应用。</font> #### <font style="color:#333333;">首先使用docker部署xinference:</font> ```plain mkdir xinference cd xinference docker run \ -d \ -e XINFERENCE_MODEL_SRC=modelscope \ -v $(pwd)/.xinference:/root/.xinference \ -v $(pwd)/.cache/huggingface:/root/.cache/huggingface \ -v $(pwd)/.cache/modelscope:/root/.cache/modelscope \ -p 9997:9997 \ --gpus all \ registry.cn-hangzhou.aliyuncs.com/xprobe_xinference/xinference \ xinference-local -H 0.0.0.0 ``` 成功后显示如下: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728451363837-61f1f1ff-9a21-4de3-9afd-3317d959f00d.png) #### 然后部署xinference部署自带模型: 通过ip地址+:9997端口号进入,选择模型llama-3.1-instruct。 ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728451357303-55ac6002-0478-4003-82a9-d6cc01c56894.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728453350134-bdd568bb-055b-4103-ba66-d45edc9700fe.png) <font style="color:#333333;">点击模型打开后点击【launche】按钮,即可开始部署模型,如果本地没有该模型会自动下载模型:</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728453407443-fd3259c8-e66a-4059-87e0-ec19c18dbd58.png) 注册到oneapi中: ![](https://cdn.nlark.com/yuque/0/2024/jpeg/48516026/1728452076054-2b15e064-532f-4006-87d1-c28910946dcf.jpeg) <font style="color:#333333;">这里部署模型为:</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728452118249-b0983be5-f206-4163-aecd-3dda0ff6d8fc.png) ## 创建一个简易的聊天应用 <font style="color:#000000;">通过浏览器访问FastGPT:http://127.0.0.1:3000/并登陆(</font><font style="color:#000000;background-color:#fff67a;">注意将127.0.0.1修改成自己服务器对应的IP地址</font><font style="color:#000000;">),点击</font><font style="color:#000000;background-color:#eff0f1;">新建</font><font style="color:#000000;">,选择</font><font style="color:#000000;background-color:#eff0f1;">简易应用</font><font style="color:#000000;">;</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728454013766-779a5fb1-be33-448e-960a-d516d521b113.png) <font style="color:#000000;">输入名称,选择</font><font style="color:#000000;background-color:#eff0f1;">简易机器人</font><font style="color:#000000;">。</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728454048096-1e20bbf7-1301-485f-b7b9-8d5017bfb76e.png) <font style="color:#000000;">点击</font><font style="color:#000000;background-color:#eff0f1;">配置AI模型</font><font style="color:#000000;">,这里</font><font style="color:#000000;background-color:#eff0f1;">AI模型</font><font style="color:#000000;">选择ERNIE-Speed-128K, 注意将</font><font style="color:#000000;background-color:#eff0f1;">回复上线</font><font style="color:#000000;">调整到4096以下,否则就会出现:</font>**<font style="color:#000000;background-color:#f76964;">LLM model respose empty</font>**<font style="color:#000000;">的错误,最后点击</font><font style="color:#000000;background-color:#eff0f1;">确认</font><font style="color:#000000;">即可</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728454064444-16a0968a-26e2-4346-985c-f20457c9f17b.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728454497380-72dced5b-5613-4684-a99b-0b9fd1c8fe2a.png) <font style="color:#000000;">模型配置成功之后,点击</font><font style="color:#000000;background-color:#eff0f1;">发布</font><font style="color:#000000;">应用;</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728454562066-4c637d09-1bef-49d4-aac0-b288d3e97664.png) <font style="color:#000000;">配置之后就可以开始聊天了</font> <font style="color:#000000;">可以在</font><font style="color:#000000;background-color:#eff0f1;">工作台</font><font style="color:#000000;">通过</font><font style="color:#000000;background-color:#eff0f1;">调试预览</font><font style="color:#000000;">开始进行对话:</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728454547245-a8b563e9-6bf9-4343-9d7d-cdc8f69d7962.png) ## 创建一个带知识库的聊天应用 ### 创建知识库 点击知识库; ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728454664362-ee7c5138-e27a-404c-aecb-77f1991e980a.png) 选择通用知识库,取名;这里设置为实验室规章制度。 ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728454688674-51c3f2b3-9edd-486c-bea6-f61d264ce2c6.png) <font style="color:#333333;">导入数据集中选择文本数据集;</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728454792555-31823d39-eec2-4c21-84e1-193579f2415a.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728455944128-acd65e7d-6db7-4580-8d14-133a90f40c2e.png) <font style="color:#333333;">选择文本拆分方式:</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728455954969-7164622e-404a-46eb-ac18-7b5b4d8b9b03.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728455920160-c3ca6c0a-8b83-4683-9d7e-18804a6302d2.png) ### 聊天应用添加知识库 <font style="color:#333333;">点击【关联知识库】;</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728456028819-71d941da-9f82-4dfe-9958-befff56174d0.png) <font style="color:#333333;">选择知识库;</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728456036289-2b2f1f9e-8608-42be-9cb8-e7208b61eac3.png) <font style="color:#333333;">点击【参数】;</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728456176679-c0ac99b5-5dd8-4a71-9e13-02d0e82a23f3.png) <font style="color:#333333;">可以选择知识库搜索匹配模式</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728456189633-fbe263dd-a9da-4ac1-825d-970bfb41142b.png) <font style="color:#333333;">可以添加工具供大模型使用</font>![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728456228584-1530225e-eb82-45f9-a96e-fd2fcbefdaaf.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1728456233228-b97e2578-c3ae-4c72-bcd1-24962709a0df.png)
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: HswOAuth/llm_course#168
No description provided.