NOTEICLR 2026 Oral
引言
第一,单向量检索不够细。第二,原始多向量检索太贵。第三,作者提出一种折中方案:只引入少量 Meta Tokens,用它们替代大量原始 token / patch 向量来做 late interaction;同时再把这些 Meta Embeddings 训练成可伸缩的层级结构。
single-vector retrieval
不管输入是文本、图片,还是图文混合,最后都压成一个固定维度的向量。查询端一个向量,候选端一个向量,然后用一个相似度函数打分,通常是点积或者 cosine similarity。上面的 “Score” 就是在算这两个向量有多像;左上角那个带对角线高亮的小矩阵,表示训练时会让正确配对的 query-candidate 分数更高,这就是 contrastive learning 在 batch 里的典型形式。

这个范式为什么这么流行?因为它非常适合大规模检索系统。原因有三个。
- 第一,它能离线建库。所有候选文档、图片、网页,先编码成单个向量,放到索引里。线上来一个 query,只需要把 query 编成一个向量,然后去近邻搜索。
- 第二,它特别适合 ANN,也就是 approximate nearest neighbor。因为每个对象就是一个点,向量数据库最喜欢这种结构。
- 第三,它的存储和计算都很省。假设每个对象一个 1024 维向量,那每个对象的索引成本基本就是 O(D);查询时打一遍向量相似度,也比较轻。
但它的问题也恰恰来自“只保留一个向量”。从表示学习角度看,这是一种很强的 information bottleneck。也就是:原始输入里很多不同粒度、不同位置、不同语义角色的信息,都必须被压进同一个向量里。这样一来,模型被迫做一种全局摘要。全局摘要对“主题级”匹配很好,但对细粒度约束就容易丢信息。
假设 query 是:“找一张图:一个穿黄色雨衣的人站在码头上,左边有红色浮标,背景是阴天海面。”这个 query 其实不是一个整体语义,而是多个约束同时成立:
- 一是“人”,
- 二是“黄色雨衣”,
- 三是“站在码头上”,
- 四是“左边有红色浮标”,
- 五是“背景是阴天海面”。
单向量模型最后只能输出一个整体 embedding。理论上它会把这些条件“平均地揉成一个全局语义中心”。问题是,一旦候选图像只满足其中大部分条件,比如也有穿黄衣服的人和海边,但没有红色浮标,它的整体向量仍然可能非常接近。因为这个模型没有显式机制去检查“每一条局部约束是否都被满足”。
再进一步,从多模态角度看,这个问题更明显。因为图像和文本本来就不是同一种信息组织方式。文本是离散 token 序列,图像往往是 patch 或区域级语义。把它们都压到一个向量里,意味着很多“词 - 区域”“短语 - 局部视觉证据”的对应关系会被抹平。对简单检索够用,但对复杂组合查询,往往不够。
multi-vector retrieval
这类方法不再强迫一个对象只对应一个向量,而是让一个 query 保留多个向量,一个 candidate 也保留多个向量。最经典的理解方式是:文本的每个 token、图像的每个 patch,或者某些局部语义单元,各自保留自己的 embedding。于是,一个对象不再是空间里的一个点,而更像是一小组向量。
这里最关键的不是“向量变多了”,而是“匹配机制变了”。单向量方法是整体对整体,一次打分。多向量 late interaction 是局部对局部,再聚合成总分。

