7.8K Star RAG 引擎:基于深度文档理解,最大程度降低幻觉、无限上下文快速完成 “大海捞针” 测试!

RAGFlow [1] 是一款基于深度文档理解构建的开源 RAG(Retrieval-Augmented Generation)引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用户各类不同的复杂格式数据提供可靠的问答以及有理有据的引用。

RAGFlow 的主要功能

"Quality in, quality out"

  • 真正在无限上下文(token)的场景下快速完成大海捞针测试。

  • 基于深度文档理解,能够从各类复杂格式的非结构化数据中提取真知灼见。

    基于模板的文本切片

  • 多种文本模板可供选择。

  • 不仅仅是智能,更重要的是可控可解释。

    有理有据、最大程度降低幻觉

  • 文本切片过程可视化,支持手动调整。

  • 有理有据:答案提供关键引用的快照并支持追根溯源

    兼容各类异构数据源

  • 支持丰富的文件类型:包括 Word 文档、PPT、excel 表格、txt 文件、图片、PDF、复印件、结构化数据和网页等。

    全程无忧、自动化的 RAG 工作流

  • 基于多路召回、融合重排序

  • 大语言模型 LLM 以及向量模型均支持配置。

  • 提供易用的 API,可以轻松集成到各类企业系统。

  • 全面优化的 RAG 工作流可以支持从个人应用乃至超大型企业的各类生态系统。

RAGFlow 的核心 DeepDoc

RAGFlow 引擎的核心的是 DeepDoc,它由视觉处理解析器两部分组成。

视觉处理

作为人类,我们使用视觉信息来解决问题。

  1. OCR(Optical Character Recognition,光学字符识别)。由于许多文档都是以图像形式呈现的,或者至少能够转换为图像,因此OCR是文本提取的一个非常重要、基本,甚至通用的解决方案。
python deepdoc/vision/t_ocr.py --inputs=path_to_images_or_pdfs --output_dir=path_to_store_result

输入可以是图像或 PDF 的目录,或者单个图像、PDF文件。您可以查看文件夹 path_to_store_result ,其中有演示结果位置的图像,以及包含 OCR 文本的 txt 文件。

2. 布局识别(Layout recognition)。来自不同领域的文件可能有不同的布局,如报纸、杂志、书籍和简历在布局方面是不同的。只有当机器有准确的布局分析时,它才能决定这些文本部分是连续的还是不连续的,或者这个部分需要表结构识别(Table Structure Recognition,TSR)来处理,或者这个部件是一个图形并用这个标题来描述。它包含 10 个基本布局组件,涵盖了大多数情况:

  • 文本、标题
  • 配图、配图标题
  • 表格、表格标题
  • 页头、页尾
  • 参考引用、公式

你可以通过以下命令查看布局检测结果:

python deepdoc/vision/t_recognizer.py --inputs=path_to_images_or_pdfs --threshold=0.2 --mode=layout --output_dir=path_to_store_result

输入可以是图像或PDF的目录,或者单个图像、PDF 文件。您可以查看文件夹 path_to_store_result,其中有显示检测结果的图像,如下所示:

3. TSR(Table Structure Recognition,表结构识别)。数据表是一种常用的结构,用于表示包括数字或文本在内的数据。表的结构可能非常复杂,比如层次结构标题、跨单元格和投影行标题。除了 TSR,我们还将内容重新组合成 LLM 可以很好理解的句子。TSR 任务有 5 个标签:

  • 列、行
  • 列标题、行标题
  • 合并单元格

你可以通过以下命令查看表结构识别结果:

python deepdoc/vision/t_recognizer.py --inputs=path_to_images_or_pdfs --threshold=0.2 --mode=tsr --output_dir=path_to_store_result

输入可以是图像或PDF的目录,或者单个图像、PDF 文件。您可以查看文件夹 path_to_store_result,其中包含图像和 html 页面,这些页面展示了以下检测结果:

### 解析器

PDF、DOCX、EXCEL 和 PPT 四种文档格式都有相应的解析器。最复杂的是 PDF 解析器,因为 PDF 具有灵活性。PDF 解析器的输出包括:

  • 在 PDF 中有自己位置的文本块(页码和矩形位置)。
  • 带有 PDF 裁剪图像的表格,以及已经翻译成自然语言句子的内容。
  • 图中带标题和文字的图。

RAGFlow 快速上手

前置条件

  1. CPU >= 4 cores
  2. RAM >= 16 GB
  3. Disk >= 50 GB
  4. Docker >= 24.0.0 & Docker Compose >= v2.26.1

如果您尚未在本地计算机(Windows、Mac 或 Linux)上安装 Docker,可参考 Install Docker Engine[2] 这篇文章。

启动服务器

  1. 确保 vm.max_map_count >= 262144

检查 vm.max_map_count 的值:

$ sysctl vm.max_map_count

如果不是,请将 vm.max_map_count 的值重置为至少 262144

$ sudo sysctl -w vm.max_map_count=262144

此更改将在系统重新启动后重置。为了确保您的更改保持永久,请相应地添加或更新 /etc/sysctl.conf 中的 vm.max_map_count 的值:

vm.max_map_count=262144
  1. 克隆项目
$ git clone https://github.com/infiniflow/ragflow.git
  1. 构建预构建的 Docker 镜像并启动服务器:

运行以下命令会自动下载开发版本 RAGFlow Docker 镜像。要下载并运行指定的 Docker 版本,请在运行以下命令之前将 docker/.env 中的 RAGFLOW_VERSION 更新为所需版本,比如 RAGFLOW_VERSION=v0.6.0

