一句话定义
多向量表示不再把整段文本压成 1 个向量,而是每个 token 一个向量;检索打分用 late interaction——查询每个 token 与文档全部 token 向量做最大相似度再求和(MaxSim)——以"存储 ×100"的代价换回词元级的匹配精度,是稠密单向量与 cross-encoder 精排之间的第三条路线。
为什么重要
单向量是"把 512 个 token 蒸馏成一个点",细节必然有损(kp-002);cross-encoder 精排准确但每个候选都要跑一遍完整模型、无法预计算。ColBERT(SIGIR 2020)证明"文档侧可预计算 + 交互推迟到打分"能同时逼近两者:在 BEIR 类基准上显著超单向量,成本远低于 cross-encoder。多模态文档检索(ColPali 类:页面截图直接作为 token 序列)进一步把它推向文档理解场景——这是"要不要在引擎里支持多向量"选型的决策背景。
前置知识
kp-016(混合检索与精排的分层——late interaction 在管线中的位置)、kp-002(嵌入的有损性——多向量存在的理由)。
核心概念
- token 级向量:文档 D 有 m 个 token → m 个 d 维向量(如 m≈128~512、d=128 的投影后维度)。
- MaxSim:查询第 i 个 token 的得分 = 它与文档所有 token 向量的最大内积;总分 = Σ MaxSim。
- late interaction(后期交互):编码与交互解耦——文档向量离线算好存起来,交互只发生在查询时的打分函数里;对比 cross-encoder 的"early interaction"(编码时就把两段拼一起)。
- PLAID 压缩:ColBERTv2 的工程化——token 向量聚类到质心,存"质心 id + 低比特残差",存储降一个量级。
- 近似打分管线:先用质心/低维摘要粗筛候选文档,再对少量候选做精确 MaxSim。
原理与机制
MaxSim 打分公式:
score(Q, D) = Σ_{i=1..|Q|} max_{j=1..|D|} ⟨E_qi, E_dj⟩
E_qi: 查询第 i 个 token 的向量; E_dj: 文档第 j 个 token 的向量
直觉: 查询的每个词都要在文档里"找到最好的对应物", 找不到(最大值低)就扣分为什么它有效:单向量把交互压缩进"一个内积",MaxSim 把交互保留在"词元对齐"层面——专有名词、数字、否定词这些单向量容易被平均掉的信号得以保留(与 kp-015 稀疏检索的互补逻辑同源,但这里是稠密通道内部的保真)。
成本结构(决策的关键账):
| 维度 | 单向量 | 多向量(ColBERT/PLAID) | cross-encoder |
|---|---|---|---|
| 文档侧存储 | 1×d | m×d(PLAID 后约降 6~10×,仍远高于单向量) | 无(实时算) |
| 查询延迟 | 毫秒级 ANN | 粗筛+精排,数十毫秒级 | 每候选一次模型前向,秒级 |
| 质量 | 基线 | 接近 rerank | 最高 |
| 索引支持 | 全部 | 少数(Vespa、Qdrant multivector 等) | 无索引 |
定位:多向量适合第二阶段精排(对粗排 top-100 做打分)或高价值小集合的一级检索;把 m×d 全量当一级 ANN 用,存储与延迟账(kp-026 口径)通常不成立。
公式或模型
见 MaxSim 式;存储账:存储 ≈ N × m × d' × bytes(d' 为投影后维度,PLAID 残差再折减),N=100 万、m=128、d'=128、fp16 ≈ 3.2 GB,比单向量(0.25 GB)高约 13 倍——能接受与否取决于业务价值密度。
图示
查询: [如何][退款][发票] 文档: [发票][丢失][报销][流程][…]
│每个token找文档侧最像的token
score = max⟨如何,·⟩ + max⟨退款,·⟩ + max⟨发票,·⟩
= ⟨如何,流程⟩+⟨退款,报销⟩+⟨发票,发票⟩ ← 词元级对齐, "发票"精确命中实例或案例
法律条文检索(条款编号与否定词敏感):单向量路线把"不包括"这类否定信号平均掉,误召回明显;ColBERT 式精排把"不得""除外"等 token 的匹配单独计入,badcase 率显著下降。工程形态:Qdrant 0.10+ 原生 multivector、Vespa 的 per-token tensor 打分;两级管线——单向量 ANN 取 top-200 → MaxSim 精排取 top-10——在延迟与质量间取得实用平衡。
直观类比
单向量检索像"凭对整本书的整体印象找书";ColBERT 像"拿着逐字索引卡到书里逐词核对"——每个查询词都必须在书里找到最好的落点。贵在书页要逐词建档(m×d 存储),准在核对是词级的。
常见误区
- "多向量可以无脑替代单向量"——存储与延迟账(本篇表格)在大多数大规模场景不成立;它的主流位置是精排段或小而贵的集合。
- "ColBERT 是另一种 BM25"——同为词元级,但 ColBERT 的匹配是稠密语义空间内的对齐(同义词仍可高分),BM25 是字面精确记账;两者互补而非替代。
- "引擎随便选,多向量都能跑"——多向量对索引与打分有专门要求(multi-vector 支持、tensor 打分);选型时这是 kp-027 决策树之外的独立能力项,需专项确认。
- "m 越大越准"——token 数由切块决定,长文档切多段各算一套多向量比无限拉长交互窗口更可控;MaxSim 对噪声 token 也敏感,质量依赖切块与清洗。
自测题
- MaxSim 中"max"与"Σ"各表达什么直觉?
- 为什么说 ColBERT 是单向量与 cross-encoder 之间的中间路线?
- m=256、d'=128、fp16,100 万条文档多向量存储多大?
答:max 表达"查询的每个词只需在文档中找到最佳对应"(词元对齐),Σ 表达"所有查询词的对齐质量累加,缺席的词会拉低总分"。
答:文档侧像单向量一样可预计算索引(成本低);交互像 cross-encoder 一样做词元级打分(质量高)——把"编码"与"交互"解耦各取所长。
答:1e6 × 256 × 128 × 2B ≈ 65.5 GB(PLAID 压缩后可降数倍);对照单向量同口径约 0.5 GB——存储是它作为一级检索的主要障碍。
与其他知识点的关系
kp-015/016 是"词法互补"的另一实现路径(外挂稀疏腿 vs 表示层保真);kp-026 是存储账的算法;kp-033 的 MUVERA 代表"多向量降维成单向量可检索形态"的最新尝试。
延伸阅读
Khattab & Zaharia, "ColBERT…"(SIGIR 2020)与 Santhanam et al., "ColBERTv2"(2021)——late interaction 的原始设计与 PLAID 压缩,多向量路线的两篇奠基文献。