想象你走进一家高档婚介所。红娘先按你的硬性条件——年龄、城市、学历——从几千份档案里快速筛出几十位候选人,这一步又快又糙,叫作“召回”。但档案写得再好,真人合不合得来,还得面对面聊过才知道。于是红娘安排你和每位候选人依次进入小面谈室深聊十几分钟,观察眼神、语气、接话的默契,最后给出一个“匹配分数”,这一步精细但昂贵,叫作“重排”。在 RAG(检索增强生成)系统里,Cross-Encoder 就是那位负责“面谈打分”的红娘:它把用户的问题(Query)和每篇候选文档(Document)同时放进同一个模型,让它们互相“对话”,再输出一个默契分。海选由 Bi-Encoder 这类“看简历”模型负责,面谈则由 Cross-Encoder 负责。本文将带你拆解 Cross-Encoder 的架构原理、联合编码的机制、与 Bi-Encoder 的取舍、为什么它注定只属于重排环节,以及如何选型和部署,让它成为你检索管线里的“金牌红娘”。

岗位关联

对 RAG 工程师而言,Cross-Encoder 是提升检索精度的最强杠杆:它用可控的延迟预算,把召回结果里“看似相关实则跑题”的文档剔出去,让大模型只读最对口的几篇,直接决定问答系统的体验上限。

目录
  1. 可视化演示
  2. 架构原理
  3. 联合编码机制
  4. Bi-Encoder对比
  5. 计算效率权衡
  6. RAG两阶段检索
  7. 模型选型考量
  8. 部署优化实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

交互对比Bi-Encoder独立编码与Cross-Encoder联合编码的架构差异,展示Cross-Encoder中Query与Document的全交互注意力机制及其在RAG重排中的优势。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Cross-Encoder vs Bi-Encoder Query tokens 与 Document tokens 联合编码 全交互注意力捕获深层语义 输出直接相关性得分 score = f([Q; D]) Cross-Encoder精度更高但延迟更大,适合RAG重排阶段

架构原理

婚介所真正值钱的不是档案室,而是那间小面谈室——一张圆桌、两把椅子、一杯柠檬水,两个人面对面坐下来聊。Cross-Encoder 的模型结构,就是 AI 界的“面谈室”:它不满足于分别阅读问题和文档,而是把两段文字“请进同一间屋”,首尾拼接成一个长序列,再让一个 Transformer 模型同时处理两边的内容。

具体来说,输入形如 [CLS] + Query 的每个词 + [SEP] + Document 的每个词 + [SEP]。[CLS] 是模型最开头的“观察笔记”,[SEP] 则是面谈桌上的柠檬水——它把两段文本清晰地隔开,告诉模型“左边是委托人的要求,右边是候选人的档案”,避免模型把两段话误读成一篇连贯的文章。

整场“面谈”下来,模型在每一层都同时看到了问题和文档的完整信息,最后把 [CLS] 这个“观察笔记”投影成一个分数——分数越高,代表这场面谈越有戏。这就是 Cross-Encoder 最朴素的原理:让两段文本共处一室,再给出一个综合判断。

Relevance(q,d)=CrossEncoderθ(CONCAT(q,[SEP],d))\text{Relevance}(q, d) = \text{CrossEncoder}_\theta\Big( \text{CONCAT}\big(q, [\text{SEP}], d\big) \Big)
公式含义:把问题 q 和文档 d 拼成一条序列,交给参数为 θ 的 Cross-Encoder 模型,输出一个相关性分数。分数越高,代表 q 与 d 越“聊得来”。
  1. CONCAT 拼接输入把问题文本与文档文本首尾相接,生成一条包含两段内容的输入序列,这是“同处一室”的第一步。
    CONCAT(q,[SEP],d)=[q1,q2,…,qm,[SEP],d1,d2,…,dn]\text{CONCAT}(q, [\text{SEP}], d) = [q_1, q_2, \ldots, q_m, [\text{SEP}], d_1, d_2, \ldots, d_n]
  2. [SEP] 分隔符它像面谈桌上的柠檬水,标记两段文本的边界,让模型知道左侧是 Query、右侧是 Document。
    [SEP]∈Rd(一个可学习的特殊向量)[\text{SEP}] \in \mathbb{R}^{d} \text{(一个可学习的特殊向量)}
  3. [CLS] 向量投影打分Transformer 编码完整个序列后,取出最前面的 [CLS] 向量,通过一个线性层映射成标量分数。
    Relevance=W⋅h[CLS]+b\text{Relevance} = W \cdot h_{[\text{CLS}]} + b

