为了在本地运行一个带有重排序(Rerank)步骤的知识库问答系统,并确保该系统能在NVIDIA GeForce RTX 3060M这样的GPU上高效运作,我们可以结合使用Dify、xinference以及ollama。以下是部署此系统的步骤概述:

部署概览

不含重排序的简易配置如果不需要利用重排序来提升检索准确性,仅通过ollama和dify就能搭建起一个基础的知识库问答平台。

包含重排序的进阶配置对于希望提高检索准确性的场景,建议加入xinference以支持本地的重排版模型部署。

部署步骤详解

部署Dify

  1. 准备工作:首先访问Dify官方网站或GitHub页面获取最新安装指南。
  2. 环境设置
  • 确保您的机器已经安装了Python及必要的依赖项。
  • 创建虚拟环境并激活它,推荐使用venv或者conda等工具。
  1. 下载与安装Dify
  • 使用pip命令安装Dify及其依赖包。
  1. 配置文件调整
  • 根据官方文档指引修改配置文件,包括数据库连接信息、API密钥等。
  1. 启动服务
  • 执行相应的脚本或命令来启动Dify服务。 aaaaaaa请注意,具体版本号和服务地址等细节,请参照最新的官方文档。

整合xinference实现重排序

  • 在已有的基础上添加xinference组件,用于执行更精细的信息检索与排序任务。
  • 参考xinference提供的示例代码或文档说明完成相关配置。

利用ollama管理大模型

  • ollama工具可以帮助我们更加便捷地管理和调用如llama3-9B这样较大的语言模型。
  • 根据性能测试报告,在RTX 3060M显卡条件下也能获得不错的生成速度体验。 通过以上步骤,您将能够构建出一套既具备良好响应速度又拥有较高查询精确度的知识问答解决方案。
git clone https://github.com/langgenius/dify.git
cd dify/docker
docker compose up -d

随后访问本地的http://localhost根据网页提示进行一步步设置就行了。

xinference

创建一个docker-compose.yaml:

services:
  xinference:
    image: xprobe/xinference:v0.11.2
    environment:
      - XINFERENCE_HOME=/root/.xinference
      - HUGGING_FACE_HUB_TOKEN=hf_114514
    volumes:
      - /mnt/Games/Model:/root/.xinference
    ports:
      - "9998:9997"
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [gpu]
    command: xinference-local -H 0.0.0.0

快捷启动容器指南

在本节中,我们将介绍如何通过编写一个简单的bash脚本来快速启动两个容器:Dify和xinference。这将有助于简化部署过程,并确保模型文件能够持久保存在本地,避免每次容器重启时重新下载。

1. 挂载Volume和设置HUGGING_FACE_HUB_TOKEN

为了使模型文件能够保存在本地,避免每次容器重启时都需要重新下载,我们通过挂载一个volumes来实现。同时,通过定义HUGGING_FACE_HUB_TOKEN,我们可以从Hugging Face Hub上拉取需要权限访问的模型,例如llama3。

2. 创建docker-compose.yaml文件

首先,创建一个docker-compose.yaml文件,配置xinference服务。这里是一个示例配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
services:
  xinference:
    image: xprobe/xinference:v0.11.2
    environment:
      
- XINFERENCE_HOME=/root/.xinference
      
- HUGGING_FACE_HUB_TOKEN=hf_aaaaaaa
    volumes:
      
- /mnt/Games/Model:/root/.xinference
    ports:
      
- "9998:9997"
    deploy:
      resources:
        reservations:
          devices:
            
- capabilities: [gpu]
    command: xinference-local -H 0.0.0.0

3. 编写bash脚本

接下来,编写一个bash脚本来快捷启动这两个容器。脚本内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/bash
c aaaaaaa
cd /home/menghuan/Documents/Xinference
echo "Xinference"
docker compose up -d
echo "dify"
cd /home/menghuan/Documents/dify
docker compose up -d
sleep 10
curl -X 'POST' \
  'http://127.0.0.1:9998/v1/models' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '...'
echo "done!"

4. 自动化和开机启动

你还可以设置这些脚本在开机后自动运行,以确保容器服务的持续可用性。

5. 配置Dify

在Dify的配置过程中,需要注意xinference的模型UID默认情况下与其模型名字相同。此外,你可以根据需要更改系统模型设置,以决定默认使用的模型。

6. 创建和配置知识库

通过Dify模板创建知识库,并选择多路召回以使用重排版。记得在知识库中添加文件以充分利用其功能。

