我会从以下几个方面为你解析这个项目,从宏观到微观,让你能全面理解它的设计思想和代码实现。

  1. 核心概念:RAGFlow 是什么?

  2. 主要特点:它解决了什么痛点?

  3. 系统架构:各个组件是如何协同工作的?

  4. 核心工作流程:一个 RAG 任务是如何执行的?

  5. 源码目录结构解读:关键代码在哪里?

  6. 如何快速上手?


1. 核心概念:RAGFlow 是什么?

RAGFlow 是一个开源的、基于深度文档理解的 RAG (Retrieval-Augmented Generation, 检索增强生成) 引擎。

简单来说,它不是一个简单的 RAG 框架,而是一个完整、开箱即用、并针对复杂文档(如 PDF、Word)进行深度优化的 RAG 应用平台。它的核心理念是,高质量的 RAG 应用,首先需要高质量的文档解析和分块(Chunking),而不仅仅是依赖于强大的大语言模型(LLM)。

一句话总结:RAGFlow 旨在通过智能化的文档处理,为企业级应用提供一个更精准、更易用的 RAG 解决方案。


2. 主要特点:它解决了什么痛点?

传统的 RAG 流程在处理复杂文档时有许多痛点,RAGFlow 主要针对以下几点进行了优化:

  • 痛点1:糟糕的文档分块(Chunking)

    • 传统方法:简单粗暴地按固定字数或按段落切分,很容易破坏表格、标题、列表等语义结构,导致检索到的上下文不完整或有误。

    • RAGFlow 方案:引入了 deepdoc 模块,这是一个深度文档理解组件。它能像人一样“看”文档,识别出标题、段落、图片、表格、代码块等,然后进行语义分块。它甚至能将表格转换成 Markdown 格式,极大地保留了原始信息的结构和准确性。

  • 痛点2:配置复杂,流程繁琐

    • 传统方法:搭建一个 RAG 系统需要手动选择和集成向量数据库、Embedding 模型、LLM、文档解析库等,工作量大且容易出错。

    • RAGFlow 方案:提供了一个自动化工作流。用户只需要上传文档,系统会自动完成解析、分块、向量化、索引等所有后台步骤。它内置了 Milvus、PostgreSQL、MinIO 等组件,通过 Docker Compose 一键部署,极大降低了使用门槛。

  • 痛点3:对特定文档格式优化困难

    • 传统方法:一套分块规则要应用于所有文档,效果不佳。

    • RAGFlow 方案:提出了**“模板化分块”(Template-based Chunking)** 的概念。用户可以为不同类型的文档(如财报、简历、论文)定义不同的解析和分块规则,从而实现最佳效果。

  • 痛点4:检索质量不高

    • 传统方法:仅依赖向量相似度检索,可能召回一些语义相关但并非最佳答案的片段。

    • RAGFlow 方案:内置了**重排(Rerank)**模块。在向量检索召回初步结果后,使用更精细的 Rerank 模型对结果进行重新排序,将最相关的片段排在前面,再送给 LLM,提升了最终答案的质量。


3. 系统架构

RAGFlow 采用微服务架构,各个组件职责分明,通过 Docker Compose 统一编排。这从它的 docker/docker-compose.yml 文件中可以清晰地看到。

