【大模型面试突击】04_Embedding与表示学习

2026大模型面试:Embedding与表示学习必考23题(含答案)

23道精选高频题,覆盖BERT句向量、SimCSE、BGE、ColBERT、难负例挖掘到电商系统设计 | 资深老哥咖啡厅风格答疑


一、BERT句向量与各向异性问题(4题)

Q1. ⭐ [高频] BERT的[CLS] token输出能否直接作为句向量使用?效果如何?为什么?

一句话秒答: 不能直接用,效果烂到离谱------甚至还不如拿GloVe算个平均。

展开来说:

你可能觉得BERT这么强,[CLS]不就是"整句话的总结"吗?还真不是。[CLS]在预训练时干的活是NSP(下一句预测),压根没被训练成"理解整句语义"的东西。你拿它去做STS(语义相似度)任务,Spearman相关系数低得让人怀疑人生。

根本原因是BERT的表示空间有个致命的"各向异性"问题------所有句向量都挤在一个狭窄的锥形区域里,随便两个句子算余弦相似度都能搞到0.6以上。区分度约等于零,跟废了没啥两样。

你必须用Sentence-BERT或者SimCSE做一轮微调,把向量空间"掰开"了,句向量才能用。

面试加分: 如果你能补一句"BERT各层的各向异性程度不同,越高层越严重,因为MLM训练目标让高频token的梯度主导了参数更新,造成了表示退化(representation degeneration)"------面试官会觉得你对底层原理理解到位。


Q2. ⭐⭐ [高频] 什么是BERT向量空间的各向异性(Anisotropy)问题?它有哪些具体表现?

一句话秒答: BERT的向量分布极不均匀,全挤在一个窄锥体里,导致余弦相似度完全不能用。

展开来说:

想象一下,理想的向量空间应该是"天女散花"------向量均匀撒在超球面上。但BERT的实际情况是"挤地铁"------所有向量都挤在同一个角落。

具体表现有三个:

  1. 相似度失灵:随便取两个毫无关系的句子算余弦相似度,结果都能大于0.6,你根本分不出谁跟谁更像。
  2. 高频词霸道:少数高频token(比如"the""is")的表示占据了空间的核心位置,低频词被挤到边缘,像是被边缘化的小透明。
  3. 越深越严重:越靠后的Transformer层,这个问题越明显。

根本原因?MLM训练时高频词参与梯度更新的次数远多于低频词,于是高频词的表示"膨胀"了,把整个空间的分布搞歪了。Ethayarajh 2019年那篇论文把这事儿说得很清楚。

面试加分: 提到"representation degeneration problem"这个术语,再说一句"这也是为什么后来的SimCSE要专门用uniformity指标来衡量向量分布均匀性",闭环了。


Q3. ⭐⭐ [面经] BERT-Flow和BERT-Whitening分别是如何解决BERT句向量问题的?

一句话秒答: 都是后处理方案------一个用flow变换映射到高斯分布,一个用PCA白化拉平分布,不用重新训练。

展开来说:

这两个方法的哲学很一致:既然BERT的向量空间歪了,那我就做个数学变换把它"掰正"。

  • BERT-Flow:用normalizing flow(标准化流)做一个可逆变换,把BERT那个歪歪扭扭的向量分布映射成标准高斯分布。因为是可逆的,信息一点都不丢。听起来高级,实际操作也不复杂。
  • BERT-Whitening:更朴素------直接做PCA白化。去均值,然后让协方差矩阵变成单位矩阵。每个维度变成均值0、方差1、互不相关。还能顺便降维,只保留前k个主成分,存储和检索成本立马降下来。

两个方法的优点是都不需要标注数据,即插即用。缺点是天花板有限------效果比不上SimCSE这种要做微调的方法。你可以把它们理解成"免费的午餐",能吃,但不算美味。

面试加分: 补一句"在工程上BERT-Whitening更实用,因为PCA白化就几行代码的事,而Flow还得训练一个额外的网络"。


Q4. ⭐ [高频] 句向量的Pooling策略有哪些?Mean Pooling、Max Pooling、[CLS] Pooling各有什么优缺点?

一句话秒答: Mean Pooling一把梭,稳定好用,SBERT和BGE的默认选择。

展开来说:

