深入讲解一下 RAGFlow 这个开源项目
我会从以下几个方面为你解析这个项目,从宏观到微观,让你能全面理解它的设计思想和代码实现。
-
核心概念:RAGFlow 是什么?
-
主要特点:它解决了什么痛点?
-
系统架构:各个组件是如何协同工作的?
-
核心工作流程:一个 RAG 任务是如何执行的?
-
源码目录结构解读:关键代码在哪里?
-
如何快速上手?
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 文件中可以清晰地看到。

我们来解析一下上图中的关键组件:
-
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 文件并进行问答为例,串联起整个流程:
-
数据准备阶段 (Indexing)
-
上传: 用户在 Web 界面上传一个 PDF 文件。
-
存储: API 服务接收文件,将其存入 MinIO,并在 PostgreSQL 中记录一条文档信息(例如,状态为 pending)。
-
任务创建: API 在 Redis 的任务队列中创建一个解析任务。
-
智能解析: deepdoc 工作进程从 Redis 中取到任务,从 MinIO 下载 PDF 文件。
-
分块: deepdoc 利用其视觉和版面分析能力,将 PDF 解析成结构化的内容(如识别标题、段落、表格),然后按预设规则(或模板)进行智能分块。
-
向量化: 系统调用指定的 Embedding 模型(如 BGE),将每个文本块(Chunk)转换成一个高维向量。
-
索引: 将文本块、其对应的向量以及元数据(如来源页码)存入 Milvus 和 PostgreSQL。
-
-
查询阶段 (Querying)
-
提问: 用户在聊天界面输入一个问题。
-
查询向量化: API 将用户的问题也用同一个 Embedding 模型转换成查询向量。
-
召回 (Retrieval): API拿着这个查询向量去 Milvus 中进行相似度搜索,找出最相似的 Top-K 个文本块。
-
重排 (Rerank): (可选但推荐) 系统将召回的 K 个文本块和原始问题一起送入 Rerank 模型,模型会给出一个更精准的相关性排序。
-
构建 Prompt: 系统将原始问题和经过重排后的、最相关的几个文本块组合成一个提示(Prompt)。
-
生成 (Generation): 将构建好的 Prompt 发送给指定的大语言模型(LLM,如 GPT-4)。
-
返回答案: 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 的部署非常友好:
-
前提: 确保你已经安装了 Docker 和 Docker Compose。
-
克隆项目:
Generated bash
Use code with caution.Bashgit clone https://github.com/infiniflow/ragflow.git -
进入目录:
Generated bash
Use code with caution.Bashcd ragflow -
启动服务:
Generated bash
Use code with caution.Bashdocker-compose -f docker/docker-compose.yml up -d -
访问: 等待所有容器启动成功后,在浏览器中打开 http://localhost:80 (或你配置的其他端口),就可以看到 RAGFlow 的登录界面了。默认的管理员账号是 admin,密码是 admin123。
总结
RAGFlow 不仅仅是一个简单的代码库,而是一个精心设计的、产品化的 RAG 平台。它的最大亮点在于将学术界先进的文档版面分析技术(deepdoc)工程化,并与一个完整的、易于部署的 RAG 工作流相结合,从根本上解决了传统 RAG 在处理非结构化和半结构化文档时的质量瓶颈。
如果你需要为一个企业构建一个处理复杂报告、合同、手册等文档的 RAG 应用,RAGFlow 绝对是一个值得深入研究和使用的优秀开源项目。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)