长查询FLINT比ConstBERT端到端快1.5–2.8倍

FLINT: Fixed-budget Late Interaction

Himank Handa, Negar Arabzadeh, Matei Zaharia

cs.IR, cs.CL

2026-10-20

FLINT用交叉注意力把查询和文档对称地压成固定个数的向量,默认各32个,长查询语料上端到端检索比ConstBERT快1.5–2.8倍,索引则比逐token的ColBERTv2小5.3–9.3倍。

这篇在解决什么

ColBERT 把查询和文档的每个 token 留成一个向量,再用 MaxSim 打分:每个查询向量在文档向量里取最大点积,然后求和。同等规模下它通常比单向量 bi-encoder 更会排。索引却随文档变长,查询一长,比对次数一起涨。

ColBERTv2 用残差压缩减存储,PLAID 用聚类中心先滤候选,向量个数仍然按 token 计。ConstBERT 把每篇文档收成固定 32 个向量,MS MARCO 和 BEIR 上排序还在,存储不再跟文档长度走,查询侧没动。BEIR 的查询大多是关键词,平均几个到二十几个 token,这一侧不贵。CRUMB 的多约束问句、话到嘴边式的 TREC-ToT 2025、深研找证据的 BrowseComp+,查询平均大约 100 到 230 个 token,ConstBERT 的搜索又被查询长度绑住。

FLINT 把文档和查询的向量个数一起锁死,看长查询和分布外查询的排序还剩多少。

方法

共享 Transformer 把查询、文档各自编成变长的上下文向量。中间加一层交叉注意力池化,做法来自 Perceiver Resampler。每侧放 V 个可学习 latent,latent 当 attention 的 query,token 表示当 key 和 value。每个 latent 扫过整段输入,把多处 token 收进一个输出。序列再长,输出仍是 V 个。后面接逐位置前馈:升维、GELU、压回原维度。

骨干、池化权重和最后的线性投影两边共用。唯一按侧分开的参数是两套 latent,Lq 和 Ld。池化后再堆自注意力时,文档向量会塌到几乎一样,分数一起塌,所以模块停在一层交叉注意力加一层前馈。

打分仍是 MaxSim,两边都换成 V 个向量:对每个查询向量,在 V 个文档向量里取最大点积,再求和。计算量固定为 V×V,跟原文长度脱钩。默认 V=32,与 ConstBERT 的文档预算一致,索引体积不能拿「文档向量更多」来解释。V 还可取 16 或 64。训练语料与这两个基线相同,都是 MS MARCO。骨干试了 BERT 和 ModernBERT-large。

结果

指标是 NDCG@10。短查询的 BEIR 上,BERT 版 FLINT 平均 0.452,低于 ConstBERT 的 0.469 和 ColBERTv2 的 0.502。个别集合会反超,Quora 上 0.848,高于 ConstBERT 的 0.817,接近 ColBERTv2 的 0.855。换 ModernBERT 后,V=32 的平均分为 0.530,ConstBERT 0.518,ColBERTv2 0.534,单向量基线 0.449。常规检索上,固定预算最多追平逐 token 的模型。

长查询才分开。BERT 版 CRUMB 平均 0.145,高于 ConstBERT 的 0.136 和 ColBERTv2 的 0.143。TREC-ToT 2025 从 0.047 升到 0.065,也高于 ColBERTv2 的 0.046。BrowseComp+ 为 0.063,对照是 0.055 和 0.057。ModernBERT 上三套复杂查询都高于 ConstBERT。查询最长、最口语的 TREC-ToT 2025,ConstBERT 0.070,不到 FLINT 0.147 的一半。对上 ColBERTv2,CRUMB 是 0.205 对 0.184;TREC-ToT 是 0.147 对 0.155,BrowseComp+ 是 0.105 对 0.135。单向量在后两套只有 0.042 和 0.022。

预算可以直接换。ModernBERT 上从 32 降到 16,各套都掉点,但仍高于单向量,三套复杂查询也高于 ConstBERT,索引大约一半。加到 64,BEIR 几乎不动,0.531 对 0.530;复杂查询继续涨,TREC-ToT 到 0.164,BrowseComp+ 到 0.108。