三种主流Pooling策略,各有各的脾气:

  • [CLS] Pooling:直接取[CLS]位置的输出。最简单粗暴,但语义信息不够丰富,没微调过的话效果最差。就像让班长一个人代表全班发言------他说的不一定是大家的意思。
  • Mean Pooling:把所有token的隐藏状态取平均(记得用attention mask把padding的位置排除掉)。信息最全面,相当于"全班投票取共识"。SBERT、BGE这些主流模型都用它,效果最稳。
  • Max Pooling:每个维度上取所有token的最大值。能抓住最突出的特征,但容易丢掉整体语义。

还有些变体方案:用attention权重做加权平均、用IDF加权、多层输出拼接等。但实话说,Mean Pooling + 正经微调,已经足够打遍天下了,别整太花哨的。

面试加分: 提到"做Mean Pooling时attention_mask排除padding是个容易踩的坑,忘了的话短句和长句的向量norm差异会很大,影响余弦相似度计算"。


二、Sentence-BERT与句向量方法(3题)

Q5. ⭐⭐ [高频] Sentence-BERT(SBERT)的核心思想是什么?它如何解决BERT做语义匹配效率低的问题?

一句话秒答: 用孪生网络把句子独立编码成定长向量,把O(n²)的交叉编码暴力匹配降成向量检索。

展开来说:

原始BERT做语义匹配有多蠢呢?它需要把两个句子拼起来一起喂进去(Cross-Encoder),才能判断它俩有多像。你有10000个句子要两两比较?那就是大约5000万次前向传播,慢到地老天荒。

SBERT的思路是:凭什么每次都要重新编码?我让每个句子独立过一遍BERT + Mean Pooling,拿到一个固定维度的向量就完了。10000个句子只要10000次前向传播,然后向量之间算余弦相似度,快到飞起。

更狠的是,拿到向量后还能扔进FAISS之类的ANN索引里,百万级文档检索10ms搞定。这才是工程上可落地的方案。

训练的时候用NLI数据集和对比损失,让语义相近的句子在向量空间里靠得更近。

面试加分: 强调"SBERT的本质贡献不是模型结构的创新,而是把BERT从'用不起'变成了'用得起'------从学术玩具变成了工程利器"。


Q6. ⭐⭐ [高频] Sentence-BERT使用了什么网络结构?为什么选择孪生网络(Siamese Network)?

一句话秒答: 共享参数的孪生BERT + Pooling层,目的就是让句子能独立编码、向量能提前算好缓存。

展开来说:

孪生网络的精髓就俩字:共享。两个句子分别过同一个BERT编码器(权重完全一样),各自出来一个句向量。权重共享保证了"同样的话在同样的空间里",同时参数量不翻倍。

训练的时候根据任务不同,玩法也不一样:

  • 分类任务(比如NLI):把两个句向量u和v以及它们的差值|u-v|拼起来,过全连接层 + softmax。为啥要拼|u-v|?因为差值里蕴含了两个句子之间的"对比信息"。
  • 回归任务(比如STS):直接优化余弦相似度和标签之间的MSE损失,更直接。

推理的时候才是真正爽的地方------每个句子的向量可以离线算好存起来,线上查询只需要编码query然后做一次向量检索。

面试加分: 聊一句"孪生网络这个范式从人脸识别(FaceNet)到文本匹配一脉相承,核心哲学都是metric learning------学一个好的距离度量空间"。


Q7. ⭐⭐ [面经] 如何用Sentence-BERT做大规模语义搜索?离线建索引和在线查询分别怎么做?

一句话秒答: 离线SBERT编码全部文档扔进FAISS,在线只编码query做ANN检索,10ms搞定百万级搜索。

展开来说:

这个流程在工业界已经是标准打法了:

离线阶段(一次性投入):

  1. 把所有候选文档用SBERT批量编码成向量(batch size开大点提吞吐)
  2. 向量灌进FAISS / Milvus之类的向量数据库
  3. 选合适的索引类型------小规模用Flat(精确搜索),大规模用IVF-PQ(近似搜索,牺牲一丢丢精度换速度)

在线阶段(每次查询):

  1. 用户query进来,同样的SBERT模型编码一下
  2. 拿着query向量去索引里做Top-K近邻搜索
  3. (可选但推荐)拿个Cross-Encoder对Top-K做精排Rerank,效果再上一个台阶

工程上的小心思:

  • 用Matryoshka截断维度省存储
  • 增量索引支持新文档实时入库
  • 做好降级方案------模型挂了能回退到BM25

百万级文档10ms以内,十亿级用Milvus集群分布式扛。

