Late-interaction 重排序(ColBERT 及更多)

架构 · 约 9 分钟阅读 ·

并非每个检索栈都需要 cross-encoder reranker。Late-interaction 模型(如 ColBERT)在保持嵌入可缓存的同时做 token 级交互打分 —— 往往比 bi-encoder 更合适,大规模下也比完整 cross-encoder 更省。

Late-interaction 是什么

bi-encoder 独立嵌入查询与文档 —— 快,但没有 token 级匹配。cross-encoder 将 query + 文档送入同一 transformer,输出单一相关性分数 —— 准,但每对都要完整推理。

Late-interaction 介于二者之间:离线预计算文档 token 嵌入,查询时用廉价交互(通常是 MaxSim —— 每个 query token 取最大余弦)在 query 与文档 token 间打分。比单向量点积更细,又不必对每对跑完整 cross-encoder。

Cross-encoder vs late-interaction vs bi-encoder

架构预计算文档?查询时成本典型用途
Bi-encoder是(每 doc 1 向量)极低百万级第一阶段召回
Late-interaction(ColBERT)是(每 doc 多 token 向量)低–中第一或 1.5 阶段;偏词面精度
Cross-encoder reranker否每对成本高50–100 候选上的第二阶段

许多 2026 栈会串联:bi-encoder 或混合召回 → 可选对数百条做 ColBERT 重打分 → 对数十条 cross-encoder rerank。合并步骤见 混合检索 + 重排序。

何时跳过 cross-encoder rerank

短名单小(≤100)且排序质量影响下游 LLM prompt 时,cross-encoder rerank 很值得。以下情况可考虑不加:

经验法则:Recall@50 低则先修检索 —— 没有 rerank 架构能变出缺失的 chunk。

ColBERTv2 实战

# pip install -U "sentence-transformers>=6"
# Rescore first-stage candidates with ColBERTv2's token-level MaxSim,
# keep the top 50 for an optional cross-encoder pass
from sentence_transformers import MultiVectorEncoder

colbert = MultiVectorEncoder("colbert-ir/colbertv2.0")

query = "reset API key"
candidates = [...]  # e.g. the top 200 from BM25 or a bi-encoder

q = colbert.encode_query([query])        # queries and documents are encoded
d = colbert.encode_document(candidates)  # differently: use both methods
scores = colbert.similarity(q, d)[0]     # one MaxSim score per candidate
top50 = [candidates[i] for i in scores.argsort(descending=True)[:50].tolist()]
# Pass top50 to bge-reranker or Cohere for final ordering

从 6.0 版(2026 年 8 月)起,sentence-transformers 可以通过 MultiVectorEncoder 直接加载 ColBERT 类模型 —— 包括 colbert-ir/colbertv2.0 这样的 Stanford ColBERT 检查点、PyLate 模型和 ColPali 类视觉检索模型(发布说明)。我们在 2026 年 10 月用 sentence-transformers 6.1.0 实际跑过上面这段代码。像这样只对第一阶段返回的候选重新打分,完全不需要建索引;如果要直接用 ColBERT 检索整个语料库,就得建 PLAID 这类压缩索引(LightOn 的 fast-plaid),发布说明里有介绍。

ColBERT 在关键词密集语料(客服 KB、法律条款、SKU)上表现好,bi-encoder 易模糊精确 token。它不会在我们的浏览器 Demo 里跑 —— 推理路径不同 —— 但应列入你的 架构对比 清单。

如何选择架构

Millions of docs, tight latency?
  → bi-encoder (+ BM25 hybrid if lexical matters)

Recall OK but order noisy, 100–1000 candidates?
  → late-interaction (ColBERT) OR widen cross-encoder input

Top 50–100 need LLM-grade precision?
  → cross-encoder rerank (bge, Cohere, Jina, mxbai…)

Task-specific instructions in the query?
  → instruction-following hosted rerank (Contextual AI, etc.)

Unsure?
  → 30 labelled queries + NDCG@5 before/after each stage

新兴开源 cross-encoder 如 Qwen3-Reranker 在多语言栈上与 bge 竞争;需要规模与精度兼得时可与 late-interaction 组合。

在浏览器里看 cross-encoder rerank

Demo 展示第二阶段 cross-encoder 打分 —— 与 bi-encoder 代理列对比,看 late-interaction 或混合检索需补什么。

打开 Demo →

继续阅读