想象你是一家拥有十万册藏书的图书馆馆长。今天来了一位知识渊博的新管理员——他读过海量书籍,词汇量惊人,任何句子他都能听懂(这就是预训练 Embedding 模型)。但他有个毛病:只会按自己的常识摆书。他把“苹果”放在水果区,可你们图书馆的“苹果”是那家著名的科技公司;他完全不懂本馆“家电-温控”类目下藏着空调说明书。读者来问“那本讲凉快的书”,他一脸茫然。 于是你决定给管理员做“在职特训”。你发现有两套行之有效的训练法:第一套叫对比学习,让管理员反复练习“把同主题的书放近、把无关的书放远”,练到形成肌肉记忆,代表方法是 BGE-Finetune;第二套叫指令微调,不改动作习惯,而是先给管理员一张“任务说明书”——“这次按读者年龄分”“这次按学科分”,让它学会按指令调整摆放逻辑,代表方法是 LLM-Embedder。两套方法殊途同归:都是为了让“书与书之间的位置关系”真实反映读者的需求。 这篇文章就跟随这位管理员的成长,把 Embedding 模型微调这件事讲透。

岗位关联

对 AI 从业者:掌握对比学习与指令微调两条 Embedding 微调路线,能直接提升检索、问答、推荐场景的召回质量,是构建语义搜索与 RAG 系统的核心技能。

目录
  1. 可视化演示
  2. 嵌入向量基础:从文字到坐标
  3. 微调必要性:为什么通用模型不够用
  4. 对比学习原理:把同类放近,异类放远
  5. BGE-Finetune:对比学习的标准实践
  6. LLM-Embedder:听指令的嵌入模型
  7. 评测与选型:用分数说话
  8. 工程实践:从实验室到图书馆
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示对比学习InfoNCE损失机制、难负样本挖掘流程、MTEB基准评估效果三种模式,点击按钮切换。

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

对比学习InfoNCE损失 锚点与正样本拉近,与负样本推远 温度系数τ调节分布锐度 L=-log(exp(sim(a,p)/τ)/Σexp(a,n_i/τ)) 最大化正样本相似度比值

嵌入向量基础:从文字到坐标

新管理员上岗第一周,馆长让他给每本书做“特征档案卡”。卡片上不写字,而是一串数字坐标——内容越像的书,坐标越接近。这便是嵌入模型的雏形。

在技术世界里,这段“数字坐标”就叫向量。一个句子经过 Embedding 模型 \(f\) 的编码,会变成一个 \(d\) 维向量 \(\mathbf{v} = f(s)\)。所有句子都被映射进同一个“语义空间”:语义相近的句子,它们的向量彼此靠近;语义无关的句子,则相隔很远。就像图书馆里内容相关的书被摆在相邻书架。

如何度量“近”?最常用的方法是余弦相似度。它只看两个向量之间的夹角,不关心向量的长短,因此对句子长度、词频都不敏感,非常适合比较句子语义:

书架上书本的位置关系,就像是余弦距离的化身。新管理员心里已经有了一套“夹角越小,内容越近”的默认规则。但这套规则来自他的通用经验,还没经过本馆特色的校准——这正是下一节要解决的问题。

sim(a,b)=cos⁡(θ)=a⋅b∥a∥⋅∥b∥=∑i=1daibi∑i=1dai2⋅∑i=1dbi2\text{sim}(\mathbf{a}, \mathbf{b}) = \cos(\theta) = \displaystyle \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \cdot \|\mathbf{b}\|} = \frac{\sum_{i=1}^{d} a_i b_i}{\sqrt{\sum_{i=1}^{d} a_i^2} \cdot \sqrt{\sum_{i=1}^{d} b_i^2}}
  1. 点积把两个向量逐位相乘再相加,衡量它们同方向的程度。
    a⋅b=∑i=1daibi\mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^{d} a_i b_i
  2. 模长向量的长度,等于各分量平方和再开根号。
    ∥a∥=∑i=1dai2\|\mathbf{a}\| = \sqrt{\sum_{i=1}^{d} a_i^2}
  3. 归一化夹角点积除以两个模长,得到夹角余弦值,范围在 \(-1\) 到 \(1\) 之间。
    cos⁡(θ)=a⋅b∥a∥⋅∥b∥\cos(\theta) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \cdot \|\mathbf{b}\|}

