基于RAG的知识库问答平台使用指南

5/2/2024 Ollamallama.cppRAGFlowDeepDocDifyMaxKBQAnythingAnythingLLM

# 1. 前言

# 1.1 知识库问答平台综述

目前我调研尝试过如下知识库问答平台,整体上都大同小异。

  • 认为比较好的:RAGFlow(文件解析的效果好,配套支持完善)、Dify(最流行,配套支持完善)
  • 认为较一般的:MaxKB(效果一般,配套支持完善)
  • 认为比较差的:QAnything(效果差劲)、AnythingLLM(文件解析就很烂,效果差劲)
  • 没实际用过的:FastGPT、Cherry Studio、BiSheng(别人用过,反馈调不出个像样的效果)

RAGFlow与Dify的选型建议:

  • 功能角度:RAGFlow的文件解析、知识库检索功能更强,其Agent实际上是Dify中的工作流,可用工具少。Dify的Agent和工作流更强,可扩展性高,但对文档解析能力较弱。
  • 技术角度:RAGFlow用到的前端技术为基于React的企业级框架Umi4,后端技术是Flask+Python;Dify的前端技术是基于React的NextJS框架,后端技术是Flask+Python。
维度 Dify RAGFlow
团队人员管理 🌟🌟 🌟🌟
模型管理 🌟🌟🌟 🌟
第三方工具 🌟🌟🌟 🌟
知识库 🌟🌟 🌟🌟🌟
应用管理 🌟🌟🌟 🌟

详细比较可参考这篇文章: AI 流程平台对比——Dify、Fastgpt、Ragflow (opens new window)

# 1.2 低代码平台优缺点分析

这些知识库问答平台,本质上都是个低代码开发平台(或者说是无代码开发平台),看似很美好,但它固有一些优点和缺点,只是适合外行玩玩(反正那些人也不会写代码,能凑合搞个60分的总比没有强)以及快速出demo,不适合专业人士来用,以下是本人的浅见。

优点:简单、快速、直观、无代码

  • 开发效率很快,拖拖拽拽一些组件就能实现,让不懂代码的人也能用起来。
  • 工作流的算法流程非常清晰,便于演示,有宣传噱头,利于对外推广卖钱。

缺点:不灵活、难提升精度、难调试

  • 拖组件的方式不灵活,效果精度难提升:如果想要加些优化处理而缺少组件的话,还是要去开发新组件的,而做组件需要考虑通用性,开发起来需要一段时间,而业务需求里的算法功能实现根本就等不及。
  • 组件本身若存在问题会影响全部工作流:比如因项目需求要对某个组件进行升级改造,但开发时产生了bug,如果测试也不到位的话,会导致影响很多已有的工作流,而且多了组件层也增加了出错的风险。
  • 外行不会用,内行不愿用:外行用的话,不知道这些组件和参数干嘛的。内行用的话,快速出演示demo可以用这个,但要是保证效果的话,不会选用这种方式,等不及开发新组件,出问题时也不方便排查。

抛开数据、模型的因素不谈,我认为实现的最大困难点不在于是用组件还是用代码,而是核心算法流程的设计(流程机制、模型选型、参数配置等),这个不管是用代码还是用组件都是一样的,专业人士肯定是更喜欢用代码去实现的,这样更方便做优化。

# 2. 大模型推理服务接入

# 2.1 接入大模型服务的多种方式

这些知识库问答平台都是不带大模型服务的,需要首先配置接入。

# 2.2 Ollama部署推理服务

# 2.2.1 Ollama推理框架简介

Ollama是一个开源的大型语言模型服务工具,它帮助用户快速在本地运行大模型。

Ollama

# 2.2.2 Ollama部署大模型服务

[1] MacOS环境的Ollama部署

实验环境:Macbook Pro 2021,M1 pro芯片,16G内存,macOS Ventura13.2.1系统

1)安装Ollama

从官网下载Ollama对应系统的客户端进行安装即可:https://ollama.com/download/Ollama-darwin.zip (opens new window)

之后在终端里输入 ollama 命令,即可查看帮助。

$ ollama
1

查看ollama帮助

2)使用Ollama

然后使用 ollama run 命令启动模型(模型不存在的话会自动下载),这里我使用qwen:0.5b进行测试,支持的模型可在这里查看:https://ollama.com/library (opens new window)

$ ollama run qwen:0.5b
1

ollama启动模型服务

模型服务启动之后,打开 http://127.0.0.1:11434 地址,会告知“Ollama is running”,在终端里可以直接进行问答。

使用ollama在终端进行问答

[2] Linux环境的Ollama部署

