• 大模型系列-fastgpt,ollama搭建本地知识库


    1. 安装fastgpt,oneapi

    • docker-compose安装
    1. 下载docker-compose.yml,config.json
    mkdir fastgpt
    cd fastgpt
    curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json
    
    # pgvector 版本(测试推荐,简单快捷)
    curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-pgvector.yml
    # milvus 版本
    # curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-milvus.yml
    # zilliz 版本
    # curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-zilliz.yml
    
    1. 修改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=root
          - POSTGRES_PASSWORD=root
          - 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=root
          - MONGO_INITDB_ROOT_PASSWORD=root
        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 root -p root --authenticationDatabase admin --eval "print('waited for connection')" > /dev/null 2>&1; do
              echo "Waiting for MongoDB to start..."
              sleep 2
            done
    
            # 执行初始化副本集的脚本
            mongo -u root -p root --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.9 # git
        image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.9 # 阿里云
        ports:
          - 3000:3000
        networks:
          - fastgpt
        depends_on:
          - mongo
          - pg
          - sandbox
        # restart: always
        environment:
          # root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
          - DEFAULT_ROOT_PSW=root
          # AI模型的API地址哦。务必加 /v1。这里默认填写了OneApi的访问地址。
          - OPENAI_BASE_URL=http://host.docker.internal:3000/v1
          # AI模型的API Key。(这里默认填写了OneAPI的快速默认key,测试通后,务必及时修改)
          - CHAT_API_KEY=sk-1234567890
          # 数据库最大连接数
          - DB_MAX_LINK=30
          # 登录凭证密钥
          - TOKEN_KEY=root
          # root的密钥,常用于升级时候的初始化请求
          - ROOT_KEY=root
          # 文件阅读加密
          - FILE_TOKEN_KEY=filetoken
          # MongoDB 连接参数. 用户名myusername,密码mypassword。
          - MONGODB_URI=mongodb://root:root@mongo:27017/fastgpt?authSource=admin
          # pg 连接参数
          - PG_URL=postgresql://root:root@pg:5432/postgres
          # sandbox 地址
          - SANDBOX_URL=http://localhost: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.32
        container_name: mysql
        # restart: always
        ports:
          - 3306:3306
        networks:
          - fastgpt
        command: --default-authentication-plugin=mysql_native_password
        environment:
          # 默认root密码,仅首次运行有效
          MYSQL_ROOT_PASSWORD: root
          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:root@tcp(mysql:3306)/oneapi
          # 登录凭证加密密钥
          - SESSION_SECRET=oneapikey
          # 内存缓存
          - MEMORY_CACHE_ENABLED=true
          # 启动聚合更新,减少数据交互频率
          - BATCH_UPDATE_ENABLED=true
          # 聚合更新时长
          - BATCH_UPDATE_INTERVAL=10
          # 初始化的 root 密钥(建议部署完后更改,否则容易泄露)
          - INITIAL_ROOT_TOKEN=root
        volumes:
          - ./oneapi:/data
    networks:
      fastgpt:
    
    1. 启动容器
    docker-compose up -d
    
    1. 登录oneapi
      可以通过ip:3001访问OneAPI,默认账号为root密码为123456
    2. 登录fastgpt
      可以通过ip:3000访问FastGPT,默认账号为root密码为docker-compose.yml环境变量里设置的 DEFAULT_ROOT_PSW

    2. 安装ollama运行大模型

    参考:Ollama 中文文档

    2.1. 安装ollama
    docker pull ollama/ollama:latest
    docker run -d --gpus=all -v /media/geekplusa/GeekPlusA1/ai/models/llm/models/ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
    # 使ollama保持模型加载在内存(显存)中
    docker run -d --gpus=all -e OLLAMA_KEEP_ALIVE=-1  -v /media/geekplusa/GeekPlusA1/ai/models/llm/models/ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
    
    2.2. ollama下载模型
    • 运行qwen:7b模型
    docker exec -it ollama ollama run qwen:7b
    
    • 测试
    curl http://localhost:11434/api/chat -d '{
      "model": "qwen:7b",
      "messages": [
        {
          "role": "user",
          "content": "你是谁?"
        }
      ]
    }'
    

    3. 安装开源的文本向量模型

    由于M3E模型不可商用,由可商用模型bge-m3替换,安装

    • 下载bge-small-zh-v1.5模型
    git clone https://www.modelscope.cn/Xorbits/bge-small-zh-v1.5.git
    cd bge-small-zh-v1.5
    wget https://www.modelscope.cn/models/Xorbits/bge-small-zh-v1.5/resolve/master/pytorch_model.bin
    
    • 启动模型
    from sentence_transformers import SentenceTransformer
    import torch
    from flask import Flask, request, jsonify
    import os
    import threading
    
    
    
    m3e = SentenceTransformer("bge-m3")
    
    if torch.cuda.is_available():
        m3e=m3e.to("cuda")
        print("现在使用GPU模式运行M3模型")
    else:
        print("现在使用CPU模式运行M3模型")
    
    # print("Enter your authtoken, which can be copied from https://dashboard.ngrok.com/auth")
    # conf.get_default().auth_token = getpass.getpass()
    
    os.environ["FLASK_ENV"] = "development"
    
    app = Flask(__name__)
    
    
    
    # Define Flask routes
    @app.route("/")
    def index():
        return "这是BGE-M3的API接口,请访问/v1/embeddings 使用POST请求"
    
    @app.route('/v1/embeddings', methods=['POST'])
    def embeddings():
        data = request.json
        input_text = data.get('input')
        print(f"/v1/embeddings 收到请求,输入文本为:{input_text}")
        model = data.get('model')
        if model is None:
            model = "BAAI/bge-m3"
    
        if input_text is None:
            return jsonify(error="No input text provided"), 400
        # input can be string or array of strings
        # if isinstance(input_text, str):
        #     sentences = [input_text]
        # elif isinstance(input_text, list):
        #     sentences = input_text
        sentences = input_text if isinstance(input_text, list) else [input_text]
        embeddings = m3e.encode(sentences,convert_to_tensor=True,show_progress_bar=True)
        embeddings = embeddings.tolist()
        data = [{"object": "embedding", "embedding": x, "index": i} for i, x in enumerate(embeddings)]
    
        # Mimic the response structure of the OpenAI API
        response = {
            "object": "list",
            "data": data,
            "model": model,
            "usage": {
                "prompt_tokens": 0,
                "total_tokens": 0
            }
        }
    
        return jsonify(response)
    
    if __name__ == '__main__':
    
        # Start the Flask server in a new thread
        threading.Thread(target=app.run, kwargs={"use_reloader": False,"debug":True,"host": "0.0.0.0"}).start()
    
  • 相关阅读:
    Libcurl 学习与使用
    创建型模式之原型模式
    CSS实现上半内容高度动态变化,下半自动填满且内部嵌套可滚动区域
    9.9校招 实习 内推 面经
    Autoware.AI 源码安装CPU版本
    php Laravel 使用elasticsearch+ik中文分词器搭建搜索引擎
    如何成为不可替代的程序员?掌握这个方法,裁员名单永远没有你
    Vue---监听div元素宽高改变时echart图表重新resize
    python 进阶系列 - 15讲 线程threading模块详解
    论文阅读-Whisper语音识别(OpenAI)
  • 原文地址:https://blog.csdn.net/qq122716072/article/details/142095270