联合编码机制

面谈之所以比看简历准,是因为两个人说的话能即时被对方听见并回应。你说的“苹果”,对方接“公司”,这个联想只在对话中发生。Cross-Encoder 的“即时回应”依赖 Transformer 的核心——多头注意力机制。

当 Query 和 Document 拼成一个序列后,序列里的每一个词都可以“看向”其他所有词,包括对侧文本的词。这意味着 Query 的“苹果”能够 attend 到 Document 的“公司”,从而在深层表示里融合出“苹果公司”的语义。词与词之间的这种跨越式连接叫词级交互,它是联合编码真正“贵”也真正“准”的原因——两个独立编码的向量之间永远不会发生这种对话。

一句话总结:联合编码就是让两段文本的每个词都“互相听见”,再按亲疏加权汇总。注意力线越多越密,模型对微妙语义的把握就越强——这是面谈式打分的天赋所在。

Attention(Q,K,V)=softmax(QK⊤dk)V\text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^\top}{\sqrt{d_k}} \right) V
公式含义:Q(提问)、K(标签)、V(内容)三组向量共同完成“你问我答”:每个词先向所有词提问,再按匹配度加权汇总对方的内容。
  1. Q、K、V 三份角色每个词都同时扮演“提问者”(Q)、“被匹配者”(K)和“内容提供者”(V),就像面谈中每个人既会发问、也会被评价、还要表达自己。
    Q=XWQ,K=XWK,V=XWVQ = XW_Q,\quad K = XW_K,\quad V = XW_V
  2. 点积计算匹配度用 Q 与所有 K 做点积,得到“我和你到底有多默契”的原始分数,再除以 $\sqrt{d_k}$ 防止分数过大。
    scoreij=Qi⋅Kjdk\text{score}_{ij} = \frac{Q_i \cdot K_j}{\sqrt{d_k}}
  3. softmax 加权汇总把原始分数变成权重,对所有 V 做加权求和,得到融合了两段文本信息的深层表示。
    αij=exp⁡(scoreij)∑jexp⁡(scoreij),hi=∑jαijVj\alpha_{ij} = \frac{\exp(\text{score}_{ij})}{\sum_j \exp(\text{score}_{ij})},\quad h_i = \sum_j \alpha_{ij} V_j

Bi-Encoder对比

看简历 VS 面谈,两种相亲模式的本质差别,恰好对应 Bi-Encoder 和 Cross-Encoder 的差别。Bi-Encoder 像红娘快速翻阅两份简历:把问题和每份档案各自浓缩成一段“摘要”(向量),再比较两份摘要像不像。简历只有一页纸,细节注定丢失。

Bi-Encoder 用两个独立的编码器(双塔)把问题和文档压成向量,然后算余弦相似度。文档向量可以提前算好、存进索引,线上只需算问题向量,因此能扛住百万级海选。但问题里的“苹果”与文档里的“公司”不会直接对话——两份摘要各说各话,细微的语义关联被抹平。Cross-Encoder 则不做摘要,而是把两段原文一起读,直接输出匹配分。

看简历快而糙,面谈慢而精。Bi-Encoder 管海选,保证不漏;Cross-Encoder 管精挑,保证不错。两者不是替代关系,而是前后衔接的两道工序。

sim(q,d)=cos⁡(Eq(q),Ed(d))=Eq(q)⋅Ed(d)∥Eq(q)∥2⋅∥Ed(d)∥2\text{sim}(q, d) = \cos\big(E_q(q), E_d(d)\big) = \frac{E_q(q) \cdot E_d(d)}{\|E_q(q)\|_2 \cdot \|E_d(d)\|_2}
公式含义:双塔分别把 q 和 d 编码成向量,再计算两个向量的余弦相似度。值越接近 1 越相关,相当于“只看简历摘要像不像”。
  1. E_q 与 E_d 双塔编码两个独立编码器分别生成问题和文档的向量。向量是“简历摘要”,只保留大局,丢掉词级细节。
    Eq(q)∈Rd,Ed(d)∈RdE_q(q) \in \mathbb{R}^{d},\quad E_d(d) \in \mathbb{R}^{d}
  2. 点积与 L2 范数分子是两个向量的逐元素乘积之和,分母是两个向量的长度之积,把结果压缩到 [-1, 1] 区间。
    u⃗⋅v⃗=∑k=1dukvk,∥u⃗∥2=∑k=1duk2\vec{u} \cdot \vec{v} = \sum_{k=1}^{d} u_k v_k,\quad \|\vec{u}\|_2 = \sqrt{\sum_{k=1}^{d} u_k^2}
  3. 余弦值域与判断余弦值越接近 1 表示方向越一致,工程上常用阈值或排序来决定是否进入下一阶段。
    cos⁡(q,d)∈[−1,1],高相关趋近 1\cos(q, d) \in [-1, 1],\quad \text{高相关趋近 } 1