微调必要性:为什么通用模型不够用

这天,一位读者进馆就问:“我要那本讲凉快的书。”老管理员秒懂,指向“家电-温控”类目的空调说明书;新管理员却愣住了,他在通用语料里检索不到“凉快”和“家电-温控”之间的关联。

这就是通用预训练嵌入模型的典型局限。具体表现在三个问题上:领域漂移——通用模型的语料来自新闻、百科,而业务文本充满黑话、缩写与行业指代;任务不对齐——预训练时学习的是“句子与句子相似”,线上需要的却是“短查询与长文档相关”;相似度失真——业务上的“相关”往往带条件,比如“凉快”只有在家电语境下才指向空调,通用模型看不到这层条件。

微调的本质,就是拿你的业务数据,通过特定损失函数更新模型参数,让向量空间从“通用空间”变形为“业务空间”。模型还是那个模型,但它对“什么是近、什么是远”的判断标准被重新校准了。这就像馆长请管理员观察本馆的真实借阅记录:读者常把哪些书一起借走,管理员就据此重新调整“亲近关系”。

特训的意义,不在于让管理员知道更多,而在于让他按本馆的规矩重新给每本书定位。接下来的两节,会分别介绍两套最主流的“定位训练法”:对比学习与指令微调。

对比学习原理:把同类放近,异类放远

馆长设计了一套“配对练习”:每一轮递给管理员两本书,一本是“同伴”,一本是“路人”。管理员的任务是把同伴摆到自己身边,把路人推到远处。成千上万轮之后,他形成了一种心法:位置远近不是看封面的颜色,而是看内容主题的亲疏。

对比学习(Contrastive Learning)正是这套心法的数学化。对每个查询(query)\(\mathbf{q}\),我们有一个正样本 \(\mathbf{k}^{+}\)(与它语义相关),还有一批负样本 \(\mathbf{k}^{-}\)(与它无关)。训练目标非常直白:让 \(\mathbf{q}\) 与 \(\mathbf{k}^{+}\) 的相似度尽量高,与所有负样本的相似度尽量低。最常用的目标函数是 InfoNCE 损失:

负样本从哪里来?最简单有效的做法是批内负样本:在一个 batch 中,除了自己的正样本,其他所有样本都被当作负样本。batch 越大,负样本越丰富,模型学到的边界就越细腻。训练结束后,书架上的远近关系不再是偶然,而是被“配对练习”重塑出的语义地图。

LInfoNCE=−log⁡exp⁡(sim(q,k+)τ)∑i=1Nexp⁡(sim(q,ki)τ)\mathcal{L}_{\text{InfoNCE}} = -\log \frac{ \exp\left( \displaystyle \frac{\text{sim}(\mathbf{q}, \mathbf{k}^{+})}{\tau} \right) }{ \sum_{i=1}^{N} \exp\left( \displaystyle \frac{\text{sim}(\mathbf{q}, \mathbf{k}_{i})}{\tau} \right) }
  1. 正样本相似度计算查询与正样本的相似度,再用温度系数 \(\tau\) 缩放后取指数。
    exp⁡(sim(q,k+)τ)\exp\left( \frac{\text{sim}(\mathbf{q}, \mathbf{k}^{+})}{\tau} \right)
  2. 全体样本求和分母遍历一个正样本加 \(N-1\) 个负样本的指数相似度,构成归一化项。
    ∑i=1Nexp⁡(sim(q,ki)τ)\sum_{i=1}^{N} \exp\left( \frac{\text{sim}(\mathbf{q}, \mathbf{k}_{i})}{\tau} \right)
  3. 取负对数把“正样本被选中”的概率取负对数作为损失,概率越大损失越小。
    −log⁡分子分母-\log \frac{ \text{分子} }{ \text{分母} }

BGE-Finetune:对比学习的标准实践

馆长把上面的配对练习整理成一本训练手册,要求新管理员分两个阶段完成:先对着馆藏自己玩“模拟配对”——把同一本书的摘要拆成两段当作正对,把随机两本书当作负对,这叫无监督对比学习;再请专家示范少量经典分类——由标注数据给出真正的正负例,这叫有监督微调。这套手册就是 BGE-Finetune 的实践框架。

