考察点
这道题出自小米 AI 大模型开发一面,是典型的「扒项目细节」题——你说项目里用了某个 embedding 模型,面试官就往下钻一层,验证你是真用过还是只知道个名字。能答出结构、维度、训练方式算及格;能讲清双塔架构的取舍、pooling 方式、和生成模型的区别才算有深度。追问常往「为什么是双向 attention」「维度怎么选」「能不能用 LLM 直接做 embedding」走。
参考答案
以 BGE-M3 为例(我项目里实际用的)
先给硬信息:BGE-M3 是智源研究院开源的 embedding 模型,基于 XLM-RoBERTa 架构,是一个 24 层的 Transformer encoder,隐藏层维度 1024,参数量约 5.6 亿。输出向量维度是 1024,取输入序列 [CLS] 位置的隐状态作为整句的稠密向量表示。最大输入长度 8192 token,支持 100 多种语言。
这三个数字(1024 维、8192 长度、多语言)基本就是选型时最常被问到的规格,建议背熟自己所用模型的对应参数。
结构上要讲清楚的几个点
第一,它是 encoder-only 架构,双向注意力。 这是 embedding 模型和 GPT 类生成模型的本质区别。BERT/XLM-RoBERTa 系的 encoder 让每个 token 能看到完整上下文(前后都看),产出的表示是「理解式」的,适合检索、分类这类需要全局语义的任务。而 decoder 的因果注意力(只能看左边)是为逐 token 生成设计的,直接拿来做句子表示,序列后部的信息利用是不对称的。面试时主动讲这层,说明你知道 embedding 模型为什么长这样。
第二,双塔(bi-encoder)推理模式。 检索时 query 和文档分别独立编码成向量,算余弦相似度。这决定了它的工程性质:文档向量可以离线预计算存进向量库,线上只需编码 query 一次加一次 ANN 检索,毫秒级。这是相对 cross-encoder(query 和文档拼接后联合编码,精度更高但无法预计算)的核心取舍——双塔拿一点精度换几个数量级的效率。
第三,pooling 方式。 BGE 系列取 [CLS] token 的隐状态做句向量(配合训练时的对比学习目标),不是所有 token 隐状态的简单平均。这是细节题里容易露怯的地方:用模型前要知道它的官方推荐取法,取错 pooling 方式向量质量会掉。
第四,M3 的「Multi」特性。 M3 指 Multi-Linguality、Multi-Functionality、Multi-Granularity。其中 Multi-Functionality 值得展开:同一个模型除了稠密向量,还能输出稀疏词权重(类似学到的 BM25)和多向量表示(ColBERT 式,每个 token 一个向量做细粒度交互)。一次推理三种表示,可以做稠密+稀疏混合检索,这是它相对前代 BGE 的差异化能力。
训练方式:对比学习是灵魂
embedding 模型的效果主要靠训练目标而非结构(结构就是标准 Transformer)。BGE 系用对比学习:构造(query, 正例文档, 负例文档)三元组,优化目标是让 query 与正例的向量距离近、与负例远,常用 InfoNCE 损失。两个工程要点:
- 难负例:负例不能全是随机采的(太容易区分,学不到东西),要混入「看起来像但不对」的难负例,模型精度上限主要被负例质量决定;
- in-batch negatives:一个 batch 里其他样本的正例互为负例,batch size 越大有效负例越多,所以 embedding 训练普遍用大 batch。
M3 在此之上还有多阶段训练(预训练式自蒸馏 + 多任务微调)来同时撑起三种检索模式。
维度数字的工程含义
1024 维这个数字不是纯理论规格,它直接决定成本:一个 chunk 存 1024 个 float32 就是 4KB,一百万 chunk 光向量就约 4GB,还要加索引开销;QPS 检索时计算的是 1024 维内积。维度更高的模型(如 text-embedding-3-large 的 3072 维)存储和计算成本翻三倍,精度提升却很有限。所以维度选择本质是精度和基础设施成本的权衡,不少新模型支持 Matryoshka 式截断(取前 256/512 维损失很小),就是这个权衡的产物。
可能的追问
- 为什么不直接用 LLM(如 Qwen-7B)做 embedding? 答:可以,也有基于 decoder 的 embedding 模型(如 GTE-Qwen 系列、E5-Mistral),效果在部分榜单更好,但推理成本高一个量级;中小规模检索场景几百 M 的 BERT 系 encoder 性价比更高。decoder 做 embedding 通常取最后一个 token 的隐状态或用特殊 prompt。
- 1024 维向量怎么做相似度? 答:训练时做过归一化的话,余弦相似度等价于内积,向量库按归一化存储后用内积索引(如 HNSW + IP),检索就是一次矩阵乘。
- 业务领域效果不满意怎么办? 答:先做混合检索(稠密 + BM25)和 rerank 兜底;还不够就用业务语料对 embedding 做对比学习微调,重点是构造高质量的难负例,几百到几千条标注对就能看到提升。