Skip to content

嵌入模型

嵌入模型(Embedding Model)把文字、图像等现实世界的信息转换为数学向量,让计算机能够计算”语义相似度”。它是 RAG 检索增强生成和向量数据库的基础引擎——没有嵌入,就没有语义搜索。本页梳理从词嵌入到句子嵌入、再到多模态嵌入的完整技术谱系,涵盖 2025 年最新的 BGE-M3、Matryoshka 表示学习、ColBERT 延迟交互模型等前沿进展。

嵌入 = 给每个概念一个”语义坐标”。

想象一个”意义空间”:king 在坐标 (1, 0.8, …),queen 在 (1, 0.8, …) 附近,而 apple 在完全不同的方向。意思越接近,坐标越接近;意思无关,坐标相隔很远。

  • One-Hot 编码(稀疏表示):词汇表有 5 万个词,每个词用 5 万维向量表示,只有一维是 1 其余全是 0。“猫”和”狗”的 one-hot 向量正交(相似度为 0)——完全看不出它们有任何关系。这就像用一万个开关表示一万个物品,每个物品独占一个开关。
  • 词嵌入(稠密表示):把每个词压缩成几百维的稠密向量,每一维代表某种隐含的语义维度。“猫”和”狗”的向量非常接近,因为它们都是宠物、都有毛、都能跑——含义被”分布式”地编码在所有维度上。这就像 GPS 坐标——经纬度只有两个数,但精确定位了现实位置。
  • 句子嵌入:从”词的坐标”升级到”整句话的坐标”。“我喜欢猫”和”我爱小猫”的句子向量非常接近,虽然用词不同,但意思一样。

嵌入的核心哲学:分布式表示(Distributed Representation)。不再用一维对应一个概念,而是用所有维度共同表示含义——维度之间协同编码,信息密度远高于 one-hot。

词嵌入的理论根源:分布式假设

Section titled “词嵌入的理论根源:分布式假设”

词嵌入并非凭空出现,它的理论基础可以追溯到 20 世纪 50 年代语言学中的分布式假设(Distributional Hypothesis):

“You shall know a word by the company it keeps.” —— J.R. Firth, 1957

分布式假设的核心命题是:频繁出现在相似上下文中的词,具有相似的含义。这一思想由 Zellig Harris(1954)和 J.R. Firth(1957)独立提出,成为统计语义学的基石。例如”猫”和”狗”都会出现在”我养了一只___""___在叫”这样的上下文中,因此它们语义相关。

在 word2vec 之前,NLP 社区已经基于这一假说发展出多种方法:TF-IDF(词频-逆文档频率,衡量词的重要性)、LSA(潜在语义分析,对词-文档矩阵做 SVD 分解)、PLSA/LDA(概率主题模型)。这些方法都是”计数型”——统计共现次数再做矩阵分解。word2vec 的革命性在于将问题转化为”预测型”——用神经网络学习上下文预测能力,权重矩阵即为词向量。

word2vec(Google, Mikolov et al. 2013)的两种训练方式:

  • CBOW(连续词袋 Continuous Bag-of-Words):用上下文词预测中心词。输入”the cat ___ on the mat”,预测空格处是”sits”。
  • Skip-gram:用中心词预测上下文词。输入”cat”,预测它周围可能出现”sits""on""mat”等词。Skip-gram 在罕见词上表现更好,是实践中的首选。

Skip-gram 的目标函数可以这样理解:给定中心词 wtw_t 和它窗口内的上下文词 wt+jw_{t+j},我们希望最大化对数似然:

L=1T∑log⁡P(wt+j∣wt)L = \frac{1}{T} \sum \log P(w_{t+j} \mid w_t)

对所有 tt 和窗口内的 jj(j≠0j \neq 0)。

其中 TT 是语料长度,cc 是上下文窗口大小。核心是条件概率 P(wt+j∣wt)P(w_{t+j} \mid w_t),用词向量的点积经 softmax 计算:

P(wO∣wI)=exp⁡(v′(wO)⋅v(wI))∑wexp⁡(v′(w)⋅v(wI))P(w_O \mid w_I) = \frac{\exp(v'(w_O) \cdot v(w_I))}{\sum_w \exp(v'(w) \cdot v(w_I))}

对词汇表中所有 ww 求和。

这里 v(wI)v(w_I) 是中心词(输入)的嵌入向量,v′(wO)v'(w_O) 是上下文词(输出)的嵌入向量,WW 是词汇表大小。注意每个词有两套向量——输入向量(输入层权重)和输出向量(输出层权重),最终通常只保留输入向量作为词嵌入。

