Appearance
12.2.3 为什么复杂文档结构下,简单 top-k chunk 容易失效?
先给结论:在复杂文档里,top-k chunk 失败的主要原因不是相似度算法不够强,而是结构信息被切碎了。问题需要“先定位层级,再定位细节”,但 flat chunk 的检索只能在碎片中碰运气。
top-k chunk 失效的典型表现
- 命中了正确章节,但返回的是错误段落
- 命中结果各自相关,但拼不成完整答案
- top-k 全部来自同一段落,关键条件被漏掉
- 只命中正文,标题和条款编号被忽略
结构性失败的三类原因
1. 结构被切碎
标题层级、章节路径、条款编号这些信息是“检索锚点”,但在 chunk 化后经常被稀释或丢失。模型只能看到局部语义,看不到“我在第几章”。
2. 问题需要多步定位
很多问题不是直接问“内容是什么”,而是问“某章里的某条款”。这类问题必须先定位范围,再做细粒度检索,一次性 top-k 不具备这个过程。
3. 多约束问题被拆散
复杂问题往往同时包含“语义 + 关键术语 + 时间/版本条件”。单次相似度检索只会命中其中一部分,导致结果看似相关但实则不完整。
你能做的不是“更大 top-k”,而是“结构升级”
如果 top-k chunk 已经出现上面的失效信号,优先考虑以下升级路径:
- 分层检索:先定位章节,再回溯到父块补上下文
- 递归检索:在命中的章节内继续检索,逐层缩小范围
- 父子合并:子块命中后合并到父块,避免碎片化
- 结构化过滤:用
section_id、path做范围约束
下面是一个最小合并示意(伪代码):
python
def merge_by_parent(nodes):
buckets = {}
for n in nodes:
buckets.setdefault(n.parent_id, []).append(n)
return [merge(bucket) for bucket in buckets.values()]这类合并的核心目标只有一个:把碎片聚回结构里。
什么时候“调 top-k”仍然有用
top-k 不是完全无效,但它只能解决“召回率不足”的问题,解决不了“结构错位”的问题。如果你发现:
- 稍微提高 top-k 就能补齐答案
- 命中内容本身正确,只是略有缺口
那说明问题是“覆盖不足”,而不是“结构丢失”。此时可以先调 top-k 或做轻度重排。
自检清单
- 命中结果是否集中在一个章节里?
- 是否存在“标题/编号信息丢失”的症状?
- 增加 top-k 后结果是否仍然碎片化?
一句话总结
top-k chunk 在大文档里最容易失败的不是“算法”,而是“结构”。当问题需要分层定位时,结构化检索才是正确解法。