当前的主流模型(如 BGE、E5、Cohere 等)主要基于 Transformer Encoder(编码器) 架构,尽管近期也有利用 Decoder-only(如基于 Mistral/Llama 微调)的趋势,但基于 Encoder 的双塔与交叉架构依然是最经典、使用最广泛的范式。


一、 Embedding 模型:双塔架构 (Bi-Encoder)

Embedding 模型的核心任务是将文本映射为高维稠密向量。为了保证检索速度,它采用的是双塔架构——Query 和 Document 各自独立通过模型,中途没有任何信息交互。

1. 核心网络组件 (Transformer Encoder)

输入文本经过词嵌入(Token Embedding)和位置编码(Positional Encoding)后,会堆叠多个 Transformer Encoder Block。每个 Block 内部包含:

  • 多头自注意力层 (Multi-Head Self-Attention, MHSA): 让句子内部的词语相互“关注”,理解上下文语义。
  • 残差连接与层归一化 (Add & Norm): 解决深层网络梯度消失问题,稳定训练。
  • 前向反馈网络 (Feed-Forward Network, FFN): 引入非线性变换,增强模型的表达能力。

2. 端到端工作流程与公式

  1. 独立输入: Query (qqq) 和 Document (ddd) 分别独立输入模型。格式通常为 [CLS] 文本内容 [SEP]

  2. 自注意力计算: 在单个塔内部,Token 之间计算注意力权重。公式如下:

    Attention(Q,K,V)=softmax(QKTdk)V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)VAttention(Q,K,V)=softmax(dk QKT)V

  3. 池化 (Pooling): 经过多层 Encoder 后,提取句子的全局特征。通常取输出层 [CLS] token 的隐藏状态向量,或者对所有 token 的输出做 Mean Pooling(平均池化),得到最终的特征向量 v\mathbf{v}v

    什么是[CLS] ?
    [CLS] 是 Classification(分类) 的缩写。它是一个特殊的、人为添加的 Token(词元),在模型的词表中占有一个固定的位置。与 “苹果”、“编程” 这种有实际语义的 token 不同,[CLS] 本身没有任何内在的词义。一般在 encoder-only 模型中加在输入的第一位,可以结合encoder-only 双向注意力的特性来收集整个输入的信息。

    为什么需要加这个[CLS]?
    核心目的是为了获取整个序列的“全局表示”(Global Representation),从而方便做句子级别的任务。

    • 吸收全局上下文: BERT 的核心是双向自注意力机制(Bidirectional Self-Attention)。在模型的前向传播过程中,每一个 token 都会和其他所有的 token 发生交互。因为 [CLS] 本身是“白纸一张”(没有具体的语义偏置),经过多层 Transformer 结构的反复交互后,处于序列起始位置的 [CLS] 会非常均匀地吸收并融合其后整个句子的语义信息。
    • 统一输出接口: 当你处理像情感分析、意图识别、或者判断两个句子是否相似这类“句子级”任务时,你需要把整段文本压缩成一个固定维度的向量。如果没有 [CLS],你可能需要对所有的输出 token 做平均池化(Mean Pooling)或最大池化(Max Pooling)来得到句向量。而有了 [CLS],由于它的设计初衷就是为了表征全句,你只需要简单粗暴地把输出层第一个位置(即 [CLS] 的位置)的隐藏层状态抽出来,后面接一个简单的线性分类器(Linear Layer)就可以直接得到结果了。
  4. 向量相似度: 在检索阶段,通过计算 Query 向量 v_q\mathbf{v}\_qv_q 和 Document 向量 v_d\mathbf{v}\_dv_d 的余弦相似度来衡量匹配度:

    S(q,d)=vq⋅vd∥vq∥∥vd∥ S(q, d) = \frac{\mathbf{v}_q \cdot \mathbf{v}_d}{\|\mathbf{v}_q\|\|\mathbf{v}_d\|}S(q,d)=vq∥∥vdvqvd


二、 Rerank 模型:交叉架构 (Cross-Encoder)

Rerank 模型的核心任务是对 Embedding 粗筛出来的少量候选文档进行精准打分。为了追求极致的语义匹配精度,它采用的是交叉架构

1. 核心网络组件

Rerank 同样基于 Transformer Encoder(组件与 Embedding 完全相同:MHSA、Add & Norm、FFN)。

核心区别在于输入方式: 它是单塔结构,在最底层的输入端就将 Query 和 Document 拼接在了一起。

2. 端到端工作流程与公式

  1. 拼接输入: Query 和 Document 被拼接成一个长序列输入。格式通常为 [CLS] Query [SEP] Document [SEP]

  2. 深度交叉注意力 (Deep Cross-Attention): 因为 Q 和 D 处于同一个序列中,在每一层 Transformer 的自注意力计算时,Query 的每一个词都会与 Document 的每一个词发生注意力交互。这种“词对词”的直接碰撞能够精准捕捉字面差异、指代关系和逻辑矛盾。

  3. 分类/打分层: 提取顶层的 [CLS] 向量 h[CLS]\mathbf{h}_{\text{[CLS]}}h[CLS](此时该向量已经融合了 Q 和 D 深度比对后的特征)。将其接入一个线性分类器,并通过 Sigmoid 函数将其映射为 0 到 1 之间的相关性概率得分 sss

    s=11+e−(Wh[CLS]+b) s = \frac{1}{1 + e^{-(\mathbf{W}\mathbf{h}_{\text{[CLS]}} + b)}}s=1+e(Wh[CLS]+b)1


三、 两者的配合经验与选型策略

结论:它们在工程上是完全解耦的,可以(且强烈建议)自由选型、组合使用。

由于双塔模型(Embedding)可以预先计算文档向量并存入向量数据库实现毫秒级检索,但缺乏深度语义交互;而交叉模型(Rerank)精度极高,但每次查询都需要实时计算,性能开销极大。因此,业界标准的 RAG 架构采用了 “漏斗式组合” (Retrieve-then-Rerank)

黄金配合经验:

  • 异构模型组合: 你完全可以使用 OpenAI 的 text-embedding-3 做广度召回,搭配 BAAI 的 bge-reranker-v2 做精排。这种“商业闭源召回 + 开源本地精排”的组合在成本和效果上往往表现极佳。
  • 控制精排截断数量 (Top-K): Embedding 通常从百万级库中召回 Top-50 到 Top-100 的文档片段。切忌将成百上千个文档送给 Rerank,否则会因为 Transformer O(N2)O(N^2)O(N2) 的复杂度导致接口严重超时。Rerank 打分后,只需保留 Top-3 或 Top-5 喂给最终的大语言模型。
  • 多路召回的“裁判员”: Rerank 模型极其适合作为多路召回(例如 BM25 关键词召回 + Embedding 向量召回)的最终裁判。无论前端召回链路多么复杂,汇总去重后统一交由 Rerank 进行统一尺度的重打分,能显著提升最终 RAG 的回答质量。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