数据截至 (上游 commit 5cc889d47547)
04 · CrossEncoder 对照
这一章讲什么: 双塔之外的另一半——CrossEncoder 为什么更准、为什么也更慢,它的
predict/rank怎么用,训练它的损失族,以及它和双塔在真实检索系统里怎么分工。
1. 它要解决的小问题
双塔把 query 和 document 各自独立编码成一个向量,再算余弦——两个文本在向量相见之前从未「见过面 」。这带来一个精度天花板:模型无法捕捉词级别的细粒度交互(比如「not」出现在哪一边)。
CrossEncoder 的选择相反:把两个文本拼成一个序列,过一次完整的 transformer,让每一层的交叉注意力都参与,最后由分类头吐一个相关度分数。它回答「这两段文字有多相关」,而不是「各自是什么意思」。
代价写在性质里:
- 不能预计算:没有「文档向量」这种东西,分数必须逐对现算。
- 成本随对数线性:N 个候选文档就是 N 次前向,全库扫描不可行。
所以两者不是竞争关系,是流水线关系:
query ──► 双塔 SentenceTransformer ──► 向量近邻搜索 ──► top-100 候选
│
▼
CrossEncoder 逐对重打分 ──► 精排 top-10