文档结构能不能帮上密集检索?
简单说,能。但增益小到你在自己项目里大概测不出来。
10 月初 arXiv 上挂了一篇论文专门测这个。标题很长,大意是《文档结构是否有助密集检索?跨两个语料库的四种机制的安慰剂对照消融》。长得像不想让人读。
真正值得抄的不是结论,是它做实验的方式。
RAG 里处理文档结构的手段就那么几种。按章节对齐切块,给每块补一段大模型写的上下文,把标题路径塞进元数据,再做一层章节到段落的层次检索。这四种过去都各自有人报过好消息。问题是语料不一样,嵌入模型不一样,指标也不一样。
更麻烦的是那个没人管的混淆因素:你往一个 chunk 前面加任何字,它的 embedding 就变了。
你测出来的「结构增益」,可能只是「多塞了二十个 token」的增益。这话不好听,但确实没人分开测过。
这篇的做法是加一个安慰剂组。标题路径照给,但跨文档随机打乱。格式上完全合法,内容上跟这篇文档没关系。它看起来像结构,实际不携带任何信息。
如果这样也涨,那涨的就是词元数量。
结果没涨。真实标题路径的结构对齐分块,在两个语料上都压过了安慰剂。维基上高 0.010,QASPER 上高 0.016。也压过了「固定窗口切块加 LLM 生成上下文」这条更常见的基线,0.022 和 0.012。
所以结论站得住:结构带来的增益,来源是内容,不是字数。
到这儿本来可以收工。但还有两件事更值得说。
第一件,效应量。dz 在 0.06 到 0.11 之间。
这个量级放在论文里很干净。四个对比项预先注册,按文档聚类的 bootstrap,Holm 校正之后仍然显著,两个语料方向一致。放在你自己的项目里,基本等于测不出来。换个 chunk size,调一下 overlap,或者换一版 embedding,波动大概率比这个大。
我不是说别做结构对齐。按文档自己的标题去切块,本来就省事、可读,做就是了。我是说别指望它给你肉眼可见的提升。谁跟你说加上标题路径检索就上一个台阶,先要一下他的效应量。
第二件,也是我最想让人记住的一条:层次化两阶段检索,掉点了。
两个语料分别掉 0.033 和 0.015。作者把原因归到第一阶段的章节召回上。第一章召不准,后面再精细也是在错的章节里翻。
这条我一点都不意外。见过太多这种管线,第一层用粗粒度检索定范围,第二层在范围内细排。听起来很顺。实际上第一层漏了,第二层再准也救不回来,你还多花了一次检索的钱。
复杂的管线不会因为多了一层就变好。它只会让错误多一个藏身的地方。
如果你手上正好有这么一套,别急着调第二层。先量第一层的章节召回。量出来多少,心里就有数了。
还有一条我没完全吃透。
人工标注的金标准结构,在维基上明显好于大模型推断出来的结构。但在 QASPER 上,这个优势不成立。同样是结构,一个来自人,一个来自模型,在两种文档上表现相反。我暂时给不出解释。可能是维基特色条目的标题层级本身就规整,模型推不出额外的东西。也可能是论文那种章节名太模板化,人和模型给的差不多。
这条先放在这里。等我搞明白了再补一句。
顺带说下实验规模,方便你判断可信度。维基那边 200 篇特色条目,951 条查询。QASPER 那边 1585 篇论文,4303 个问题。两个语料差异够大,方向还一致。
至于 0.022 还是 0.010,记不住没关系。
记住那条掉点的就行。加层不一定更好。第一层不靠谱的时候,加层只会更差。
本周就这些,下周见。