面试加分: 提到"实际系统里还要处理长文档分chunk、chunk溯源、去重等问题,纯向量检索只是pipeline中的一环"。


三、对比学习与SimCSE(5题)

Q8. ⭐⭐ [高频] SimCSE无监督方法如何构造正例对?为什么Dropout可以作为数据增强?

一句话秒答: 同一句话过两次前向传播,靠不同的Dropout mask产生"几乎一样但又不完全一样"的两个表示当正例对。

展开来说:

这个idea简单到让人拍大腿------你啥数据增强都不用做,就利用Dropout本身的随机性就够了。

Dropout在训练时会随机丢掉10%的神经元,两次前向传播的随机mask不同,所以出来的表示有微小差异。这就好比你让同一个人拍了两张自拍------角度稍微有点不同,但绝对是同一个人。这就是天然的正例对。

为啥这比传统的数据增强好?因为文本的离散增强(删词、换词、回译)太容易翻车了。你把"我今天不开心"删掉"不"字,语义直接反了------这种"正例"其实是毒药。Dropout增强完全在连续的隐空间里操作,语义100%不变。

作者实验了一圈,Dropout概率p=0.1效果最好。太大的话两个表示差异太大,正例对质量反而下降。

面试加分: 说一句"SimCSE这个设计可以理解为在特征空间做了一种最小化的数据增强,跟视觉里的SimCLR用随机裁剪是同样的哲学,只是手段更优雅"。


Q9. ⭐⭐ [高频] SimCSE的损失函数是什么?请写出InfoNCE Loss的公式并解释各项含义。

一句话秒答: InfoNCE Loss,本质就是个多分类交叉熵------在一堆负例里把正例挑出来。

展开来说:

公式长这样:

Li=−log⁡esim(hi,hi+)/τ∑j=1Nesim(hi,hj+)/τL_i = -\log \frac{e^{\text{sim}(h_i, h_i^+)/\tau}}{\sum_{j=1}^{N} e^{\text{sim}(h_i, h_j^+)/\tau}}Li=−log∑j=1Nesim(hi,hj+)/τesim(hi,hi+)/τ

别被公式唬住,拆开来看其实特别直观:

  • 分子 esim(hi,hi+)/τe^{\text{sim}(h_i, h_i^+)/\tau}esim(hi,hi+)/τ:这是正例对的相似度(同一句话两次Dropout得到的两个表示)
  • 分母:batch里所有样本的增强表示和当前样本的相似度之和------其他样本就是负例(in-batch negatives)
  • sim:余弦相似度
  • τ(温度系数):一般取0.05,控制分布的"尖锐程度"

整个loss做的事情就是:让正例对的相似度在所有样本中脱颖而出。batch越大,负例越多,对比信号越强,效果越好。

你可以把它想象成一个N选1的选择题------从N个候选里选出唯一的正例。

面试加分: 补一句"InfoNCE和对比学习领域的NT-Xent Loss本质是同一个东西,都源自noise contrastive estimation的思想,只是不同论文里叫法不同"。


Q10. ⭐⭐ [面经] SimCSE中温度系数的作用是什么?温度过大或过小会有什么影响?

一句话秒答: 温度控制softmax的"尖锐程度",SimCSE最优值0.05------小了训练崩,大了学不到东西。

展开来说:

温度系数τ干的事情很简单:它缩放softmax输入的量级。

  • τ小(比如0.01):softmax分布极其尖锐,几乎变成了argmax。模型的注意力全集中在最难区分的那几个负例上。好处是学得精细,坏处是太敏感------碰上个噪声负例就可能崩盘,训练非常不稳定。
  • τ大(比如1.0):softmax变得很平滑,所有负例的贡献趋于均匀。模型"雨露均沾"地看每个负例,学不到什么有区分度的东西。收敛慢,效果差。

SimCSE实验下来τ=0.05是甜点。这个值让模型能重点关注hard negatives(难负例),同时不至于被个别噪声样本带跑偏。

直觉上你可以这么理解:温度就像是考试的难度。太难了(τ太小)大家全挂科,太简单了(τ太大)大家全满分------都没有区分度。0.05刚好是那个"能拉开差距但不至于全军覆没"的难度。

面试加分: 提到"温度系数和知识蒸馏里的temperature异曲同工------都是在softmax里做平滑/锐化操作来控制信息传递的粒度"。