问题在于:分母要对整个词汇表(通常 5 万~30 万词)求和,每个训练样本都要遍历所有词——计算量极其庞大。这就是 word2vec 必须做优化的根本原因。

负采样(Negative Sampling) 是解决上述计算瓶颈的关键技巧。它不遍历整个词汇表计算 softmax,而是把多分类问题转化为二分类:给定中心词,判断一个候选词是”真正的上下文词”(正样本)还是”随机采样的噪声词”(负样本)。

L=log⁡σ(v′(wO)⋅v(wI))+∑i=1klog⁡σ(−v′(wi)⋅v(wI))L = \log \sigma(v'(w_O) \cdot v(w_I)) + \sum_{i=1}^{k} \log \sigma(-v'(w_i) \cdot v(w_I))

第一项为正样本项,第二项是对 kk 个负样本 wiw_i 求和的负样本项。

其中 σ 是 sigmoid 函数,k 是负样本数(通常 5~20),P_n(w) ∝ freq(w)^0.75 是一种对高频词做轻微惩罚的噪声分布。直觉上:模型要给真正的上下文词打高分(sigmoid 输出接近 1),给随机噪声词打低分(sigmoid 输出接近 0)。

负采样把每步从 O(W)(遍历词汇表)降到 O(k)(只看 k 个负样本),k 通常取 5~15,速度提升数千倍。另一种替代方案层次 Softmax(Hierarchical Softmax) 用霍夫曼树把计算量降到 O(log W),但在实践中负采样更常用、效果更好。

向量算术:king − man + woman ≈ queen

Section titled “向量算术:king − man + woman ≈ queen”

word2vec 训练出的向量最令人惊叹的性质是线性类比(Linear Analogy):

vec(国王)−vec(男人)+vec(女人)≈vec(女王)vec(巴黎)−vec(法国)+vec(意大利)≈vec(罗马)vec(走路)−vec(走)+vec(游泳)≈vec(游)\begin{aligned} \text{vec}(\text{国王}) - \text{vec}(\text{男人}) + \text{vec}(\text{女人}) &\approx \text{vec}(\text{女王}) \\ \text{vec}(\text{巴黎}) - \text{vec}(\text{法国}) + \text{vec}(\text{意大利}) &\approx \text{vec}(\text{罗马}) \\ \text{vec}(\text{走路}) - \text{vec}(\text{走}) + \text{vec}(\text{游泳}) &\approx \text{vec}(\text{游}) \end{aligned}

几何解释:在嵌入空间中,语义关系对应着大致平行的向量。“国王→女王”的位移方向(即 vec("女王") - vec("国王"))编码了”性别转换”这个语义维度,与”男人→女人”的位移方向高度一致。因此从”国王”出发,减去”男人”(去掉男性属性),加上”女人”(加上女性属性),就落在了”女王”附近。

更深层的原因在于:word2vec 的训练目标使得共现上下文相似的词向量相近,而上下文模式中的线性组合关系(如”国王”与”女王”在王室相关上下文中的分布差异,恰好对应”男人”与”女人”在性别相关上下文中的分布差异)被编码为近似线性的向量位移。

GloVe(Stanford, Pennington et al. 2014)则从另一个角度出发:利用全局的词共现矩阵(哪些词经常一起出现),通过矩阵分解学习嵌入。word2vec 是局部上下文窗口(滑窗预测),GloVe 是全局统计(共现矩阵分解)——两者效果接近,但 GloVe 的数学推导更优雅,显式优化共现比例的对数。

词嵌入只表示单个词,但实际应用需要表示整句话。最朴素的办法是把句中所有词的向量取平均——但这样丢失了词序和语法结构(“狗咬人”和”人咬狗”的平均向量完全一样)。早期方法如 SIF(Smooth Inverse Frequency) 通过加权平均 + 去除主成分来改善,但仍无法捕捉深层语义。

Sentence-BERT(Reimers & Gurevych, EMNLP 2019)的突破在于:用预训练的 BERT 编码句子,通过**孪生网络(Siamese Network)**结构 + **池化(Pooling)**得到固定长度的句子向量,再用对比学习微调。

孪生网络的核心:两个共享权重的 BERT 编码器分别处理句子 A 和句子 B,输出各自的向量。因为是同一个编码器(权重共享),语义相似的句子会得到相近的向量。关键创新是让 BERT 的输出可直接用余弦相似度比较——原始 BERT 直接拼接两个句子做分类,无法高效计算相似度,不适合语义搜索场景。

