项目概述
RAGFlow 是一个基于深度文档理解的开源 RAG(检索增强生成)引擎。它提供了一个流畅的 RAG 工作流,结合大型语言模型(LLM)提供真实的问答能力,并通过各种复杂格式化数据的引用支持回答。本文通过分析 RAGFlow 的源代码和官方文档,总结其在实现 RAG 技术时采用的最佳实践。
文档处理与切分
深度文档理解(DeepDoc)
RAGFlow 的一个核心特色是其深度文档理解能力,这主要通过deepdoc
模块实现:
-
1. 多格式文档解析:
-
• 支持 PDF、DOCX、Excel、PPT、TXT、图片等多种文档格式 -
• 每种格式都有专门的解析器(如 pdf_parser.py
、docx_parser.py
等) -
• 能够处理复杂布局和格式,保留文档的结构信息
-
• OCR 技术:对图像或扫描文档进行文本提取 -
• 布局识别:识别 10 种基本布局组件(文本、标题、图表、表格等) -
• 表格结构识别(TSR):处理复杂表格,包括层次标题、跨单元格等
-
• 基于模板的智能切分(Template-based chunking) -
• 保留文档的语义结构和上下文关系 -
• 可视化切分结果,允许人工干预和调整
从源码分析可见,RAGFlow 在deepdoc/parser
目录下为不同文档类型实现了专门的解析器,确保能准确提取各类文档的内容和结构。这种深度理解能力是 RAG 系统高质量检索的基础。