Q11. ⭐⭐ [高频] SimCSE有监督方法如何利用NLI数据集构造训练样本?Entailment和Contradiction分别充当什么角色?

一句话秒答: NLI三元组天然就是(anchor, positive, hard negative)------蕴含句当正例,矛盾句当硬负例。

展开来说:

NLI数据集简直就是为对比学习量身定做的:

  • Premise(前提)→ 当anchor
  • Entailment(蕴含句)→ 当正例(语义一致,"换了个说法")
  • Contradiction(矛盾句)→ 当硬负例(话题相关但语义相反)

这里最妙的是Contradiction的角色。随机负例太弱了,模型闭着眼都能分对。但矛盾句跟premise聊的是同一个话题,只是结论反了------"这是一只猫" vs "这不是一只猫"。这种天然的hard negative逼着模型学到真正的语义差异,而不是靠浅层的词汇重叠蒙混过关。

损失函数也相应扩展了:分母里除了in-batch负例,还显式加上了每个样本的矛盾句,让模型特别去区分anchor和它的hard negative。

效果也说明了一切:有监督SimCSE在STS上比无监督版高2~5个百分点。数据质量的提升永远是最有效的杠杆。

面试加分: 补一句"后来的很多工作(如LLM2Vec)也验证了高质量正负例对训练效果的决定性影响,这也是为什么BGE这类模型要花大力气做数据工程"。


Q12. ⭐⭐⭐ [面经] Alignment和Uniformity分别衡量句向量质量的哪个方面?它们的具体定义是什么?

一句话秒答: Alignment看正例够不够近,Uniformity看整体分布够不够散,两个指标越小越好。

展开来说:

这两个指标是Wang & Isola 2020年提出来的,堪称对比学习的"体检报告":

  • Alignment :ℓalign=E(x,x+)∥f(x)−f(x+)∥2\ell_{\text{align}} = \mathbb{E}_{(x,x^+)} \| f(x) - f(x^+) \|^2ℓalign=E(x,x+)∥f(x)−f(x+)∥2

    • 衡量"语义相似的样本在向量空间里够不够近"
    • 值越小越好------正例对的表示越紧凑
  • Uniformity :ℓuniform=log⁡E(x,y)e−2∥f(x)−f(y)∥2\ell_{\text{uniform}} = \log \mathbb{E}_{(x,y)} e^{-2\|f(x)-f(y)\|^2}ℓuniform=logE(x,y)e−2∥f(x)−f(y)∥2

    • 衡量"整体向量分布在超球面上够不够均匀"
    • 值越小越好------向量分散得越均匀,信息保留越充分

好的句向量模型得同时满足:正例紧凑(低Alignment)+ 整体均匀(低Uniformity)。但这俩之间有trade-off------你不能把所有向量都映射到同一个点(Alignment完美了但Uniformity炸了)。

SimCSE的Dropout增强之所以牛,正是因为它在保持Alignment的同时大幅改善了Uniformity------把那个歪歪扭扭的各向异性空间"掰均匀"了。

面试加分: 说一句"这两个指标本质上对应了对比学习损失函数的两项------分子优化Alignment,分母优化Uniformity,InfoNCE Loss是两者的天然统一"。


四、现代Embedding模型(BGE/E5/GTE)(4题)

Q13. ⭐⭐ [高频] BGE(BAAI General Embedding)模型的训练方法是什么?经历了哪些训练阶段?

一句话秒答: 三阶段流水线------RetroMAE预训练打地基,大规模对比学习学通用语义,任务微调拔高。

展开来说:

BGE的训练pipeline非常"教科书",基本上是Embedding模型训练的最佳实践:

阶段一:RetroMAE预训练

在大规模无标注语料上做掩码自编码预训练(不是普通MLM,而是RetroMAE这种对检索更友好的预训练方式),给模型打好语言理解的基底。

阶段二:大规模对比学习

用大约2亿文本对(来自搜索日志、QA对、网页标题-正文对等)做对比学习。这一步是核心------海量的(query, positive)对让模型学会什么叫"语义相关"。

阶段三:任务特定微调

在高质量标注数据上做final tuning,针对具体任务(检索、分类、聚类等)进一步精调。

另外BGE还引入了instruction-aware机制------在query前加指令前缀,让同一个模型能适配不同的检索意图。这个设计后来成了行业标配。