BERT 对每个 token 输出一个向量(如 512 个 token → 512 个 768 维向量),需要”压缩”成单个句子向量。三种主流池化策略:

池化策略原理优点缺点
[CLS] pooling取特殊 [CLS] token 的输出向量BERT 预训练时 [CLS] 已聚合全局信息效果常不如 Mean pooling
Mean pooling对所有 token 向量取平均最稳定、最常用,效果通常最好对噪声 token 敏感
Max pooling对每个维度取所有 token 的最大值捕捉最显著的特征可能丢失细粒度信息

实践中 Mean pooling 是最稳妥的默认选择,绝大多数现代模型(BGE、E5、GTE)都采用 Mean pooling。

现代嵌入模型几乎都用**对比学习(Contrastive Learning)**训练。核心思想:

  1. 取一个锚点句子(anchor),如”一只猫坐在垫子上”。
  2. 构造正样本(positive):语义相同的改写,如”小猫趴在地毯上”。
  3. 构造负样本(negative):语义无关的句子,如”今天股市大涨”。
  4. 训练目标:拉近 anchor 和 positive 的向量,推远 anchor 和 negative 的向量。

最核心的损失函数是 InfoNCE(Info Noise-Contrastive Estimation),也叫 NT-Xent(Normalized Temperature-scaled Cross Entropy):

L=−log⁡exp⁡(sim(zi,zj+)/τ)exp⁡(sim(zi,zj+)/τ)+∑kexp⁡(sim(zi,zk−)/τ)L = -\log \frac{\exp(\text{sim}(z_i, z_{j+}) / \tau)}{\exp(\text{sim}(z_i, z_{j+}) / \tau) + \sum_k \exp(\text{sim}(z_i, z_{k-}) / \tau)}

其中 z_i 是锚点向量,z_j+ 是正样本向量,z_k− 是负样本向量,sim 是相似度函数(通常用余弦相似度),τ 是温度系数(Temperature)(控制分布的尖锐程度,通常取 0.01~0.05),N 是负样本数量。

直觉上:InfoNCE 是一个 N+1 类的分类问题——模型要从 1 个正样本和 N 个负样本中”识别”出正确的正样本。N 越大(负样本越多),任务越难,学到的嵌入判别力越强——这也是为什么大厂训练嵌入模型要用超大 batch size(数千甚至数万)来增加负样本数量。

随机采样的负样本往往”太简单”(与锚点语义差异太大),模型学不到细粒度的区分。困难负样本挖掘(Hard Negative Mining) 专门找”看起来很像但实际不匹配”的样本:

  • BM25 困难负样本:用 BM25 关键词检索召回的文档——它们在词汇上相似但语义上不一定匹配,是极好的困难负样本。
  • 语义困难负样本:用当前模型的嵌入向量找最相似但不匹配的文档。
  • 混合策略:研究表明正负样本比例 1:41:7(1 个正样本配 47 个困难负样本)效果最佳。

困难负样本挖掘是 BGE、E5 等 SOTA 模型的关键训练技巧,能显著提升检索精度。

指令微调嵌入(Instruction-Tuned Embedding)

Section titled “指令微调嵌入(Instruction-Tuned Embedding)”

最新的嵌入模型(如 E5-instruct、BGE-instruct)引入了**指令(Instruction)**概念:嵌入时给模型一个任务指令,如”检索与查询相关的段落”或”找出语义相似的句子”。同一个句子在不同指令下生成不同向量——适配不同任务(检索 vs 分类 vs 聚类)。例如 BGE 要求查询加特定前缀”为这个句子生成表示用于检索相关文章:“,效果提升明显,别漏了。

MTEB(Massive Text Embedding Benchmark) 是目前最权威的嵌入模型综合评估基准,涵盖 8 大类任务:

任务类别评估内容典型数据集
检索(Retrieval)给定查询,从大量文档中召回最相关的MS MARCO, BEIR, MIRACL
重排(Reranking)对候选文档对重新排序AskUbuntu, StackOverflow
分类(Classification)用嵌入做文本分类SST2, AmazonReviews
聚类(Clustering)用嵌入做文本聚类Wiki, Reddit
句子相似度(STS)判断两句话的语义相似程度STS12-STS22, BIOSSES
配对分类(Pair Classification)判断两句话是否是复述Sprint, Twitter
摘要(Summarization)评估摘要与原文的一致性SummEval