设 query 有 个向量,candidate 有 个向量。那打分不是直接算一个整体 cosine,而是:
对 query 的每个向量,去 candidate 的所有向量里找一个最相似的;把这些“最好匹配分”加总起来。
图里的 “MaxSim, MaxSim, MaxSim” 就是在干这个事。每个 query 向量都单独去 candidate 里找自己的最佳匹配,然后上面那个 Σ 再把这些局部证据加起来,形成总分。
这套机制专业上叫 late interaction。“late” 的意思是:编码阶段先各自独立编码,不急着强融合;等到检索打分的时候,再做细粒度交互。这和 cross-encoder 不一样。cross-encoder 是在编码时就让 query 和 candidate 彼此看见,效果好但不能离线建库;late interaction 则保留了检索系统最重要的性质——候选可以独立预编码。
这类方法为什么比 single-vector 更强?因为它天然适合“分解式匹配”。还是刚才那个例子:“黄色雨衣”“码头”“红色浮标”“阴天海面”。
在多向量模型里,这几个语义片段不必被压成一个平均意义上的整体。它们可以由不同 query 向量分别承载。然后在候选图像侧,各自去找最匹配的区域向量。这样总分更像是在问:这个候选有没有满足 query 的各个关键局部条件?
所以这类方法对 compositional retrieval,也就是组合条件检索,通常更强;对局部证据敏感;对长文本、细粒度视觉检索、文档检索尤其有效。ColBERT 在文本检索里就是靠这个思路出名的。引言和第 2 节 related work 也专门点了这一点:ColBERT 保留 token-level embeddings,再用 lightweight scoring 做 late interaction。
但它的问题非常现实,而且非常严重:太贵。这里要分成两个成本。
- 第一个是索引成本。如果一个候选文档不是一个向量,而是 64 个、128 个甚至几百个向量,那索引体积会直接膨胀。单向量是“每个对象一个 embedding”。多向量是“每个对象一串 embeddings”。对百万级、千万级库,这个差别是很大的。
- 第二个是打分成本。因为 query 不是一个向量,candidate 也不是一个向量,所以不是一次点积结束,而是要形成一个局部相似度矩阵。如果 query 有 个向量,candidate 有 个向量,那么最朴素地看,要比较 对。文本对文本时,这个代价还相对可控,因为 query token 数可能不算太大。但一旦图像参与,问题急剧恶化。图像常常会有上百个 patch tokens。于是文本 query 对图像 candidate:还勉强能做;图像 query 对图像 candidate:就可能变成上百乘上百,甚至更多;多模态 query 对多模态 candidate:代价进一步爆炸。
这正是引言里强调的点。作者说,现有 naive 的多向量方法里,每张图可能对应 hundreds of patch embeddings,每个查询文本又对应若干 token embeddings,检索时都要存、都要比。这会造成很大的 index size 和 retrieval latency。更关键的是,当 query 端也有图像时,相似度计算会变成“几千个 query token 对几千个 candidate token”的交互,训练和推理都很难承受。图右上角 query 侧那个红叉,本质上就是在提示:这类传统多向量方案在实践里通常主要支持 text-to-image / text-to-doc 这类场景,而不太能自然扩展到真正的 multimodal-to-multimodal retrieval。
方法
预备知识
先看 Problem Definition。论文说,multimodal retrieval 的意思是:查询 可以是文本 、图像 ,或者文本加图像的组合 ;候选 也一样,可以是任意模态或者多模态组合。这个定义很宽,它没有把任务限制成“文搜图”或者“图搜文”,而是统一成:给定一个 query 和一组 candidates,从里面找最相关的那个。
本质上只是在说一句话:“对于候选集合里的每一个候选 ,都算一个相关性分数 ,然后取分数最高的那个。”
- :查询。
- :候选库里的 个候选。
- :相似度函数,或者更准确地说,相关性打分函数。
- :不是返回最大值本身,而是返回“让这个值最大的那个对象”。
- :最终被检索出来的 top-1 结果。
这里的关键不在公式本身,而在 。因为检索系统的本质,最后都归结为:如何定义 query 和 candidate 的匹配分数。3.1 后半部分其实就是在定义一种特定的 ,也就是 late interaction 的打分方式。
现在看 Late Interaction 这段。论文说,对于一个 query 和一个 candidate ,它们的多向量表示分别记作:
是 embedding dimension,也就是每个向量的维度。比如 128、256、1024 之类。 是 query 侧有多少个向量。 是 candidate 侧有多少个向量。所以 不是一个向量,而是一张矩阵:里面有 行,每一行是一个 维向量。同理, 也有 个 维向量。
为什么作者这里用 而不是 ?因为在 dense retrieval 传统记号里,candidate 往往也叫 document,所以这里 其实就是 candidate side representation,把它理解成“候选项表示”就行,不必纠结符号。
第一步,固定 query 侧的第 个向量 。第二步,让它去和 candidate 侧所有向量 分别做点积相似度。第三步,从这些相似度里取一个最大的,也就是
然后,对 query 的所有向量都重复这个过程,最后把这些“每个 query 向量的最佳匹配分”全部加起来。这就是 late interaction 里非常经典的 MaxSim + Sum 结构。
从直觉上讲,它的含义是:“query 里的每一个局部语义单元,都去 candidate 里找最能对上它的局部证据;然后把这些局部证据的强度累加起来,作为整体相关性。”
第一,这个打分通常是非对称的。它是“对 query 里的每个向量求一个最佳匹配,再求和”。它没有反过来对 candidate 的每个向量也做同样事情。所以 一般不严格等于 。这意味着它更像一种“query coverage”打分:query 提出的每个局部需求,candidate 是否都能给出证据。在检索里很合理,因为通常是 query 驱动的。用户在 query 里表达了需求,系统要检查候选是否覆盖这些需求,而不是要求候选的每个局部都必须被 query 解释。
第二,为什么是 max,而不是 average 或 sum over all ?因为作者想要的是“最强证据”,不是“所有弱相关证据的堆积”。如果某个 query 向量已经在 candidate 中找到了一个非常匹配的局部,那么这个局部语义就算被满足了,再把其他低相似度的局部也加进去,反而可能引入噪声。
第三,为什么最后要对 求和?因为 query 往往不是单一约束,而是多个语义约束并列出现。对 求和,相当于要求多个 query 局部共同贡献得分。于是,一个候选若只满足 query 的某一部分条件,得分就不会太高;一个候选若能同时满足很多 query 局部条件,得分才会上去。
本文方法
作者不再直接拿所有 patch embeddings 或 token embeddings 去做检索,而是额外插入一小组可学习的特殊 token,让它们在经过整段上下文交互之后,自己长成一组“高浓度的信息摘要向量”,最后用这组摘要向量做 multi-vector retrieval。
传统 patch/token-level retrieval 的思路是:输入里有多少局部单元,我就尽量保留多少局部向量。文本是一堆 token,图像是一堆 patch。这样表达力强,但向量数量非常大。
METAEMBED 的思路是:不直接保留所有原始局部向量,而是让模型学习出少数几个“语义槽位”。这些槽位不是原始内容本身,而是额外插进去的 Meta Tokens。经过 Transformer 全局交互后,这些 Meta Tokens 的最终 hidden states 会吸收整个输入里的关键信息,于是它们就变成了一组紧凑但有表达力的表示,也就是 Meta Embeddings。
METAEMBED
说明底座是一个 Vision-Language Model,参数是 ,输入是文本 和图像 。其中: 是文本 token 序列; 是输入图像; 是 VLM 参数。
为什么作者要写成条件概率分布?因为底层用的是一个通用 VLM 表达形式。但在这篇论文里,重点不是“生成 y”,而是“利用这个 VLM 产出检索 embedding”。
他们给输入额外加可学习的 Meta Tokens:查询端有 ,候选端有
是每个向量的维度。 是 query 侧 Meta Tokens 的数量。 是 candidate 侧 Meta Tokens 的数量。
所以 不是一个 token,而是一组 query 专用的可学习 token embedding; 也是一组 candidate 专用的可学习 token embedding。
这个式子只是说:模型初始输入序列是把几类 token 沿序列维拼接起来。分号这里就是 concat,不是别的复杂操作。
:视觉 patch tokens,共 个;:文本 tokens,共 个;:query 侧 Meta Tokens;:candidate 侧 Meta Tokens。
然后 VLM 输出最后一层 hidden states:
也就是:整段输入过完整个 Transformer 以后,每个位置都有一个最后一层表示。
作者不取所有位置的 hidden states,而只取 Meta Tokens 所在位置的 hidden states,得到:
query-side embeddings
candidate-side embeddings
再做 L2 normalization。
最终用于检索的,不是原始 patch/token 的 hidden states;而是 Meta Tokens 在“读完整个输入之后”的最终表示。
这就是“compressed yet expressive”的来源。compressed:因为只保留 或 个向量,而不是保留所有原始 token/patch。expressive:因为这些向量是在全局 self-attention 后形成的 contextualized representation,能够吸收原始输入中的细粒度语义。
为什么说它仍然是 multi-vector retrieval。因为最终的 query 和 candidate 表示仍然不是单向量,而是:,
query 侧有 个向量,candidate 侧有 个向量。所以它仍然是多向量检索,只不过这些向量不再是所有原始 token/patch 的表示,而是少量 Meta Embeddings。
这就是为什么作者说它是 scalable late-interaction retrieval model。late interaction 的框架没变,变的是“多向量从哪里来”。
用 Meta Embeddings 做 late interaction
有了 和 以后,作者定义分数:
对 query 的每个 Meta Embedding,去 candidate 的所有 Meta Embeddings 中找最匹配的那个;把这些最好匹配分加起来,作为整体相关性。
索引大小是 ;打分成本是
如果数据库里有 个候选,每个候选要存 个 维向量,那索引体积当然就随 线性增长。 而一次 query-candidate 打分,要把 query 的 个向量和 candidate 的 个向量做大量比较,每次比较涉及 维点积,因此复杂度大致是 。
MMR
MMR 的全称是 Matryoshka Multi-Vector Retrieval。“Matryoshka” 就是套娃。核心思想是不要把这一组 Meta Embeddings 视为平级、必须一次性全用完的向量;而要把它们训练成一个前缀嵌套结构:前几个向量先表达粗粒度摘要,后面的向量逐步补充更细的信息。
作者定义了 组预算层级。对 query,有:
对 candidate,有:
意思是第 1 组只取很短的前缀;第 2 组取更长一点的前缀;一直到第 组取完整的全部 Meta Embeddings。
接着作者定义第 组的 query 表示:
candidate 也是类似:
也就是只拿前 个 query Meta Embeddings,以及前 个 candidate Meta Embeddings。这就是“prefix-nested structure”的具体数学形式。
作者对每个 group 再定义一个分数:
它意味着同一个模型,不只会用“完整的一组 embedding”来检索;它的每一个前缀版本都被定义成一个合法的检索器。所以 MMR 不是“测试时硬截断”,而是“训练时就要求前缀本身具备判别力”。
Training Objective
现在看 mini-batch 定义:
意思是一个 batch 里有 个 query。每个 query 有一个正样本候选 和一个额外的 hard negative 这里的 hard negative 是“很像但不对”的负样本,它比随机负样本更有训练价值。
然后作者定义第 组下,query 和 candidate 的相似度 logit:
这里 是 temperature。这个 temperature 的作用可以理解成调 softmax 的尖锐程度。 越小,分数差异会被放大,softmax 更尖; 越大,分布更平缓。
所以公式其实只是把检索分数转成对比学习里的 logits。
InfoNCE
对 query 来说:分子是它和自己正确候选 的相似度。分母里除了这个正样本,还包括两类负样本:
一类是 batch 里其他样本的候选 ,也就是 in-batch negatives;另一类是额外给它配的一个 hard negative 。
所以这一项 loss 想做的事情就是:让 query 和自己的正确候选分数尽可能高;让它和别人的候选、以及那个困难负样本的分数尽可能低。
因为这件事对每个组 都做一遍,所以每个前缀都被单独训练成一个可用的检索器。
最终总损失是:
这里 是 group-specific importance scale,也就是每组的权重。
这表示作者并不是只关心某一个预算,而是同时优化所有预算。 的作用就是决定你更强调哪几个预算层级。比如你可以更看重低预算可用性,也可以更看重大预算精度。