面试加分: 提到"三阶段训练的关键是数据量的递减和数据质量的递增------阶段一用海量但粗糙的数据,阶段三用少量但精确的数据,这跟LLM预训练的哲学如出一辙"。


Q14. ⭐⭐ [高频] BGE模型中为什么在query前面加instruction(指令前缀)?这样做的好处是什么?

一句话秒答: 让模型通过前缀指令区分"你到底想搜啥",一个模型干多件事。

展开来说:

想想看,同样一个query"苹果":

  • 做QA检索时,你想找"苹果的营养价值"这种答案
  • 做分类时,你想找其他水果类的文本
  • 做搜索时,你可能想找苹果手机的评测

不同任务对"相关性"的定义完全不一样。如果不加区分,模型就会困惑------到底该优先匹配哪种关系?

BGE的做法很聪明:在query前面加一句instruction,比如"为这个句子检索相关段落:"或"为这个查询找到相关答案:"。模型看到不同的指令,就知道用不同的编码策略。

最妙的是:只在query端加instruction,document端不加。 这意味着所有文档只需要编码一次,不同类型的query来了只是前缀不同而已,文档向量完全复用。

这个设计借鉴了InstructOR的工作,现在E5-Mistral、GTE、Nomic-Embed这些新模型也都跟进了。

面试加分: 补一句"instruction-aware Embedding的思路和LLM时代的instruction tuning是一脉相承的------通过指令来激活模型的不同能力,本质上是在做条件化编码"。


Q15. ⭐⭐⭐ [面经] BGE-M3模型的"M3"代表什么?它支持哪三种检索方式?

一句话秒答: M3 = Multi-Linguality + Multi-Functionality + Multi-Granularity,一个模型搞定三种检索。

展开来说:

BGE-M3是BAAI出的一个"瑞士军刀"级别的检索模型,三个M各有含义:

  • Multi-Linguality(多语言):支持100+种语言,中英日韩法德全都行,而且能跨语言检索------你用中文搜,它能给你返回英文的相关文档。
  • Multi-Functionality(多功能) :同时支持三种检索范式:
    • Dense Retrieval:传统的稠密向量检索
    • Sparse Retrieval:学习型的稀疏权重检索,可以理解为"模型自己学了一个BM25"
    • Multi-Vector Retrieval:ColBERT风格的多向量token级交互检索
  • Multi-Granularity(多粒度):从短句到长文档(最长8192 token)都能处理

最牛的是三种检索的分数可以加权融合:score = w1*dense + w2*sparse + w3*multi_vec。三路互补,效果直接拉满。Dense捕捉语义,Sparse抓精确匹配,Multi-Vector做细粒度交互,各司其职。

面试加分: 提到"M3的Sparse检索不是传统的词袋模型,而是通过模型学习每个token的'重要性权重'------跟SPLADE的思路类似,但集成在了一个统一模型里"。


Q16. ⭐⭐⭐ [面经] Matryoshka Representation Learning(俄罗斯套娃表示学习)的核心思想是什么?如何实现可变维度的Embedding?

一句话秒答: 训练时同时优化多个维度切片的损失,让向量的前d维自动编码最重要的信息,推理时想截多少截多少。

展开来说:

这个idea太漂亮了。名字叫"俄罗斯套娃"是因为:大娃套着小娃,768维的向量"套着"256维的向量,256维又"套着"64维的。

具体怎么做?训练的时候对多个维度切片(比如[32, 64, 128, 256, 512, 768])同时计算对比损失,加权求和。这就强迫模型把最关键的语义信息编码在前面几个维度,越往后越是锦上添花的细节。

推理时就爽了------你预算充足就用768维,要省钱就截到256维甚至64维。截到原始维度的1/4(768→192),检索质量只掉1~2%,但存储和计算成本直降75%。这个trade-off简直太香了。

OpenAI的text-embedding-3系列、BGE最新版本都已经采用了这个方案。在工程部署中,你可以用低维做粗排快速筛选,高维做精排保质量。

面试加分: 补一句"Matryoshka还可以和PQ(Product Quantization)组合使用------先截断维度再做量化压缩,存储开销能压到原来的1/10以下"。


五、检索范式与稀疏vs稠密(4题)

Q17. ⭐ [高频] 稀疏检索(Sparse Retrieval)和稠密检索(Dense Retrieval)的核心区别是什么?

一句话秒答: 稀疏靠词匹配(BM25那一套),稠密靠语义理解(向量那一套),实战中混着用效果最好。

