被切分边界拦腰截断的关键句,以及随之消失的答案
你的 RAG 流水线将文档切分为 512 个 token 的片段,并带有 50 个 token 的重叠。这是一个标准的行业默认设置。在你的语料库中,有这样一句话——“除非订单来自欧盟地区(在这种情况下监管窗口为 14 天),否则退款将在 5 个工作日内处理”——它恰好跨越了分块边界。分块 N 包含前半部分。分块 N+1 包含后半部分。
用户提问“欧盟退款需要多长时间”。检索系统给分块 N 打分最高,因为查询嵌入与第一段碎片中的“欧盟地区”对齐。而包含唯一实际答案的分块 N+1 排名太低,无法同时被检索到。智能体回答“5 个工作日”,并自信地引用了分块 N。客户人在法兰克福。答案是错误的。流水线完全按照设计运行。
这种故障模式不会出现在你的分块质量评估中。分块是格式良好的。语料库是格式良好的。嵌入模型是格式良好的。分块之间的边界——你在自己文档中划下的那些线——才是答案所在。
分块器是为上下文窗口而建,而非为了 意义
每个流行 RAG 框架自带的默认分块器都是围绕一个约束设计的:嵌入模型的上下文窗口。512 个 token 是编码器能容纳的上限。带有重叠的递归 token 切分既能干净地适应这个上限,又能在索引时保持低廉的计算成本。
这种设计完全没有考虑到语篇逻辑。token 切分器不知道“除非订单来自欧盟地区”是一个从句,其含义取决于它修饰的主句。它不知道合同中带编号的例外情况一旦与它所限定的规则分离,就会失去功能。它也不知道没有表头的表格行是一行没人能理解的数字。切分器只知道 token 和换行符。文档的语篇结构对它来说是不可见的。
增加 50 个 token 的重叠是为了捕捉边界溢出,但重叠是根据典型句子长度校准的。长复合句——那些带有例外、限定条件、前提和豁免条款的句子——经常会超过重叠窗口。而在法律、监管、财务和政策文档中,起到支撑作用的句子几乎总是长句。重叠是为了保护中位数长度的句子。它保护不了那个关键的句子。
2026 年 1 月一项使用 SPLADE 检索对重叠进行的系统分析发现,总体而言,重叠没有提供可衡量的召回率提升,只是增加了索引成本。总量数据隐藏了重叠起关键作用的情况和重叠纯属摆设的情况。它没有区分二者,你的评估套件可能也没有。
