怎么考「双塔和交叉编码器的区别?为什么不直接用 cross-encoder 检索全库?」
谁在问:有算法背景的面试官;是 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 完全不能用」的,都是绝对化;能给边界的才对。
危险信号
听到这些话,基本可以判定是背题而不是做过。
评分卡
- 说清两者的编码方式差异(独立编码 vs 联合编码)
- 落点在「能不能离线预计算」这个工程后果
- 能解释双塔精度差的根因(定长向量的信息瓶颈)
- 能推出「两阶段是成本约束下的必然」这个架构结论
- 加分:知道 ColBERT 式后期交互及其存储代价
- 加分:能讨论 LLM-as-reranker 的适用边界
- 加分:理解分层检索是规模的必然而非算力妥协
参考答案与考察意图面试中途别看这一段
考察意图
这题是 RAG 检索部分最能筛掉背题选手的一问。 很多人能背出「双塔快、交叉准」,但答不出「为什么快、为什么慢」。完整回答需要三层递进:机制差异 → 工程后果 → 架构结论。能走到第三层——说清「两阶段架构是成本约束下的必然」——的候选人是少数。
参考答案
60 分答案(及格线)
双塔(bi-encoder):query 和 document 各自独立过编码器,各得一个向量,再算余弦相似度。交叉编码器(cross-encoder):把 query 和 document 拼接后一起送进模型,让注意力在两者之间充分交互,直接输出一个相关性分数。
双塔快但精度有限,交叉编码器精度高但慢。所以工程上用双塔做第一阶段召回,用交叉编码器做第二阶段精排。
90 分答案(有生产经验的回答)
必须把「为什么」讲透,分三层:
第一层·机制差异:
双塔: query → [编码器] → 向量A ┐
├→ 余弦相似度
doc → [编码器] → 向量B ┘ (两者从未见过对方)
交叉: [query + doc] → [编码器 + 全交叉注意力] → 相关性分数
(逐 token 交互,无压缩无近似)第二层·工程后果(关键):双塔的 doc 向量可以离线预先算好存起来,查询时只需编码 query 一次,剩下的是纯向量检索,所以能在百万级语料上做到毫秒级。交叉编码器没法预计算——分数依赖 query-doc 这一「对」,query 来了才能算。要给 100 万文档打分,就得跑 100 万次模型推理。
第三层·架构结论:所以「为什么不全库用 cross-encoder」的答案不是「它慢」,而是它的计算量正比于候选数量且无法离线摊销。这决定了两阶段架构是成本约束下的必然选择:用便宜的双塔把范围从百万缩到一百,再用昂贵的交叉编码器在这一百里精挑。
精度差异的根因:双塔把每篇文档压缩成一个固定向量,压缩时丢掉的信息再也找不回来,它只能判断「这两段话大体像不像」;交叉编码器没有这个压缩瓶颈,能捕捉「问题里的『垫付』和文档里的『先行支付』是一回事」这类细粒度对应。
第三条路(加分):ColBERT 式后期交互——文档预先编码成一组 token 级向量(不压成单个向量),查询时做细粒度的 token 匹配。精度接近 cross-encoder,又保留了部分预计算能力;代价是存储开销大得多(每篇文档存一组向量而非一个)。它在大候选集场景下比纯 cross-encoder 更扛延迟。