MTEB 排行榜是嵌入模型选型的权威参考——但要注意,排行榜分数不等于实际 RAG 效果。实际场景中的查询分布、文档领域、语言比例都与 MTEB 测试集不同,选型时务必在自己的数据集上做 A/B 测试。详见 MTEB 排行榜。

模型来源维度最大 token特点
BGE-M3智源 BAAI10248192多功能(稠密+稀疏+多向量)、多语言、长文本
BGE-large/en/zh智源 BAAI1024512中文效果顶尖,开源可商用
GTE-Qwen2阿里巴巴可变32768基于 LLM 的嵌入,超长上下文
E5-mistral微软40964096基于 Mistral-7B,指令微调,MTEB 顶级
NV-Embed-v2NVIDIA409632768MTEB 排行榜顶级,潜在注意力机制
Voyage-3 / Voyage-3-largeVoyage AI102432000专注 RAG 场景优化,商用 API
OpenAI text-embedding-3-largeOpenAI30728192闭源 API,支持维度截断
OpenAI text-embedding-3-smallOpenAI15368192商用 API 入门,性价比高
Cohere Embed v4Cohere15368192多语言、多模态支持
Jina-embeddings-v3Jina AI10248192长文本检索,任务感知(LoRA)
stellaStephan Tual可变8192开源英文 SOTA,社区训练

选型经验法则:中文优先 BGE-M3 / GTE-Qwen2;英文开源优先 E5-mistral / NV-Embed / stella;商用 API 优先 Voyage-3 或 OpenAI text-embedding-3。务必在自己的业务数据上验证,不要迷信排行榜。

BGE-M3(BAAI, 2024)是 2024-2025 年最重要的开源嵌入模型之一。名称中三个 M 代表 Multi-functionality(多功能)、Multi-linguality(多语言)、Multi-granularity(多粒度)。核心创新是一个模型同时输出三种表示:

三种表示各有优势,可以单独使用,也可以加权融合:

  • 稠密向量(Dense):1024 维,捕捉整体语义相似度,适合语义搜索。
  • 稀疏向量(Sparse):每个词输出一个权重,类似神经网络版的 BM25(关键词匹配),擅长精确匹配专有名词、代码、产品型号。
  • 多向量(Multi-Vector):保留 token 级别嵌入,做 ColBERT 式的延迟交互,精度最高。

BGE-M3 支持超过 100 种语言、最大 8192 token 输入(远超传统嵌入的 512),在 MTEB 多语言排行榜上长期名列前茅。它的”一模型三路输出”设计让你不必在稠密检索和稀疏检索之间二选一,而可以用一个模型同时获得语义搜索和关键词匹配的能力。

Matryoshka Representation Learning(MRL,套娃表示学习) 由 OpenAI 在 2022 年提出,其核心思想极其优雅:训练嵌入模型时,让它同时在多个维度截断下都保持高质量。

名字来自俄罗斯套娃(Matryoshka doll)——大的套娃里套着小的。MRL 训练的向量也是如此:前 8 维已经包含了粗粒度语义信息,前 32 维更精细,前 256 维更精细……直到完整的 768 维或 3072 维。

具体做法是在训练时同时优化多个截断维度:

LMRL=∑mwm⋅L(z1:m),m∈{8,16,32,64,128,256,512,768}L_{MRL} = \sum_{m} w_m \cdot L(z_{1:m}), \quad m \in \{8, 16, 32, 64, 128, 256, 512, 768\}

其中 {8, 16, 32, ...} 是一组截断维度,z_{1:m} 表示只取前 m 维,w_m 是每个维度的权重。模型同时学习”用 8 维也能做检索”和”用 768 维做精确检索”,因此前 m 维不是随机子空间,而是按信息重要性排序的。

训练完成后,你可以直接截断向量维度(只取前 N 维),无需重新训练:

截断维度相对于完整维度的性能存储节省适用场景
768(完整)100%基准精确检索、最终重排
256~98%3 倍大规模向量库主检索
128~96%6 倍初筛过滤、粗召回
64~92%12 倍极大规模、边缘部署
32~85%24 倍原型验证、极低延迟

(上表为示意比例,实际损失因模型和任务而异。)

两阶段检索策略:用截断向量(如 256 维)做快速粗召回,得到 Top-100 候选;再用完整维度(768 维)做精排,选出 Top-10。这样既兼顾了速度又保留了精度。OpenAI text-embedding-3-large 原生支持 MRL——你可以直接指定 dimensions 参数(如 256、512、1536、3072),API 返回截断后的向量。

注意:截断后向量需要重新做 L2 归一化(因为截断改变了向量长度),否则余弦相似度计算会出错。

