ColBERT
ColBERT 将查询和文档编码为逐 token 的 BERT 嵌入,并通过后期交互(MaxSim)进行评分,实现快速、准确的搜索和 RAG。
ColBERT(基于 BERT 的上下文化后期交互)是一种神经检索模型,它将查询和每篇文档分别表示为每个token一个嵌入,并通过后期交互为文档打分:每个查询 token 找到与之最相似的文档 token,然后将这些最大相似度(称为 MaxSim)相加,得到相关性分数。斯坦福大学的 Omar Khattab 和 Matei Zaharia 在 SIGIR 2020 论文 ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT 中介绍了该模型。文档 token 嵌入只需离线计算一次,因此查询时只需进行简单的相似度计算,而不必对每篇候选文档都完整运行一次 BERT。
后期交互的适用场景#
神经检索器的区别在于查询和文档何时进行交互。双编码器将每段文本压缩为一个向量,这是向量搜索的标准设置:文档向量预先计算好,搜索速度快,但单个向量会模糊各个词项之间的差异。交叉编码器将查询和文档一起输入Transformer,让注意力比较每一对 token。它们精度最高,但每个查询-文档对都必须运行一次,因此只适用于对较短的候选列表进行重排序。
ColBERT 像双编码器一样分别编码查询和文档,但会为每个 token 保留一个 128 维向量,并且只在最后的 MaxSim 步骤中让两侧交互。查询会用 BERT 的掩码 token 填充到固定的 32 个 token,这为模型提供了额外位置,用于扩展查询中的相关词项。在 MS MARCO 和 TREC CAR 段落搜索基准测试中,ColBERT 的表现可与基于 BERT 的排序器相媲美,同时运行速度快两个数量级,每次查询使用的 FLOPs 少四个数量级。
计算 MaxSim 分数#
MaxSim 算子只需几行 PyTorch 代码。下面的示例将其应用于一个小型 BERT 系列编码器生成的上下文 token 嵌入:
import torch.nn.functional as F
from sentence_transformers import SentenceTransformer
encoder = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
query = "who wrote the novel Dune"
docs = [
"Frank Herbert published the science fiction novel Dune in 1965.",
"A dune is a hill of sand shaped by the wind.",
]
# One L2-normalized contextual embedding per query token
q = F.normalize(encoder.encode(query, output_value="token_embeddings"), dim=-1)
for doc in docs:
d = F.normalize(encoder.encode(doc, output_value="token_embeddings"), dim=-1)
# MaxSim: each query token keeps its best-matching document token, and the maxima are summed
score = (q @ d.T).max(dim=1).values.sum()
print(f"{score.item():.2f} {doc}")小说段落的得分为 5.90,沙丘段落的得分为 4.33。两段都包含“dune”,因此该词在两段中都能获得较高匹配分数;但在第一段中,查询 token“wrote”与“published”的余弦相似度为 0.72,而“novel”则与自身匹配;在第二段中,“wrote”所能找到的最佳匹配只有 0.29。
ColBERT 与相关术语的区别#
- BERT 本身:ColBERT 为检索任务微调的预训练编码器,并添加一个将每个 token 投影到 128 维的线性层。
- 后期分块:同样会先在上下文中编码文本再进行拆分,然后将 token 平均为每个块的一个向量;而 ColBERT 会保留每个 token 向量。
- 语义搜索:ColBERT 执行的任务,即按段落含义而非共享关键词对段落排序。
- 混合搜索:合并关键词搜索结果和单向量搜索结果,同时实现精确词项匹配和语义匹配。ColBERT 的 token 级匹配则在单个神经模型中实现了部分精确匹配能力。
图像中的后期交互#
后期交互也适用于图像。ColPali(2024)使用视觉语言模型将每页文档截图嵌入为 patch 向量网格,再用 MaxSim 对查询 token 进行匹配,从而将后期交互引入基于 PDF 的多模态 RAG。开放词汇检测出于类似原因保留了细粒度图像特征:Ultralytics YOLOE 会为每个提示类别(例如“双层巴士”)存储一个文本嵌入,并将其与特征图每个位置上的区域特征进行比较,因此简短提示就能匹配一个小物体,而不是使用一个概括整幅图像的单一向量。
ColBERTv2 和 PLAID#
为每个 token 存储一个向量,会让 ColBERT 索引的大小约为单向量索引的十倍;当 ColBERT 在检索增强生成(RAG)流程中充当第一阶段检索器或重排序器时,这一开销尤为重要。斯坦福 ColBERT 代码库实现了两种解决方案。PLAID 是一种搜索引擎,会先根据聚类质心为候选项打分,再运行完整的 MaxSim。ColBERTv2(NAACL 2022)将每个 token 向量存为最近质心的 ID,并将残差量化为每维 1 或 2 位;它还通过交叉编码器蒸馏得到去噪监督信号进行训练,其残差压缩将后期交互的存储占用减少了 6 到 10 倍。