实验环境:CentOS7,1TB内存,512TB存储,NVIDIA A800显卡(80GB显存)、CUDA12.2环境

1)安装Ollama并配置非本机访问

这里以Ollama安装Qwen2-7b为例

$ curl -fsSL https://ollama.com/install.sh | sh            // 需要设置一下代理
$ ollama run qwen2:7b                                      // 拉取qwen2:7b并运行(是4bit量化模型,官方有说明)
1
2

Linux安装Ollama

由于服务器要让其他机器访问服务,因此需要配置一下。详见:https://github.com/ollama/ollama/blob/main/docs/faq.md#how-do-i-configure-ollama-server (opens new window)

  • Step1:输入以下命令来编辑 systemd 服务,这将打开一个编辑器,然后添加以下内容,保存。

    $ systemctl edit ollama.service
    
    [Service]
    Environment="OLLAMA_HOST=0.0.0.0"
    
    1
    2
    3
    4
  • Step2:重新加载systemd并重新启动 Ollama

    $ systemctl daemon-reload
    $ systemctl restart ollama
    
    1
    2

然后可以通过如下方式验证Ollama的API服务。

$ ollama list                                          // 查看模型列表
$ curl http://ip:11434/api/generate -d '{
    "model": "qwen2:7b",
    "prompt": "Why is the sky blue?",
    "stream": false
  }'
1
2
3
4
5
6

注:Ollama的模型文件存储在/usr/share/ollama/.ollama/models路径,如果想要移除可以使用ollama rm qwen2:7b命令,以下是服务启动与关闭命令:

$ sudo systemctl stop ollama                           // 关闭ollama服务
$ sudo systemctl start ollama                          // 开启ollama服务
$ sudo systemctl status ollama                         // 查看ollama状态
1
2
3

2)安装 deepseek-v2:236b int4 模型

为了有个更好的效果,这里使用ollama 安装个 deepseek-v2 的 236b int4 量化模型,顺便测测它的推理效果、推理速度、显存占用。

$ ollama run deepseek-v2:236b
1

Ollama安装deepseek-v2模型

部署它的推理服务总共占用了 121 GB 显存,推理效果和推理速度都还不错。

deepseek-v2-236b-int4模型的显存占用

# 2.2.3 Ollama导入自定义大模型

如果想要添加 Ollama 未支持的模型或者自己微调的模型,可以使用 llama.cpp (opens new window) 工具将模型转换成 GGUF 格式,然后导入 Ollama,详见:Import a model (opens new window)

这里使用猎户星空专门对 RAG 微调过的模型 Orion-14B-Chat-RAG 为例,演示如何转换和导入自定义模型。

Step1:将模型转换成GGUF格式

$ git clone https://github.com/ggerganov/llama.cpp.git && cd llama.cpp
$ python3 convert-hf-to-gguf.py /root/llm_model/Orion-14B-Chat-RAG --outfile /root/ollama/Orion-14B-Chat-RAG.gguf
1
2

注:这里我使用的是 Python3.10 环境( Python3.7.3确认不行)

Step2:将GGUF格式模型导入Ollama

$ cd /root/ollama
$ echo "FROM ./Orion-14B-Chat-RAG.gguf" > ./Modelfile            // 创建用于导入模型的 Modelfile 文件
$ ollama create Orion-14B-Chat-RAG -f Modelfile                  // 将模型导入Ollama
$ ollama list                                                    // 查看模型列表
$ ollama run Orion-14B-Chat-RAG:latest                           // 启动自定义导入的模型
1
2
3
4
5

Ollama导入自定义大模型

注:Orion-14B-Chat-RAG这个模型很差劲,不管是直接请求还是接入RAG系统里,表现都不佳,胡言乱语的。

# 3. RAGFlow知识库问答平台

# 3.1 RAGFlow简介

RAGFlow是一款基于深度文档理解的开源 RAG引擎,它为任何规模的企业提供简化的 RAG 工作流程,结合 LLM提供真实的问答功能。

RAGFlow系统架构图

# 3.2 RAGFlow主要特点

RAGFlow主要特点里面我认为最值得一提的是:DeepDoc深度文档理解(解决复杂文档解析问题)、基于RAPTOR实现长上下文RAG(解决了多跳问题)。

# 3.2.1 DeepDoc深度文档理解

它用到的“深度文档理解”技术的文档自动解析效果是非常不错的,不过这个的解析过程有一些慢,官方的FAQ里也对为什么解析慢和吃资源的问题进行了解释:

RAGFlow为什么解析慢并且吃资源

对于不同领域、不同格式和不同检索要求的大量文档,准确的分析成为一项至关重要的任务,DeepDoc就是为了这个目的而诞生的。

