[[Chunking]] 对 [[RAG]] 的影响非常大,因为它决定了知识库里最小的检索单元。切得好,检索能找到刚好回答问题的证据;切得不好,要么找不到,要么找回来一堆噪声,最后生成模型也会被带偏。
它的核心权衡是信息粒度和上下文完整性。块太小,语义容易断,比如一句“该方法效果更好”被单独切出来,模型不知道“该方法”指什么;块太大,里面噪声多,[[embedding]] 会被多个主题稀释,检索精度下降,塞给大模型也浪费窗口。
常见方法里,固定长度分块最简单,按 token 或字符数硬切。优点是稳定、好控制,适合日志、流水、某些无明显结构的文本;缺点是容易切断段落和表格。
语义边界分块是按标题、段落、句子或条款切。它能保留完整语义,适合论文、产品文档、合同、技术手册。但问题是块大小不稳定,有的章节很长,需要再做递归切分或摘要压缩。
[[滑动窗口]]是用固定窗口加步长往前滑。窗口长度与 overlap 都只是待测试变量;它可能缓解边界信息丢失,也会带来冗余,必须在同一评测集比较召回、答案质量、索引体积和去重成本。
重叠分块是一个候选方案,相邻块保留一部分重叠区域。它可能比纯固定切分更不容易断语义,但也会增加索引和去重成本;是否适用要和无重叠方案放在同一评测集比较。
对检索精度来说,块越聚焦,通常越容易匹配准;对召回率来说,有 overlap 或滑动窗口通常更不容易漏;对生成质量来说,最关键的是 chunk 是否自包含,里面是否有足够的上下文支撑答案。
举个技术文档例子,用户问“[[RLHF]] 训练流程里 [[PPO]] 是怎么用的”。如果照搬某个固定长度硬切,可能 RLHF 流程在上一块,PPO 细节在下一块,检索只召回一个就答不完整。按二级标题切能保留完整章节,但章节过长时仍要二次处理。比较稳妥的做法是先保留标题和段落边界,再把不同窗口长度和 overlap 作为候选,用同一评测集选出方案,同时给每个子块带上父标题和章节 metadata。
选型上我会看三件事:文档结构、用户 query 类型、Embedding 模型能力。结构化文档优先语义切分,代码可以按函数或 AST,FAQ 可以按问答对;精确问答适合更小粒度,摘要分析需要更大上下文;如果 embedding 模型对长文本表示能力弱,chunk 就不能太长。
最后一定要评估。用一批真实 query 比较不同 chunk 大小和 overlap,观察 Recall@K、MRR、答案正确率和引用准确率。Chunking 不是一次性拍参数,而是 RAG 里最值得 A/B 的基础环节。