跳到主要内容
索引不动,调检索调个屁

索引不动,调检索调个屁

钻牛角
钻牛角

· 阅读约 6 分钟

十天前 ORDER 挂在 arXiv 上,2609.17012。我第一眼是真没想点进去。路由、检索增强,这俩词挨一块儿,我脑子里自动蹦十几篇同质化的东西。后来是扫到摘要里“同时调整索引和检索”这句,手又绕回去了。嘿,本来没打算开这头。

这堵墙我撞过。之前给一个历史文献检索的活儿做过东西,具体是啥不细说,免得你猜出来。反正是同一个系统,查“某年某月发生什么”还行,换个“某个机构跨二十年的演变”,直接废。你猜为啥。分块粒度、元数据筛选、来源权重,全在预处理阶段焊死了。一个记者去找条报道,和一个研究者去翻二十五年史料,走的是同一条管道。这不叫通用,这叫偷懒。

传统 RAG 那个默认惯性就是这德行:先建索引,建完就当家具了,再不动;检索器固定;然后什么查询都往里灌。顺,太顺了,顺到没人较真。我一开始也是。做 demo 的时候换几个 Query 跑跑,感觉还行,就上了。然后被用户半夜一封邮件敲醒。

现在回来看 ORDER 这头牛。它的路子不复杂:先拿一组和语料关联的问题集做语义聚类,这步没什么可说的;然后一个聚类学一套自己的配置——分块策略、元数据过滤、重排序,全是聚类级别。推理的时候查询进来,按最近质心甩到对应索引。就完了,没别的花活。

我读到这儿第一反应是:这不就是 query routing 吗,早八百年有了吧。差点关标签页。可慢着——query routing 是给你选个检索源,或者选个子集,它不碰索引。ORDER 是连索引本身都跟着查询走。这俩不是一个 knob。一个是拧水龙头,一个是换管子。水龙头拧出花,管子烂了照样漏你一手。

后面有两个组件让我多停了一会儿。第一个是监督查询路由器 QRe,任务就是预测哪些集合最可能藏着相关证据。没啥新鲜的,监督信号加分类头,我一眼扫过去。第二个是 Uniform Multi-source Sampler,UMS——把检索预算平均分给选中的来源。哎,这个 Uniform 我盯了半天。为啥平均,不按置信度加权?你路由器不是已经在预测哪个集合更可能有货吗,为啥不把预算多给几分?

我一开始觉得这设计有点蠢。后来脑子里冒出个场景:历史档案里查一个冷门人物,真正有东西的来源往往不是路由器最看好的那个,而是个边角料小集合,置信度平平,但刚好就那一条。真按置信度加权,预算全砸大集合,冷门集合连个检索机会都捞不着。平均分配反而成了个兜底,防着路由器一头扎进它自以为了解的地盘。嘿,这地方我越想越顺。

不过 UMS 这个平均分配,我也就自己瞎琢磨。论文里到底有没有给消融实验说它比加权强,我还没逐句抠完。我连 TeX 源码都下了,180KB,密度不低,消融那部分还没啃透。要是真没对比,那这块算我替作者脑补了理由——没证据就下判断,跟那帮水货有啥区别。先把这疑点挂着。

再往下那些对比结果我不复述了,反正论文里说在异构历史档案上稳定优于朴素基线和一票所谓强 SOTA RAG。我一开始对“强 SOTA 系统”这种自我标榜有点翻白眼,这种对比十篇九篇不可信。但这一篇我没挑出大毛病,因为它比的是“证据检索质量”,不是生成得分。这恰好是我在意的。

有个表我不列不舒服:

环节传统固定 RAGORDER
索引预处理阶段一次建好,不再动按查询聚类,预先建多套索引
分块策略全局统一每个聚类一套
元数据过滤全局统一每个聚类一套
重排序全局统一每个聚类一套
查询路由无最近质心分配
来源选择固定QRe 筛选
预算分配固定(或简单加权)平均分给选中来源

拉胯的还是“全局统一”这一列。你可以永远相信,语料一杂,任何全局统一的配置都能给你整点阴间活。光调检索不回头看索引,就会整成这个样。

这论文真正戳我的,不是那套路由花活,是它肯把矛头指回索引端。RAG 圈子里有个不太说得破的惯性:所有人都盯着 Retriever 和 Generator 那点调节,重排、精排、Hybrid Search 来回搓,唯独索引——嘿嘿,建好就完了,跟买来的柜子似的往那儿一杵。可“该索引什么”本来就是检索问题的另一半。索引策略不变,后面玩得再花,也是在一堆过时的切分上跳舞。

异构历史档案为啥是块好试金石?因为那个异构不是人工造出来的,是时间堆出来的。来源杂,时间跨度大,语言飘,文体乱,同一笔信息可能散在三条不同脉络里。这种语料下,固定分块能好使才见鬼。说白了,就是我最早那堵墙的放大版:查具体事件得细粒度 chunk,查跨时间演变得大跨度 chunk,同时可能还得从某个特定来源集合里捞。三个需求,一套全局配置伺候不了。

让我把判断说偏一点:这篇论文的核心贡献不是新模型,也不是新损失函数,是个工程直觉——“检索配置应当以查询为条件”这件事,它真用一套完整框架做出来了,而且把索引端这个最没人动的 knob 掰活了。你说它很多组件是拼装,我不否认。可拼装位置选得准,本身就是判断力。

中间我还犯过嘀咕:这思路,真没人系统做过吗?我又翻了翻,动态索引不是没有,动态检索配置也有人提,可把分块、元数据、重排序三样一起挂到查询聚类上,再串一个路由器从源头串到尾巴的,我确实没见谁做完整。哦对,还有个更让我在意的细节——它聚类用的是“和语料关联的问题集”,不是实时聚当前查询。这意味着啥?这些聚类对应的索引可以离线下先建好。推理时只是路由过去,没实时重建索引那个破延迟。这点很实用,不然线上光重建索引就够喝一壶。

最后,说个跟论文八竿子打不着的。我昨天整理硬盘,翻出个三年前的 RAG demo,当时还自我感觉良好,里头有我手写的“自适应检索”注释。点开一看,所谓自适应就是 if else 判断查询长度,长一点就多取几个 chunk。我盯着看了三十秒,默默把文件关了。那时候没 ORDER 这种参照,我也跟那个“全局统一”的惯性一样,觉得差不多行了。想想挺傻,也挺正常。人嘛,墙没撞过,就不觉得疼。

扯远了,反正——嘿嘿,下次见。

钻牛角
钻牛角

逮住一个前端小知识点挖到底:现象→实验→兼容性表格→闲聊,配 demo 玩梗。

查看主页 →