BGE(BAAI General Embedding)是智源研究院开源的文本嵌入模型系列。BGE-Finetune 是指在 BGE 基础上做有监督对比微调:模型通常是一个 Transformer 编码器,取句子首位的 [CLS] 向量作为整句表示,再经过归一化得到检索向量。微调时,数据被构造成 <query, 正例, 难负例> 三元组,其中难负例是指表面相似、语义却不相关的文本——比如“苹果手机使用技巧”与“苹果种植技术”。

训练目标通常使用带难负例的对比损失:

实践中有两个关键旋钮:温度系数 \(\tau\) 通常设在 \(0.01\sim 0.05\),太小会让训练震荡,太大会让所有样本的相似度趋同;大 batch 则能让批内负样本的数量成倍增长,这也是对比学习微调最有效的免费午餐。经过手册训练的管理员,不仅会分类,还知道“苹果和苹果汁”别放一块,除非用户点名要水果专区。

L=−log⁡e sim(q,p)/τe sim(q,p)/τ+∑j∈H(q)e sim(q,hj)/τ\mathcal{L} = -\log \frac{ e^{\, \text{sim}(\mathbf{q}, \mathbf{p}) / \tau } }{ e^{\, \text{sim}(\mathbf{q}, \mathbf{p}) / \tau } + \sum_{j \in H(\mathbf{q})} e^{\, \text{sim}(\mathbf{q}, \mathbf{h}_j) / \tau } }
  1. 正对指数相似度分子保持查询与正样本的匹配度,温度 \(\tau\) 控制分布的尖锐程度。
    e sim(q,p)/τe^{\, \text{sim}(\mathbf{q}, \mathbf{p}) / \tau }
  2. 难负例集合分母只累加来自难负例集合 \(H(\mathbf{q})\) 的指数相似度,让模型面对“看似相似”的干扰项。
    ∑j∈H(q)e sim(q,hj)/τ\sum_{j \in H(\mathbf{q})} e^{\, \text{sim}(\mathbf{q}, \mathbf{h}_j) / \tau }
  3. 对数比损失迫使模型在难负例中依然认出真正的正例。
    −log⁡esp/τesp/τ+∑jeshj/τ-\log \frac{e^{s_p/\tau}}{e^{s_p/\tau} + \sum_{j} e^{s_{h_j}/\tau}}

LLM-Embedder:听指令的嵌入模型

另一家分馆也来了一位新管理员。他悟性极高,但习惯“听指令”做事。馆长说“按读者年龄分”,他就把绘本放少儿区;说“按学科分”,他就把数学书归到自然科学。同样是那些书,换个指令,摆放规则立刻切换。这种思路对应着嵌入模型微调的第二条路线:指令微调。

LLM-Embedder 是智源提出的检索模型微调方案。它的核心创新在于:用大语言模型生成“指令 + 样本”的训练数据,再把指令作为条件拼接到输入中,让同一个 query 在不同任务声明下得到不同的向量。比如用户搜“苹果”,如果指令是“在水果类目中检索”,向量会偏向食物语义;如果指令是“在科技类目中检索”,向量则偏向公司语义。它把对比学习与指令机制融合在一起:

训练数据覆盖多个检索任务——Web 检索、对话检索、事实验证、问答等,每个样本都配有任务指令。与 BGE 相比,BGE 学到的是一把固定的“语义尺子”,而 LLM-Embedder 学到的是一套“可切换的刻度盘”。好比图书管理员拥有多张摆放模式卡片,读者一开口说出场景,他立刻调出对应的布局。

L=−log⁡e sim(g(q,ins), g(p,ins))/τ∑k∈S(ins)e sim(g(q,ins), g(k,ins))/τ\mathcal{L} = -\log \frac{ e^{\, \text{sim}\big( g(\mathbf{q}, \text{ins}),\, g(\mathbf{p}, \text{ins}) \big) / \tau } }{ \sum_{k \in S(\text{ins})} e^{\, \text{sim}\big( g(\mathbf{q}, \text{ins}),\, g(\mathbf{k}, \text{ins}) \big) / \tau } }
  1. 指令注入把任务指令 \(\text{ins}\) 与文本拼接后共同编码,得到条件化表示。
    g(q,ins)g(\mathbf{q}, \text{ins})
  2. 条件相似度在相同指令下计算 query 与候选文本的相似度,保证可比性。
    sim(g(q,ins), g(k,ins))\text{sim}\big( g(\mathbf{q}, \text{ins}),\, g(\mathbf{k}, \text{ins}) \big)
  3. 条件对比求和分母只遍历该指令覆盖的候选集合 \(S(\text{ins})\),实现“分任务对比”。
    ∑k∈S(ins)e ⋅/τ\sum_{k \in S(\text{ins})} e^{\, \cdot / \tau }