![alt text](https://raw.githubusercontent.com/infiniflow/ragflow/main/docs/ragflow_architecture.png)

我们来解析一下上图中的关键组件:

  • Web (前端): 位于 web/ 目录,使用 React 和 Ant Design 构建的用户界面。用户通过这个界面进行数据集管理、文档上传、对话测试等操作。

  • API (后端): 位于 api/ 目录,是整个系统的大脑。它使用 FastAPI 框架构建,负责接收前端请求,协调其他所有服务来完成任务。

  • Controller / Service Layer (控制器/服务层): 这是 API 内部的逻辑分层,负责处理业务逻辑,如用户管理、数据集创建、任务调度等。

  • MinIO (对象存储): 一个兼容 S3 协议的对象存储服务。所有用户上传的原始文件(如 PDF, DOCX)都存放在这里。

  • PostgreSQL (关系型数据库): 负责存储系统的元数据,例如:

    • 用户信息

    • 数据集信息

    • 文档信息(文件名、状态等)

    • 任务处理状态

    • Chunk 与原始文档的对应关系

  • Redis (缓存/消息队列): 用于数据缓存和任务队列。当一个新文档被上传时,API 会创建一个解析任务并放入 Redis 队列,由后台的工作进程消费。

  • Milvus (向量数据库): 核心组件之一。所有文档被分块(Chunk)并转换为向量(Embedding)后,都存储在 Milvus 中,用于高效的相似度检索。

  • deepdoc (后台任务): 虽然图中没有单独画出,但这是 RAGFlow 的灵魂。它以后台任务的形式运行,从 Redis 任务队列中获取待处理的文档,进行深度解析、分块,并将结果存回数据库。


4. 核心工作流程

让我们以用户上传一个 PDF 文件并进行问答为例,串联起整个流程:

  1. 数据准备阶段 (Indexing)

    1. 上传: 用户在 Web 界面上传一个 PDF 文件。

    2. 存储: API 服务接收文件,将其存入 MinIO,并在 PostgreSQL 中记录一条文档信息(例如,状态为 pending)。

    3. 任务创建: API 在 Redis 的任务队列中创建一个解析任务。

    4. 智能解析: deepdoc 工作进程从 Redis 中取到任务,从 MinIO 下载 PDF 文件。

    5. 分块: deepdoc 利用其视觉和版面分析能力,将 PDF 解析成结构化的内容(如识别标题、段落、表格),然后按预设规则(或模板)进行智能分块。

    6. 向量化: 系统调用指定的 Embedding 模型(如 BGE),将每个文本块(Chunk)转换成一个高维向量。

    7. 索引: 将文本块、其对应的向量以及元数据(如来源页码)存入 Milvus 和 PostgreSQL

  2. 查询阶段 (Querying)

    1. 提问: 用户在聊天界面输入一个问题。

    2. 查询向量化: API 将用户的问题也用同一个 Embedding 模型转换成查询向量。

    3. 召回 (Retrieval): API拿着这个查询向量去 Milvus 中进行相似度搜索,找出最相似的 Top-K 个文本块。

    4. 重排 (Rerank): (可选但推荐) 系统将召回的 K 个文本块和原始问题一起送入 Rerank 模型,模型会给出一个更精准的相关性排序。

    5. 构建 Prompt: 系统将原始问题和经过重排后的、最相关的几个文本块组合成一个提示(Prompt)。

    6. 生成 (Generation): 将构建好的 Prompt 发送给指定的大语言模型(LLM,如 GPT-4)。

    7. 返回答案: LLM 根据提供的上下文信息生成答案,API 将答案流式返回给前端界面。


5. 源码目录结构解读

了解了架构和流程后,我们来看代码:

  • ragflow/

    • api/: 后端核心代码 (FastAPI)

      • api_app.py: FastAPI 应用的入口。

      • controllers/: API 的路由和控制器,处理 HTTP 请求,是业务逻辑的起点。例如 document_controller.py 处理文档相关的 API。

      • db/: 数据库模型(使用 SQLAlchemy)和操作。

      • schedulers/: 任务调度器,定期执行一些清理或检查任务。

      • serviecs/: 存放核心业务逻辑,如 document_service.py 负责文档处理的完整流程。

      • utils/: 工具类函数。

    • deepdoc/: 灵魂所在:深度文档理解库

      • 这是一个独立的 Python 包,是 RAGFlow 的核心技术壁垒。

      • parser/: 包含了对不同文件类型(PDF, Word, TXT 等)的解析器。pdf_parser.py 是重点。

      • vision/: 视觉相关的模型和代码,用于版面分析、表格识别等。

      • layout_recognizer/: 版面识别器,判断文本块是标题、段落还是表格。

    • rag/: RAG 流程相关模块

      • llm/: 封装了与不同大语言模型(如 OpenAI, Ollama)交互的客户端。

      • retrieval/: 封装了检索逻辑。

      • rerank/: 封装了 Rerank 模型的调用。

    • web/: 前端代码 (React)

      • src/: 源码目录。

      • pages/: 页面组件。

      • services/: 调用后端 API 的封装。

    • docker/: 部署相关

      • docker-compose.yml: 非常重要! 定义了所有服务、依赖关系、端口映射和环境变量,是理解整个系统架构的最佳入口。

      • Dockerfile.*: 各个服务的 Docker 镜像构建文件。


6. 如何快速上手?

RAGFlow 的部署非常友好:

  1. 前提: 确保你已经安装了 Docker 和 Docker Compose。

  2. 克隆项目:

    Generated bash
    git clone https://github.com/infiniflow/ragflow.git

    Use code with caution.Bash
  3. 进入目录:

    Generated bash
    cd ragflow

    Use code with caution.Bash
  4. 启动服务:

    Generated bash
    docker-compose -f docker/docker-compose.yml up -d

    Use code with caution.Bash
  5. 访问: 等待所有容器启动成功后,在浏览器中打开 http://localhost:80 (或你配置的其他端口),就可以看到 RAGFlow 的登录界面了。默认的管理员账号是 admin,密码是 admin123。

总结

RAGFlow 不仅仅是一个简单的代码库,而是一个精心设计的、产品化的 RAG 平台。它的最大亮点在于将学术界先进的文档版面分析技术(deepdoc)工程化,并与一个完整的、易于部署的 RAG 工作流相结合,从根本上解决了传统 RAG 在处理非结构化和半结构化文档时的质量瓶颈。

如果你需要为一个企业构建一个处理复杂报告、合同、手册等文档的 RAG 应用,RAGFlow 绝对是一个值得深入研究和使用的优秀开源项目。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