Embedding 与 Reranker 模型训练
RAG 检索质量的天花板由 Embedding 和 Reranker 模型决定。「Embedding 模型是怎么训出来的?难负例是什么?Reranker 和 Embedding 有什么区别?」是 RAG 岗的进阶考点。本文讲清对比学习原理、难负例挖掘、多阶段训练范式(BGE/GTE/E5)、双塔 vs 交叉编码器、以及 MTEB 评测。使用侧见 Embedding 与向量数据库,切分检索见 切分与检索策略深挖。
面试先背这几句话
- Embedding 模型用对比学习训练:拉近正样本(query-相关doc)、推远负样本,核心是 InfoNCE 损失。
- 难负例(hard negatives) 是训练质量的关键:语义相近但不相关的样本,比随机负例信息量大得多。
- in-batch negatives(批内负例):把 batch 内其他样本当负例,免费扩大负例数,batch 越大效果越好。
- Embedding(双塔)vs Reranker(交叉编码器):双塔快、可预计算、用于召回;交叉编码器慢、精度高、用于精排。
- 主流开源模型 BGE / GTE / E5 / M3 走「预训练→大规模弱监督对比→高质量有监督+难负例」多阶段范式。
一、为什么需要专门的 Embedding 模型
通用 LLM 的隐藏层表示不直接适合检索——语义相似度任务和生成任务的目标不同。Embedding 模型专门优化「语义相近的文本,向量也相近」,让点积/余弦相似度能反映语义相关性,从而支撑向量检索(见 Embedding 与向量数据库)。
二、对比学习与 InfoNCE ★
Embedding 训练的核心是对比学习:给定一个 query $q$,一个正样本 $d^+$(相关文档),一批负样本 $d^-$,让模型学会把 $q$ 和 $d^+$ 的向量拉近、和 $d^-$ 推远。
标准损失是 InfoNCE(带温度的对比损失):
$$L = -\log \frac{\exp(\text{sim}(q, d^+)/\tau)}{\exp(\text{sim}(q,d^+)/\tau) + \sum_{d^-}\exp(\text{sim}(q,d^-)/\tau)}$$
- $\text{sim}$ 通常是余弦相似度,$\tau$ 是温度系数(控制分布尖锐程度,是重要超参)。
- 本质:一个「从一堆候选里挑出正样本」的分类问题。
- 负样本越多、越难,学到的表示区分度越好。
三、负例的三个层次 ★
负例质量直接决定 Embedding 上限:
| 类型 | 说明 | 效果 |
|---|---|---|
| 随机负例 | 随机抽的无关文档 | 太简单,模型很快学会,信息量低 |
| in-batch 负例 | 同 batch 内其他样本的正文档 | 免费、高效,大 batch 是关键(故 Embedding 训练爱用超大 batch) |
| 难负例(hard negative) | 语义相近但实际不相关 | 信息量最大,逼模型学细粒度区分,质量决定天花板 |
难负例挖掘(hard negative mining):用一个已有检索模型对 query 召回 Top-K,把「排名靠前但不是正确答案」的当难负例。要小心假负例(其实相关但没标注)——过难的负例反而带噪,常做阈值过滤或用 reranker 清洗。
四、双塔 vs 交叉编码器 ★
这是 RAG 检索架构的核心区分:
| 双塔(Bi-Encoder / Embedding) | 交叉编码器(Cross-Encoder / Reranker) | |
|---|---|---|
| 结构 | query 和 doc 分别编码成向量 | query 和 doc 拼在一起输入,输出相关性分数 |
| 交互 | 只有最后向量点积(浅) | 全程注意力交互(深) |
| 速度 | 快,doc 向量可离线预计算 | 慢,每个 query-doc 对都要过一次模型 |
| 精度 | 中 | 高 |
| 用途 | 召回(从百万文档选 Top-K) | 精排(对 Top-K 重排选 Top-N) |
RAG 的经典配方:双塔召回(快,从海量里粗筛)+ 交叉编码器精排(准,对少量精筛),兼顾速度与精度(见 RAG 生产化与系统设计)。
五、Reranker 的训练
Reranker(交叉编码器)同样用相关性数据训练,但形式不同:
- 输入:
[CLS] query [SEP] doc [SEP],输出一个相关性分数(回归或分类)。 - 损失:可用对比/排序损失(如 pairwise、listwise),让相关 doc 分数高于不相关。
- 难负例同样关键:Reranker 就是要在「双塔召回后仍难区分」的候选里做细判,训练时要喂足够难的负例。
六、开源模型的多阶段训练范式
以 BGE、GTE、E5 为代表,通常三阶段:
- 预训练:从通用语言模型(如 BERT/RetroMAE)初始化,或做检索导向的继续预训练。
- 大规模弱监督对比学习:用海量弱标注对(如网页标题-正文、问答对、CCPairs)做 in-batch 对比,学通用语义。
- 高质量有监督 + 难负例精调:用人工标注/高质量数据集 + 挖掘的难负例做精调,提升下游检索精度。
进阶特性:
- 指令感知(instruction-tuned):E5/BGE 支持给 query 加指令前缀(如「为这个问题检索相关段落:」),一个模型适配多任务。
- 多功能(BGE-M3):同时支持稠密检索、稀疏检索(词权重)、多向量(ColBERT 式),一模型多用。
- Matryoshka 表示:训练时让向量前 k 维也能单独用,支持按需截断降维、省存储。
七、评测:MTEB
MTEB(Massive Text Embedding Benchmark) 是 Embedding 模型的权威榜单,覆盖检索、聚类、分类、重排、语义相似度等多类任务。中文有 C-MTEB。选型时看 MTEB 的检索(Retrieval)子任务分数最相关,但也要注意:
- 榜单任务与你的业务领域可能不匹配,最终要在自己数据上评。
- 存在过拟合榜单的风险(和 LLM 刷榜同理)。
八、工程选型建议
- 别自己从头训:优先用 BGE/GTE/M3 等开源强模型,多数场景够用。
- 领域差距大再微调:法律/医疗/代码等专业领域,用领域数据 + 难负例微调 Embedding 收益明显。
- 召回+精排搭配:双塔召回 Top-50~100,交叉编码器 rerank 取 Top-3~5。
- 中文选中文优化模型:BGE-zh、GTE-zh 等,别用纯英文模型硬套。
- 在业务数据上评:用自己的 query-doc 对算召回率@K、MRR、nDCG,别只信 MTEB。
高频追问
- Embedding 模型怎么训练的? 对比学习:用 InfoNCE 损失拉近 query-正文档、推远负文档,让余弦相似度反映语义相关性。
- 难负例是什么,为什么重要? 语义相近但不相关的样本,信息量远大于随机负例,逼模型学细粒度区分,决定检索上限;要防假负例。
- in-batch negatives 是什么? 把 batch 内其他样本的正文档当作负例,免费扩大负例规模,所以 Embedding 训练偏爱超大 batch。
- Embedding 和 Reranker 有什么区别? 双塔分别编码、点积、快、用于召回;交叉编码器拼接全交互、慢但准、用于精排;RAG 里二者配合。
- 为什么 RAG 要「召回+精排」两段? 双塔从海量快速粗筛 Top-K,交叉编码器对 Top-K 精准重排,兼顾速度与精度。
- BGE-M3 的多功能指什么? 一个模型同时支持稠密、稀疏、多向量检索,适配不同检索需求。
- 怎么评估 Embedding 模型? 看 MTEB/C-MTEB(尤其检索子任务),但最终必须在自己业务数据上用召回率@K、MRR、nDCG 验证。
- 什么时候需要微调 Embedding? 领域术语/语义与通用差距大时(法律、医疗、代码),用领域数据+难负例微调收益显著。