RAG 中的分块策略(Chunking Strategy)
引言
检索增强生成(Retrieval-Augmented Generation, RAG)已经成为大语言模型应用中不可或缺的范式。它通过从外部知识库检索相关信息,辅助模型生成更准确、更及时的答案。然而,RAG 系统的性能高度依赖于一个关键步骤:如何将原始文档分割成合适的片段(chunks)以供检索。这就是"分块策略"(Chunking Strategy)要解决的问题。
Q1:什么是分块?为什么在 RAG 中它如此重要?
A:
分块(Chunking)是指将长文本切分成若干较小、语义完整的段落的过程。在 RAG 系统中,文档首先被切分成块,然后每个块被向量化存入向量数据库。当用户提问时,系统将查询也向量化,并通过相似度检索召回最相关的几个块,最后将这些块作为上下文交给 LLM 生成答案。
分块的重要性体现在以下几个方面:
- 向量检索的限制:大多数 embedding 模型对输入长度有限制(例如 512 或 1024 token),且长文本的语义容易稀释,导致检索不精确。
- 上下文窗口约束:LLM 的上下文窗口有限,如果块太大,可能放不进 prompt;如果块太小,可能缺少足够的背景信息。
- 检索质量与生成质量的平衡:块粒度过粗可能引入噪声,粒度过细则可能丢失关键信息。分块策略直接影响召回的准确性和生成的完整性。
- 系统性能:块的数量和大小会影响向量存储和检索的延迟。
因此,分块策略是 RAG 系统设计中的核心决策之一。
Q2:有哪些常见的分块方法?它们各自的优缺点是什么?
A:
常见的分块方法可以分为以下几类:
1. 固定大小分块(Fixed-size Chunking)
- 做法:按固定的字符数或 token 数切割文本,例如每 500 个 token 切一块,可设置重叠。
- 优点:实现简单,计算开销小,适用于大多数场景。
- 缺点:可能切断句子甚至词语,导致语义破碎;无法感知文档结构,检索时容易丢失上下文。
2. 基于句子的分块(Sentence-based Chunking)
- 做法:以句子为基本单位,组合多个句子达到目标大小,通常使用 NLP 工具(如 spaCy、NLTK)识别句子边界。
- 优点:保持了句子完整性,语义破坏较小。
- 缺点:句子长短不一,可能导致块大小差异大;对语言依赖性强,处理代码、表格等非自然语言文本效果差。
3. 递归分块(Recursive Chunking)
- 做法 :先尝试按一个较大的分隔符(如段落)切分,如果块仍然太大,则递归地用更细的分隔符(如句子、标点)继续切分。LangChain 的
RecursiveCharacterTextSplitter就是典型代表。 - 优点:尽可能保持语义边界,灵活适应不同文本结构。
- 缺点:需要预定义分隔符优先级,对特殊格式(如 markdown、代码)需要定制。
4. 基于文档结构的分块(Document Structure-based Chunking)
- 做法:利用文档的固有结构(如 Markdown 标题、HTML 标签、PDF 段落)进行分块,例如按章节、小节切分。
- 优点:块具有清晰的语义边界,非常适合层次化文档;可结合元数据(如标题)增强检索。
- 缺点:依赖文档格式,不同文档可能结构不一致。
5. 语义分块(Semantic Chunking)
- 做法:通过模型判断文本的语义边界,例如检测主题转换点,或者使用 embedding 相似度合并句子直到语义连贯。
- 优点:理论上块内语义最紧凑,检索效果最佳。
- 缺点:计算开销大,需要额外模型,实现复杂。
6. 特殊分块(如按 token、按窗口滑动)
- 针对代码:按函数、类分块,保留代码结构。
- 针对表格:按行或按描述+表格分块。
实际应用中,通常结合多种方法,例如先用结构分割,再对过长的块递归切分。
Q3:分块大小如何影响检索和生成?如何确定最优块大小?
A:
分块大小是影响 RAG 系统效果的关键参数。它主要影响两方面:
1. 对检索的影响
- 小块:更精确,容易命中包含具体事实的片段,但可能缺乏上下文,导致召回的信息孤立。小块数量多,检索范围广,但可能引入更多噪声。
- 大块:上下文丰富,能提供背景信息,但可能包含大量无关内容,稀释了关键信息的密度,导致检索准确率下降(召回的内容虽然相关但太泛)。
2. 对生成的影响
- 如果块太小,LLM 可能无法理解完整逻辑,需要额外的推理,甚至产生幻觉。
- 如果块太大,可能超出上下文窗口,或者挤占 prompt 中其他指令的空间,同时增加计算成本。
如何确定最优块大小?
没有通用的最优值,需要根据具体场景实验。以下是一些经验法则:
- 从 300-500 token 开始尝试(英文约 200-300 词),这是一个常见的起始点。
- 考虑 embedding 模型的最大输入长度:通常设为最大长度的 70%~80%,留有余地。
- 考虑检索的目标:如果问答是事实性(如"巴黎是哪个国家的首都?"),小块可能足够;如果涉及推理(如"总结这段文章的主要观点"),则需要包含足够上下文的块。
- 实验验证:在验证集上测试不同块大小下的检索准确率(如 hit rate)和生成质量(人工或自动评估)。可以结合重叠来缓解信息丢失。
Q4:什么是分块重叠(Overlap)?它有什么作用?
A:
分块重叠指在切分时,相邻块之间保留一部分重复内容。例如,块1包含 token 1-500,块2包含 token 400-900,重叠部分为 100 token。
作用:
- 保持语义连续性:避免关键信息恰好被切分在边界上,导致两个块都不包含完整信息。重叠确保边界附近的信息在至少一个块中是完整的。
- 提高检索鲁棒性:如果查询的关键词正好落在边界上,重叠可以保证该信息被包含在相邻块中,从而被检索到。
- 平滑上下文过渡:在生成阶段,如果召回多个相邻块,重叠可以消除块之间的生硬切换,帮助 LLM 拼接信息。
注意事项:
- 重叠会增加存储和计算开销(更多块)。
- 重叠比例通常设为 10%~20%,具体取决于文本长度和语义密度。
Q5:如何针对不同文档类型选择分块策略?
A:
文档类型决定了分块的最佳实践:
- 新闻文章/散文:适合基于段落或句子的递归分块。段落往往有相对完整的语义,先按段落切,段落太长再按句子。
- 学术论文/技术报告:强烈建议利用文档结构(标题、章节、子章节)分块。每个章节是一个主题单元,标题可作为元数据嵌入块向量,增强检索。
- 代码 :按函数、类、方法分块,保留注释和函数名。可以使用专门的分割工具(如
langchain的LanguageRecursiveTextSplitter)。 - 表格数据:可以有两种方式:1) 将表格转为描述性文本后分块;2) 保留表格结构,按行或按表格块分块,并在元数据中注明表头。
- 对话记录:按轮次分块,每轮可能包含用户和助手消息,要保持对话的上下文。
- 多语言文本:使用支持相应语言的句子分割器,注意 token 计数可能因语言而异(如中文 token 数与字数关系不同)。
Q6:分块策略如何与 embedding 模型和检索算法协同优化?
A:
分块不是孤立的,它与 embedding 模型、检索算法构成一个整体。优化时应考虑:
- embedding 模型的输入限制:块大小不应超过模型的最大输入 token 数,否则会被截断,造成信息丢失。
- embedding 模型的语义理解能力:有些模型对短文本效果好,有些擅长长文本。可以测试不同块大小下的 embedding 相似度分布。
- 检索算法 :
- 如果使用稀疏检索(如 BM25),分块可以稍大,因为 BM25 基于词频,对长文档相对友好。
- 如果使用密集检索(向量相似度),块大小影响语义向量的质量。实验表明,中等大小(200-500 token)的块往往效果较好。
- 多向量检索:有些高级 RAG 系统会为每个块生成多个向量(如小块+摘要),或者使用"父文档检索器"(先检索小块,再返回其所属的大块),这种设计可以结合小块的高精度和大块的丰富上下文。此时分块策略需要支持父子块关系。
Q7:如何评估分块策略的好坏?
A:
评估分块策略需要结合检索质量和生成质量两个维度。常用方法包括:
1. 检索评估
- 召回率(Recall@k):在测试问题集中,看前 k 个检索结果是否包含正确答案所在的块。
- 命中率(Hit Rate):即召回率的一种。
- 平均倒数排名(MRR):正确答案在检索结果中的排名。
- 可以通过构建一个包含"问题-答案所在段落"的测试集来评估。
2. 生成评估
- 人工评估:由人工判断生成答案的相关性、准确性、完整性。
- 自动指标:如 ROUGE、BLEU(用于摘要类任务),或使用 LLM 作为 judge(如 GPT-4 打分)。
- 端到端任务:在具体任务(如问答、摘要)上比较不同分块策略下的最终输出。
3. 其他指标
- 块数量与存储开销。
- 检索延迟。
Q8:实际项目中,如何迭代优化分块策略?
A:
分块策略的优化是一个实验驱动的过程,推荐以下步骤:
- 明确业务场景:确定你的 RAG 系统主要处理什么类型的文档,用户查询的特点是什么。
- 选择合适的基线分块方法:例如,对于普通文本,用递归分块,块大小 500,重叠 50。
- 构建小规模验证集:收集 50-100 个真实或模拟的问题,并标注出答案所在的文档范围。
- 评估基线效果:计算检索召回率,并抽样检查生成质量。
- 提出改进假设并实验 :
- 如果检索到的块包含答案但答案不完整 → 尝试增大块大小或增加重叠。
- 如果检索到的块包含太多无关信息 → 尝试减小块大小或使用基于语义的分块。
- 如果某些问题总是检索不到正确位置 → 检查是否因为答案跨块,考虑使用父子块检索。
- 分析错误案例:深入分析失败案例,找到分块导致的问题,调整策略。
- A/B 测试:在线上环境进行 A/B 测试,对比新策略和旧策略的业务指标。
记住,分块策略没有银弹,持续迭代才能逼近最优。
Q9:有没有一些前沿的分块技术值得关注?
A:
近年来,研究者提出了多种创新的分块方法:
- 基于嵌入的合并(Embedding-based Chunking):使用滑动窗口计算相邻句子或段落的 embedding 相似度,当相似度低于阈值时切分,保证块内语义连贯。
- 利用 LLM 分块:让 LLM 判断文本的主题边界,或者生成摘要作为块元数据。
- 自适应分块(Adaptive Chunking):根据查询动态选择不同粒度的块,例如先检索粗粒度块,再从中精确定位细粒度信息。
- 多模态分块:对于包含图文、表格的文档,分块需要兼顾不同模态的关联性。
这些技术虽然目前计算成本较高,但为未来更智能的 RAG 系统提供了方向。
总结
分块策略是 RAG 系统设计中至关重要的一环,它直接决定了检索的质量和生成的最终效果。掌握分块策略不仅需要理解各种方法的原理和适用场景,还需要具备在实践中实验和调优的能力。