OCR(Optical Character Recognition,光学字符识别)

$ python deepdoc/vision/t_ocr.py -h
usage: t_ocr.py [-h] --inputs INPUTS [--output_dir OUTPUT_DIR]

options:
  -h, --help            show this help message and exit
  --inputs INPUTS       Directory where to store images or PDFs, or a file path to a single image or PDF
  --output_dir OUTPUT_DIR
                        Directory where to store the output images. Default: './ocr_outputs'
1
2
3
4
5
6
7
8

TSR(Table Structure Recognition,表结构识别)

$ python deepdoc/vision/t_recognizer.py -h
usage: t_recognizer.py [-h] --inputs INPUTS [--output_dir OUTPUT_DIR] [--threshold THRESHOLD] [--mode {layout,tsr}]

options:
  -h, --help            show this help message and exit
  --inputs INPUTS       Directory where to store images or PDFs, or a file path to a single image or PDF
  --output_dir OUTPUT_DIR
                        Directory where to store the output images. Default: './layouts_outputs'
  --threshold THRESHOLD
                        A threshold to filter out detections. Default: 0.5
  --mode {layout,tsr}   Task mode: layout recognition or table structure recognition
1
2
3
4
5
6
7
8
9
10
11

# 3.2.2 RAPTOR解决多跳问题

RAPTOR (opens new window) 的想法源自今年的一篇论文《树状检索的递归抽象处理》,如下图所示,该论文提出了一种增强的文档处理方法,对文档内容进行层次聚类:

RAPTOR-1

将原始文档划分为块后,RAPTOR 以递归和分层的方式对这些块进行聚类:聚类过程从叶子节点(图中的蓝色块)开始,并通过嵌入将叶子汇总为更高级别的信息。该过程以递归方式执行,从叶子开始形成“树”结构。聚类过程的结果是摘要,可以使用 LLM 生成摘要。使用聚类和摘要生成至关重要,因为它可以捕获处理复杂主题查询和问答任务中的多步骤推理所需的更精细的细节。RAPTOR 论文讨论了检索聚类内容的两个过程,如下图所示:

RAPTOR-2

第一个过程维护树结构:检索从根节点开始,并在整个树结构中按层次进行。这种检索实现起来有点复杂,并且对多次调用“不友好”。第二个过程是将树形结构扁平化,便于检索。此过程易于实现,并且与多个召回过程自然融合。

RAGFlow 实现了论文中提出的扁平化树形检索结构:使用 Deepdoc 解析文件后,可以选择开启 RAPTOR 开关进行聚类和生成摘要,将原始 Chunk 和生成的摘要送入数据库,建立全文索引和向量索引,后续操作与传统 RAG 方案类似。默认情况下,RAPTOR 开关是关闭的,因为启用此功能会消耗更多的Token。

RAGFlow的RAPTOR功能

如下图所示,左半部分是LLM根据聚类结果生成的摘要,RAGFlow将这些摘要进行可视化,并与原始数据一起用于RAG的检索流程。

RAGFlow开启RAPTOR功能的效果

RAPTOR 帮助 LLM 更好地理解上下文。这是因为聚类树结构中的上层节点对文本具有更“宏观”的理解,这对于需要跨块摘要或多跳问答的场景非常有用,因为这些场景无法直接从相应的上下文中检索答案。

# 3.3 RAGFlow搭建

# 3.3.1 服务器要求

实验环境:CentOS7,512GB内存,128TB存储,NVIDIA 4090显卡(24GB显存)、CUDA11.7环境

适用于Windows、Mac、Linux操作系统,以下是官方要求的配置及环境需求:

  • CPU >= 4 核、内存 >= 16 GB、磁盘 >= 50 GB
  • Docker >= 24.0.0 & Docker Compose >= v2.26.1

除此之外,官方还要求 vm.max_map_count 参数 >= 262144

$ sysctl vm.max_map_count                                          // 查询vm.max_map_count参数目前为多少
$ sudo sysctl -w vm.max_map_count=262144                           // 修改vm.max_map_count参数的大小(无需重启服务器即可生效)
$ echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf    // 将vm.max_map_count参数的大小写入配置文件(使其重启后也能生效)
1
2
3

注:vm.max_map_count 是 Linux 内核中的一个参数,用于定义一个进程可以拥有的最大内存映射区域的数量。这些内存映射区域可以是文件映射、共享内存或匿名内存等。这个参数在使用 Elasticsearch 这种需要大量内存映射的大型应用程序时特别重要。如果设置得太低,这些应用程序可能会因为无法创建新的内存映射区域而失败。