文档切分实现
在rag/nlp/rag_tokenizer.py
中,RAGFlow 实现了复杂的文本分词和处理逻辑:
class RagTokenizer:
# 实现了多种分词和处理方法
defdfs_(self, chars, s, preTks, tkslist, _depth=0, _memo=None):
# 深度优先搜索算法进行文本切分
# …
defmaxForward_(self, line):
# 最大前向匹配算法
# …
defmaxBackward_(self, line):
# 最大后向匹配算法
# …
RAGFlow 采用了多种切分策略,包括:
-
1. 基于语义的切分:保持语义完整性,避免割裂上下文 -
2. 基于长度的切分:控制每个 chunk 的 token 数量,避免过长或过短 -
3. 基于结构的切分:尊重文档原有结构(段落、标题等) -
4. 可配置的切分模板:提供多种切分模板选项,适应不同文档类型和检索需求
这种灵活的切分策略确保了检索时能够获取足够的上下文,同时避免了无关信息的干扰。
Embeddings 模型选择与配置
RAGFlow 支持多种 embeddings 模型,在rag/llm/embedding_model.py
中实现了丰富的模型接口:
class DefaultEmbedding(Base):
# 默认使用FlagEmbedding模型
def__init__(self, key, model_name, **kwargs):
# 默认使用BAAI/bge-large-zh-v1.5模型
# …
classOpenAIEmbed(Base):
# OpenAI的embedding模型
# …
classQWenEmbed(Base):
# 通义千问的embedding模型
# …
classZhipuEmbed(Base):
# 智谱AI的embedding模型
# …
RAGFlow 的 embeddings 模型选择实践包括:
-
1. 多模型支持:
-
• 支持主流的 embeddings 模型,如 OpenAI、智谱 AI、通义千问等 -
• 默认使用 BAAI/bge-large-zh-v1.5
模型,针对中英文优化 -
• 支持本地部署的模型(如 Ollama、LocalAI 等)
-
• 实现了批量编码(batch encoding)以提高效率 -
• 自动处理长文本截断,避免超出模型最大长度限制
-
• 确保同一知识库内所有文档使用相同的 embedding 模型 -
• 保证向量空间的一致性,提高检索质量
-
• 允许为不同知识库选择不同的 embedding 模型 -
• 支持通过配置文件调整模型参数
RAGFlow 的官方 Docker 镜像(非 slim 版本)已预装了两个优化的 embedding 模型:BAAI/bge-large-zh-v1.5
和 maidalun1020/bce-embedding-base_v1
,这两个模型专为中英文优化,提供了良好的多语言支持。
向量数据库选型与实现
RAGFlow 在向量数据库方面采用了灵活的架构,主要通过rag/utils/doc_store_conn.py
实现数据库连接和操作:
class DocStoreConnection:
# 向量数据库连接抽象类
# …
class OpenSearchConnection(DocStoreConnection):
# OpenSearch实现
# …
RAGFlow 的向量数据库实践包括:
-
1. 默认使用 OpenSearch:
-
• 作为默认的向量数据库,提供高性能的向量检索 -
• 支持复杂的查询和过滤操作 -
• 良好的水平扩展能力,适合大规模数据
-
• 为每个知识库创建独立的索引 -
• 使用命名规则 ragflow_{uid}
确保索引唯一性 -
• 存储文档元数据和向量数据,支持多种查询方式
-
• 结合关键词搜索和向量相似度搜索 -
• 使用加权融合( weighted fusion
)提高检索质量 -
• 支持多种相似度计算方法(如余弦相似度)
-
• 实现了批量操作以提高写入效率 -
• 使用缓存减少重复计算 -
• 支持分片和复制以提高可用性和性能
RAGFlow 的向量数据库设计注重灵活性和性能,能够处理大规模的文档集合,并支持复杂的检索需求。
检索实现机制
RAGFlow 的检索机制主要在rag/nlp/search.py
中实现,采用了多种技术提高检索质量:
class Dealer:
def search(self, req, idx_names: str | list[str], kb_ids: list[str], emb_mdl=None, highlight=False, rank_feature: dict | None = None ):
# 实现了复杂的检索逻辑
# …
def insert_citations(self, answer, chunks, chunk_v, embd_mdl, tkweight=0.1, vtweight=0.9):
# 实现了引用插入逻辑
# …
RAGFlow 的检索实践包括:
-
1. 混合检索策略:
-
• 结合全文检索和向量相似度检索 -
• 默认权重配置为:关键词权重 0.05,向量相似度权重 0.95 -
• 支持调整权重以适应不同场景
-
• 首先进行初步检索获取候选文档 -
• 然后使用重排序(reranking)提高相关性 -
• 最后进行结果过滤和排序
-
• 当结果不足时,自动降低匹配阈值进行二次检索 -
• 支持基于相似度阈值的过滤,确保结果质量 -
• 可配置的检索参数,如 topk、相似度阈值等
-
• 自动为生成的回答插入引用标记 -
• 支持查看引用来源,提高透明度和可信度 -
• 引用格式为 [ID:n]
,便于用户追踪信息来源
-
• 支持为文档块添加关键词,提高特定查询的排名 -
• 实现了同义词扩展,提高召回率 -
• 支持自定义停用词和权重调整
RAGFlow 的检索机制注重准确性和可解释性,通过多种技术的组合提高了检索质量,同时提供了灵活的配置选项以适应不同的应用场景。
RAG 流程集成与优化
RAGFlow 提供了完整的 RAG 工作流,从文档上传、解析、切分、索引到检索和生成,形成了一套自动化的流程:
-
1. 流程自动化:
-
• 提供直观的 Web 界面,简化操作 -
• 自动化的文档处理和索引建立 -
• 支持批量处理多个文档
-
• 可视化切分结果,允许人工调整 -
• 支持添加关键词和修改文档块内容 -
• 提供检索测试功能,验证配置效果
-
• 支持配置不同的 LLM 作为生成模型 -
• 支持多种 embedding 模型 -
• 支持图像理解模型,处理多模态内容
-
• 使用并行处理提高文档解析速度 -
• 批量操作减少 API 调用次数 -
• 缓存机制减少重复计算
-
• 模块化设计,便于扩展和定制 -
• 支持通过 API 集成到其他系统 -
• 支持 Docker 部署,简化环境配置
RAGFlow 的整体架构注重易用性和灵活性,适合各种规模的业务需求,从个人使用到大型企业应用都能满足。
总结
RAGFlow 在 RAG 技术实现上的最佳实践主要体现在以下几个方面:
-
1. 深度文档理解:通过专门的解析器和视觉处理技术,实现对复杂文档的深度理解,为高质量检索奠定基础。 -
2. 智能文档切分:采用基于模板的切分策略,保留文档的语义结构和上下文关系,提高检索的准确性。 -
3. 灵活的模型支持:支持多种 embeddings 模型和 LLM,允许用户根据需求选择最适合的模型组合。 -
4. 高效的向量存储:使用 OpenSearch 作为向量数据库,提供高性能的检索能力和良好的扩展性。 -
5. 混合检索策略:结合关键词搜索和向量相似度搜索,通过加权融合提高检索质量。 -
6. 可解释性设计:提供引用和溯源功能,增强生成内容的可信度和透明度。 -
7. 人机协作:允许人工干预和调整,结合自动化流程提高整体效率。
RAGFlow 的这些最佳实践为构建高质量的 RAG 系统提供了有价值的参考,特别是在处理复杂文档、提高检索质量和增强生成内容可信度方面的创新设计。
后续我将就本文列举的各个模块进行更详细的分析。
参考地址
-
• 开源仓库:https://github.com/infiniflow/ragflow -
• 官方文档:https://ragflow.io/docs/dev/