项目概述
RAGFlow 是一个基于深度文档理解的开源 RAG(检索增强生成)引擎。它提供了一个流畅的 RAG 工作流,结合大型语言模型(LLM)提供真实的问答能力,并通过各种复杂格式化数据的引用支持回答。本文通过分析 RAGFlow 的源代码和官方文档,总结其在实现 RAG 技术时采用的最佳实践。

文档处理与切分
深度文档理解(DeepDoc)
RAGFlow 的一个核心特色是其深度文档理解能力,这主要通过deepdoc模块实现:
- • 支持 PDF、DOCX、Excel、PPT、TXT、图片等多种文档格式
- • 每种格式都有专门的解析器(如
pdf_parser.py、docx_parser.py等)
- • 布局识别:识别 10 种基本布局组件(文本、标题、图表、表格等)
- • 表格结构识别(TSR):处理复杂表格,包括层次标题、跨单元格等
- • 基于模板的智能切分(Template-based chunking)
从源码分析可见,RAGFlow 在deepdoc/parser目录下为不同文档类型实现了专门的解析器,确保能准确提取各类文档的内容和结构。这种深度理解能力是 RAG 系统高质量检索的基础。
文档切分实现
在rag/nlp/rag_tokenizer.py中,RAGFlow 实现了复杂的文本分词和处理逻辑:
classRagTokenizer:
# 实现了多种分词和处理方法
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中实现了丰富的模型接口:
classDefaultEmbedding(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 模型选择实践包括:
- • 支持主流的 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实现数据库连接和操作:
classDocStoreConnection:
# 向量数据库连接抽象类
# …
classOpenSearchConnection(DocStoreConnection):
# OpenSearch实现
# …
RAGFlow 的向量数据库实践包括:
- • 使用命名规则
ragflow_{uid}确保索引唯一性
- • 使用加权融合(
weighted fusion)提高检索质量
RAGFlow 的向量数据库设计注重灵活性和性能,能够处理大规模的文档集合,并支持复杂的检索需求。
检索实现机制
RAGFlow 的检索机制主要在rag/nlp/search.py中实现,采用了多种技术提高检索质量:
classDealer:
defsearch(self, req, idx_names:str|list[str], kb_ids:list[str], emb_mdl=None, highlight=False, rank_feature:dict|None=None):
# 实现了复杂的检索逻辑
# …
definsert_citations(self, answer, chunks, chunk_v, embd_mdl, tkweight=0.1, vtweight=0.9):
# 实现了引用插入逻辑
# …
RAGFlow 的检索实践包括:
- • 默认权重配置为:关键词权重 0.05,向量相似度权重 0.95
- • 然后使用重排序(reranking)提高相关性
RAGFlow 的检索机制注重准确性和可解释性,通过多种技术的组合提高了检索质量,同时提供了灵活的配置选项以适应不同的应用场景。
RAG 流程集成与优化
RAGFlow 提供了完整的 RAG 工作流,从文档上传、解析、切分、索引到检索和生成,形成了一套自动化的流程:
RAGFlow 的整体架构注重易用性和灵活性,适合各种规模的业务需求,从个人使用到大型企业应用都能满足。
总结
RAGFlow 在 RAG 技术实现上的最佳实践主要体现在以下几个方面:
- 1.深度文档理解:通过专门的解析器和视觉处理技术,实现对复杂文档的深度理解,为高质量检索奠定基础。
- 2.智能文档切分:采用基于模板的切分策略,保留文档的语义结构和上下文关系,提高检索的准确性。
- 3.灵活的模型支持:支持多种 embeddings 模型和 LLM,允许用户根据需求选择最适合的模型组合。
- 4.高效的向量存储:使用 OpenSearch 作为向量数据库,提供高性能的检索能力和良好的扩展性。
- 5.混合检索策略:结合关键词搜索和向量相似度搜索,通过加权融合提高检索质量。
- 6.可解释性设计:提供引用和溯源功能,增强生成内容的可信度和透明度。
- 7.人机协作:允许人工干预和调整,结合自动化流程提高整体效率。
RAGFlow 的这些最佳实践为构建高质量的 RAG 系统提供了有价值的参考,特别是在处理复杂文档、提高检索质量和增强生成内容可信度方面的创新设计。
后续我将就本文列举的各个模块进行更详细的分析。