所以训练目标的整体逻辑是:每个前缀都独立对比学习;所有前缀一起训练;从而得到一个“任何预算都能用”的统一模型。
Test-time Scaling
由于表示是 prefix-nested 的,所以测试时你可以自由选择只用多少个向量。作者把这个选择叫 retrieval budget,也就是:
它表示 query 侧用前多少个 Meta Embeddings;candidate 侧存/用前多少个 Meta Embeddings。
在 indexing time,你可以只给每个 candidate 存前 个向量。这样索引更小。在 query time,你可以只生成或只拿 query 的前 个向量去打分。这样打分更快。如果预算宽松,就用更大的 group,效果更好;如果预算紧张,就用更小的 group,速度更快。
最关键的是不用重新训练。因为这些 group 在训练时已经并行优化过了,所以测试时只是“切换预算”,不是“切换模型”。

左边:同一个索引是嵌套的。你可以只取前缀,也可以取更长前缀。
中间:索引更大、打分向量更多时,延迟会增长。
右边:预算越大,精度越高。
实验
作者不是只在一个底座上试,而是放在不同类型的 VLM 上都试了,包括 Qwen2.5-VL、PaliGemma 和 Llama-3.2-Vision。这里想证明 METAEMBED 不是绑定某一个架构的技巧,而是一种较通用的训练 recipe。
训练数据主要用了 MMEB-train 和 ViDoRe-train,再加一个显式 hard negative。也就是说,作者想证明性能提升主要来自方法本身,而不是靠特别复杂的数据工程。
评测分成两块:一块是 MMEB,用 Precision@1,看的是整体多模态 embedding 能力;另一块是 ViDoRe v2,用 NDCG@5,看的是视觉文档检索能力。
结果
在 MMEB 上,METAEMBED 的核心结论很明确:它整体上明显强于同量级的强基线,而且模型越大,优势越明显。Qwen2.5-VL 初始化的 3B、7B、32B 版本分别做到 69.1、76.6、78.7。
这个趋势很关键。作者不只是说“我的方法比别人高一点”,而是在说:随着底座模型变大,METAEMBED 比传统单向量路线更能把大模型的能力吃出来。尤其 7B 和 32B 的提升比较显著,这也是论文比较强调的点。
在 ViDoRe v2 上,结论也很干脆:METAEMBED 不只是综合 benchmark 上强,在视觉文档检索这种更偏细粒度匹配的任务上也强。3B 版本平均 60.3,7B 版本 61.3,都超过了前面的单向量基线,也超过了 ColPali、ColQwen2 这类已有多向量方法。
作者特别强调它在多语言和生物医学子任务上表现不错,即使训练里没有专门加多语言数据。这说明它至少在一定程度上保留了底座模型原本的跨语言能力。
底座模型本身的短板会直接传到 METAEMBED 上。比如 Llama-3.2-Vision 初始化的 11B 版本,在 grounding 和 classification 上不差,但 VQA 掉得比较多,整体只有 65.1。
消融实验