传统的双编码器(Bi-Encoder)将每个文本压缩成一个向量,速度快但可能丢失细节。ColBERT(Contextualized Late Interaction over BERT) 提出了另一种范式:保留 token 级别的嵌入,在查询时再做细粒度匹配。

ColBERT 对查询(query)和文档(document)分别生成 token 级的嵌入矩阵(而非单个向量)。查询有 L_q 个 token 向量,文档有 L_d 个 token 向量。相关性分数用 MaxSim 操作计算:

MaxSim(Q,D)=∑imax⁡jsim(qi,dj)\text{MaxSim}(Q, D) = \sum_{i} \max_{j} \text{sim}(q_i, d_j)

对查询中每个 token ii,取文档中最相似的 token jj。

直觉上:对查询中的每个 token(如”猫”),在文档中找到最相似的 token(如”小猫""宠物""动物”),取最大相似度;然后把所有查询 token 的最大相似度加起来。这比”一句话压成一个向量再比较”粒度细得多——能够捕捉到”文档里提到了查询中的每个关键概念”这种细粒度匹配。

ColBERT v2(Khattab & Zaharia, 2022)在 v1 基础上做了关键优化:

  • 残差压缩(Residual Compression):将 token 嵌入量化为更紧凑的位表示,存储空间减少 10 倍以上。
  • 位图索引(Bitmap Indexing):加速 MaxSim 的在线计算,使 ColBERT 在大规模检索中变得可行。
  • PLAID 引擎:后续优化的检索引擎,进一步将查询延迟降到数十毫秒级。

何时用 ColBERT vs Bi-Encoder:

特性Bi-Encoder(双编码器)ColBERT(延迟交互)
表示形式每文本 1 个向量每文本 N 个 token 向量
存储成本低高(约 50~100 倍)
查询速度极快较慢
精度好更好(细粒度匹配)
适用场景大规模召回(百万级文档)小规模精排、高精度场景

实践中常见 Bi-Encoder 召回 + ColBERT 精排的级联架构,详见重排序和检索方法。

CLIP(Contrastive Language-Image Pre-training,OpenAI 2021) 把文本和图像映射到同一个向量空间,是多模态嵌入的奠基之作。架构包含两个编码器:

  • 图像编码器:Vision Transformer(ViT),将图片切分为 16×16 的 patch 序列,用 Transformer 编码成一个向量。
  • 文本编码器:标准 Transformer,将描述文字编码成一个向量。
  • 对比学习训练:一个 batch 包含 N 张图和 N 条文本(图-文一一对应),目标是让正确配对的图-文向量靠近、错误配对的远离——本质就是图像版的 InfoNCE。

CLIP 用 4 亿对图文对训练,训练后可以直接用文本搜图、用图搜文、甚至做零样本图像分类(把分类任务转化为”哪段文本描述与图片最相似”)。

SigLIP(Google, 2023)对 CLIP 的对比学习做了关键改进:将 softmax 损失换成独立的 sigmoid 损失。CLIP 的 softmax 要求 batch 内所有样本做归一化计算,batch 越大计算越复杂;而 sigmoid 对每个图-文对独立判断”匹配/不匹配”,不依赖 batch 内其他样本。这一改进使得:

  • 更大的 batch size 可行(不需要全局归一化)。
  • 训练更稳定,尤其在小数据集上。
  • 效果更好,在零样本分类和检索任务上超过 CLIP。

SigLIP 已成为 2024-2025 年多模态 LLM(如 PaliGemma、LLaVA 系列后继模型)的首选视觉编码器。

2025 年的趋势是从”专门的多模态编码器”走向统一嵌入模型(Universal Embedding)——一个模型同时处理文本、图像、音频甚至视频:

  • CLIP / SigLIP 变体:图文检索的标准基座。
  • AudioCLIP / LAION-CLAP:将音频也纳入共享向量空间,支持”用文字描述搜音频”。
  • InternVideo / VideoCLIP:视频嵌入,支持”以文搜视频""以视频搜视频”。
  • ImageBind(Meta):用图像作为”锚点”,将文本、图像、音频、深度图、热成像、IMU 传感器数据等 6 种模态绑定到同一向量空间——不需要所有模态两两配对训练,只需各自与图像对齐。

统一嵌入模型使得”用文字搜视频片段""用一段音频找相似风格的音乐”等跨模态搜索成为可能。实际产品中,Cohere Embed v4 已开始支持图文混合嵌入,Jina clip v2 则提供高质量的中英图文检索能力。

