多向量检索与 ColBERT
ColBERT 是一种使用 token 级多向量表示的检索模型。它分别编码查询与文档,为每个有效 token 保留上下文向量;查询时逐个寻找匹配,再通过 MaxSim 将局部匹配汇总为文档得分。文档向量可以离线建立索引,也可以用于对已有候选重排。
单向量 dense 检索把一个文档块编码成一个向量,再与查询向量比较。一段文字同时包含对象、时间和限制条件时,这种表示可能丢失部分局部匹配信息。ColBERT 保留 token 级表示,使查询的不同部分能够分别与文档中的相关位置匹配。
BM25 和 SPLADE 在词项空间中匹配,ColBERT 则使用带上下文的 token 向量。两个 token 即使字面不同,也可能取得较高的向量相似度。
token 表示与后期交互
ColBERT 分别编码问题和文档,保留它们的 token 级向量。每个向量在各自文本内部已经融合了上下文;问题与文档之间的匹配发生在编码之后,因此称为 late interaction,后期交互。
查询编码得到向量序列 Q = [q_1, ..., q_m],文档编码得到 D = [d_1, ..., d_n]。两侧向量维度相同,token 数量可以不同。文档向量可以提前计算并保存在索引中。
MaxSim 怎样评分
查询时,常见的 MaxSim 评分让每个查询 token 找到文档中最相似的 token,再把最佳匹配相加:
s(q, d) = sum_i [max_j (q_i · d_j)]
i 遍历有效查询 token,j 遍历有效文档 token这里使用归一化 token 向量的点积形式。实现还会处理特殊 token、掩码和长度限制,不能简单把所有分词结果无差别加入公式。
假设一个简化查询只有两个有效 token,其与某篇文档三个 token 的相似度矩阵为:
| 文档 token 1 | 文档 token 2 | 文档 token 3 | |
|---|---|---|---|
| 查询 token 1 | 0.9 | 0.2 | 0.1 |
| 查询 token 2 | 0.1 | 0.3 | 0.8 |
MaxSim 得分为 0.9 + 0.8 = 1.7。假如另一篇文档两行的最大值分别为 0.95 和 0.2,得分只有 1.15:它虽然对第一个 token 匹配更强,但缺少第二部分的匹配。
同一个文档 token 可以成为多个查询 token 的最佳匹配,公式没有一对一配对约束。局部相似度相加也不能直接证明文本蕴含答案;数字、否定、例外仍需要专门的评测。
多向量索引与候选检索
普通单向量检索的索引项通常对应一个 chunk 向量。ColBERT 的一个 chunk 对应一组 token 向量,检索实现需要处理 token 级候选、映射回文档,以及按 MaxSim 聚合和评分。它可以借助向量近邻索引缩小范围,但整条检索过程不能等同于“给每篇文档存一个向量,然后做一次 ANN”。
采用 token 近邻索引的实现,可以把检索分成以下过程:
- 离线编码文档块,保存各 token 向量及其所属的 chunk ID,建立用于近邻搜索的索引。
- 在线编码查询,分别为查询 token 查找相近的文档 token,将命中的 token 映射回 chunk,合并成候选集合。
- 读取候选 chunk 的 token 向量,计算或近似计算完整的 MaxSim 得分,再按分数返回文档块。
候选召回和最终 MaxSim 评分承担不同任务。前者限制需要评分的文档范围,后者比较候选与整个查询的匹配程度。如果某个相关 chunk 没进入候选集,后续评分无法把它补回来。索引版本也可能采用压缩向量和专门的剪枝策略,执行过程不必严格逐项遍历。
ColBERT 也可以只用于重排:先由 BM25 或单向量 dense 取候选,再对这些候选做 MaxSim 评分。这时不一定需要覆盖全库的 token 近邻索引,但仍需要取得候选文档的 token 表示,召回范围也受前一阶段限制。
数据库声称支持多向量,也需要确认其聚合运算、索引结构和模型格式是否匹配 ColBERT。把标题、摘要、假想问题各编码成一个向量,再映射回父文档,是另一种多向量设计,并不自动具有 token 级 MaxSim 行为。
相比单向量,token 级表示通常带来更多存储和查询计算。ColBERTv2 等工作研究了表示压缩,实际内存、延迟及质量仍取决于实现和数据。若单向量检索经常遗漏问题中的局部条件,可以在相同语料和问题上比较两者,检查召回收益是否足以抵消索引体积和计算开销。
多向量表示也受编码长度限制:被截断的内容没有对应 token 向量,无法参与后期交互。比较效果时,需要同时检查文档切块和截断方式,避免把输入内容不同造成的差异归因于评分方法。