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

Q2-12检索模型架构常见

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

开场怎么问

bi-encoder 和 cross-encoder 有什么区别?

换个问法

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

五层追问链

左边照着问,右边对着听。最后一层是压力面,不必每个候选人都问到。

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

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

cross-encoder 能不能也做预计算?比如提前算好所有 query-doc 对?

期望
理论上可以,但 query 空间是开放的(用户能问任何话),组合爆炸,不可行。只有在 query 集合封闭且很小的场景(如固定 FAQ 匹配)才有意义。
信号
能立刻指出「query 空间开放」的,逻辑清晰;答「可以先算好」的没想清楚。

ColBERT 的存储开销大概是什么量级?值得吗?

期望
每篇文档存一组 token 级向量,存储可能是单向量方案的数十倍(取决于文档长度和是否降维/量化)。是否值得取决于:候选集规模是否大到 cross-encoder 扛不住、存储成本是否可接受。多数中小规模场景直接两阶段更简单。
信号
能说出「多数场景不值得」的,有工程节制。

如果 cross-encoder 变得非常快(比如小模型 + 硬件加速),架构会变吗?

期望
变的是分界点而不是分层本身——第一阶段的候选数可以放大(100→1000),但只要计算量正比于候选数、无法离线摊销,全库精排在百万级以上仍不可行。分层检索是数据规模的必然,不是算力的临时妥协。
信号
这题答得好非常能体现第一性思考;答「那就不用双塔了」的没抓住本质。

那你们直接用大模型给文档打分排序,不是比 cross-encoder 更准吗?

期望
LLM 做 rerank 确实可行,精度可能更高(它有更强的语义理解和推理能力),但速度和成本明显劣于专用重排模型,适合质量优先、量不大的场景(如离线报告生成、高价值查询)。在线对话场景通常不划算。要能给出「什么时候值得用 LLM 重排」的边界。
信号
一口咬定「LLM 一定更好」或「LLM 完全不能用」的,都是绝对化;能给边界的才对。

危险信号

听到这些话,基本可以判定是背题而不是做过。

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

评分卡

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

考察意图

这题是 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 更扛延迟。

攒够了去组卷页一键生成可打印的面试题单