# 3.3.2 服务器搭建

这里使用官方提供的脚本使用 Docker Compose 一键搭建。但搭建过程中遇到了一些坑,卡在文件解析那里过不去,因此这里对其进行了修改。

$ git clone https://github.com/infiniflow/ragflow.git
$ cd ragflow/docker
$ chmod +x ./entrypoint.sh
$ docker compose up -d
1
2
3
4

ragflow/docker/.env(注意检查一下该配置文件里提到的端口有没有被占用)

# Version of Elastic products
STACK_VERSION=8.11.3


# Port to expose Elasticsearch HTTP API to the host
ES_PORT=1200

# Set the Elasticsearch password
ELASTIC_PASSWORD=infini_rag_flow

# Port to expose Kibana to the host
KIBANA_PORT=6601

# Increase or decrease based on the available host memory (in bytes)

MEM_LIMIT=8073741824


MYSQL_PASSWORD=infini_rag_flow
MYSQL_PORT=5455

# Port to expose minio to the host
MINIO_CONSOLE_PORT=9001
MINIO_PORT=9000

MINIO_USER=rag_flow
MINIO_PASSWORD=infini_rag_flow

REDIS_PORT=6379
REDIS_PASSWORD=infini_rag_flow

SVR_HTTP_PORT=9380

RAGFLOW_VERSION=dev

TIMEZONE='Asia/Shanghai'

######## OS setup for ES ###########
# sysctl vm.max_map_count
# sudo sysctl -w vm.max_map_count=262144
# However, this change is not persistent and will be reset after a system reboot.
# To make the change permanent, you need to update the /etc/sysctl.conf file.
# Add or update the following line in the file:
# vm.max_map_count=262144
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

修改 docker-compose.yml 加一下 gpu 启动。

include:
  - path: ./docker-compose-base.yml
    env_file: ./.env

services:
  ragflow:
    depends_on:
      mysql:
        condition: service_healthy
      es01:
        condition: service_healthy
    image: infiniflow/ragflow:${RAGFLOW_VERSION}
    container_name: ragflow-server
    deploy:
      resources:
        reservations:
          devices:
          - driver: nvidia
            device_ids: ['0']
            capabilities: [gpu]
    ports:
      - ${SVR_HTTP_PORT}:9380
      - 80:80
      - 443:443
    volumes:
      - ./service_conf.yaml:/ragflow/conf/service_conf.yaml
      - ./ragflow-logs:/ragflow/logs
      - ./nginx/ragflow.conf:/etc/nginx/conf.d/ragflow.conf
      - ./nginx/proxy.conf:/etc/nginx/proxy.conf
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    environment:
      - TZ=${TIMEZONE}
      - HF_ENDPOINT=https://huggingface.co
    networks:
      - ragflow
    restart: always
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

修改 docker-compose-base.yml 将中间件的 volumes 都改成了相对路径。

