RAG中文档的存储和切割,是决定检索质量的核心环节。下面从文档存储方式和文档切割策略两个部分来详细拆解。
一、 文档是怎么存的?
简单来说,RAG系统中文档的存储分为两步:先“切”,再“存”。
存储前的准备:解析与分块在存储前,系统会先解析源文档(如PDF、Word、HTML等),提取其中的文本内容。然后,会执行关键的文档切割(Chunking) 步骤,将长文档切分成更小的、便于处理的语义片段。
核心存储:向量数据库切分完成后,每个文本块(Chunk)会被一个嵌入模型(Embedding Model) 转换成固定长度的数值列表,即向量(Vector)。这个向量代表了该文本块的语义。随后,这些向量会被存入专门的向量数据库。
主流向量数据库:包括开源的 Chroma、FAISS,以及商业或云服务提供的 Qdrant、Weaviate、Milvus 和 pgvector等。 混合存储架构:许多生产级系统会采用“向量数据库 + 传统检索引擎”的混合架构。向量数据库处理语义相似度搜索,而 Elasticsearch 或 PostgreSQL 的全文索引则负责处理精确的关键词匹配查询,从而提升召回率。
二、 文档切割(Chunking)策略
分块的质量直接决定了RAG的性能上限。如果切割不当,再强大的模型也无法基于支离破碎的信息给出可靠答案。以下是几种主流的切割策略:
1. 固定大小分块(Fixed-size Chunking)
原理:严格按照预设的字符数或Token数进行切割。通常会设置一个重叠区(Overlap),让相邻块共享一部分内容,以缓解上下文被切断的问题。 优缺点:优点是实现简单、速度快。缺点是极易破坏语义完整性,可能直接从句子或段落中间切断。 适用场景:作为快速构建的基准线(Baseline),或处理日志等结构单一的文本。
2. 递归分块(Recursive Chunking)
原理:这是目前最推荐的策略之一。它使用一个分隔符优先级列表(如:先按段落 \n\n,再按换行\n,再按句号。,最后按字符)进行递归切割。优先用最高级的分隔符切分,如果切出的块仍过大,再用下一级分隔符继续切,直到所有块都符合大小要求。优缺点:优点是尽可能保留了段落、句子等高层级的语义结构,是固定大小和纯语义分割之间的一个优秀折中方案。缺点是实现稍复杂,性能开销略高于固定大小分块。 适用场景:绝大多数通用文档的首选,尤其适合带有段落、章节等结构的文档。例如,在基准测试中,512 token大小、15%重叠的递归分块达到了69%的端到端准确率,优于纯语义分块。
3. 语义分块(Semantic Chunking)
原理:不依赖物理结构,而是通过计算句子间的嵌入向量相似度来决定切割点。当相邻句子的相似度低于某个阈值时,意味着主题发生了变化,就在此处切割。 优缺点:优点是能创建主题高度统一、逻辑连贯的块,检索质量高。缺点是计算成本高,因为需要调用嵌入模型计算相似度,速度较慢。 适用场景:对检索精度要求极高的场景,或处理主题跳跃较多的复杂文档。
4. 基于结构的分块(Structure-aware Chunking)
原理:利用文档自身的结构信息(如Markdown/HTML的标题层级、PDF的章节、表格、代码块等)进行智能分割。例如,将一个一级标题及其下所有内容作为一个大块。 优缺点:优点是完美贴合文档逻辑,信息组织性强。缺点是依赖高质量的文档解析器,通用性较弱。 适用场景:处理格式固定的文档,如法律合同、学术论文、技术手册等。
5. 延迟分块(Late Chunking / Dynamic Chunking)
原理:这是一种较新的策略,不在索引时切分,而是在查询时动态决定如何从文档中提取信息块。 优缺点:优点是灵活性极高,能根据问题动态聚焦。缺点是实现复杂,目前还不普及。 适用场景:前沿研究或对灵活性有极高要求的特定智能体(Agent)应用。
三、 粒度选择与实战建议
1. 如何选择分块大小(Chunk Size)?
分块大小没有标准答案,需要在“信息完整性”和“检索精度”之间权衡。
块太大:会引入噪声,稀释关键信息,导致检索精度下降。 块太小:上下文不足,可能导致语义丢失。
实践建议:
推荐起点:许多企业级应用推荐从 300-500 Tokens 开始尝试。如果嵌入模型的最佳输入是512或1024 Tokens,可以以此为参考。 重叠大小(Overlap):通常设置为块大小的 **10%-20%**。 核心原则:优先按结构切,而不是按长度切。在处理有明确结构的文档时,基于结构的切分效果通常优于固定大小切分。
2. 如何评估分块效果?
评估不能只看直觉,需要建立量化指标:
检索指标:关注命中率(Hit Rate)、MRR(Mean Reciprocal Rank) 等,直接衡量检索到的块是否相关。 端到端指标:最终还是要看问答的准确率。例如,前述基准测试显示,512 token的递归分块能达到69%的端到端准确率。 风险分布:注意分块粒度决定了“缺失型”或“冲突型”错误的风险分布。
面试回答模板
“面试官,RAG中的文档存储,核心是将文档解析、切块后,通过嵌入模型转化为向量,并存储在专门的向量数据库中,以便进行高效的语义检索。
而文档切割是决定RAG性能上限的关键一步。主流的策略有几种:固定大小分块实现简单但易破坏语义;递归分块通过优先级分隔符递归切割,是平衡效果与效率的通用首选;语义分块通过计算向量相似度切分,精度高但成本也高;基于结构的分块则利用文档自身的标题、段落结构,非常适合处理格式固定的专业文档。
在粒度上,一般建议从 300-500 Tokens 开始尝试,并设置 10%-20% 的重叠。没有完美的策略,关键是要根据文档类型和业务场景,通过实验来选择和调优。核心原则是:分块要尽量对齐自然语义边界,避免硬切。”
夜雨聆风