双塔和交叉编码器的区别?为什么不直接用 cross-encoder 检索全库?

Q2-12检索模型架构常见bi-encodercross-encoderColBERT后期交互预计算

谁在问:有算法背景的面试官;是 Rerank 话题的深挖终点

口语化问法

  • bi-encoder 和 cross-encoder 有什么区别?
  • 既然 cross-encoder 更准,为什么检索阶段不用它?
  • 有没有介于两者之间的方案?

考察意图

这题是 RAG 检索部分最能筛掉背题选手的一问。 很多人能背出「双塔快、交叉准」,但答不出「为什么快、为什么慢」。完整回答需要三层递进:机制差异 → 工程后果 → 架构结论。能走到第三层——说清「两阶段架构是成本约束下的必然」——的候选人是少数。

参考答案

图 2 · 60 分与 90 分差在哪:代价、演进、怎么验证

60

60 分答案(及格线)

双塔(bi-encoder):query 和 document 各自独立过编码器,各得一个向量,再算余弦相似度。交叉编码器(cross-encoder):把 query 和 document 拼接后一起送进模型,让注意力在两者之间充分交互,直接输出一个相关性分数。

双塔快但精度有限,交叉编码器精度高但慢。所以工程上用双塔做第一阶段召回,用交叉编码器做第二阶段精排。

90

90 分答案(有生产经验的回答)

必须把「为什么」讲透,分三层:

第一层·机制差异

原文示意
双塔:  query → [编码器] → 向量A ┐
                                 ├→ 余弦相似度
        doc   → [编码器] → 向量B ┘     (两者从未见过对方)

交叉:  [query + doc] → [编码器 + 全交叉注意力] → 相关性分数
                                 (逐 token 交互,无压缩无近似)

第二层·工程后果(关键):双塔的 doc 向量可以离线预先算好存起来,查询时只需编码 query 一次,剩下的是纯向量检索,所以能在百万级语料上做到毫秒级。交叉编码器没法预计算——分数依赖 query-doc 这一「对」,query 来了才能算。要给 100 万文档打分,就得跑 100 万次模型推理。

第三层·架构结论:所以「为什么不全库用 cross-encoder」的答案不是「它慢」,而是它的计算量正比于候选数量且无法离线摊销。这决定了两阶段架构是成本约束下的必然选择:用便宜的双塔把范围从百万缩到一百,再用昂贵的交叉编码器在这一百里精挑。

精度差异的根因:双塔把每篇文档压缩成一个固定向量,压缩时丢掉的信息再也找不回来,它只能判断「这两段话大体像不像」;交叉编码器没有这个压缩瓶颈,能捕捉「问题里的『垫付』和文档里的『先行支付』是一回事」这类细粒度对应。

第三条路(加分)ColBERT 式后期交互——文档预先编码成一组 token 级向量(不压成单个向量),查询时做细粒度的 token 匹配。精度接近 cross-encoder,又保留了部分预计算能力;代价是存储开销大得多(每篇文档存一组向量而非一个)。它在大候选集场景下比纯 cross-encoder 更扛延迟。

追问链

图 1 · 五层追问树:面试官会往哪儿挖
从「压缩丢了什么」挖到「算力变快了,分层还要不要」

  1. 双塔精度差的根本原因是什么?

    期望信息瓶颈 —— 变长文本压成定长向量必然有损,且压缩时不知道未来会被什么 query 查,只能保留「通用语义」;交叉编码器是在已知 query 的前提下评估文档,信息利用率完全不同
    信号说到「压缩时不知道未来的 query」这层 → 理解很深
  2. cross-encoder 能不能预计算?提前算好所有 query-doc 对?

    期望理论上可以,但 query 空间是开放的(用户能问任何话)→ 组合爆炸,不可行;只有 query 集合封闭且很小时才有意义,比如固定 FAQ 匹配
    信号立刻指出「query 空间开放」→ 逻辑清晰;答「可以先算好」→ 没想清楚
  3. ColBERT 的存储开销大概是什么量级?值得吗?

    期望每篇文档存一组 token 级向量,存储可能是单向量方案的数十倍(取决于文档长度和是否降维/量化)。值不值看两条:候选集是否大到 cross-encoder 扛不住、存储成本能否接受 —— 多数中小规模场景直接两阶段更简单
    信号能说出「多数场景不值得」、把边界落在候选集规模上 → 有工程节制
  4. cross-encoder 变得非常快(小模型 + 硬件加速),架构会变吗?

    期望变的是分界点而不是分层本身 —— 第一阶段候选数可以放大(100→1000),但只要计算量正比于候选数、无法离线摊销,全库精排在百万级以上仍不可行;分层检索是数据规模的必然,不是算力的临时妥协
    信号答「那就不用双塔了」→ 没抓住本质;能分开「分界点变」与「分层不变」→ 第一性思考
  5. 直接用大模型给文档打分排序,不是比 cross-encoder 更准吗?

    期望不是「更准就用」,而是按代价排序:LLM 做 rerank 确实可行、精度可能更高(语义理解与推理更强)→ 但速度和成本明显劣于专用重排模型 → 所以只给质量优先、量不大的场景,如离线报告生成、高价值查询;在线对话场景通常不划算
    信号一口咬定「LLM 一定更好」或「LLM 完全不能用」→ 都是绝对化;能给出边界 → 才算答对
只会背「双塔快、交叉准」的,第 2 层和第 4 层都空:前者考「为什么不能预计算」这个工程后果,后者考「分层是规模的必然还是算力的妥协」。

评分要点

  1. 说清两者的编码方式差异(独立编码 vs 联合编码)
  2. 落点在「能不能离线预计算」这个工程后果
  3. 能解释双塔精度差的根因(定长向量的信息瓶颈)
  4. 能推出「两阶段是成本约束下的必然」这个架构结论
  5. 加分:知道 ColBERT 式后期交互及其存储代价
  6. 加分:能讨论 LLM-as-reranker 的适用边界
  7. 加分:理解分层检索是规模的必然而非算力妥协

常见错误

只答「双塔快、交叉准」,说不出快慢的机制原因——最典型的背题特征
说「cross-encoder 太慢所以不用」,但答不出「慢在无法预计算」这个具体原因。
把 bi-encoder 和 cross-encoder 说成模型大小的差别(其实是架构差别,同尺寸模型也有这个区别)。
完全不知道 ColBERT 这类中间形态。
认为 cross-encoder 可以取代 embedding 模型直接做检索。

关联学习