维度典型模型适用场景
384all-MiniLM-L6-v2原型验证、资源受限
768BGE-base、E5-base平衡效果与效率,生产常用
1024BGE-large、BGE-M3、GTE-large追求更高精度
1536OpenAI text-embedding-3-small商用 API 入门
3072OpenAI text-embedding-3-large最高精度,存储成本高
4096E5-mistral、NV-Embed基于 LLM 的嵌入,精度极高

维度越高信息越丰富,但存储和检索成本也越高(向量数据库内存随维度线性增长)。一般 RAG 检索用 768-1024 维即可;配合 Matryoshka 截断,高维模型也可以在低维下高效运行。

Embedding Dimension vs Retrieval Performance

两个嵌入向量的相似度最常用**余弦相似度(Cosine Similarity)**衡量:

cos⁡(A,B)=A⋅B∣A∣×∣B∣\cos(A, B) = \frac{A \cdot B}{|A| \times |B|}

值域 [-1, 1],越接近 1 表示方向越一致(语义越相似)。不关心向量长度,只关心方向——这正是语义比较所需要的。

如果预先对向量做 L2 归一化(使 |A| = |B| = 1),则余弦相似度退化为点积(Dot Product),计算更快——大多数向量数据库默认做归一化,直接用点积即可。

  • 批量嵌入:几乎所有嵌入模型和 API 都支持批量推理。逐条调用 API 会产生巨大的网络开销,应积攒到 100~1000 条一批统一提交。本地推理时,GPU 的并行优势也要求批量处理才能发挥。
  • 缓存嵌入结果:文档嵌入是昂贵操作(尤其调用外部 API),应将结果持久化缓存。文档内容不变则嵌入不变——用文档内容的哈希值(如 MD5/SHA256)作为缓存 key,避免重复计算。
  • 增量更新:知识库新增文档时只需嵌入新文档,无需全量重建。设计好文档 ID 与向量的映射关系。

向量检索引擎的**近似最近邻(ANN, Approximate Nearest Neighbor)**索引主要有两大流派:

索引类型原理优点缺点适用场景
HNSW(分层可导航小世界图)构建多层近邻图,从顶层粗导航到底层精搜查询速度快、召回率高、无需训练内存占用大、构建慢中小规模库(1000 万以下)、低延迟首选
IVF(倒排文件)K-means 聚类后只搜索最近的几个簇内存效率高、构建快需要训练、召回率依赖参数调优大规模库(1000 万以上)、内存受限
IVF-PQ(IVF + 乘积量化)IVF 基础上对向量做压缩编码内存占用极低有精度损失超大规模、资源极受限
Flat(暴力搜索)不做任何近似,计算所有距离100% 精确速度慢、不可扩展小库(10 万以下)、精确基准

经验法则:默认从 HNSW 开始(M=16, ef_construction=200),效果不满足时再调参。百万级以上文档考虑 IVF,亿级考虑 IVF-PQ。详见向量数据库。

详细的索引选型和调参策略,推荐参考 ANN Benchmarks 上的实测对比。

嵌入模型通常限制 512 token 左右(BGE-M3、GTE-Qwen2 等新模型支持 8192+ token),长文档需先**分块(Chunking)**再嵌入。分块策略直接影响检索质量——详见 RAG 的分块策略章节。

用 sentence-transformers 生成嵌入并计算相似度

