RAG 检索增强[ragembedding]速答 · 约 6 分钟更新 2026-09-28

Embedding 模型是怎么训练出来的?对比学习在做什么?

一句话结论

Embedding 训练的核心是对比学习,通过 InfoNCE 损失函数拉近正样本、推远负样本,现代做法高度依赖 In-batch 负例与 BM25 挖掘的难负例来构建训练信号。

先这样答

现代 Embedding 模型的训练通常包含预训练与对比学习微调阶段。对比学习的目标是拉近锚点与正例的距离,推远负例。检索场景中这套机制主要通过 InfoNCE 损失函数实现,它将一个正例与多个负例的对齐过程转化为带有温度系数的 softmax 交叉熵分类任务。

训练效果的关键在于负样本构建。主流做法是引入 In-batch 负例,将同一个 batch 内的其他样本直接视作当前锚点的负例。这种机制的负例数量随 batch 规模同步增长,易于大规模扩展。此外模型还需要难负例来提升区分边界,即与锚点标签不同但嵌入非常接近的样本。

在实践中,DPR 利用 BM25 检索出排名靠前但不含答案的段落作为难负例。配合 In-batch 负例训练后,DPR 在 top-20 段落检索准确率上绝对提升了 9% 到 19%。中文领域的 BGE 模型则采用了大规模配对数据对比学习,结合 RetroMAE 预训练提升表征质量。

在推理阶段,E5 等模型要求给查询侧增加 "query: " 前缀,给文档侧增加 "passage: " 前缀,以区分不同的文本角色。目前评估模型的事实标准是 MTEB 榜单,它覆盖 8 类 Embedding 任务、58 个数据集和 112 种语言,是选型的重要参考。

面试官会怎么追问

  • 「InfoNCE 里的温度系数起什么作用?」 它作用在 logits 上控制分布尖锐度。温度过小会让梯度集中在最难负例上,导致训练不稳定;过大则分布平滑,模型对所有负例一视同仁失去轻重。
  • 「In-batch negatives 有什么坑?怎么解决?」 坑是假负例,即 batch 内撞上了语义相同的样本,误伤训练;同时存在 batch 内分布偏差。通常可以通过数据去重、调整采样策略或采用更大的 batch 规模缓解。
  • 「难负例怎么挖?挖太狠会怎样?」 用当前模型或 BM25 检索出的高分错误结果构建,挖得太狠会引入假负例与标注噪声。工程实践中通常采用难易混合的策略。

回答的坑

认为 MTEB 分数高的模型在业务检索效果一定好,正确方向是认识到 MTEB 为多任务平均分,实际选型需关注领域分布重合度,上线前必须自建业务评测集。 忽视模型推理时的前缀指令要求,正确方向是遵循官方规范,在非对称检索中添加 "query: " 或 "passage: " 前缀,避免模型掉分。

—— 本题完 ——