services:
  es01:
    container_name: ragflow-es-01
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
      - ./esdata01:/usr/share/elasticsearch/data
    ports:
      - ${ES_PORT}:9200
    environment:
      - node.name=es01
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=false
      - discovery.type=single-node
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=false
      - xpack.security.transport.ssl.enabled=false
      - TZ=${TIMEZONE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test: ["CMD-SHELL", "curl http://localhost:9200"]
      interval: 10s
      timeout: 10s
      retries: 120
    networks:
      - ragflow
    restart: always

  mysql:
    image: mysql:5.7.18
    container_name: ragflow-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
      - TZ=${TIMEZONE}
    command:
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password
      --tls_version="TLSv1.2,TLSv1.3"
      --init-file /data/application/init.sql
    ports:
      - ${MYSQL_PORT}:3306
    volumes:
      - ./mysql_data:/var/lib/mysql
      - ./init.sql:/data/application/init.sql
    networks:
      - ragflow
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-uroot", "-p${MYSQL_PASSWORD}"]
      interval: 10s
      timeout: 10s
      retries: 3
    restart: always

  minio:
    image: quay.io/minio/minio:RELEASE.2023-12-20T01-00-02Z
    container_name: ragflow-minio
    command: server --console-address ":9001" /data
    ports:
      - ${MINIO_PORT}:9000
      - ${MINIO_CONSOLE_PORT}:9001
    environment:
      - MINIO_ROOT_USER=${MINIO_USER}
      - MINIO_ROOT_PASSWORD=${MINIO_PASSWORD}
      - TZ=${TIMEZONE}
    volumes:
      - ./minio_data:/data
    networks:
      - ragflow
    restart: always

  redis:
    image: redis:7.2.4
    container_name: ragflow-redis
    command: redis-server --requirepass ${REDIS_PASSWORD} --maxmemory 128mb --maxmemory-policy allkeys-lru
    ports:
      - ${REDIS_PORT}:6379
    volumes:
      - ./redis_data:/data
    networks:
      - ragflow
    restart: always

volumes:
  esdata01:
    driver: local
  mysql_data:
    driver: local
  minio_data:
    driver: local
  redis_data:
    driver: local

networks:
  ragflow:
    driver: bridge
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

但是首次启动时es又报错了,给es的挂载目录加了一下权限就好了。

$ sudo chown -R 1000:1000 ./esdata01
$ sudo chmod -R 755 ./esdata01
1
2

部署完成之后,输入以下命令检查一下健康状态:

$ docker logs -f ragflow-server
1

成功搭建RAGFlow的后台健康日志

浏览器打开 http://ip 地址即可访问(无需填写端口号,因为这里用的是80端口),无默认账号(可通过页面自行注册)

注:注册时邮箱可以随便填,没有验证。登录的时候是邮箱+密码来登录,那个邮箱虽然在系统上是一经注册不能修改,但其实直接从数据库里改也没啥事儿。

# 3.4 RAGFlow使用

# 3.4.1 创建知识库

知识库——创建知识库——选择嵌入模型、解析方法,设置分块的Token数等关键配置。

RAGFlow创建知识库

然后上传知识文件,对文件进行解析,解析完成之后才可以进行问答(如果解析卡住了,就去看下后台日志,检查下中间件状态,我首次按照官方命令部署时,遇到了ES健康状态为Red的问题,我将其改成相对路径并添加权限之后就好了。另注:这里的文件解析进度百分比是个假的,界面显示值与数据库存的值对不上)。

RAGFlow成功解析知识文件

解析完成之后,可以点击文件名称那里,查看解析出来的分块,可以看到它对表格格式的处理也是很好的。

RAGFlow解析后的内容片段

RAGFlow查看解析后的文件

RAGFlow对于表格的处理

# 3.4.2 添加大模型

点击用户头像,再点击左侧的“模型服务商”,添加大模型(需要输入Base URL、API-KEY等信息)

RAGFlow添加大模型服务商

如果想接入本地大模型,可通过Ollama或Xinference的方式接入,其中使用Xinference的方式可以接入任何OpenAI格式(/v1/chat/completions)的大模型服务,它这里没有加严格校验(通过OpenAI那里加不进去,校验太严格了)。

[1] 以Ollama方式接入

以前面提到过的 Qwen2-7B 为例,基础Url输入:http://IP:11434,模型名称填写qwen2:7b。由于 RAGFlow是Docker方式搭建的,它无法通过本地的方式访问Ollama,因此还需要给Ollama配置一下,然后就可以用IP访问了。

使用Ollama方式接入大模型服务

[2] 以Xinference方式接入

这里我主要用它来接入OpenAI格式的大模型服务,比如使用 LLaMA-Factory 部署了个开启 vLLM 的大模型推理服务。

  • vLLM是一个大型语言模型推理加速工具,它通过优化内存管理、连续批处理、CUDA核心优化和分布式推理支持等技术手段,显著提高了大型语言模型的推理速度和效率。详细介绍及如何部署可见我的另一篇博客:基于vLLM加速大模型推理并评估性能 (opens new window)

部署完的推理服务地址是 http://ip:8000/v1/chat/completions,下面可以通过这种方式进行接入(基础url填写到 /v1、模型UID可以随便填)

通过Xinference接入OpenAI格式的大模型服务

# 3.4.3 创建应用场景

聊天——新建助理,在助理设置里配置基础信息,选择一下知识库,提示引擎里的配置信息按需修改。

RAGFlow创建应用场景-基础配置

然后选择一下模型,配置一下模型的请求参数。

RAGFlow创建应用场景-模型配置

注:如果遇到输出被截断的问题,把模型设置这里的“最大token数”关掉即可(这里可能有个bug,用ollama的开源大模型时,虽然最大token数我设置的2048,但却只输出了一行就被截断了,关闭该参数即恢复正常)。

# 3.4.4 使用应用场景

我这里使用了BAAl/bge-large-zh-v1.5的Embedding模型,GPT-4o大模型,测试了很多轮对话,未经人工干预数据的情况下,整体效果就很不错。

RAGFlow应用场景效果

RAGFlow应用场景效果-2

# 3.5 RAGFlow的API调用

RAGFlow支持在平台外使用API进行操作,可以很方便的使用代码进行调试或者接入其他自定义应用。

# 3.5.1 开启RAGFlow的助理API

可以在助理那里的“聊天API“处进行开启。

开启RAGFlow的助理API

打开之后,先点开“API键“按钮,在里面生成一个API-KEY。

RAGFlow生成API-KEY

# 3.5.2 RAGFlow的独立应用场景

配置了API-KEY之后,就可以使用“财务政策问答 Web App”下的“预览”、“嵌入”功能了,前者是开启一个独立的问答页访问地址(整个页面如下图所示,看不出平台相关的东西了),后者可以使用iframe将其嵌入到其他应用。

RAGFlow的独立应用场景

# 4. MaxKB知识库问答平台

# 4.1 MaxKB简介

MaxKB 是一款基于 LLM 大语言模型的知识库问答系统。MaxKB 的主要特点包括:

  • 开箱即用:支持直接上传文档、自动爬取在线文档,支持文本自动拆分、向量化,智能问答交互体验好;
  • 无缝嵌入:支持零编码快速嵌入到第三方业务系统;
  • 多模型支持:支持对接主流的大模型,包括 Ollama 本地私有大模型(如 Llama 2、Llama 3、qwen)、通义千问、OpenAI、Azure OpenAI、Kimi、智谱 AI、讯飞星火和百度千帆大模型等。

项目地址:https://github.com/1Panel-dev/MaxKB (opens new window)

# 4.2 MaxKB搭建

实验环境:CentOS7,512GB内存,128TB存储,NVIDIA 4090显卡(24GB显存)、CUDA11.7环境

官方提供了Docker镜像,一键即可部署。

$ mkdir MaxKB && cd MaxKB
$ docker run -d --name=maxkb -p 8080:8080 -v ~/.maxkb:/var/lib/postgresql/data 1panel/maxkb
1
2

使用 Chrome 浏览器打开 http://xxx.xxx.xxx.xxx:8080 地址,使用默认账号进行登录。

用户名: admin
密码: MaxKB@123..
1
2

# 4.3 MaxKB使用

# 4.3.1 创建知识库

知识库——创建知识库——上传文件并填写知识库描述信息——自动进行分段

MaxKB添加知识库文件

自动分段后支持预览,以下是创建完的知识库。

MaxKB创建完的知识库

# 4.3.2 添加大模型

系统设置——模型设置——添加模型,这里以OpenAI为例

MaxKB添加OpenAI模型

注:官方这里做的不好,API域名这里有歧义,它其实是应该填写 https://api.openai.com/v1 这种格式,如果填写成域名,校验过不去,而且报错描述很粗。

# 4.3.3 创建应用场景

应用——创建应用——填写应用描述信息

MaxKB创建应用场景

创建完的应用,点开之后会给出访问链接。

MaxKB创建完的应用

比较吸引我的是它的“命中测试功能”。

MaxKB的命中测试功能

# 4.3.4 使用应用场景

打开应用场景访问链接,输入问题即可。

MaxKB使用应用场景

# 5. QAnything知识库问答平台

# 5.1 QAnything简介

网易有道开源的知识库问答引擎 QAnything,包括专门优化的自研的 embedding 和 rerank 模型,微调后的 LLM,优化后的推理代码,向量数据库,以及一个立即上手可用的前端。所有的算法模型(包括 7B 大模型+embedding/rerank+OCR)占用显存不超过 16G。

QAnything架构

# 5.2 QAnything搭建

# 5.2.1 准备运行环境

实验环境:CentOS7,512GB内存,128TB存储,NVIDIA 4090显卡(24GB显存)、CUDA11.7环境

如下是QAnything官方要求的基础环境:

System Required item Minimum Requirement Note
Linux NVIDIA GPU Memory >= 4GB (use OpenAI API) Minimum: GTX 1050Ti(use OpenAI API) Recommended: RTX 3090
NVIDIA Driver Version >= 525.105.17
Docker version >= 20.10.5 Docker install (opens new window)
docker compose version >= 2.23.3 docker compose install (opens new window)
git-lfs git-lfs install (opens new window)

[1] 准备Docker和Docker Compose环境

安装Docker环境

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun
$ sudo systemctl enable docker
$ sudo systemctl start docker
$ docker version
1
2
3
4
5

安装Docker Compose环境

$ sudo curl -L https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
1
2
3

[2] 准备NVIDIA驱动环境

安装 nvidia-smi 及 nvidia-cuda-toolkit 工具

$ sudo yum update
$ sudo yum install nvidia-utils-520
$ sudo yum install nvidia-cuda-toolkit
1
2
3

使用 nvidia-smi 命令可以显示出GPU的所有基础信息。

$ nvidia-smi                 // 查询GPU详情
$ nvidia-smi -q              // 查询GPU型号
$ nvcc --version             // 查看CUDA驱动版本
1
2
3

配置Docker使用GPU,需要安装官方提供的nvidia-container-toolkit工具。

$ curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo  
$ sudo yum install -y nvidia-container-toolkit   
$ sudo nvidia-ctk runtime configure --runtime=docker
$ sudo systemctl restart docker   
1
2
3
4

[3] 安装git及git-lfs环境

$ sudo yum update
$ yum install git
$ wget https://packagecloud.io/github/git-lfs/packages/el/7/git-lfs-3.4.1-1.el7.x86_64.rpm/download -O git-lfs-3.4.1-1.el7.x86_64.rpm
$ sudo yum install git-lfs-3.4.1-1.el7.x86_64.rpm -y
1
2
3
4

[4] 安装其他缺失的命令

官方提供的run脚本里需要使用jq命令,未安装的话会启动失败。

$ sudo yum install jq
1

# 5.2.2 官方脚本一键安装

拉取项目代码,使用官方脚本一键安装,按照脚本提示,输入OpenAI API KEY和服务器IP地址等信息,之后会自动下载模型及环境。

$ git clone https://github.com/netease-youdao/QAnything.git
$ cd QAnything
$ chmod u+x run.sh
$ bash ./run.sh -c cloud -i 0 -b default
1
2
3
4

这个一键脚本搭建的方式,很多信息都写死了,密码也是最简单的,建议启动之前,先把 docker-compose-linux.yaml 里的配置及相应代码里的连接配置改改。

参数说明及使用方法详见:

QAnything一键脚本使用说明

当所有环境成功运行起来了之后,后台日志如下:

成功部署QAnything的日志

注意事项:如果服务无法正常使用,检查log里的日志文件即可,看看是不是有的服务没有成功启动。如果需要卸载重新搭建,执行close.sh脚本即可。

# 5.3 QAnything使用

使用 Chrome 浏览器打开后台日志打印出来的 http://xxx.xxx.xxx.xxx:5052/qanything 地址,可以看到如下界面:

QAnything主界面

之后新建一个知识库,上传一些文档,等待其完成解析。

QAnything解析文档

之后就可以输入问题,根据知识库进行问答了。

QAnything知识库问答

# 6. AnythingLLM知识库问答平台

# 6.1 AnythingLLM简介

AnythingLLM 是一个开源的、可定制的、功能丰富的文档聊天机器人。这是一个全栈应用程序,它能够将任何文档、资源或内容片段转化为LLM在聊天中可以利用的相关上下文。该应用允许用户选择并配置要使用的LLM或向量数据库,并支持多用户管理及权限控制,以确保数据安全和高效协作。

AnythingLLM

# 6.2 安装AnythingLLM并配置

实验环境:Macbook Pro 2021,M1 pro芯片,16G内存,macOS Ventura13.2.1系统

从官网下载AnythingLLM对应系统的客户端进行安装即可,首次启动需要进行一些配置。

Step1:LLM模型选择Ollama(参数直接使用默认的)

AnythingLLM配置Ollama服务

Step2:Embedding模型选择Ollama(参数直接使用默认的)

AnythingLLM配置Embedding模型

Step3:向量数据库选择LanceDB(这个是本地的,比较省事)

Step4:确认AnythingLLM的配置,下一步的邮箱及用途可以随便填,再下一步创建一个Workspace。

AnythingLLM确认配置

Step5:全部配置完成之后,可以进入到AnythingLLM的主界面

AnythingLLM主界面

# 6.3 AnythingLLM使用

# 6.3.1 构建本地知识库

点击工作空间旁边的上传按钮,上传一些文档,将其加入右侧的工作空间,保存Embedding。

上传文档构建本地知识库

# 6.3.2 本地知识库问答

在 Send a message 处输入要问的问题,大模型很快便可给予回复,点击 Show Citations 可以查看参考了什么文档,这个文档是可以点开来看的。

AnythingLLM本地知识库问答

注:这里的效果不好是因为选用的是qwen:0.5b模型,下面将其换成GPT-4的模型效果就好多了。

# 6.3.3 更换商业LLM服务

点击左侧底部的“扳手”图标,即可进入到 AnythingLLM 设置页,在这里可以对之前的初始化配置进行重新设置。

AnythingLLM将LLM服务换成GPT4

需要注意的是,国内用户使用GPT-4 别选择那个OpenAI(没有配置代理的地方,国内网络访问不通)。而是应该选择Local Al,这里去自定义配置,相当于使用BaseURL的方式。

同理,Embedding Model(选择text-embedding-ada-002)与 Vector Database (还是选择LanceDB)也重新配置。然后删掉之间的工作空间,重新上传文档构建本地知识库,再重新进行问答即可。

AnythingLLM更换GPT4大模型服务后的问答效果

注:因为Vector Database 还是使用LanceDB,一开始我并没有将其重配,但是问答时报错 LanceDBError: No vector column found to create index,我将之前的Vector Database、工作空间、本地知识库全部删了重新配置即可正常使用。

# 7. Dify知识库问答平台

# 7.1 Dify简介

Dify 是一款开源的大语言模型应用开发平台。它融合了后端即服务和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员,也能参与到 AI 应用的定义和数据运营过程中。

由于 Dify 内置了构建 LLM 应用所需的关键技术栈,包括对数百个模型的支持、直观的 Prompt 编排界面、高质量的 RAG 引擎、稳健的 Agent 框架、灵活的流程编排,并同时提供了一套易用的界面和 API。这为开发者节省了许多重复造轮子的时间,使其可以专注在创新和业务需求上。

Dify与其它平台的对比

# 7.2 Dify平台搭建

实验环境:Macbook Pro 2021,M1 pro芯片,16G内存,macOS Sonoma14.5系统,Docker 25.0.3,Docker Compose v2.24.6

官方搭建教程:https://docs.dify.ai/v/zh-hans/getting-started/install-self-hosted/docker-compose (opens new window)

$ git clone https://github.com/langgenius/dify.git
$ cd dify/docker
$ cp .env.example .env      // 检查是否有端口冲突及需要需要修改的配置(全部使用默认配置即可成功部署)
$ docker-compose up -d
$ docker compose ps         // 检查所有容器是否都正常运行
1
2
3
4
5

注:官网说要为 Docker 虚拟机(VM)至少分配 2 个虚拟 CPU(vCPU))和 8GB 初始内存,否则安装可能会失败。