展开来说:

这两个流派就像"文科生"和"理科生"的思维方式:

稀疏检索(BM25/TF-IDF)

  • 每篇文档用一个词表大小的高维稀疏向量表示(大多数维度是0)
  • 靠关键词精确匹配,你搜"苹果"就只能匹配到包含"苹果"的文档
  • 优点:不需要GPU,精确术语查询效果好,可解释性强
  • 致命缺点:词汇鸿沟------"治疗头疼"搜不到"缓解偏头痛"

稠密检索(SBERT/BGE)

  • 每篇文档用一个低维稠密向量(如768维)表示
  • 靠语义理解,能捕捉同义词、意图等深层关系
  • 优点:理解"你到底想要什么",同义替换、表述变化都能搞定
  • 缺点:专有名词、实体名等精确匹配场景反而弱,需要GPU

实际工业系统的做法:Hybrid Search------BM25和向量检索双路召回,分数融合取最优。BM25抓精确匹配,向量抓语义理解,互相补位。

面试加分: 提到"最新的趋势是用一个模型同时生成稀疏和稠密表示(如BGE-M3),省掉了维护两套系统的麻烦"。


Q18. ⭐⭐⭐ [面经] ColBERT的Late Interaction机制是什么?它如何在效果和效率之间取得平衡?

一句话秒答: query和document独立编码但保留token级向量,匹配时做轻量级的MaxSim交互------既快又准。

展开来说:

ColBERT的设计哲学是在Bi-Encoder和Cross-Encoder之间找到一个"甜点":

  • Bi-Encoder:每个文档压缩成一个向量,快但信息丢太多
  • Cross-Encoder:query和doc一起编码做全交互,准但太慢
  • ColBERT(Late Interaction):各自独立编码,但每个文档保留所有token的向量(而不是压缩成一个),匹配的时候做"迟到的交互"

具体怎么"Late Interaction"?用MaxSim操作:

  1. query编码后得到每个token的向量 [q1, q2, ..., qm]
  2. document编码后得到每个token的向量 [d1, d2, ..., dn]
  3. 对query中每个token qi,找document中与它最相似的token(MaxSim)
  4. 把所有query token的MaxSim分数加起来 → 最终匹配分

document的token向量可以离线预计算,线上只需要算query的编码 + MaxSim操作,比Cross-Encoder快几个数量级。同时因为保留了token级别的交互信息,效果又比单向量的Bi-Encoder好。

代价是存储------每个文档要存所有token的向量。ColBERTv2用残差压缩把存储压到1/20~1/50。

面试加分: 补一句"ColBERT的思路启发了后续很多工作,比如BGE-M3的Multi-Vector检索就是ColBERT的思路,PLAID索引也是为ColBERT专门设计的高效检索方案"。


Q19. ⭐⭐ [面经] 双塔模型(Bi-Encoder)和交叉编码器(Cross-Encoder)在语义匹配中各有什么优缺点?

一句话秒答: Bi-Encoder快但糙,Cross-Encoder准但慢------召回用前者,精排用后者,分工明确。

展开来说:

这两个架构的对比,本质上是"效率 vs 精度"的经典trade-off:

Bi-Encoder(双塔模型):

  • query和doc各过各的编码器,出来两个独立向量
  • 支持离线索引 + ANN检索,速度飞快(毫秒级)
  • 问题是把整个文档压缩成一个向量,难免丢信息------两个句子之间的细粒度交互(比如某个关键词的对应关系)就看不到了

Cross-Encoder(交叉编码器):

  • query和doc拼成一个序列一起进BERT,所有token之间充分做attention交互
  • 精度最高------模型能看到每一对token之间的关系
  • 问题是没法预计算,每一对(query, doc)都要重新推理,复杂度O(n),大规模场景根本扛不住

工业界的标准方案: 串联使用------Bi-Encoder做召回(百万→Top100),Cross-Encoder做精排(Top100→Top10)。

还有个骚操作:用Cross-Encoder做teacher,蒸馏到Bi-Encoder里。让学生(Bi-Encoder)学到老师(Cross-Encoder)的打分能力,精度提升的同时保持速度优势。

面试加分: 说一句"Cross-Encoder的精度优势来自它做了'早期交互'(Early Interaction),而ColBERT的Late Interaction就是在这两者之间找平衡点"。


Q20. ⭐⭐ [面经] 在RAG系统中,Retriever和Reranker分别使用什么模型架构?为什么要分两阶段?