Section titled “用 sentence-transformers 生成嵌入并计算相似度”
from sentence_transformers import SentenceTransformer, util
# 加载中文友好的嵌入模型(BGE-base,768 维)
model = SentenceTransformer("BAAI/bge-base-zh-v1.5")
# 待比较的句子
sentences = ["我喜欢猫", "我爱小猫", "今天股市大涨"]
embeddings = model.encode(sentences) # 生成嵌入向量
# 计算余弦相似度(0~1,越大越相似)
sim_0_1 = util.cos_sim(embeddings[0], embeddings[1]).item()
sim_0_2 = util.cos_sim(embeddings[0], embeddings[2]).item()
print(f"'我喜欢猫' vs '我爱小猫': {sim_0_1:.3f}") # ≈ 0.85(语义相近)
print(f"'我喜欢猫' vs '今天股市大涨': {sim_0_2:.3f}") # ≈ 0.30(语义无关)
import torch
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("BAAI/bge-base-zh-v1.5") # 768 维
emb = model.encode(["如何训练猫使用猫砂盆"], normalize_embeddings=True)
# 截断到 256 维(取前 256 维),然后重新归一化
for dim in [768, 512, 256, 128, 64]:
truncated = emb[:, :dim]
truncated = torch.nn.functional.normalize(
torch.tensor(truncated), p=2, dim=1
)
print(f"{dim:4d} 维向量: 前 5 个值 = {truncated[0, :5].tolist()}")
from FlagEmbedding import BGEM3FlagModel
model = BGEM3FlagModel("BAAI/bge-m3", use_fp16=True)
queries = ["如何训练猫"]
documents = ["训练小猫使用猫砂盆的方法", "今日股市行情", "猫粮推荐"]
# 同时获取稠密、稀疏、多向量分数
scores = model.compute_score(
model.encode(queries)["embeddings"],
model.encode(documents)["embeddings"],
)
print(scores) # 输出 dense_score, sparse_score, colbert_score
  • 模型选型看语言:中文场景优先 BGE-M3(智源)、GTE-Qwen2(阿里),英文场景优先 E5-mistral、NV-Embed、stella。MTEB 排行榜是参考但不是唯一标准。
  • 归一化向量:存储前对嵌入做 L2 归一化(使向量长度为 1),这样余弦相似度退化为点积,计算更快——大多数向量数据库默认做归一化。
  • 维度与成本的权衡:3072 维的存储和检索成本是 768 维的 4 倍。配合 Matryoshka 截断,可以两阶段检索(低维粗召 + 高维精排)兼顾速度与精度。
  • 异步批量嵌入:建库阶段对数万文档做嵌入很耗时,应批量处理并缓存结果,避免重复计算。
  • 注意最大输入长度:嵌入模型通常限制 512 token 左右,长文档需先分块再嵌入——详见 RAG 的分块策略。
  • 指令前缀:部分模型(如 BGE)要求查询加特定前缀(如”为这个句子生成表示用于检索相关文章:”),效果提升明显,别漏了。
  • 别忽略稀疏检索:纯稠密嵌入对精确匹配(产品型号、代码、人名)较弱,BGE-M3 的稀疏向量或 BM25 混合检索能弥补这一短板——详见检索方法。
  • RAG 语义检索:把知识库文档嵌入向量后,用户提问时用嵌入向量检索最相关段落——所有 RAG 产品的核心。详见 RAG 检索增强生成。
  • 语义搜索:搜索”如何提升销量”时能找到写着”提高营业额的方法”的文档——理解意思而不只是匹配关键词。
  • 推荐系统:把用户兴趣和商品描述都嵌入,推荐向量最相似的商品——淘宝、美团的语义推荐引擎。
  • 文本去重:在海量文档中找出语义重复的内容——新闻聚合去重、论文查重、爬虫数据清洗。
  • 聚类分析:把嵌入向量送入 K-means 等算法,自动发现文档的主题分组。
  • 以图搜图 / 以文搜图:用 CLIP / SigLIP 嵌入打通文本和图像,Pinterest 的相似图片推荐、电商的拍照购物都基于此。
  • 跨模态搜索:统一嵌入模型让”用文字搜视频片段""用音频找相似音乐”成为可能——短视频平台的内容推荐已开始采用。