Dify平台搭建

# 7.3 Dify平台使用

# 7.3.1 配置基本设置

在Chrome浏览器中输入 http://localhost 访问 Dify,首先需要先设置管理员用户,登录之后先把模型供应商添加一下。

Dify平台添加模型提供商

# 7.3.2 创建大模型应用

Dify支持的应用种类很多,这里以最简单的聊天助手作为示例,其余场景如何使用见官方文档。

Step1:创建一个空白应用

Dify平台创建空白应用

Step2:设置提示词并选择模型

Dify平台的应用配置

Step3:创建并使用应用

Dify平台使用应用

# 8. 参考资料

[1] llama.cpp是在本地以最少硬件配置和最先进的性能实现 LLM 推理 from Github (opens new window)

[2] 网易有道开源的知识库问答引擎 QAnything from Github (opens new window)

[3] 阿里云推出企业级大模型RAG系统,几次点击即可连接PB级知识库 from 微信公众号 (opens new window)

[4] Ollama + AnythingLLM,有手就行本地知识库+LLM 组合拳 from Bilibili (opens new window)

[5] Ollama导入 GGUF、PyTorch 或 Safetensors 模型 from Github (opens new window)

[6] DeepDoc深度文档理解 from Github (opens new window)

[7] RAGFlow 部署本地 LLM from Github (opens new window)