长查询语料上,端到端平均响应时间比 ConstBERT 快 1.5–2.8 倍。最大差距在 TREC-ToT 2025,约 640 万文档,查询平均 204 个 token:BERT 从 74.3 ms 降到 26.1 ms,ModernBERT 从 140.9 ms 降到 51.3 ms。相对 ColBERTv2,BERT 快 10.5–36.2 倍,ModernBERT 快 23–170 倍。170 倍就是 ModernBERT 这一格,ColBERTv2 端到端 8707.9 ms。查询平均只有 7 个 token 的 NFCorpus 上,两者响应时间非常接近。

时间差几乎全在搜索。TREC-ToT 配 BERT 时,查询每长一个 token,两边编码都只加 0.005 ms;搜索斜率是 FLINT 0.004 ms/token,ConstBERT 0.31 ms/token。搜索本身快 2.5–4.8 倍。PLAID 先拿查询向量去探聚类中心,只对候选做 MaxSim。ConstBERT 打分的候选数是 FLINT 的 2.3–4.6 倍,每个候选还要多比 5–7 倍的查询向量。

索引上,BERT 版与 ConstBERT 几乎同大,文档侧都是 32 个向量。相对 ColBERTv2,BERT 小 5.3–5.8 倍,ModernBERT 小 6.8–9.3 倍。TREC-ToT 上 ModernBERT 索引从 70G 降到 7.5G。单向量在三个大语料上更小,搜索大约 1 ms。V=64 的搜索时间是 V=32 的 2.8–4.9 倍。

设置对照FLINT
BEIR 平均 NDCG@10,BERTColBERTv2 0.502 / ConstBERT 0.4690.452
BEIR 平均,ModernBERTColBERTv2 0.534 / ConstBERT 0.5180.530
TREC-ToT 2025,ModernBERTConstBERT 0.070 / ColBERTv2 0.1550.147
同上,端到端延迟ConstBERT 140.9 ms / ColBERTv2 8707.9 ms51.3 ms
索引相对 ColBERTv2逐 token 一向量小 5.3–9.3 倍

为什么重要

晚交互此前的加速,要么压缩 token 向量,要么只把文档收短。查询侧一直一个 token 一个向量。问句变长以后,ConstBERT 的搜索按 token 变陡。FLINT 压平的是搜索:候选更少,每个候选的 MaxSim 从「查询 token 数 × 32」变成 32×32。

索引停在 ConstBERT 那一档,比 ColBERTv2 小 5.3–9.3 倍,也不随文档变长。改动在池化位置,训练目标没有换,可以放进已经在用 PLAID 的多向量栈。计时两边都用 PLAID,报告的加速没有另加降维。V 取 16、32、64,对应大约半索引、默认预算,以及 2.8–4.9 倍搜索时间换来的复杂查询分数。骨干从 BERT 换到 ModernBERT,这套相对收益还在。

局限与存疑

BERT 版 BEIR 平均低于两个基线,0.452 对 0.469 对 0.502。查询只有几个到十几个 token 时,固定 32 个查询向量没有多送出精度。摘要里的 comparable,更接近 ModernBERT 上 0.530 对 0.534 这一档。

170 倍出现在文档最多、查询最长的那一格,对照是 ColBERTv2,不是 ConstBERT。跟固定预算基线比,端到端只有 1.5–2.8 倍,磁盘几乎没省。存储上的 5.3–9.3 倍是相对逐 token 模型,9.3 倍就是 ModernBERT 的 TREC-ToT。这笔差记在 ColBERTv2 头上。

复杂查询的绝对分仍然低。BrowseComp+ 上 0.105,高于 ConstBERT 的 0.067,低于 ColBERTv2 的 0.135。V=64 能在 TREC-ToT 上到 0.164,搜索时间同时变为 2.8–4.9 倍。主表不和 XTR、WARP、MUVERA 比。对照卡在同一骨干、同一套 MS MARCO 训练,干净,也停在架构对比。ModernBERT 的多向量权重原先不公开,两个基线按同一流程重训,方差没有单独报。

候选变少以后 NDCG@10 还在。Recall@1000 只在附录,正文没有说明召回被剪掉多少。BERT 上池化向量方向更集中,少探几个聚类中心会不会漏掉相关文档,没有正面检验。训练只有 MS MARCO,长查询收益全是零样本。换成带长查询的训练集之后,V=32 还够不够,论文没有做。

术语

原文与代码

社区讨论

相关论文

全部论文解读