分块如何决定回答质量

固定长度切分为什么会把定义和例外条款拆开、结构感知分块与 15% 重叠各自解决什么、表格为什么要整块保留,以及召回成功但答案仍然出错的典型情形。

作者 SecureRAG Team · · 10 分钟阅读

分块决定了文档里哪些内容有机会被一起召回,而那些从来没有在同一块里出现过的内容,无论嵌入模型多好都召不回来。回答质量的上限在切分这一步就被定下来了,比模型和排序都早。

固定长度切分,会把条款和它的例外拆开

最粗的做法是每 N 个字符切一刀。它快、结果确定,产生的错误还特别像“模型不行”,其实跟模型无关。看一个合同里常见的形状:

8.3 除非双方另有书面约定,任何一方均可提前三十日书面通知对方终止本协议。

8.4 前款不适用于以下情形:……

按任意位置切下去,8.3 落在上一块末尾,改变 8.3 含义的例外条款 8.4 落在下一块开头。只召回前一块,你拿到的是被截掉了例外的规则。生成模型会把它当成不留例外的规定陈述出来,而引用完全正确——它引用的确实是你文档里的原文。

凡是“总则 + 但书”“价格 + 脚注”“质保 + 除外责任”这种结构,都会遇到同一件事。信息一点没丢,只是被拆散了。

结构感知切分:标题,再段落,再句子

本站的解析先把文档变成一个个块,并记住每块所处的标题路径,再按优先级切:

  1. 尽量沿用文档自己的结构。 Markdown 标题和编号式标题(第 3 章7.4Article 5Section 2.1附录 A)会开启新分组,每块都带着自己的标题路径,于是条款继承了它上方的各级标题。
  2. 超出 700 字符目标时,按段落边界切。
  3. 单段仍然过长时,才按句子边界切——切句规则同时认中文的句号、叹号、问号和分号,也认 .!?;
  4. 短块合并,短于 40 字符的直接不嵌入,因为三五个字的碎片嵌出来就是噪声。

标题识别用的是启发式规则,值得知道,因为结构感知最早失效的地方就在这里。一行文字满足“不超过 70 字符、不是表格行也不是代码围栏”,并且符合下列之一,就会被当作标题:以冒号结尾、后面紧跟空行、或者是一行不超过九个词且句末没有标点。密集正文里恰好独占一行的那句短话可能被误判成标题,于是在错误的位置开了新分组。这是个可以接受的折中:文档格式太杂,想要一条从不误判的规则是不现实的。

15% 重叠解决了什么,又代价在哪

目标 700 字符、重叠 15%,意味着每一块大约重复上一块的 105 个字符。这份重复只为了一件事:被边界切开的句子,至少在某一块里是完整的。没有重叠时,“通知期为三十天”这种答案可能被切成数字和量词分居两块,结果两块都召不回来。

代价是实打实的:

  • 索引变大。 重叠块是近似副本,15% 的重叠就让索引多背约 15% 的向量,嵌入时间同步上涨。
  • 结果重复。 top-k 会很乐意把同一段内容返回两次,一次来自边界这一侧,一次来自另一侧。所以流程里有一步多样性处理:MMR 取 λ = 0.7,并把与已选块余弦超过 0.92 的候选直接剔除——在有重叠的情况下,这个阈值主要拦住的就是重叠自己造出来的邻块。
  • 上下文被浪费。 最终交给回答环节的是 6 块,其中两块是同一段,等于只有 4 块有效证据。

重叠是对“必须切”这件事的补偿,它本身不是优点。把比例提到 30%,换回来的主要是重复结果。

表格和代码必须整块保留

表格最能说明整块规则为什么重要。按行切开,每一块里都是没有表头的数字。一块里只有 | 第三季度 | 12,400 | 8.1% | 时,它嵌入出来是一串数字的模式:问“第三季度怎么样”也许能找到它,问“第三季度毛利率多少”就永远找不到,因为“毛利率”这三个字躺在另一块的表头里。这一行内容忠实、完整,但没用。

代码围栏同理。把一个函数切成两半,两半里都没有那个问题里最可能提到的函数名。所以切分代码会把代码围栏和表格行标记为原子块,不在其间下刀,宁可让分组超过目标尺寸。

表格有一个值得在导入前做的补救:每隔二十行重复一次表头,或者干脆把表格导出成 CSV 再导入。CSV 会按结构化记录解析,列名跟着每个值一起走。

你真正会遇到的失败:召回成功,答案出错

这一类最让人困惑,因为引用看起来完全正确。三种形状:

现象 实际发生了什么 怎么办
引用页码正确,讲规则时丢了例外 例外条款在下一块,没进前 6 提问时把例外的说法带上;顺便确认条款编号有没有被识别成标题
答案里出现“它”“上述”却没有指代对象 跨块指代,先行词在上一块 提问时重复名词;这是真实的上限
数字被引用,含义丢失 表头和数据行被分开,或单位落在边界另一侧 把表格按 CSV 导入,或在源头保留表头后再转格式

共同点是:那一块局部正确、整体不完整。检索没有失职——它返回的块里确实有你问题中的字眼。答案还是错了,所以“有引用”和“答案被支撑”不是同一件事。

调参:有哪些旋钮,什么时候动它

情况 改什么 原因
回答讲规则时总是不带例外 换一种把例外说出来的问法,或往下看几条结果 例外条款存在,是检索缺了能命中它的词汇
一段内容吃掉整个上下文 不用改,近似去重已经处理 余弦超过 0.92 的重叠邻块会被剔除
数字出现但没标签 把来源按 CSV 重新导入,或补上重复表头 从来没挨在一起过的表头,切分造不出来
结果里全是碎片 没有可调项,回头检查源文件 40 字符以下的块本来就不嵌入,你看到的来自正文
长政策里答到了错误的章节 确认章节有没有被识别为标题 密集排版下的编号条款可能躲过启发式规则

有一条建议比这里任何一个参数都管用:先看来源,再信答案。每条回答都会列出它用到的文本块。证据单薄,答案就单薄,而问题通常出在导入环节,不在检索设置里。

分块救不了的那些事

切分只能在拿到的文本上工作。PDF 没有文字层,就没有东西可切,OCR 必须在工具之外先做,而 OCR 出来的文本没有可靠的标题结构。抽取时把分栏顺序读错了,结构感知切分会忠实地保住这个错乱的结构。同一条条款在十二份文件里有十二个不同数值,检索会把十二个都给你,再多的重叠也回答不了哪一份对你有效。切分是很有力的二阶杠杆,解析才是一阶。