RAG 知识库分块参数怎么调:粒度、重叠与验证方法
RAG 知识库里,分块(chunking)决定的不是「文档怎么存」,而是「检索器的最小返回单元是什么」。检索只能返回块,生成只能读被返回的块,所以块边界一旦定错,后面换更强的 embedding 或补一层重排都很难完全救回来。
但分块参数没有通用最优解:同一个块大小对 FAQ 是浪费,对长文档可能刚好,对表格则可能直接把表头和表体切开。下面不展开 RAG 概念,而是把分块拆成可描述的旋钮、按文档类型给策略,再给一套可复现的验证与调参流程。
先把分块拆成几个可调的旋钮
- 切分单元:固定长度切,还是按结构边界切(标题、段落、列表项、表格行、函数)。
- 块大小:按 token 还是按字符计数,以及具体数值。
- 重叠长度:相邻块共享多少头部/尾部内容。
- 上下文附加:是否把标题路径、表头、文件路径拼进块文本一起向量化。
- 父子结构:用小块做检索命中,返回父块给生成。
- 元数据:来源、页码、章节路径等,用于过滤与引用。
真正直接影响检索效果的通常是前三个,后三个决定生成阶段能否拿到足够上下文。
按文档类型选择切分策略
FAQ / QA 对:最小语义单元就是一对问答,切分要保证问题和答案不被拆开,块大小由内容本身决定,不要强行统一长度。如果单个答案很长,可以让「问题 + 答案摘要」作为检索块、「问题 + 完整答案」作为返回块。重叠在这类文档里基本没有意义,因为相邻条目本来语义独立。
长文档 / 规范 / 手册:优先按标题层级切,再对超长小节做二次切分。块内最好带上从顶层到当前的标题路径,否则「第 3.2 节」这类块离开结构后语义会塌掉,检索时几乎无法区分。重叠在这里的作用是覆盖「答案刚好跨在边界上」的情况,它的意义是覆盖边界附近的句子,而不是按比例放大。
表格:表格的价值在表头与行之间的关系,不能按字符长度切。可行做法是把表头与每一行(或若干行一组)拼成一条可独立理解的文本记录,再按行组切分,并且每个分组里都要重复表头。跨页表格应先合并再切。需要注意表格转文本会丢失部分结构信息,如果业务需要精确数值计算,纯向量检索未必合适,这里还需要进一步验证。
代码:函数、类、方法是最自然的分块边界,检索单元通常是「签名 + 函数体」,必要时附上同文件中被引用的类型或导入。按行数硬切会把函数体截断,产生无法独立理解的块。代码的 token 密度与自然语言差别很大,沿用同一套长度参数往往不合适。
粒度如何影响召回与生成
块过小,单块语义不完整,向量表示容易被高频词主导,检索会命中「看起来相关但答不了问题」的块;同时要把答案凑齐就得提高 top-k,噪声比例随之上升。
块过大,一个块里混入多个主题,向量被平均掉,检索精度下降;返回后又挤占生成阶段的上下文预算,关键信息被稀释。
重叠的作用是有限的:它只能缓解边界切分带来的信息丢失,修不了切分逻辑本身的问题。重叠越高,索引条目越多,构建时间、存储和检索开销都会上升。
以上是方向性判断,具体到某个知识库,拐点只能通过评测找,不能凭经验直接下结论。
一套可复现的调参流程
1. 固定其余变量。 embedding 模型、距离度量、top-k、是否重排,在调分块期间都不要动,否则无法判断指标差异来自哪里。
2. 建小规模金标集。 从真实文档里挑若干问题,标注每道题答案对应的原始文本片段,而不是块——因为块会随参数变化。规模不必大,但要覆盖不同文档类型和不同题型。
3. 定义可计算的指标。 检索侧看金标片段是否被召回、在金标结果里排第几;生成侧看答案是否包含金标事实、是否引入文档外内容。生成侧可以人工判读,但判读标准要固定下来。
4. 单变量扫描。 先固定重叠,围绕文档自然结构长度往两侧取若干档块大小,逐档重建索引并评测;再固定较优块大小,扫描重叠长度。每次改动分块都意味着索引要完整重建,这个成本必须在评估时算进去。
5. 分类型看结果。 整体指标会掩盖差异:FAQ 可能在某个区间一直稳定,长文档和表格却对边界策略非常敏感。按文档类型拆开看,才能决定是全局统一参数,还是按集合分别配置。
6. 回到真实查询验证。 离线指标提升不等于端到端体验提升,最终要用线上查询做对比,并保留回滚到旧索引版本的能力。
容易忽略的边界条件
- token 数与字符数不是一回事。更换 embedding 模型意味着分词方式变化,同一份配置的等效长度会变,需要重新验证而不是直接沿用。
- 分块参数变更通常要求全量重建索引。先定分块策略再大规模导入,成本远低于上线后返工。
- 检索返回相邻块时要去重与合并,否则重叠部分会被重复拼进上下文,白白占预算。
- 元数据(标题路径、页码、表头)常常是提升召回最便宜的手段,优先级不亚于调块大小。
- 分块策略应当版本化,和索引一起管理;否则线上效果波动时,无法判断是数据变了还是配置变了。
对开发团队而言,一个务实的顺序是:先按文档类型确定切分边界,再用小规模金标集扫一遍块大小与重叠,最后才考虑换 embedding 或加重排。把分块当成一次性预处理,通常会在需要调整时付出重建整个索引的代价。