评测与选型:用分数说话

特训结束,馆长要验收。考试不考背书,而是给管理员一批真实的读者提问,看它能否把真正相关的书排到前几名。检索领域有两张经典的“考卷”:MRR 和 Recall@K。

MRR(平均倒数排名)关心第一个正确答案排在哪:如果排在第 1 位就得 1 分,排第 3 位就得 1/3 分。Recall@K 则关心前 K 个结果里覆盖了多少正确答案:答案有 5 个,前 10 里命中 4 个,Recall@10 就是 0.8。此外还要做语义相似度评测(STS):给句子对打分,看与人工标注的相关性排序是否一致。

选型建议:如果你的场景是 FAQ 检索、短文本召回,BGE-Finetune 训练稳定、部署轻量,通常是性价比之选;如果你的场景本身带有明确的“意图维度”——比如按文档类型、按用户角色检索,LLM-Embedder 的指令机制更能贴合需求。考试分数最终告诉馆长:哪套训练方案更值得继续投入。

MRR=1∣Q∣∑i=1∣Q∣1ranki,Recall@K=1∣Q∣∑i=1∣Q∣∣reli∩topK(qi)∣∣reli∣\text{MRR} = \frac{1}{|Q|} \sum_{i=1}^{|Q|} \frac{1}{\text{rank}_i}, \qquad \text{Recall@K} = \frac{1}{|Q|} \sum_{i=1}^{|Q|} \frac{|\text{rel}_i \cap \text{top}_K(q_i)|}{|\text{rel}_i|}
  1. 倒数排名对每个 query 取第一个正确答案名次的倒数,名次越靠前分数越高。
    1ranki\frac{1}{\text{rank}_i}
  2. 平均 MRR对所有 query 的倒数排名取平均,衡量整体“首击”能力。
    1∣Q∣∑i=1∣Q∣1ranki\frac{1}{|Q|} \sum_{i=1}^{|Q|} \frac{1}{\text{rank}_i}
  3. 前 K 覆盖率Recall@K 计算前 K 个结果与真实相关文档集合的交集占比。
    ∣reli∩topK(qi)∣∣reli∣\frac{|\text{rel}_i \cap \text{top}_K(q_i)|}{|\text{rel}_i|}

工程实践:从实验室到图书馆

训练好模型只是第一步,真正把管理员放回图书馆工作,还要排班表、做巡检、处理读者投诉。工程化落地同样有章可循。

数据管线是质量的地基:清洗噪声、去重、构造难负例、划分测试集,每一步都不能省。一个常被忽视的坑是数据泄漏——测试集里的文本在训练集里出现过,评测分数虚高,上线立刻现原形。超参调优要记住几个经验起点:学习率设 \(1\times10^{-5}\sim 2\times10^{-5}\)(比预训练阶段小一个量级),batch size 尽量大(至少 64),温度系数 \(\tau\) 在 \(0.02\sim 0.05\),训练 1~3 个 epoch 即可,多了容易过拟合。部署优化时,先把向量做 L2 归一化,再用 FAISS 建近似最近邻索引,配合量化把内存降一个数量级。

常见陷阱还包括:难负例过难导致训练崩溃(解决:先易后难,逐步加入困难负例);只用领域数据导致通用能力退化(解决:混合一部分通用语料);不做指令归一化导致同一文本在不同指令下向量不一致(解决:统一指令模板)。一个好管理员加上一套完备的值班制度,图书馆才算真正运转起来——模型微调与工程体系,从来都是缺一不可。

AI 应用场景

电商智能客服 FAQ 检索

阶段:Embedding 微调(对比学习)

