ColBERT 在做什么
ColBERT 类模型为查询和文档的每个 token 各生成一个向量,打分时对每个查询 token 取它与文档全部 token 的最大相似度,再把这些最大值求和(MaxSim)。它介于双塔模型(快但粗)与交叉编码器(准但慢)之间:细粒度匹配能力接近交叉编码,同时文档向量可以离线预计算,支持全库检索。代价是索引体积按 token 数放大。
基本信息
| 打分方式 | MaxSim:查询每 token 取与文档全部 token 的相似度极值后求和 |
|---|---|
| 存储特征 | 每个 token 一个向量,索引体积显著大于单向量方案 |
| 代表工作 | ColBERT 与后续的改进版本,以及支持多向量的检索库 |
| 架构位置 | 介于双塔检索与交叉编码重排之间 |
典型使用场景
- 细粒度问答:答案藏在长段落里的某一句,需要词级匹配能力
- 专业语料检索:术语、缩写密集,单向量容易被相似但不相干的段落干扰
- 替代重排链路:不想再维护一套交叉编码器时,用后期交互一步完成召回与排序
- 多语言混合语料:token 级匹配对跨语言术语有一定容忍度
- 高价值小语料:愿意用更大索引体积换取精度,且总量可控
MaxSim 打分概念
MaxSim 打分概念
score(q, d) = Σ_i max_j ( E_qi · E_dj )
# q、d 各自保留 token 级向量,进入多向量索引
# 查询每个 token 与文档全部 token 取极值匹配(MaxSim)再求和
# 存储:每 token 一个向量,索引体积大于单向量方案
# 因此规模预估时要按平均 token 数放大存储预算
三类模型对比
| 类型 | 匹配精度 | 成本特征 |
|---|---|---|
| 双塔单向量 | 较高 | 索引最小,检索最快 |
| 后期交互多向量 | 更高 | 索引体积按 token 数放大 |
| 交叉编码器 | 最高 | 必须逐对打分,无法做全库检索 |
| 常见分工 | — | 双塔召回加重排,或后期交互一步到位 |
多向量索引的存储与检索复杂度高于单向量:规模预估时按平均 token 数放大预算,否则上线后索引体积会远超预期。
后期交互不能被当成纯重排器使用:把它接在单向量召回之后、只对少量候选打分,就放弃了它全库检索的能力,收益也就打了折扣。