计算效率权衡

面谈很贵,贵到婚介所只能安排十几场而非上千场。Cross-Encoder 同样昂贵:它需要为每一对 (Query, Document) 完整跑一遍 Transformer,且文档向量无法离线缓存。预算是硬约束,决定了它的使用边界。

设 Query 长 m 个词,Document 长 n 个词,拼接后序列总长 $L = m + n$。多头注意力要让每个词与其他所有词两两配对,配对规模是 $L^2$ 量级。序列长度每翻一倍,计算量约翻四倍——这就是“联合编码拖慢一切”的数学根源。

实际工程中,单条打分的毫秒级耗时会随候选数线性累加:$T_{\text{重排}} = k \times t_{\text{单条}}$。所以重排必须发生在海选之后,只对几十到几百条候选“面谈”。用有限的预算换取最高的精度,正是重排环节存在的意义。

Computation=O((m+n)2⋅dk)\text{Computation} = O\Big( (m + n)^2 \cdot d_k \Big)
公式含义:Cross-Encoder 的计算量随拼接总长度的平方增长,再乘以每个配对的向量维度。候选一多,耗时立刻失控。
  1. 拼接总长度 L = m + nQuery 与 Document 串成一条序列,总长是两边相加;序列越长,后面所有计算的规模越大。
    L=m+nL = m + n
  2. 注意力配对 L²每个词都要与序列中所有词计算注意力分数,总配对数约等于总长度的平方。
    配对数=L×L=(m+n)2\text{配对数} = L \times L = (m + n)^2
  3. 点积维度 d_k每一对词的匹配都要做 d_k 维点积,所以整体计算量还要乘上 d_k。
    总开销=(m+n)2×dk\text{总开销} = (m + n)^2 \times d_k

RAG两阶段检索

把婚介所的完整流程画出来,就是 RAG 的两阶段检索管线:委托人提出要求 → 红娘拿着硬性条件海选 → 筛出 Top100 候选人 → 逐一安排面谈 → 最终推荐 Top3。每一步各司其职,缺一不可。

召回阶段用 Bi-Encoder 向量相似度从全库 D 里捞回 $K_1$ 条候选,速度快、覆盖面广;重排阶段用 Cross-Encoder 对 $K_1$ 条候选逐一精细打分,重新排序后取 $K_2$ 条送入大模型生成答案。这个“粗筛 + 精排”的组合,是 RAG 系统中最经典的工程范式。

没有海选,面谈名单可能漏掉真命天子;没有面谈,光看简历可能牵错手。两阶段的黄金搭档,让 RAG 既跑得快,又答得准。

Top-K2=Rerankθ(Retrieve(q,D,K1), K2)\text{Top-}K_2 = \text{Rerank}_\theta\Big( \text{Retrieve}(q, D, K_1),\ K_2 \Big)
公式含义:先用 Retrieve 从全库 D 取出 $K_1$ 条候选,再用 Rerank 模型重排后截取前 $K_2$ 条。召回保证不漏,重排保证准。
  1. Retrieve(q, D, K1) 召回用双塔向量相似度从全库中取回 $K_1$ 条候选,这一步在海量文档上执行,必须快。
    C1={d∈D:sim(q,d) 排名前 K1 的文档}C_1 = \{d \in D : \text{sim}(q, d) \text{ 排名前 } K_1 \text{ 的文档}\}
  2. Rerank_θ 重排把 $K_1$ 条候选逐一与 q 拼接,交给 Cross-Encoder 精细打分,再按分数降序重新排序。
    si=CrossEncoderθ(q,di),di∈C1s_i = \text{CrossEncoder}_\theta(q, d_i),\quad d_i \in C_1
  3. Top-K2 截取取分数最高的 $K_2$ 条(如 3-5 条)作为最终上下文,拼接进提示词交给大模型生成回答。
    C2=arg⁡max⁡d∈C1K2s(q,d)C_2 = \arg\max_{d \in C_1}^{K_2} s(q, d)