解决的问题:电商平台有上百万条历史问答,传统关键词检索对“口语化提问”匹配率很低——用户问“运费谁出”而答案标题写的是“配送费用说明”,字面毫无交集。用 BGE-Finetune 把历史问答做成 query-正例对,把同类高频问题作为难负例,微调后向量检索能直接召回语义同义的答案。

具体案例:某电商团队采集了 20 万条用户提问与客服采纳答案,构造三元组训练一个 epoch,线上 FAQ 的 Recall@10 从 61% 提升到 79%,机器人首次解决率提高 15 个百分点。

企业内部知识库多指令检索

阶段:指令微调(LLM-Embedder)

解决的问题:企业内部知识库涵盖合同、技术文档、规章制度等多个子库。同一个词“项目”在合同库指“项目条款”,在研发 wiki 里指“项目进展”,通用向量模型难以区分。LLM-Embedder 通过指令微调,让同一 query 在不同子库语境下得到不同向量。

具体案例:某制造企业把知识库按文档类型分为 8 类,每类人工编写 50 条指令模板,由大模型批量生成训练样本。上线后,员工搜索“项目变更”能在合同库命中条款原文,在研发库命中周报记录,两个场景的 MRR 分别提升 22% 和 18%。

学术论文语义检索

阶段:Embedding 微调与评测

解决的问题:研究者用自然语言描述一个 idea,希望从论文库中召回相关文献。通用嵌入模型对学术术语的敏感度不足,微调后能更准确地区分“方法相似”与“任务相似”。

具体案例:一个课题组的语义检索系统利用 5 万条论文摘要对,以标题为 query、摘要为正文正例,构造引用关系负样本,微调 BGE 模型后用 MRR 评测,检索命中率从 54% 提升至 71%。

Python 演示

python48 行
import torchimport torch.nn as nnimport torch.nn.functional as F torch.manual_seed(42)  class SimEnc(nn.Module):    def __init__(self, vocab, dim):        super().__init__()        self.table = nn.Embedding(vocab, dim)        self.proj = nn.Sequential(nn.Linear(dim, dim), nn.Tanh())     def forward(self, ids):        vec = self.table(ids).mean(dim=1)        return F.normalize(self.proj(vec), dim=-1)  def info_nce(q, pos, neg, tau=0.05):    # q:[B,D] pos:[B,D] neg:[B,N,D]    pos_sim = (q * pos).sum(-1) / tau    neg_sim = torch.einsum('bd,bnd->bn', q, neg) / tau    logits = torch.cat([pos_sim.unsqueeze(1), neg_sim], dim=1)    return F.cross_entropy(logits,                           torch.zeros(logits.size(0), dtype=torch.long))  def train_one_step(model, q_ids, pos_ids, neg_ids):    q = model(q_ids)    pos = model(pos_ids)    neg = model(neg_ids)    loss = info_nce(q, pos, neg)    loss.backward()    return loss.item()  model = SimEnc(vocab=100, dim=16)optimizer = torch.optim.Adam(model.parameters(), lr=1e-3) q_ids = torch.randint(0, 100, (4, 5))pos_ids = torch.randint(0, 100, (4, 5))neg_ids = torch.randint(0, 100, (4, 3, 5)) for step in range(10):    optimizer.zero_grad()    loss = train_one_step(model, q_ids, pos_ids, neg_ids)    optimizer.step()    print(f"step {step}: loss={loss:.4f}")
目的:用 PyTorch 实现一个最简 InfoNCE 对比学习训练循环,演示 BGE-Finetune 中“正样本拉近、负样本推远”的核心机制。
  1. class SimEnc(nn.Module):定义极简编码器,用词向量平均代替真实 Transformer,方便演示
  2. vec = self.table(ids).mean(dim=1)把句子中所有词的嵌入取平均,得到句子向量
  3. return F.normalize(self.proj(vec), dim=-1)线性变换后做 L2 归一化,保证余弦相似度只依赖方向
  4. def info_nce(q, pos, neg, tau=0.05):定义 InfoNCE 对比损失,温度系数取 0.05
  5. pos_sim = (q * pos).sum(-1) / tau计算 query 与正样本的缩放相似度,作为分子
  6. neg_sim = torch.einsum('bd,bnd->bn', q, neg) / tau用爱因斯坦求和一次性算出 query 与所有负样本的相似度
  7. logits = torch.cat([pos_sim.unsqueeze(1), neg_sim], dim=1)把正样本相似度与负样本相似度拼成 logits
  8. return F.cross_entropy(logits, torch.zeros(...))用交叉熵让正样本类别概率最大,等价于 InfoNCE 损失
  9. optimizer.zero_grad(); loss.backward(); optimizer.step()标准训练三步曲,10 轮内 loss 会明显下降