$ cd ragflow/docker
$ chmod +x ./entrypoint.sh
$ docker compose up -d

核心映像大小约为 9 GB,可能需要一段时间才能加载。

  1. 启动服务器并运行后检查服务器状态:
$ docker logs -f ragflow-server

以下输出确认系统已成功启动:

    ____                 ______ __
   / __  ____ _ ____ _ / ____// /____  _      __
  / /_/ // __ `// __ `// /_   / // __ | | /| / /
 / _, _// /_/ // /_/ // __/  / // /_/ /| |/ |/ /
/_/ |_| __,_/ __, //_/    /_/ ____/ |__/|__/
              /____/
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:9380
 * Running on http://x.x.x.x:9380
 INFO:werkzeug:Press CTRL+C to quit

如果您跳过此确认步骤直接登录 RAGFlow,您的浏览器可能会提示网络异常错误,因为此时您的 RAGFlow 可能尚未完全初始化。

  1. 在 Web 浏览器中,输入服务器的 IP 地址并登录 RAGFlow。

使用默认设置时,您只需输入 http://IP_OF_YOUR_MACHINE(无端口号),因为使用默认配置时可以省略默认 HTTP 服务端口 80

配置 LLMs

RAGFlow 是一个 RAG 引擎,它需要与 LLM 协作才能提供接地气、无幻觉的问题解答功能。目前,RAGFlow 支持以下 LLM,而且该列表还在不断增加:

  • OpenAI
  • 通义千问
  • Moonshot
  • DeepSeek-V2

注意:RAGFlow 还支持使用 OllamaXinference 在本地部署 LLM。

  1. 单击页面右上角 > Model Providers(模型提供商):

> 每个 RAGFlow 账户都可以免费使用通义千问的 text-embedding-v2 模型。这就是为什么你能在已添加模型列表中看到 Tongyi-Qianwen。以后您可能需要更新您的 Tongyi-Qianwen API 密钥。

  1. 点击所需的 LLM 并更新相应的 API 密钥(本例中为 DeepSeek-V2):

您添加的模型如下所示:

3. 单击系统模型设置(System Model Settings)选择默认模型:

  • Chat model
  • Embedding model
  • Image-to-text model

有些模型,例如文生图模型 qwen-vl-max,是特定 LLM 的附属模型。您可能需要相应地更新您的 API 密钥才能使用这些模型。

创建你的第一个知识库

您可以将文件上传到 RAGFlow 中的知识库,并将其解析为数据集。知识库实际上就是数据集的集合。RAGFlow 中的问题解答可以基于一个特定的知识库或多个知识库。RAGFlow 支持的文件格式包括文档(PDF、DOC、DOCX、TXT、MD)、表格(CSV、XLSX、XLS)、图片(JPEG、JPG、PNG、TIF、GIF)和幻灯片(PPT、PPTX)。

  1. 单击页面顶部中间的 “知识库(Knowledge Base)” 选项卡 > 创建知识库。
  2. 输入知识库名称,然后单击 “确定” 按钮。您将进入知识库的配置页面:

3. RAGFlow 提供多种分块模板,以适应不同的文档布局和文件格式。为您的知识库选择嵌入模型和 chunk 模板。

注意:一旦选择了嵌入模型并用它来解析文件,就不能再更改了。原因很明显,我们必须确保特定知识库中的所有文件都使用相同的嵌入模型进行解析(确保它们在相同的嵌入空间中进行比较)。

  1. 单击 + Add file > Local files,开始向知识库上传指定文件。
  2. 在上传的文件条目中,单击 Play 按钮开始解析文件:

> 文件解析完成后,解析状态变为SUCCESS。

干预文件解析

RAGFlow 具有可见性和可解释性,允许您查看分块结果并在必要时进行干预。为此:

  1. 点击完成文件解析的文件,可以查看分块结果:

2. 将鼠标悬停在每个快照上可快速查看每个块。

  1. 双击分块文本以添加关键字或在必要时进行手动更改:
  2. 在检索测试中,在测试文本中提出一个快速问题,以仔细检查您的配置是否有效: 从下面的内容中您可以看出,RAGFlow 以真实的引用进行了回应。

### 配置 AI Chat

RAGFlow 中的对话基于特定的知识库或多个知识库。创建知识库并完成文件解析后,就可以开始 AI 对话了。

  1. 点击 Chat 选项卡 > Create an assistant
  2. 更新 Assistant 配置:
  • 命名您的助手并指定您的知识库。
  • 空回复:
  • 如果您希望将 RAGFlow 的答案限制在您的知识库中,请在此处留下响应。这样,当 RAGFlow 没有检索到答案时,它就会按照您在这里设置的内容统一回答。
  • 如果您希望 RAGFlow 在没有从您的知识库中检索到答案时随机应变,请将其留空,这样可能会产生幻觉。
    1. 更新提示引擎或在开始时保持原样。
    2. 更新模型设置
    3. RAGFlow 还提供对话 API。将鼠标悬停在对话 > Chat Bot API 上,即可将 RAGFlow 的聊天功能集成到您的应用程序中:
    4. 测试聊天功能

往期文章

关注 AI 真好玩,带你玩转各类 AI 工具,掌控数字未来!

如果这篇文章对您有所帮助,请点赞、关注,并分享给您的朋友。感谢您的支持!

参考资料

[1] RAGFlow: https://github.com/infiniflow/ragflow

[2] Install Docker Engine: https://docs.docker.com/engine/install/

3