7. PDF文件预处理

由于Dify不提供PDF预处理功能,我们可以使用pdfdeal库结合easyocr作为OCR引擎来处理PDF文件,以增强知识库的索引能力。

8. 电子邮件集成

考虑到LLM/向量编码/重排版模型都能本地运行,我们可以考虑将电子邮件等隐私文件集成到知识库中,以实现更高效的信息管理。

#!/bin/bash
cd /home/menghuan/Documents/Xinference
echo "Xinference"
docker compose up -d
echo "dify"
cd /home/menghuan/Documents/dify
docker compose up -d
sleep 10
curl -X 'POST' \
  'http://127.0.0.1:9998/v1/models' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "model_engine": "xinference",
  "model_uid": "bge-reranker-v2-m3",
  "model_name": "bge-reranker-v2-m3",
  "gpu_idx": 0,
  "model_type": "rerank"
}'
echo "done!"

首先,您需要配置Dify。这个过程相对简单,但有几个关键点需要注意:xinference的模型UID默认情况下是等于其模型名字的。因此,在更改系统模型设置时,请确保了解这一点,因为这决定了默认情况下会使用哪个模型。当然,您也可以为单个工作流或知识库自定义其聊天或向量化模型。 接下来,为了实现开机启动后自动运行这两个脚本,您需要进行以下操作:

  1. 确保您的脚本已经正确编写并保存在适当的位置。2. 根据您的操作系统(如Windows、Linux或macOS),找到相应的方法来设置开机启动。这通常涉及到任务计划程序、cron作业或其他类似的工具。3. 在启动项中添加您的脚本路径,以确保每次计算机启动时都会自动运行这些脚本。 最后,不要忘记检查和测试您的配置,确保一切按预期工作。如果遇到任何问题,可以参考相关文档或寻求社区的帮助。
    不得不承认某些问题还是得在线大模型才能回答,llama3-8B还是参数量稍微小了点

不得不承认某些问题还是得在线大模型才能回答,llama3-8B还是参数量稍微小了点

随后从模板创建一个知识库(芝士学爆!),选择多路召回以使用重排版。

当然记得先往知识库里加点文件

当然记得先往知识库里加点文件

重要

注意上图中N选1召回中含有一个对整个工作流默认LLM的全局选项!没想到藏在这儿

随后就尽情想用芝士学爆吧:

知识库很好的补全了llama3-8B的短板

知识库很好的补全了llama3-8B的短板

题外话:对PDF文件的预处理

值得注意的是dify并没有对pdf进行预处理(例如OCR),检索一圈发现好像确实也没什么特别好的库或者方法…于是自己搓了一个,其会先对PDF中的图片进行OCR,随后处理下文本并按照原有页数输出。不过其设计的目标就是为增强知识库的索引…所以以格式pdf输出时其格式可能对人类不是特别友好(不过知识库能完全读取)。至少个人测试其效果很不错。

安装,这儿使用easyocr作为OCR引擎(当然你也可以自定义OCR函数):

pip install 'pdfdeal[easyocr]'

随后对我./PPT的文件处理下:

import os
from pdfdeal import deal_pdf
for root, dirs, files in os.walk("./PPT"):
    for file in files:
        file_path = os.path.join(root, file)
        deal_pdf(
            input=file_path, output="pdf", language=["en"], path="./Output", GPU=True
        )
        print(f"Deal with {file_path} successfully!")

aaaaaaa a既然 LLM(语言模型)/向量编码/重排版模型已经能够在本地运行,这就为处理隐私文件提供了新的可能性。例如,对于电子邮件这样的敏感信息,现在可以考虑将它们接入个人或企业的知识库中。通过这种方式,用户不仅能够更好地管理和检索他们的邮件,而且还能确保这些数据不会离开用户的控制范围,从而增强了数据的隐私性和安全性。 aaaaaaa a在实现这一设想之前,有几个关键点需要注意:

  1. 隐私保护:必须确保所使用的模型和技术不会泄露用户的个人信息。

  2. 数据加密:对存储于知识库中的邮件进行加密是必要的,以防止未经授权的访问。

  3. 合规性:解决方案需要遵守相关的法律法规,特别是关于数据保护的规定。

  4. 用户体验:系统应该设计得易于使用,并且能够有效地帮助用户找到他们需要的信息。 基于以上考量,虽然将电子邮件集成到知识库中看起来是一个可行的方向,但在真正实施前还需要进一步的研究与开发工作来解决潜在的问题。