常见误区

误区我以为 Embedding 微调和文本分类一样,batch size 设成 8 或 16 最稳妥,显存也省。

正解对比学习的核心是“正负样本相互比较”。batch 太小意味着批内负样本太少,模型无法看到足够多的干扰项,学出来的向量空间缺乏区分度。实践中 batch size 往往要 64、128 甚至更大。就像配对练习时,每轮只给管理员看 2 本路人书,他永远学不会分辨复杂的主题差异。

为何常见:大家习惯了分类任务里小 batch 的稳定性,忽略了对比学习损失里“分母”由批内样本决定这一关键差异。

误区我随便拿一些无关句子当负样本,反正数量大,模型总能学到东西。

正解随机负样本太“简单”,模型很快就能把它们和 query 区分开,梯度信号趋近于零。真正有效的负样本是难负例——和 query 表面相似、语义却不同的文本,比如“苹果手机使用技巧”之于“苹果种植技术”。只有逼着模型在相似中找差异,它才会学到精细的语义边界。

为何常见:直觉上“多而杂”能覆盖更多情况,但机器学习需要的是有梯度的困难样本,而不是已经能轻松分类的样本。

误区我以为 LLM-Embedder 里的“指令”和大模型对话里的 prompt 一样,是为了让模型生成更好的文字回答。

正解在 LLM-Embedder 中,指令是条件编码的输入,它被拼接到文本前一起送入编码器,目的是改变输出向量的语义方向。同一句话“苹果”,在“指令:水果”下得到水果向量,在“指令:科技”下得到公司向量。指令不是用来生成文字,而是用来切换语义空间。

为何常见:指令微调(instruction tuning)一词在生成模型领域太流行,容易让人把它的语义迁移到检索模型上。

误区我微调完模型,觉得它整体变聪明了,任何相似度计算都应该更准。

正解Embedding 微调是“向特定任务的方向”校准。只用在领域数据上训练,模型会在本领域变强,但在通用任务上可能退化——这叫灾难性遗忘。工程上通常要混合 10%~30% 的通用语料,或者专门评测跨领域能力。

为何常见:人们容易把“微调”理解为全局能力提升,忽略了它其实是“空间变形”,有得必有失。

误区我担心训练震荡,把温度系数 \(\tau\) 设为 1,觉得数值大一点分布更平滑。

正解对比学习里 \(\tau\) 通常取 \(0.01\sim 0.05\)。\(\tau\) 过大时,所有样本的相似度都会被压到接近 0,softmax 输出接近均匀分布,梯度信号微弱,模型学不动。\(\tau\) 过小则会让模型对难负例过于苛刻,训练不稳定。温度不是越大越稳,而是需要一个让“区分度”与“稳定性”平衡的值。

为何常见:直觉上“高温 smoother”来自模拟退火等概念,但对比学习的温度控制的是概率分布的锐利程度,作用机制完全不同。

面试题

Q1. 下列关于 Embedding 微调的说法正确的是?

单选题 · easy

  • A.只改变输出向量的维度大小
  • B.调参让向量空间贴合任务← 正确答案
  • C.微调完全不需要训练数据
  • D.微调后推理速度一定变慢

答案:B。Embedding 微调的本质是用任务数据调整模型参数,使向量空间贴合业务语义,B 正确。微调不改变输出维度,也需要训练数据,更与推理速度无关,A/C/D 均错误。

Q2. 余弦相似度主要衡量两个向量的什么?

单选题 · easy

  • A.向量本身的长度差异
  • B.向量方向夹角的余弦← 正确答案
  • C.向量坐标的绝对值大小
  • D.向量中非零元素的个数

答案:B。余弦相似度等于两向量点积除以模长乘积,只关心方向夹角,不关心长度和坐标绝对值,也与非零元素个数无关。图书管理员判断两本书是否相近,看的是“朝向”而不是“书有多厚”。

