· liyu · algorithm · 11 min read · — 次浏览
文本向量化演进:从 Word2Vec 到现代 Embedding 模型
文本向量化是搜索、推荐与 RAG 共同的地基。本文快速回顾 one-hot、TF-IDF、Word2Vec 等经典方案的思路与局限,重点拆解现代 Embedding 模型的三大支柱:BERT 上下文表示、Sentence-BERT 句向量专用化与对比学习训练范式,并盘点 BGE、GTE、E5、OpenAI text-embedding-3 等主流模型与 MRL、指令前缀等关键技术。
一、文本向量化:一切语义检索的地基
无论搜索、推荐还是 RAG,第一步都是同一个动作:把文本变成向量。向量是语义的坐标——两个向量足够近,就意味着两段文本语义足够相关。上一篇写 TF-IDF 时讲了它作为稀疏向量化的角色,这篇文章把镜头拉远,看文本向量化的完整演进线:老方案是怎么想的、为什么被淘汰,以及现代主流 Embedding 模型到底强在哪。
二、快速回顾:前三代方案
第一代 one-hot / 词袋 → 向量有了,语义为零
第二代 TF-IDF / LSA → 加权与降维,统计语义
第三代 Word2Vec / GloVe → 分布式词向量,语义涌现
第四代 BERT → SBERT → 对比学习 → 现代 Embedding 模型(本文重点)one-hot:词表多大,向量就多长,当前词的位置是 1、其余全 0。任意两个词都正交,「电脑」和「计算机」的相似度严格为 0——语义信息完全缺失。
TF-IDF:用词频 × 稀缺度给词加权,向量有了轻重之分,还能算余弦相似度。但它依旧建立在「词与词独立」的假设上,只是比 one-hot 聪明的统计,不是语义。
LSA(潜在语义分析):对词-文档矩阵做 SVD 降维,把共现模式压缩进低维潜空间,算是「语义」的第一次尝试,但线性假设太弱。
Word2Vec(2013):真正的分水岭。核心思想是 distributional hypothesis——看一个词的邻居,就知道它的意思。Skip-gram 用中心词预测上下文,训练出的词向量 300 维左右,「国王 − 男人 + 女人 ≈ 女王」的类比性质惊艳了整个行业。GloVe 补上全局共现矩阵的视角,FastText 用子词(n-gram)解决了未登录词。
但第三代有个致命天花板:静态。一个词只有一个向量,「苹果发布了新手机」和「晚饭吃个苹果」里的「苹果」共享同一个表示——一词多义无从谈起。静态词向量的时代,就此让位。
三、现代主流:三大支柱
支柱一:上下文动态表示(BERT)
BERT 用 Transformer 双向编码器替代查表:每个词的向量由整句话共同决定,一词多义自然解决——「苹果」在两句里得到两个不同的向量。这是现代 Embedding 的表达力来源(Transformer 内部机制见我之前写的注意力机制)。
但一个新的尴尬出现了:BERT 不是为「句向量」设计的。直接取 [CLS] 或对词向量做平均池化,得到的句子向量在语义相似度任务上效果很差,甚至不如训练了十年的 Word2Vec 平均。原因是各向异性(anisotropy):BERT 原始输出向量挤在一个狭窄的锥形区域里,随便两句的余弦相似度都高达 0.9+,区分度极低。
支柱二:句向量专用化(Sentence-BERT)
Sentence-BERT(2019)补上第二块拼图:用孪生网络微调 BERT,让「编码句子」本身成为训练目标。Query 和文档过同一个(或两个)编码器得到句向量,再用余弦相似度 / 三元组损失训练,使语义相近的句子在向量空间靠近。
这正是双塔架构在文本侧的应用:编码器把句子映射进同一个语义空间,检索阶段 Query 编码一次,候选向量全部离线预算好。
支柱三:对比学习——统一训练范式
现代 Embedding 模型几乎都用同一个损失函数:InfoNCE。给定查询 q、正样本 d⁺ 和一堆负样本 dᵢ⁻:
exp( sim(q, d⁺) / τ ) ← 正样本得分
L = −log ─────────────────────────────
Σᵢ exp( sim(q, dᵢ) / τ ) ← 正样本 + 全部负样本得分之和直觉:在所有候选里把正样本「拔」到第一名。τ 是温度系数,控制难例的惩罚梯度;sim 通常是余弦相似度;dᵢ 依次取正样本与各个负样本。这个公式的威力全在负样本策略上:
- In-batch Negatives:batch 内其他样本的正例全是我的负例,零成本拿到几十个负样本,GPU 利用率极高;
- 难负例(Hard Negatives):用 BM25 或已有模型检索出「看着相关实则不是答案」的文档当负例,这是 BGE 系列效果好的关键——只见过随机负例的模型,分不清「相关」和「最相关」;
- SimCSE:极端优雅的数据增强——同一句话过两次编码器(dropout 不同)互为正样本,无标注数据也能对齐空间。
四、现代模型全景与关键技术
主流玩家
闭源 API OpenAI text-embedding-3(small/large)、Cohere Embed、Voyage
开源中文系 BGE 系列(智源)、GTE(阿里)、M3E、Conan
开源多语言 BGE-M3、E5 / multilingual-E5、Jina Embeddings现代模型的训练配方大同小异:大规模弱监督预训练(标题-正文、问答对,数亿级)→ 高质量有监督微调(标注偏好数据 + 难负例)→(部分)指令微调与蒸馏。
关键技术一:指令前缀
E5 和 BGE 要求在文本前加任务指令:Query 侧加 为这个句子生成表示以用于检索相关文章:,文档侧不加。这不是玄学——它把「这段文本是要被检索的」显式告诉模型,在非对称检索(短 Query 对长文档)场景能带来可观的提升。用 BGE 系列不写指令前缀,等于白丢几个点的召回。
关键技术二:MRL 套娃表示(Matryoshka)
传统上维度定了就不能改。MRL 训练时让向量的前 k 维本身就可用:text-embedding-3-large 输出 3072 维,但你可以直接截断到 256 维,效果只掉一点点,存储和检索成本降 12 倍。这让「一个模型服务多档 SLA」成为可能——高价值场景用全长,海量场景用短维。
关键技术三:多路合一(BGE-M3)
BGE-M3 的「M3」是 Multi-Lingual、Multi-Functionality、Multi-Granularity:100+ 语言、8192 token 上下文,且一个模型同时输出三种检索向量——稠密向量(语义)、稀疏向量(类 learned sparse 的词权重)、ColBERT 式多向量(late interaction)。上一篇讲的稀疏 + 稠密混合检索,现在一个模型就能把两路向量都生产出来,再用 RRF 融合即可。
动手跑一个
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("BAAI/bge-small-zh-v1.5") # 512 维中文模型
queries = ["为这个句子生成表示以用于检索相关文章:向量数据库怎么选?"]
docs = ["Milvus 适合亿级向量的分布式检索场景", "今天气温骤降注意保暖"]
q_emb = model.encode(queries, normalize_embeddings=True)
d_emb = model.encode(docs, normalize_embeddings=True)
scores = q_emb @ d_emb.T # 余弦相似度(归一化后点积等价)
# → 文档 0 分数显著高于文档 1,尽管两者与 query 无词面重叠五、怎么选:评估与选型速览
- 看榜单:英文看 MTEB,中文看 C-MTEB。榜单只作初筛,拿自己的真实语料做一次召回评测永远比榜单可信;
- 维度与成本:本地开发与中小规模用
bge-small(512 维)够用;大规模上线时用 MRL 截断降维,或直接选小模型 + 精排(交叉编码器重排)的组合; - 私有化约束:数据不能出内网就选开源系(BGE/GTE),CPU 或单卡即可推理;能接受 API 的场景,闭源模型省心且通常质量更稳;
- 别忘记基线:专有名词、型号、代码检索,TF-IDF / BM25 稀疏向量至今仍然能打,纯 Embedding 方案反而容易在精确匹配上翻车。
六、小结
文本向量化的十年,是「语义」逐步进入向量的十年:one-hot 有了形式,TF-IDF 有了轻重,Word2Vec 有了分布式语义,BERT 有了上下文,而对比学习把这些原料锻造成了真正可检索的语义空间。现代 Embedding 模型的全部工作,归结起来就是一句话:让相关的文本靠近,让无关的文本远离——剩下的,交给向量检索。
配合本博客已写的向量数据库选型与 KNN vs ANN,从向量化到检索的完整拼图已经齐了。
回看感悟累计回看 — 次
加载中…