模型选型考量

婚介所有不同风格:有的主攻高端白领,有的深耕本地圈层。重排模型市场也一样:bge-reranker-base/large、Cohere Rerank、cross-encoder/ms-marco-MiniLM-L6-v2 等,各有脾性。选错了,就像请了一个不懂行话的红娘,话不投机半句多。

选型看三件事:领域匹配度、模型规模、推理成本。通用模型在电商术语上可能抓瞎,用行业语料微调过的模型才懂“圈内行话”;模型越大精度越高,但延迟和显存也水涨船高。这些模型大多用对比学习训练,目标是把相关文档的得分推高、不相关文档的得分压低。

挑重排模型就像挑婚介所:看它是否熟悉你所在圈子的潜台词。领域微调 + 规模适中 + 预算可控,三者平衡才是金牌红娘。

L=−log⁡es(q,d+)/τes(q,d+)/τ+es(q,d−)/τ\mathcal{L} = -\log \frac{e^{s(q, d^+) / \tau}}{e^{s(q, d^+) / \tau} + e^{s(q, d^-) / \tau}}
公式含义:训练时给每个问题配一个正例文档和一个负例文档,最小化这个损失会让正例分数尽量高、负例分数尽量低,从而教会模型“谁更合适”。
  1. 正例 d+ 与负例 d-训练数据由三元组构成:一个问题配一篇相关文档(正例)和一篇不相关文档(负例)。
    三元组=(q,d+,d−)\text{三元组} = (q, d^+, d^-)
  2. s(q, d) 相关分数Cross-Encoder 对问题-文档对输出一个标量分数,分数越高代表越相关。
    s(q,d)=CrossEncoderθ(q,d)s(q, d) = \text{CrossEncoder}_\theta(q, d)
  3. 温度 τ 与 softmax分数除以温度 τ 后做 softmax,再取负对数。最小化该式等价于让正例分数显著高于负例。
    P(d+)=es(q,d+)/τes(q,d+)/τ+es(q,d−)/τP(d^+) = \frac{e^{s(q,d^+)/\tau}}{e^{s(q,d^+)/\tau} + e^{s(q,d^-)/\tau}}

部署优化实践

面谈室有限,红娘靠排班和复盘把它经营得井井有条。重排服务上线后,真正的考验是“排班”——如何用有限的 GPU 把成百上千次面谈快速地做完。

答案之一是批处理:把多条候选打成一个 batch 送入 GPU,让硬件并行计算。批量推理的耗时近似取 batch 里最慢的一条,而不是逐条相加,吞吐量因此成倍提升。此外,高频问题的重排结果可以缓存复用,超长序列可以截断,模型可以量化压缩——这些“排班技巧”共同决定了服务的真实吞吐。

批处理是排班,缓存是提前备课,监控是复盘。把这些细节做扎实,你的重排服务才能像金牌婚介所一样,又准又稳。

T批≈max⁡i=1Bti ≪ T串=∑i=1BtiT_{\text{批}} \approx \max_{i=1}^{B} t_i \ \ll \ T_{\text{串}} = \sum_{i=1}^{B} t_i
公式含义:B 条样本打包推理的耗时约等于最慢一条的耗时,远小于逐条推理耗时之和。批越大,单条均摊成本越低。
  1. batch 大小 B一次打包 B 个 (q, d) 对进入 GPU,并行计算远比逐个处理高效。
    B={(q,d1),(q,d2),…,(q,dB)}\mathcal{B} = \{(q, d_1), (q, d_2), \ldots, (q, d_B)\}
  2. max 与 sum 的区别批推理约耗时最慢的一条而非逐条相加,因此吞吐提升接近线性。
    max⁡iti≪∑i=1Bti\max_i t_i \ll \sum_{i=1}^{B} t_i
  3. 配套监控指标上线后用 MRR、Recall@K 等指标持续观察重排带来的质量收益,及时发现问题。
    MRR@K=1∣Q∣∑q∈Q1rank(q)\text{MRR@}K = \frac{1}{|Q|} \sum_{q \in Q} \frac{1}{\text{rank}(q)}

AI 应用场景

企业智能客服工单助手

