跳到正文

Embedding 向量维度选型

向量维度对质量、存储、索引速度和延迟的影响

原题:请描述常用的文本嵌入(Embedding)模型架构,如BERT、Sentence-BERT等,并解释不同输出向量维度对下游任务的影响。

向量检索 · 小米真题

30 秒回答

  1. 区分BERT与Sentence-BERT的架构差异(单塔vs双塔、训练目标)
  2. 解释CLS token与Mean Pooling的优劣
  3. 说明向量维度的影响(表达能力vs计算效率、存储成本)
  4. 提及实际选型考量(MTEB榜单、领域适配)

回答与解析

答案要点

  • 区分BERT与Sentence-BERT的架构差异(单塔vs双塔、训练目标)
  • 解释CLS token与Mean Pooling的优劣
  • 说明向量维度的影响(表达能力vs计算效率、存储成本)
  • 提及实际选型考量(MTEB榜单、领域适配)

主流Embedding架构对比

模型 核心架构 关键改进
BERT Transformer Encoder 预训练MLM+NSP,输出token级表示
Sentence-BERT 双塔Siamese网络 用对比学习(Contrastive Loss)优化句子级表示

BERT为何不适合直接做语义检索

  • BERT的[CLS]向量未经显式句子相似度训练,语义区分度弱
  • 原生BERT计算句子相似度需两两拼接输入,复杂度O(n²),无法离线建索引

Sentence-BERT的双塔设计

Tower A (Query) ──→ 固定编码器 ──→ 向量v₁ ──┐
                                           ├──→ 余弦相似度计算
Tower B (Doc)  ──→ 共享权重编码器 ──→ 向量v₂ ──┘
  • 离线编码文档:文档向量预计算存入向量库
  • 在线编码查询:仅编码query,实时检索Top-K

向量维度的影响

维度 优势 劣势 适用场景
高维(1024+) 语义表达丰富,区分度高 存储大、检索慢、内存压力大 高精度要求、数据量可控
低维(256-384) 检索快、省存储、易部署 信息压缩可能损失细粒度语义 海量数据、实时性要求高

工程权衡:通常768→384的降维,在MTEB评测中损失<2%,但存储减半。


实际选型建议

  1. 看榜单:MTEB Leaderboard选Top3开源模型(如BGE、E5、GTE系列)
  2. 看领域:通用场景用E5,中文用BGE,代码用CodeBERT
  3. 看规模:亿级文档优先考虑384维+量化(FP16/INT8)

口语版讲法(约4分钟)

  • 这道题本质在问怎么选架构和维度
  • BERT单塔不适合检索,Sentence-BERT双塔才是标配
  • 输出维度是精度和效率的权衡
  • 落地要结合场景和榜单,注意维度降维的坑
  • 可延伸点:追问维度压缩方法

好,这道题我觉得核心不是在背BERT和Sentence-BERT的架构差异,而是问你在实际做文本嵌入的时候,怎么根据业务场景选模型和输出维度。说白了,就是怎么在表达能力和工程效率之间做取舍。

先说架构。很多人以为BERT直接就能做语义检索,其实不是。BERT是个单塔模型,它输出的是每个token的向量,[CLS]那个位置虽然可以当句子表示,但BERT预训练的时候没专门学过句子相似度,所以直接拿[CLS]算余弦相似度效果很差。更关键的是,BERT算两个句子相似度必须把它们拼成一个序列输入,复杂度是O(n²),根本没法离线建索引,线上实时检索更不可能。所以BERT更适合做分类、序列标注这类任务,不适合做检索。

真正做检索的标配是Sentence-BERT这种双塔架构。它用两个共享权重的编码器分别编码query和doc,训练的时候用对比学习拉近相似句子、推开不相似句子。这样doc可以提前离线编码存到Vector Database里,线上只编码query,然后做ANN检索。这样就把复杂度从O(n²)降到了O(n),工程上才可行。

输出向量维度这块,我一般会先看业务对精度的要求。高维比如768或1024,语义表达更丰富,区分度更高,但存储和检索开销也大。低维比如256或384,检索快、省内存,但可能会损失一些细粒度语义。实际落地中,我通常会优先考虑384维,因为很多开源模型比如BGE、E5在MTEB榜单上,从768降到384,精度损失不到2%,但存储直接减半,检索速度也能提升不少。

举个例子,假设我们要做电商客服的退款政策检索。文档量大概几百万篇,线上要求毫秒级响应。如果直接用768维,向量库可能要几十GB,检索延迟也高。我会先用384维的E5模型,配合Product Quantization做量化,把每个向量从4字节降到2字节甚至1字节,这样内存占用和延迟都能满足。当然,前提是业务对精度没那么敏感,召回率差一两个点能接受。如果场景是金融风控合同比对,一点语义差别都不能丢,那我会保留高维,配合HNSW索引和GPU加速来扛性能。

这里有个坑:很多人觉得维度越低越好,直接降到128甚至64,结果召回崩了。所以我会先拿一小批业务数据做A/B测试,对比不同维度下的Recall@K和延迟,找到那个拐点。另外,降维不是简单截断,最好用训练好的降维矩阵或者蒸馏出来的小模型,效果更稳。

说到降维,其实除了直接选低维模型,还可以用Distillation或者Product Quantization来压缩维度,但不同压缩方式对精度和速度的影响不太一样。

所以整体上,我会把文本嵌入看成一块拼图:架构选双塔,维度根据精度和效率的trade-off来定,再配合索引和量化,才能做出一个真正可用的检索系统。

关键一句:除了直接选低维模型,还可以用蒸馏或乘积量化来压缩维度,但不同方法对精度和速度的影响不同。

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设你要给电商平台做商品检索,用户搜‘红色连衣裙’,你打算怎么把商品描述和用户查询变成向量来算相似度?你用的是单塔模型还是双塔?

  2. 问法 2 · 层层追问

    文本嵌入模型你平时怎么选的?……BERT 直接拿 [CLS] 向量做检索效果好吗?……那 Sentence-BERT 有什么改进?……向量维度比如 768 和 384,实际部署时你怎么权衡?

  3. 问法 3 · 直球架构

    对比一下 BERT 和 Sentence-BERT 的架构差异,重点说输出向量维度对检索精度、存储和速度的影响,以及你实际选型时会参考哪些指标?

同模块相关题目