Ch13 RAG修订于 二〇二六年七月六日
概念-ColBERT
一句话理解
ColBERT(Contextualized Late Interaction over BERT)是一种延迟交互检索模型,它的核心思想是:不对 query 和 document 各自压缩成单个向量,而是保留每个 token 的独立向量表示,在检索的最后阶段进行细粒度的 token 级交互,从而以接近 Cross-Encoder 的精度实现接近 Bi-Encoder 的速度。
核心创新:Late Interaction
传统检索模型的两极
检索模型存在一个经典的速度-精度权衡:
| 模型类型 | 原理 | 速度 | 精度 |
|---|---|---|---|
| Bi-Encoder | Query 和 Doc 各自编码成单向量,点积算分 | 极快(可预计算 Doc 向量) | 较低(丢失细粒度信息) |
| Cross-Encoder | Query 和 Doc 拼接后同时编码 | 极慢(每次查询需重新编码所有 Doc) | 最高 |
| ColBERT | 多向量 + 延迟交互 | 快(预计算 Doc 多向量) | 接近 Cross-Encoder |
ColBERT 的解决方案
ColBERT 的核心创新在于保留 token 级别的向量表示:
Bi-Encoder 的做法:
Query: "什么是深度学习" → [CLS] 向量 → 一个 [1, d] 向量
Doc: "深度学习是..." → [CLS] 向量 → 一个 [1, d] 向量
→ 两个向量点积 → 相似度分数
ColBERT 的做法:
Query: "什么是深度学习" → [q1, q2, q3, ..., q_Nq] → Nq 个 [1, d] 向量
Doc: "深度学习是..." → [d1, d2, d3, ..., d_Nd] → Nd 个 [1, d] 向量
→ 每个 query token 找最相似的 doc token → sum of max → 相似度分数
Late Interaction 公式
ColBERT 的评分函数定义为:
S(q, d) = Σ_{i=1}^{Nq} max_{j=1}^{Nd} E_q(q_i) · E_d(d_j)^T
对于每个 query token 向量 q_i,找到所有 doc token 向量中与它最相似的那个(max),然后对所有 query token 的这些最大相似度求和(sum)。
这种 “先分别编码,后交互匹配” 的策略就是 “Late Interaction”(延迟交互)的含义。
为什么比 Bi-Encoder 好
Bi-Encoder 把整个文档”压缩”成一个向量,丢失了大量信息:
- “猫追老鼠” 和 “老鼠追猫” 可能被编码成相似的向量(词袋模型问题)
- 长文档的信息被平均化,细节丢失
ColBERT 保留了每个 token 的表示,在匹配阶段能捕捉到细粒度的语义对应关系。
为什么比 Cross-Encoder 快
Cross-Encoder 需要将 query 和每个候选 doc 拼接后送入模型,无法预计算。如果有 100 万个文档,就需要进行 100 万次完整推理。
ColBERT 可以预计算并存储所有文档的 token 向量(离线完成),检索时只需要:
- 编码 query(一次推理,~10ms)
- 计算 Late Interaction(纯矩阵运算,GPU 加速,~1ms 每 1000 个文档)
ColBERT vs Bi-Encoder vs Cross-Encoder 对比
| 维度 | Bi-Encoder | ColBERT | Cross-Encoder |
|---|---|---|---|
| 编码方式 | Query/Doc 各自压缩为单向量 | Query/Doc 各自保留所有 token 向量 | Query+Doc 拼接后共同编码 |
| Doc 向量预计算 | 可以 | 可以(存储多向量) | 不可以 |
| 存储开销 | 低(1 x d 维/文档) | 高(N x d 维/文档,~100x) | 无需存储 |
| 检索速度 | 极快 | 快 | 极慢 |
| 检索精度 | 较低 | 高(接近 CE) | 最高 |
| 交互粒度 | 文档级 | Token 级 | Token 级 |
| 适合阶段 | 粗筛(召回) | 精筛(召回/重排序) | 精排(重排序) |
| 典型模型 | BGE, E5, GTE | ColBERTv2, ColBERT-V3 | BGE-Reranker, Cohere Rerank |
| 2026年趋势 | 主流召回方案 | 高精度召回优选方案 | 主流重排序方案 |
ColBERTv2:2026 年的实用版本
ColBERTv2 是 ColBERT 的改进版本,主要优化:
- 去噪训练:使用更难的反例(hard negatives),提升区分能力
- 残差压缩:将 token 向量压缩到更小的存储空间
- 查询增强:训练时对 query 做数据增强,提升泛化
2026 年,ColBERTv2 已被广泛用于需要高精度检索的场景:
- 学术文献检索
- 法律文档检索
- 多语言检索
- 代码搜索
2026 年:高精度检索的优选方案
2026 年,ColBERT 在检索领域的定位是:
- 精度优先场景:当 Bi-Encoder 精度不够,但又不能承受 Cross-Encoder 的全量检索成本时,ColBERT 是最佳平衡点
- 多向量检索的标杆:ColBERT 是 Late Interaction 范式的代表,后续的 SPLADE、PLAID 等模型都受其影响
- RAG 检索增强:在需要高精度检索的 RAG 系统中,ColBERT 作为召回模型或一级重排序模型
- 存储成本下降:随着 SSD 成本下降,存储多向量不再是瓶颈
技术细节
编码过程
Query 编码:
Input: "什么是深度学习?"
→ BERT 编码
→ 归一化每个 token 的输出向量
→ 输出: [q_1, q_2, ..., q_n] (每个 token 一个 d 维向量)
→ 用 [Q] 标记 token 的输出作为后续使用的标识
Document 编码:
Input: "深度学习是机器学习的一个分支..."
→ BERT 编码
→ 归一化每个 token 的输出向量
→ 过滤标点符号的 token
→ 输出: [d_1, d_2, ..., d_m] (每个 token 一个 d 维向量)
检索流程
离线阶段(索引):
1. 对所有文档进行 ColBERT 编码
2. 存储每个文档的多向量表示
3. 构建向量索引(通常用 PLAID 引擎加速)
在线阶段(检索):
1. 对 query 进行 ColBERT 编码
2. 粗筛:用 token 向量做近似最近邻,召回候选文档
3. 精筛:对候选文档做完整的 Late Interaction 计算
4. 排序返回 Top-K 结果
适用场景
最适合的场景
- 高精度语义检索:需要精确匹配语义,而非简单关键词匹配
- 长文档检索:文档较长,Bi-Encoder 的信息压缩损失大
- 多语言检索:token 级匹配能更好地处理跨语言对应
- 学术/法律检索:需要高精度,文档量可控
- RAG 精筛阶段:在粗筛后对候选文档做精细排序
不太适合的场景
- 超大规模索引(1B+ 文档):存储开销大,Bi-Encoder 更经济
- 实时性要求极高:Late Interaction 仍有计算开销
- 短文本匹配:文档很短时,Bi-Encoder 和 ColBERT 差距不大
相关笔记
- 深挖-重排序 — 重排序技术详解
- 稠密检索(深挖) — 稠密检索技术详解
- 概念-CrossEncoder — 精度最高的检索模型
- 第13章 · RAG 进化树 — RAG 技术知识体系
- Bi-Encoder (双塔模型/双编码器) — 双塔检索模型
来源
- ColBERT 论文 (SIGIR 2020): https://arxiv.org/abs/2004.12832
- ColBERTv2 论文: https://arxiv.org/abs/2112.01488
- ColBERT GitHub: https://github.com/stanford-futuredata/ColBERT
- PLAID 引擎 (ColBERT 加速): https://arxiv.org/abs/2205.09707
- Stanford ColBERT 项目页: https://cs.stanford.edu/~karlin/colbert/