阶段:RAG 检索与重排阶段

解决的问题:传统客服助手靠关键词或向量召回返回 50 条候选,常把“退款流程”和“退货政策”混为一谈,答非所问。引入 Cross-Encoder 重排后,用户问“发票怎么开”时,真正讲开票步骤的文档被顶到第一位,答非所问的坏案例大幅减少。

具体案例:某电商客服系统改造后,用户问“订单取消后多久退款”,召回阶段返回 100 条候选,用 bge-reranker-base 重排取 Top3 送大模型,答案采纳率提升 22%,无效模型调用下降 30%。

电商商品搜索精排

阶段:搜索排序中的精排阶段

解决的问题:向量召回能快速找到 200 个相关商品,但“白色连衣裙”与“白色连衣裙礼服款”的细微差别,只有词级交互才能分辨。Cross-Encoder 对商品标题与属性做精细打分,把最贴合用户意图的商品排到最前。

具体案例:某电商平台在召回之后接入 Cross-Encoder 精排,搜索“夏季通勤衬衫”,原本排名第 9 的“冰丝免烫衬衫”被顶到第 1,点击率提升 15%,下单转化率提升 8%。

医疗文献检索助手

阶段:专业领域 RAG 的重排阶段

解决的问题:医学问答助手需要把最相关的临床指南排在最前,错误排序可能误导诊断。通用重排模型对医学术语不敏感,用中文医疗语料微调后的 Cross-Encoder 能准确区分“用药禁忌”和“不良反应”两类文档。

具体案例:某医疗科研助手用领域微调的 Cross-Encoder 对文献库候选重排,医生提出的“二甲双胍禁忌症”问题,Top1 命中正确指南的概率从 61% 提升到 87%,检索结果获得临床医生认可。

Python 演示

python42 行
# -*- coding: utf-8 -*-"""Cross-Encoder 重排模拟: 用词级交互近似联合编码打分"""import math  class CrossEncoderSim:    """模拟 Cross-Encoder: 同时看到问题与文档, 输出相关性分数"""     def __init__(self):        self.gc_count = 0  # 累计打分次数     def score(self, query, doc):        self.gc_count += 1        q_set = set(query.lower().split())        d_terms = doc.lower().split()        hit = sum(1 for t in d_terms if t in q_set)        overlap = hit / max(len(d_terms), 1) * 0.6        order = 0.0        for idx, term in enumerate(d_terms):            if term in q_set:                order += 1.0 / (idx + 1)        order = min(order / max(len(q_set) * 2, 1), 0.4)        return round(overlap + order, 4)  def rerank(query, docs, top_k=3):    model = CrossEncoderSim()    scored = [(model.score(query, doc), i, doc) for i, doc in enumerate(docs)]    scored.sort(key=lambda x: x[0], reverse=True)    return scored[:top_k]  if __name__ == "__main__":    query = "RAG 如何提升大模型回答准确性"    docs = [        "RAG 检索增强生成通过外部知识库提升回答准确性",        "反向传播是训练神经网络的核心算法",        "RAG 把检索到的文档拼进提示词供模型参考",        "卷积神经网络常用于图像分类任务",    ]    for score, idx, doc in rerank(query, docs, top_k=2):        print(f"候选#{idx + 1} 分数={score} 文本={doc}")
目的:用轻量脚本模拟 Cross-Encoder 的“词级交互”打分,演示 RAG 重排阶段如何把最相关的文档排到最前。
  1. hit = sum(1 for t in d_terms if t in q_set)统计文档里有多少词命中问题,模拟联合编码中两段文本“对上话”的强度。
  2. order += 1.0 / (idx + 1)命中词出现得越靠前权重越高,近似注意力机制对关键前置线索的强调。
  3. order = min(order / max(len(q_set) * 2, 1), 0.4)归一化并限制最大权重,防止长文档因词多而虚高。
  4. scored.sort(key=lambda x: x[0], reverse=True)按分数降序排序,对应重排模型输出新的候选次序。
  5. return scored[:top_k]只保留 TopK 结果送大模型,体现“面谈昂贵,只留最合适的几位”。

常见误区

误区既然 Cross-Encoder 精度碾压 Bi-Encoder,那我干脆把整个检索环节都换成 Cross-Encoder,从全库直接打分,效果一定最好?反正公司 GPU 多。

