一句话定义:交叉编码器(Cross-Encoder)是一种把「查询」和「候选文档」拼成一段文本、一起送进模型、直接输出相关度分数的模型结构。
它怎么工作
假设你在做一个知识库搜索,用户问「报销多久能到账」,候选文档是「差旅费报销流程说明」。
双编码器(AI 词典:Bi-Encoder">Bi-Encoder)的做法是:问题和文档各走各的,分别压成一个向量,再算两个向量的余弦相似度。好处是文档向量可以提前算好存进向量库,搜索时只算问题的向量,快。
交叉编码器的做法完全不同,它把两段文本拼成一句:
```
[CLS] 报销多久能到账 [SEP] 差旅费报销流程说明…… [SEP]
```
整段丢进 Transformer,让「报销」这个词和文档里的「报销」「到账」「T+7 个工作日」在每一层注意力里直接互相看见。最后模型输出一个分数,比如 0.87,表示这段文档和这个问题有多相关。
打个比方:双编码器像两个人各自写一份自我介绍,然后你比对两份简历像不像;交叉编码器像把两个人拉到同一张桌子上当面聊,谁跟谁合适,一眼就看出来了。显然当面聊更准,但你不可能让一个人跟一万个人都当面聊一遍。
关键取舍
| 维度 | 双编码器 Bi-Encoder | 交叉编码器 Cross-Encoder |
|---|---|---|
| 输入形式 | 查询、文档分别编码 | 查询+文档拼接后一起编码 |
| 能否预计算 | 能,文档向量可离线存好 | 不能,每对组合都要现算 |
| 一次能评多少 | 百万级向量里做近似检索 | 通常几十到几百条候选 |
| 精度 | 较低,两段文本从未交互 | 明显更高 |
| 典型角色 | 召回(Recall) | 重排(Rerank) |
所以工程上常见的组合是两阶段:先用向量检索或 BM25 这类便宜方法,从百万文档里粗筛出 50~100 条候选;再用交叉编码器对这几十条逐一打分,重新排序后取前几条交给大模型生成答案。第一阶段的活儿是「别漏」,第二阶段的活儿是「排准」。
和相邻概念的区别
- 和双编码器的区别如上,核心是「有没有让查询和文档在模型内部交互」。
- 和「重排模型(Reranker)」不是并列关系:交叉编码器是实现重排最常见的一种结构,重排是它扮演的角色。也有用大模型直接打分做重排的做法。
- 和「相似度打分」不同:交叉编码器输出的是任务相关的相关度,不是对称的语义相似度。它需要针对具体任务训练过,不能指望拿一个通用模型直接当万能裁判。
对从业者的实际意义
1. 如果你的 RAG 系统「检索出来的东西明明在里面,就是排不到前面」,加一层交叉编码器往往是性价比最高的一步改动,通常比换更大的向量模型见效更直接。
2. 成本要算清楚:延迟大致随候选数量线性增长。候选从 100 降到 50,延迟减半,精度可能只掉一点点,这个旋钮值得调。
3. 中文场景下优先选在你所在领域数据上微调过的版本;通用预训练权重直接拿来用,效果常常不如预期。
具体模型选型、显存占用、吞吐数据随版本和硬件变化很大,实际以官方页面和你的压测结果为准。
一句话记住:交叉编码器是「精算师」——算得准,但一次只能算一笔账,所以它站在检索流水线的最后一段,而不是第一段。