类库语言说明
sentence-transformersPython最流行的句子嵌入库,内置 SBERT、E5、BGE 等数百个预训练模型
HuggingFace TransformersPython提供底层 Transformer 模型,可自行加载和微调嵌入模型
OpenAI Embeddings APIRESTtext-embedding-3-small / large,闭源商用嵌入服务,支持 MRL 维度截断
Cohere EmbedREST多语言多模态嵌入 API(Embed v4 支持图文)
Voyage AIREST专注 RAG 场景优化的嵌入 API(Voyage-3 系列)
FlagEmbeddingPython智源 BGE 系列官方库,支持 BGE-M3 多功能检索和微调
CLIP / SigLIP / open_clipPython多模态图文嵌入模型,图文共享向量空间
gensimPython经典词嵌入库,提供 word2vec、GloVe、fastText 训练接口
rerankers / ColBERTPython延迟交互检索库,ColBERT v2 及 PLAID 引擎
术语英文解释
稠密向量Dense Vector每一维都有非零值的低维向量(如 768 维),是嵌入的表示形式
稀疏表示Sparse Representation如 one-hot 编码或 BM25 词频向量,绝大多数维度为零
余弦相似度Cosine Similarity衡量两向量方向一致性的指标,值域 -1 到 1,越大越相似
嵌入空间Embedding Space所有嵌入向量构成的高维空间,语义相近的内容向量也相近
对比学习Contrastive Learning通过拉近正样本、推远负样本来训练嵌入的方法
InfoNCEInfoNCE Loss对比学习的核心损失函数,从正负样本中识别正确配对
负采样Negative Samplingword2vec 的加速技巧,用随机噪声词代替遍历整个词汇表
指令微调嵌入Instruction-Tuned Embedding嵌入时加入任务指令,使同一文本在不同任务下生成不同向量
分布式表示Distributed Representation信息分布在所有维度上而非集中在一维的表示方式
分布式假设Distributional Hypothesis上下文相似的词具有相似含义,是嵌入的理论基础
Matryoshka 表示学习MRL训练嵌入在多个维度截断下都保持高质量的方法
延迟交互Late Interaction保留 token 级嵌入到查询时再做细粒度匹配,ColBERT 的核心机制
MaxSimMaxSim OperationColBERT 的核心操作,对查询每个 token 取文档中最相似 token 的分数
孪生网络Siamese Network两个共享权重的编码器分别处理输入对,Sentence-BERT 的架构
池化Pooling将 token 级向量压缩为句子级向量的操作(CLS / Mean / Max)
困难负样本Hard Negative与锚点表面相似但实际不匹配的样本,能提升嵌入判别力
Top-K 检索Top-K Retrieval返回相似度最高的 K 个结果,是语义搜索的标准操作
多模态嵌入Multimodal Embedding将文本、图像、音频等不同模态映射到同一向量空间
MTEBMassive Text Embedding Benchmark涵盖 8 大类任务的综合嵌入评估基准,选型权威参考
  • 分布式假设:Zellig Harris, “Distributional Structure” (Word, 1954);J.R. Firth, “A synopsis of linguistic theory” (1957)——嵌入理论的语言学根源。
  • word2vec:Mikolov et al., “Efficient Estimation of Word Representations in Vector Space” (ICLR 2013),词嵌入的开山之作,提出 Skip-gram 和 CBOW。
  • 负采样:Mikolov et al., “Distributed Representations of Words and Phrases and their Compositionality” (NeurIPS 2013),提出负采样和层次 softmax 优化。
  • GloVe:Pennington, Socher, Manning, “GloVe: Global Vectors for Word Representation” (EMNLP 2014),利用全局词共现矩阵的词嵌入方法。
  • Sentence-BERT:Reimers & Gurevych, “Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks” (EMNLP 2019),句子嵌入里程碑,sentence-transformers 的基础。
  • InfoNCE:Oord et al., “Representation Learning with Contrastive Predictive Coding” (2018),对比学习损失函数的奠基之作。
  • E5:Wang et al., “Text Embeddings by Weakly-Supervised Contrastive Pre-training” (2022),微软的对比学习文本嵌入。
  • BGE / C-Pack:Xiao et al., “C-Pack: Packged Resources To Advance General Chinese Embedding” (2023),智源的中英文嵌入模型,MTEB 中文榜首。
  • BGE-M3:Chen et al., “M3-Embedding: Multi-Lingual, Multi-Functionality, Multi-Granularity Text Embeddings Through Self-Knowledge Distillation” (2024),一模型三功能的统一检索嵌入。
  • Matryoshka 表示学习:Kusupati et al., “Matryoshka Representation Learning” (NeurIPS 2022),多维度截断的嵌入训练方法。
  • ColBERT:Khattab & Zaharia, “ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT” (SIGIR 2020),延迟交互检索的开创之作。
  • ColBERT v2:Santhanam et al., “ColBERTv2: Effective and Efficient Retrieval via Lightweight Late Interaction” (NAACL 2022),ColBERT 的压缩与加速优化。
  • CLIP:Radford et al., “Learning Transferable Visual Models From Natural Language Supervision” (ICML 2021),OpenAI 多模态对比学习,图文共享向量空间的奠基之作。
  • SigLIP:Zhai et al., “Sigmoid Loss for Language Image Pre-Training” (ICCV 2023),Google 改进的图文对比学习,用 sigmoid 替代 softmax。
  • ImageBind:Girdhar et al., “ImageBind: One Embedding Space To Bind Them All” (CVPR 2023),Meta 的六模态统一嵌入。
  • NV-Embed:Lee et al., “NV-Embed: Improved Techniques for Training LLMs as Generalist Embedding Models” (2024),NVIDIA 的 MTEB 顶级嵌入模型。
  • MTEB 排行榜:Muennighoff et al., “MTEB: Massive Text Embedding Benchmark” (EACL 2023),综合评估嵌入模型在 8 类任务上的表现,是选型的权威参考。详见 HuggingFace MTEB Leaderboard。