正解精度高是有代价的——联合编码无法离线缓存文档向量,每条候选都要实时算一遍。全库可能是百万到亿级文档,做一次全量打分的时间成本是 Bi-Encoder 召回的上千倍。正确姿势是“先海选再面谈”:Bi-Encoder 负责召回 Top100,Cross-Encoder 只对这 100 条精排。就像婚介所不可能让委托人和一千个候选人逐一深聊,面谈只给海选胜出者。

为何常见:初学者容易只看“精度更高”这一个指标,忽略了延迟与吞吐的硬约束,就像只看简历写得漂亮就以为不需要见面一样。

误区重排又准又细,我干脆去掉 Bi-Encoder 召回,把全部文档都丢给 Cross-Encoder 打分,一步到位不就行了?

正解计算开销不允许。Cross-Encoder 单条打分是毫秒级,全库百万条就是几十分钟到几小时,用户等不起。召回阶段负责“广撒网”保证不漏,重排负责“精挑细选”保证准,两者在管线中是互补的两级,缺了召回,重排连候选名单都没有;缺了重排,光看简历可能牵错手。

为何常见:把“Retrieve“和”Rerank”误当成同一种任务的两个名字,没意识到它们在管线中扮演着完全不同的角色与成本量级。

误区多送几条候选给 Cross-Encoder 总没坏处吧?我把召回返回的 1000 条全送进去,精度肯定更高,顶多多等一会儿。

正解候选过大会带来两个问题:一是延迟线性上涨(总耗时 = 候选数 × 单条耗时),二是噪声变多,弱相关文档可能干扰排序稳定性。工程上常见做法是候选控制在 50-200 条,精排后取 Top3-10 送生成,再往上收益急剧递减。就像面谈室排满 1000 场,红娘累垮了,判断力也跟着下降。

为何常见:只盯着“精度上限”而忽略延迟预算和收益递减曲线,不知道排序任务中“更多候选”并非线性带来更好的结果。

误区模型输出 0 或 1,直接告诉我文档相不相关,我拿这个标签做过滤就行了,不用管什么分数排序。

正解实际输出是连续的标量分数(常经过 sigmoid 或 softmax),重排关注的是分数的相对次序而非绝对含义。分数 0.6 和 0.7 的两条文档,谁排前面、谁进 TopK,才是决定答案质量的关键。把分类任务的二元直觉带进排序任务,会丢掉最有价值的排序信息。

为何常见:“相关/不相关”的直觉太强,掩盖了排序任务本质上是“比较谁更相关”的连续问题。

误区都是算相似度嘛,我把 Cross-Encoder 最后一层的向量拿出来存进索引,以后直接查表匹配不就行了?

正解两者的训练目标和语义空间完全不同。Bi-Encoder 的向量是独立编码的“简历摘要”,余弦相似度语义稳定;Cross-Encoder 的表示是联合编码的产物,脱离了对侧文本就没有稳定含义,拿它做向量检索效果很差。想兼得鱼与熊掌,得靠“双塔召回 + 单塔重排”的架构分工,而不是互相替换向量。

为何常见:“向量”这个词掩盖了两种模型内部交互方式的本质差异,让人误以为所有向量都可以进索引查表。

面试题

Q1. Cross-Encoder 在 RAG 重排中的核心输入方式是?

单选题 · easy

  • A.把 Query 和 Document 分开独立编码
  • B.将 Query 与 Document 拼接后统一编码← 正确答案
  • C.先编码 Query 再将结果与文档相加
  • D.用双塔分别生成向量再算余弦相似

答案:B。Cross-Encoder 的核心是把 Query 和 Document 拼成一条序列输入同一个模型,让两段文本共享注意力,就像面谈必须两个人同处一室。A、D 是 Bi-Encoder 的做法;C 的“相加”既不是双塔也不是拼接,是错误表述。

Q2. 与 Bi-Encoder 相比,Cross-Encoder 的主要优势在于?

单选题 · mid

  • A.推理速度比双塔模型明显更快
  • B.能捕捉词与词之间的深层交互← 正确答案
  • C.文档向量可以离线缓存复用
  • D.对部署硬件的配置要求更低

答案:B。Bi-Encoder 分别编码后再算余弦,像读两份简历;Cross-Encoder 让两边的词互相 attend,能捕捉“苹果”与“公司”这类跨文本的词级交互,精度更高。A、C、D 都是双塔模型的优势,恰好与 Cross-Encoder 相反。

Q3. 为什么 Cross-Encoder 通常只用于重排而非召回?

