跳到正文

RAG 分块参数调优

chunk size、overlap 与层级切块参数的实验调优

原题:在构建RAG系统时,如何进行有效的文本分块(chunking)?请介绍不同的分块策略、考虑因素以及各种方法的优缺点。

文档处理 · 百度真题

30 秒回答

  1. 分块策略分类(固定长度、语义、递归等)及适用场景
  2. 分块粒度与检索精度的权衡关系
  3. 边界处理策略(句子/段落完整性)
  4. 重叠策略的作用与设置

回答与解析

答案要点

  • 分块策略分类(固定长度、语义、递归等)及适用场景
  • 分块粒度与检索精度的权衡关系
  • 边界处理策略(句子/段落完整性)
  • 重叠策略的作用与设置
  • 实际选型需结合文档类型和业务需求

核心分块策略

1. 固定长度分块(Fixed-size)

  • 按token数或字符数切分,具体长度作为候选变量
  • 优点:实现简单、Embedding均匀、便于批量处理
  • 缺点:可能切断语义,边界信息丢失

2. 递归分块(Recursive)

  • 优先按段落→句子→固定长度层级切分
  • 优点:尽量保持语义单元完整
  • 缺点:块大小不均,短块信息密度低

3. 语义分块(Semantic)

  • 用Embedding计算句子相似度,聚类形成语义连贯的块
  • 优点:块内主题一致,检索精度高
  • 缺点:计算成本高,块大小难控

4. 结构化分块

  • 按文档固有结构:标题、章节、表格、代码块等
  • 适用于PDF、Markdown、HTML等结构化文档

关键考虑因素

因素 建议
块大小 需结合Embedding输入限制、文档结构和LLM上下文预算提出候选
重叠(Overlap) 比较零重叠、短窗口与较长窗口,用同一评测集验证边界证据完整性
边界对齐 优先在句号、换行处切割,避免截断句子
元数据保留 记录来源位置、标题等,用于重排序和答案溯源

实践选型建议

  • 通用文档:递归分块 + 适度重叠,平衡效果与成本
  • 问答场景:比较多组粒度与重叠窗口,联合验证命中率和证据完整性
  • 长文摘要:比较较大块、父子索引与结构分块,验证上下文完整性和噪声
  • 混合策略:先结构化提取,再对长段落语义分块

最终需通过检索召回率端到端问答效果验证,无绝对最优,只有场景最优。

口语版讲法(约4分钟)

  • 一句话定位:分块本质是信息密度与检索精度的平衡
  • 三种核心策略:固定长度、递归、语义,各有适用边界
  • 混合策略与业务落地:以客服退款文档为例
  • 关键参数:块大小、重叠、边界对齐
  • 落地风险:匹配模型窗口、元数据保留、效果验证

这道题问的是文本分块,但本质其实是在问怎么在信息密度和检索精度之间做平衡。块切太大,语义是完整了,但检索时容易命中一堆无关内容;块切太小,精度上去了,但上下文碎片化,大模型反而看不懂。所以没有一个万能策略,得根据文档类型和业务场景来选。

先说三种核心策略,各有各的适用边界。固定长度分块最简单,按token数或者字符数一刀切,具体长度作为候选变量。优点是实现快、Embedding均匀、批量处理效率高。但缺点是它不管语义边界,可能一句话被拦腰切断,关键信息就丢了。所以它适合那种内容结构统一、长度一致的文档,比如日志或者固定格式的报告。递归分块就聪明一些,它先按段落切,段落太长再按句子切,句子还长才用固定长度兜底。这样尽量保住语义单元完整,但代价是块大小不均匀,短块信息密度低。语义分块更高级,用 Embedding 算句子相似度,把主题一致的句子聚成一个块。块内主题纯度高,检索精度好,但计算成本高,而且块大小不好控制,可能有的块特别大。

真正落地的时候,我很少只用一种策略。更常见的做法是混合。比如处理客服退款文档,我会先按文档固有结构分,像标题、章节、表格这些,结构化强的部分直接用结构化分块;对里面的大段说明文字,再用递归分块,保证句子完整;如果某个段落跨越多个主题,比如既有退款规则又有操作流程,那我会考虑用语义分块把它拆开。这样既利用了结构信息,又兼顾了语义连贯性。

具体参数上,有几个坑要注意。块大小要结合Embedding模型的实际输入限制、文档结构和LLM上下文预算提出候选。重叠也要比较零重叠、短窗口与较长窗口,用同一评测集验证是否补回边界证据。边界对齐很重要,一定要在句号、换行处切,别在句子中间截断。还有元数据要保留,比如来源位置、标题,这对后续重排序和答案溯源很有帮助。

最后说落地风险。一个常见失败场景是,块大小和LLM上下文窗口不匹配。比如LLM支持8K上下文,你把块切成2K,然后检索时一次塞4个块,结果超出窗口长度,模型直接截断。所以上线前一定要验证检索召回率和端到端问答效果,不能只看分块本身。

我其实更倾向把分块看成整个RAG系统的一部分,跟检索、重排一起调优。比如分块粒度细了,检索精度会高,但可能漏掉全局信息,这时候可以用 Parent Document 机制,先召回子块,再关联到父块喂给大模型。

所以我的总结是,没有最优策略,只有场景最优。我会先根据文档类型选基础策略,然后通过实验调块大小和重叠,最后结合检索效果做取舍。

关键一句:分块粒度与检索精度的权衡,以及Parent Document机制作为补充

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设你做一个企业知识库问答系统,文档里有长章节、表格、代码。用户问“第三季度营收多少”,你怎么把文档切成一块块,既能定位到数据,又不丢失上下文?

  2. 问法 2 · 层层追问

    RAG里文本怎么切块?……你一般用固定大小还是按语义?……那如果你切断了句子,召回时会不会找到不完整的答案?怎么避免?

  3. 问法 3 · 直球架构

    比较一下固定长度分块、递归分块和语义分块各自的优缺点,以及实际应用里块大小、重叠、边界对齐这些参数怎么设置?

同模块相关题目