一句话秒答: Retriever用Bi-Encoder做大海捞针,Reranker用Cross-Encoder做精挑细选------漏斗式架构,层层过滤。

展开来说:

RAG系统的检索模块就是个"漏斗":

第一层------Retriever(召回):

  • 架构:Bi-Encoder(如BGE、E5)
  • 任务:从百万级候选文档中快速捞出Top-50~100
  • 速度:~10ms
  • 原理:query和doc各自编码成向量,通过ANN索引做最近邻搜索

第二层------Reranker(精排):

  • 架构:Cross-Encoder(如bge-reranker-v2)
  • 任务:对Retriever召回的Top-50100做精细重排序,选出Top-510
  • 速度:~100ms(因为只需要处理几十个候选)
  • 原理:把query和每个候选doc拼一起过BERT,输出精确的相关性分数

为什么非要分两阶段?

因为Cross-Encoder太准但太慢------让它在百万文档里一个个看,等它算完黄花菜都凉了。而Bi-Encoder虽然快但精度有天花板。两阶段就是"快速粗筛 → 精细精排",在可接受的延迟内拿到最好的结果。

最终Top-5~10的高质量文档,送给LLM生成回答。

面试加分: 提到"在实际RAG系统中,Reranker的ROI往往是最高的------加一个Reranker,最终回答质量能提升一大截,性价比极高"。


六、训练技巧、评估与系统设计(3题)

Q21. ⭐⭐ [高频] 什么是难负例(Hard Negatives)?为什么难负例对Embedding模型训练至关重要?

一句话秒答: 难负例就是"看着像但其实不相关"的样本------模型只有被这种样本"虐"过,才能真正学会区分语义。

展开来说:

先做个类比:你练英语听力,如果天天听"How are you?"这种入门对话,你永远不会进步。你得听那些"听起来很像但意思完全不同"的材料------比如"complement"和"compliment"------才能真正提升辨别能力。

训练Embedding模型也是这个道理:

简单负例(随机采样的不相关文档):模型闭着眼就能分对,梯度信号约等于零,训练了个寂寞。

难负例(BM25高分但不相关的文档):在表面上跟query很像(有很多共同关键词),但实际上不相关。模型得"绞尽脑汁"才能区分,这种挣扎才是真正学习的过程。

常见的难负例来源:

  1. BM25 Top-K中剔除正例后的结果
  2. 上一轮Embedding模型的错误召回
  3. 同一batch内的其他正例(in-batch negatives)

但注意一个坑:太难的"负例"可能根本就是正例------只是标注没覆盖到(假阴性)。这种噪声会毒害模型训练,需要做去噪处理。

面试加分: 补一句"难负例的'难度'应该是可控的------太简单学不到,太难又有噪声风险。实践中一般取BM25 Top-20~100的非相关文档作为难负例,既有挑战性又不至于太多假阴性"。


Q22. ⭐⭐⭐ [字节/面经] 请设计一个完整的难负例挖掘pipeline:从初始模型训练到多轮迭代挖掘的流程。

一句话秒答: "训练 → 挖掘 → 再训练"的闭环迭代,每轮用当前模型的错误召回当下一轮的难负例,螺旋式上升。

展开来说:

这个pipeline在工业界已经是标准操作了,字节、阿里的搜索团队都这么干:

Round 0(冷启动):

  • 没有模型怎么挖难负例?用BM25或者随机负例凑合着来
  • 训练出一个初始Embedding模型M0------"先有个能跑的再说"

Round 1(首轮挖掘):

  • 用M0对全部query做检索,拿到Top-K结果
  • 其中和正例不匹配的结果就是M0"搞错了"的样本------天然的难负例
  • 用这批难负例 + 正例训练出M1

Round 2+(迭代):

  • M1比M0强了,它犯的错误是更"难"的错误
  • 用M1再挖一轮难负例,训练M2...
  • 每一轮模型变强,挖出的负例也更难,形成"螺旋式上升"

关键步骤------去噪:

  • 用Cross-Encoder对挖出的难负例打分,分数过高的可能是假阴性(其实是相关的只是标注缺失),过滤掉
  • 这一步非常重要,不做去噪模型会被噪声带跑偏

停止条件: 验证集上MRR@10、NDCG@10不再提升,一般2~3轮就收敛了。