Q3. 对比学习 InfoNCE 损失中,温度系数 \(\tau\) 偏大时会发生什么?

单选题 · mid

  • A.分布更均匀,训练信号变弱← 正确答案
  • B.正样本概率突出,训练加快
  • C.模型参数直接梯度爆炸
  • D.向量维度意外降低

答案:A。\(\tau\) 偏大使所有相似度指数被压缩,softmax 输出趋向均匀分布,正样本概率不再突出,反向传播的梯度变小,训练信号变弱。它不会导致梯度爆炸,也不会改变维度。

Q4. 批内负样本(in-batch negative)指的是什么?

单选题 · mid

  • A.对正样本增强后得到的副本
  • B.把批内其他样本当负样本← 正确答案
  • C.人工标注的困难负样本
  • D.从全体语料随机抽样样本

答案:B。批内负样本是指在一个 batch 中,除了当前 query 的正样本外,把其他所有样本都当作负样本使用。它不需要额外采集,是大 batch 策略能提升效果的根本原因。

Q5. BGE-Finetune 的标准两阶段训练顺序是?

单选题 · hard

  • A.先有监督后无监督训练
  • B.先无监督对比再有监督微调← 正确答案
  • C.先指令微调再对比学习
  • D.只做有监督微调训练

答案:B。BGE-Finetune 采用两阶段:第一阶段用无监督对比学习在领域语料上“热身”,让模型先感知主题结构;第二阶段用带难负例的有监督数据精细校准。顺序不能颠倒,也不能只做有监督。

Q6. LLM-Embedder 与 BGE-Finetune 最主要的区别是什么?

单选题 · mid

  • A.前者参数量更大更耗显存
  • B.前者按任务指令影响向量← 正确答案
  • C.前者不需要任何负样本
  • D.前者输出的向量维度更低

答案:B。LLM-Embedder 的核心是“指令感知”——把任务指令作为条件输入,使同一文本在不同指令下得到不同向量。BGE-Finetune 则用固定语义尺度。两者都需要负样本,参数量和维度并非本质区别。

Q7. 使用 MRR 评估检索系统时,最关注什么?

单选题 · hard

  • A.所有结果的平均相似度
  • B.第一个正确答案的排名← 正确答案
  • C.前 K 个结果的精确率
  • D.模型推理速度的快慢

答案:B。MRR 对每个 query 取第一个正确答案名次的倒数再取平均,它衡量的是“第一次就命中”的能力。前 K 个结果的覆盖率属于 Recall@K 的范畴,与推理速度和平均相似度无关。

Q8. 下列哪些做法能有效提升对比学习微调效果?

多选题 · mid

  • A.增大批次以扩充批内负样本← 正确答案
  • B.使用语义近似的难负例← 正确答案
  • C.把温度系数设为 0 做到必中
  • D.先在领域数据上无监督对比← 正确答案

答案:ABD。大 batch 扩充负样本、难负例提供有效梯度、无监督对比作为两阶段中的热身阶段,都有助于提升效果。温度系数设为 0 会导致除零异常,绝不是有效做法。

Q9. 关于 LLM-Embedder 的指令微调,下列说法正确的是?

多选题 · hard

  • A.不同指令下同一文本向量可不同← 正确答案
  • B.指令只用来生成答案不影响嵌入
  • C.该训练数据可由大模型生成← 正确答案
  • D.指令微调后不能再用于检索

答案:AC。LLM-Embedder 让指令参与编码,因此同一文本在不同指令下向量不同,A 正确;训练数据正是由大语言模型生成指令与样本,C 正确;指令微调恰恰是为了检索,D 错误;指令会影响嵌入,B 错误。

Q10. 下列哪些属于 Embedding 微调的常见陷阱?

多选题 · easy

  • A.数据泄漏导致评测分数虚高← 正确答案
  • B.难负例过难导致训练崩溃← 正确答案
  • C.只用领域数据不加通用语料← 正确答案
  • D.向量归一化导致推理变慢

答案:ABC。数据泄漏使离线指标虚高、难负例过难让模型崩溃、只用领域数据引发灾难性遗忘,都是常见坑。向量归一化是标准操作,它不会让推理变慢,反而配合索引加速检索,D 错误。