[8] Ollama常见问题 from Github (opens new window)

[9] RAGFlow常见问题 from RAGFlow官方FAQ (opens new window)

[10] 基于 RAPTOR 实现长上下文 RAG from RAGFlow官方文档 (opens new window)

[11] RAGFlow开源Star量破万,是时候思考下RAG的未来是什么了 from 微信公众号 (opens new window)

[12] Vector | Graph:蚂蚁首个开源Graph RAG框架设计解读 from 微信公众号 (opens new window)

[13] 微软发布GraphRAG,使用大模型结合知识图谱能力增强传统rag能力 from Bilibili (opens new window)

[14] RAGFlow 正式进入 Agentic 时代 from 微信公众号 (opens new window)

[15] 大模型时代为何要新开发一款AI原生数据库 from 微信公众号 (opens new window)

[16] Ollama Support for API_KEY based authentication from Github issues (opens new window)

[17] 从8550秒到608秒!RAGFlow最新版本让知识图谱生成效率狂飙 from 微信公众号 (opens new window)

[18] HippoRAG 2发布,GraphRAG退位 from 微信公众号 (opens new window)

[19] AI 流程平台对比——Dify、Fastgpt、Ragflow from AI关乎未来 (opens new window)

[20] 为DeepSeek提供“联网搜索”功能的这家公司,把价格打到了Bing的1/3 from 微信公众号 (opens new window)

Last Updated: 4/18/2025, 2:21:51 PM