字节内部的实践经验:还会混合多种负例来源(BM25负例 + 模型负例 + 跨batch负例),按比例混合训练更稳定。

面试加分: 提到"这个pipeline和ANCE(Approximate nearest neighbor Negative Contrastive Estimation)论文的思路一致------用异步更新的ANN索引来持续挖掘难负例,工业界做了很多工程优化让它能在大规模数据上跑起来"。


Q23. ⭐⭐⭐ [字节/面经] 请从零设计一个面向电商搜索的Embedding模型训练方案,包括数据准备、模型选型、训练策略、评估方法。

一句话秒答: 基于BGE微调,用电商的点击/购买行为构造训练对,三阶段训练 + 难负例挖掘,离线指标和业务指标双重评估。

展开来说:

这是一道完整的系统设计题,面试官想看的是你的全局视野和工程落地能力:

一、数据准备(最关键的一步)

正例来源:

  • 用户搜索query → 点击的商品标题(量大但噪声也大)
  • 用户搜索query → 购买的商品标题(量少但质量高)
  • 购买 > 点击,质量分级

难负例来源:

  • 曝光了但没点击的商品(用户看了但没兴趣)
  • BM25高分但没点击的商品

数据清洗:去掉机器人流量、过短query(如单字)、异常行为(秒点刷单)

二、模型选型

  • 基座:BGE-large 或 E5-large,多语言场景选BGE-M3
  • 架构:Bi-Encoder(线上检索必须快)
  • query端加instruction:如"搜索相关商品:",区分搜索意图

三、训练策略

  1. 预热阶段:用全量点击日志做大规模对比学习,让模型先建立粗粒度的语义理解
  2. 精调阶段:用高质量购买数据 + 难负例挖掘迭代训练
  3. 损失函数:InfoNCE + in-batch negatives,batch size越大越好(2048+)
  4. 可选:多任务训练(搜索匹配 + 类目预测 + 品牌匹配),做正则化防止过拟合

四、评估方法(重点!面试必问)

离线指标:

  • MRR@10、Recall@50、NDCG@10

业务指标:

  • 搜索点击率CTR、转化率CVR、无结果率

分层评估:

  • 头部热门query、中腰部query、长尾query分别看
  • 长尾query的提升往往是向量检索相对BM25最大的优势所在

A/B测试:线上流量对比,这是最终的裁判

五、上线部署

  • Matryoshka截断到256维降低成本
  • FAISS/Milvus建索引
  • 增量更新策略(新商品上架要能快速入库)
  • 降级方案------模型异常时回退BM25

面试加分: 提到"电商搜索还有个特殊挑战------query的意图是多样的。用户搜'连衣裙'可能想看商品,也可能想看穿搭指南。instruction-aware Embedding在这里特别有用,可以根据不同场景动态调整编码策略"。


写在最后:这23道题覆盖了Embedding领域从基础概念到系统设计的完整链路。面试时答题的核心原则是------先给结论(一句话秒答),再展开(让面试官看到你的理解深度),最后加分(展示你的工程实践和前沿视野)。祝各位早日拿到心仪offer。

相关推荐
lingliang3 小时前
Web3学习笔记:Day2-Solidity基础语法
笔记·学习·web3
前路不黑暗@3 小时前
Java项目:Java脚手架项目的阿里云短信服务集成(十六)
android·java·spring boot·学习·spring cloud·阿里云·maven
寒秋花开曾相惜3 小时前
(学习笔记)2.2 整数表示(2.2.3 补码编码)
c语言·开发语言·笔记·学习
CappuccinoRose3 小时前
CSS 语法学习文档(十七)
前端·css·学习·布局·houdini·瀑布流布局·csspaintingapi
啊阿狸不会拉杆3 小时前
《计算机视觉:模型、学习和推理》第 1 章 - 绪论
人工智能·python·学习·算法·机器学习·计算机视觉·模型
tritone3 小时前
初探云原生:在阿贝云免费服务器上学习负载均衡的实践心得
服务器·学习·云原生
好奇龙猫4 小时前
【日语学习-日语知识点小记-日本語体系構造-JLPT-N2前期阶段-第一阶段(14):単語文法】
学习
努力学算法的蒟蒻4 小时前
day89(2.18)——leetcode面试经典150
算法·leetcode·面试
我命由我123454 小时前
Visual Studio - Visual Studio 修改项目的字符集
c语言·开发语言·c++·ide·学习·visualstudio·visual studio