这道题其实问的是[[Embedding]]模型在落地时怎么选型,本质是精度、速度、成本三者的权衡。我先说说主流模型结构,再讲维度怎么选,最后聊点落地时容易踩的坑。
先说模型结构。目前最常用的是 Sentence-BERT,就是[[双塔]]结构,两个BERT共享参数,各自把句子编码成向量,然后用余弦相似度比。它的好处是推理快,向量可以预计算存到 [[Vector Database]] 里,线上只做近似搜索。但它的缺点是句子间的交互被压缩到向量比较这一步,有些细粒度语义会丢。比如客服场景里用户说“退款没到账”,和知识库里“退款到账时间说明”这两句话,双塔可能觉得差不多,但实际含义差很多。所以 纯双塔适合粗排或者召回阶段,精排还得用交互式的 [[Cross-Encoder]]。
另一个是 SimCSE,分无监督和有监督两个版本。无监督版特别巧妙,同一句话过两次 Dropout 当正样本,batch 里其他样本当负样本,就能学到不错的语义空间。这对冷启动很友好,比如一个新业务线,没有标注数据也能快速出基线。有监督版用 NLI 数据,蕴含对是相似,矛盾对是不相似,效果更好。但 SimCSE 本质还是双塔,和 SBERT 是同一类,只是训练目标不一样。
其他像 Instructor、GTE、BGE、E5 这些,核心思路都类似,只是加了指令引导、多语言支持或者大规模弱监督预训练。我的经验是 真正落地常常混合用:比如用 BGE 做通用向量,再针对业务数据用 SimCSE 无[[监督微调]]一下。
再讲维度。常见的有 256、384、768、1024,再高到 2048 也有。维度越高,语义容量越大,检索精度理论上会更好,但代价也大:索引体积暴涨,搜索延迟变高,训练也更难收敛。768 是 BERT-base 的标准输出,大多数场景够用了,生态兼容性最好。384 适合对延迟和内存特别敏感的场景,比如移动端或者边缘设备。1024 一般是 BERT-large 的维度,追求极致精度时用,但你要评估存储和计算成本能不能接受。
这里有个坑:维度高并不一定保证精度提升。如果你的数据量不大,比如就几万条,高维度向量在 [[HNSW]] 这类图索引里反而容易过拟合,召回可能不如低维度。另外,索引类型也影响维度选择:[[IVF]] 对维度敏感,高维度下量化误差大;HNSW 相对好一些,但内存开销也大。所以上线前一定要用业务数据做召回指标测试,不能只看论文里的基准。
新趋势是 MRL,Matryoshka Representation Learning。它让模型输出一个高维向量,但你可以按需截断成低维子向量,精度损失很小。这打破了“一次训练固定维度”的限制,部署时灵活调整,特别实用。
不过话说回来,Embedding 维度选型还要结合你用的 [[ANN]] 算法。比如 [[IVF-PQ]] 对高维向量做[[乘积量化]],能大幅压缩索引,但精度损失明显。所以我会把 Embedding 模型选型看成系统组件的一部分,和索引、检索策略一起调优,而不是孤立看模型本身。
总结一下,我更倾向于把 Embedding 模型看成整个检索系统的编码器,选型时优先考虑 768 维度的通用模型,再根据业务数据微调。如果延迟敏感就降到 384,精度要求高就试 1024 加 MRL。落地时一定跑通全链路测试,关注 Recall@K 和延迟的 trade-off,别只看模型精度。