单选题 · hard

  • A.重排模型对算力开销十分敏感
  • B.联合编码计算庞大难以全量执行← 正确答案
  • C.召回阶段完全不需要任何模型
  • D.重排只需要处理个位数量候选

答案:B。联合编码的注意力复杂度随 (m+n)² 增长,且文档向量无法离线缓存,无法在全库海量文档上实时打分,所以只能重排小候选集。A 说反了——是计算量大导致延迟敏感;C、D 均为错误常识。

Q4. 在 RAG 两阶段检索中,重排阶段的核心作用是?

单选题 · easy

  • A.从海量文档里快速粗筛出候选
  • B.对召回结果精细排序提升准确率← 正确答案
  • C.直接替代大语言模型生成答案
  • D.负责构建文档库的向量索引

答案:B。两阶段检索中,召回负责“海选”出 Top100,重排用 Cross-Encoder 对候选精细排序,把真正相关的文档顶到最前再送大模型。A、D 是召回阶段职责;C 明显错误,生成是 LLM 的活。

Q5. Query 长度 10、文档长度 100 时,Cross-Encoder 的注意力计算规模约为?

单选题 · hard

  • A.与 Query 长度无关只受文档制约
  • B.随两者总长的平方级规模增长← 正确答案
  • C.随 Query 与文档长度线性增加
  • D.复杂度恒为常数不随长度变化

答案:B。Cross-Encoder 把两段文本拼接后做自注意力,每个词都要与其他所有词配对,配对规模是总长度 110 的平方量级,即 O((m+n)²)。A、C、D 都低估了词级交互的配对规模。

Q6. 召回返回 200 条候选,重排预算限制为 20 条,最优做法是?

单选题 · mid

  • A.两百条全部送入重排模型打分
  • B.先粗排选二十条再精排提质← 正确答案
  • C.只让重排处理第一条候选结果
  • D.候选数量越多重排效果越好

答案:B。工程上不会让重排处理全部召回结果,而是先截断到预算内再精排,平衡精度与延迟。A 延迟不可接受;C 丢失大量信息;D 忽略了收益递减和噪声干扰。

Q7. 对 100 个候选重排,单条推理 10ms 且无并行,总耗时约为?

单选题 · extreme

  • A.大约 10 毫秒即可全部完成
  • B.约 1000 毫秒呈线性累加← 正确答案
  • C.约 10 秒与候选数完全无关
  • D.约 0.1 毫秒属常数级开销

答案:B。无并行时,重排总耗时 = 候选数 × 单条耗时 = 100 × 10ms = 1000ms,线性累加。这正是 Cross-Encoder 只能处理小候选集的直接原因,也说明批处理等并行手段对部署至关重要。

Q8. Cross-Encoder 相比 Bi-Encoder 的劣势包括哪些?

多选题 · mid

  • A.无法离线缓存文档向量← 正确答案
  • B.推理延迟比双塔模型更高← 正确答案
  • C.检索精度一定显著更低
  • D.文档表示无法彼此独立← 正确答案

答案:ABD。联合编码使文档表示依赖对侧 Query,无法离线缓存(A)、延迟高(B)、各候选不能独立计算(D)。C 错误——Cross-Encoder 精度更高而非更低,就像面谈比看简历更了解一个人。

Q9. 选择 RAG 重排模型时,应优先考虑哪些因素?

多选题 · hard

  • A.领域语料的数据匹配程度← 正确答案
  • B.模型规模与推理延迟← 正确答案
  • C.支持向量维度可配置
  • D.是否做过领域数据微调← 正确答案

答案:ABD。选重排模型要看领域匹配(A)、规模与延迟(B)、是否微调(D),就像挑婚介所要看它懂不懂你的圈子。C“向量维度可配置”是 Bi-Encoder 建索引的考量,与重排无关。

Q10. 以下哪些场景适合使用 Cross-Encoder?

多选题 · easy

  • A.RAG 检索结果的精细重排← 正确答案
  • B.两段文本的细粒度相关打分← 正确答案
  • C.召回阶段的向量索引构建
  • D.问答系统的候选答案精排← 正确答案

答案:ABD。Cross-Encoder 适合对少量文本对做精细打分:RAG 精排(A)、细粒度相关打分(B)、问答候选排序(D)。C 的向量索引构建是召回阶段 Bi-Encoder 的职责,属于“海选”环节。