第一,test-time scaling 真的成立。图 3 展示了不同 retrieval budget 下的性能曲线。无论是 3B、7B 还是 32B,只要你把预算从小的配置一路加到大的配置,性能都会稳定上升。也就是说,作者说的“检索预算是一个精度—成本旋钮”不是概念,而是真的能在实验里画出一条平滑上升曲线。
第二,MMR 很关键,不是可有可无。作者专门比较了“有 MMR”和“没有 MMR”的版本。结果是:如果没有 MMR,模型在低预算下掉点非常厉害。也就是说,普通多向量模型即使你测试时硬截成前缀,也不能自然获得好的低预算性能;必须在训练时就明确让这些前缀单独承担检索任务。这正好支持了作者的方法主张:test-time scaling 的能力不是免费得到的,而是 MMR 训练出来的。更有意思的是,即使在满预算下,有 MMR 的版本也没有吃亏,甚至还略好一点。这说明 MMR 并不是“为了低预算牺牲高预算”。

随着 retrieval budget 变大,索引大小会明显增加,理论 FLOPs 也会暴涨,但实际 scoring latency 在多数预算下增长没那么夸张,直到最大预算才明显上去。比如从最小预算到中等预算,延迟基本都在 1.6 到 1.9 ms 左右;到最大预算才升到 6.25 ms。但与此同时,索引内存从 0.68 GiB 一路涨到 42.72 GiB,MMEB 精度则从 71.3 升到 76.6。这个方法确实给了部署者一个现实可用的 trade-off,你可以按机器资源选择预算。
讨论
METAEMBED 在工程上并没有想象中那么重,而且真正的瓶颈通常不在 late interaction 打分,而在 query 编码。
作者先把一个在线检索流程拆成三步。第一步是 query encoding,也就是把输入的文本、图片编码成向量。第二步是 scoring,用 query 向量去和库里的候选向量打分。第三步是 ranking,把分数排个序。这么拆以后,作者想说明:虽然大家直觉上会担心 multi-vector 的打分太贵,但实际测下来,很多时候最花时间的反而不是打分,而是前面的编码。
他们的第一个观察是:retrieval budget 变大以后,理论 FLOPs 的确涨得很快,但在大多数预算下,实际打分延迟没有同步暴涨。意思就是,GPU 在这些中等预算下还能“吞得下”这些额外计算,所以 scoring 还没有真正成为瓶颈。只有到最大的预算,比如 ,打分延迟才明显上去。
第二个观察是在整个检索链路里,query encoding 远比 scoring 贵。作者举的例子是,一个 1024 token 的图像 query,编码本身就要 42.72 TFLOPs、788ms;而 Table 3 里多数 scoring 延迟只是毫秒级。这个数量级差距说明,如果你真要优化系统效率,优先级应该放在“怎么更快地把 query 编出来”,而不是只盯着后面的 MaxSim 打分。换句话说,这篇论文虽然在讲 scalable retrieval,但作者自己也很清楚:真正的大头常常是 encoder,不是 scorer。
第三个观察是内存问题。METAEMBED 的 index memory 会随着 retrieval budget 变大而线性增加,因为你要给每个 candidate 存更多向量。所以它不是没有代价,只是这个代价主要体现在索引体积上,而不是始终体现在在线延迟上。作者给出的解决思路也比较务实:要么选一个更平衡的 budget,不追求最大配置;要么在系统层面做 CPU offloading / swapping,也就是把一部分索引数据放到 CPU 内存里,按需搬运。
部分信息可能已经过时