「北京」和「中国的首都」没有一个字相同,但任何现代搜索系统都能判断它们语义几乎等同——支撑这件事的不是什么语法分析,而是一种朴素到近乎笨拙的技术:把每段文字映射成高维空间里的一个向量(embedding),然后让「语义相近」变成「距离相近」。理解、检索、推荐、去重、聚类,几乎所有语义任务的地基都是这个向量。本文从它的来路讲起:词向量怎么让「国王 − 男人 + 女人 ≈ 女王」成立,BERT 之后同一个词为什么会有不同的向量,以及 2026 年的 embedding 模型版图与它的能力边界。
从 one-hot 到词向量:符号如何变成几何
最早的文本表示是 one-hot:词表里每个词一个位置,该词为 1 其余为 0。它的问题一眼可见——任何两个词的距离都相等,「猫」和「狗」与「猫」和「微积分」在向量空间里毫无区别,语义信息为零。
改变来自一个语言学假设(分布假说):一个词的含义,由它周围经常出现的词决定。2013 年 Mikolov 等人的 word2vec(arXiv:1301.3781)把这个假设变成了工程:用神经网络在大规模语料上训练,让经常共现的词拥有相近的向量。训练完的副产品震惊了所有人——语义关系成了向量空间里稳定的方向,最著名的演示是「国王 − 男人 + 女人 ≈ 女王」:从「国王」的向量里减去「男人」的方向、加上「女人」的方向,最近的邻居居然就是「女王」。性别的语义被编码成了空间里一条可计算的直线。
但 word2vec 有一块先天短板:每个词只有一个静态向量。「苹果发布新手机」和「我吃了一个苹果」里的「苹果」,在该模型眼里是同一个点——一词多义被硬生生抹平了。
上下文嵌入:BERT 之后,同一个词不同的向量
2018 年 BERT(arXiv:1810.04805)为代表的 Transformer 模型改写了这一点:词的向量由上下文动态计算——同样的「苹果」,出现在「发布手机」旁边和「削皮」旁边,会得到两个不同的向量。一词多义从此有了自然的表达。更重要的是,Transformer 的自注意力让整个句子被压缩成一个「句子向量」,文本表示的单位从词升级到了句子与段落。
这里要区分两个容易混淆的东西(本站《一篇读懂 Reranker》也强调过):双塔编码器(bi-encoder)把查询和文档分别独立编码成向量,然后算距离——可以离线建库、毫秒级检索,这是「embedding 检索」的本体;交叉编码器(cross-encoder)把查询和文档拼在一起喂给模型,直接输出相关性分数——精度高但每对都要跑一次模型,没法预计算,所以只用于对召回结果精排。embedding 负责「快而广」,reranker 负责「慢而准」,两者是分工不是竞争。
顺带解释一个让新手踩坑的实现细节:不少主流开源模型(E5、BGE 系列等)是「指令感知」的,训练时查询和文档带着不同前缀(如 query: 与 passage:),推理时必须照抄这个格式,漏掉前缀检索质量会明显下降——调用任何 embedding 模型前,先读它的模型卡,看它预期的输入格式。
向量的算术:余弦相似度
比较两个 embedding,业界标准动作是余弦相似度:两个向量的夹角越小,分数越接近 1。为什么用夹角不用直线距离?一是 embedding 通常按方向编码语义、按模长编码「信息量」之类的杂讯,归一化后只比方向更干净;二是高维空间里欧氏距离有「距离集中」现象,区分度会退化,余弦更稳。实现只需几行:
import math
def cosine(a, b):
"""余弦相似度:1 同向,0 正交,-1 反向。"""
dot = sum(x * y for x, y in zip(a, b))
na = math.sqrt(sum(x * x for x in a))
nb = math.sqrt(sum(x * x for x in b))
return dot / (na * nb)
text_embedding = [0.8, 0.2, 0.1]
query_embedding = [0.7, 0.3, 0.0]
random_embedding = [0.1, 0.0, 0.9]
print(cosine(text_embedding, query_embedding)) # 约 0.99:语义几乎一致
print(cosine(text_embedding, random_embedding)) # 约 0.30:方向基本无关
2026 年的主流模型已经把输入输出做成了「一等公民」。以 OpenAI 的 text-embedding-3-large 为例:输出 3072 维向量、支持 8192 token 的长输入、定价每百万 token 0.13 美元;轻量的 text-embedding-3-small 是 1536 维、每百万 token 0.02 美元,便宜 6 倍而 MTEB 均分只差约 2 分——大批量场景的性价比之选。Google 的 gemini-embedding-001 走多模态路线,文本、图像、音视频映射到同一个空间;开源侧 Qwen 的 embedding 系列是公开权重阵营的头牌,而 Google 刚刚发布的开源模型 EmbeddingGemma 2 展示了一个有趣的方向——原生 768 维、可无损截断到 512、256 甚至 128 维使用。评测方面,MTEB 及其后继榜单覆盖检索、聚类、分类等数十个任务,text-embedding-3-large 约 64.6 分的成绩在今天仍属第一梯队,但开源模型的差距已缩小到个位数分。
工程链路:从文本到毫秒级检索
embedding 真正的威力要在工程链路里才显现。一条标准 RAG 检索管线是这样的:文档切块(chunking)→ 逐块算 embedding → 连同向量存入向量数据库;查询到达时,查询文本同样算出向量,然后在库里找最近的 K 个邻居(KNN)。这条链路里最容易被低估的环节其实是第一步:切块定 granularity,也定误差的上限——块太大,一个向量要同时代表多个主题,语义被平均稀释,检索回来的块里大半是无关内容;块太小,上下文断裂,单块信息不足以回答问题。固定长度加重叠(overlap)是最省事的基线,按标题、段落边界做语义切块通常更稳,而「查询是短句、文档是长块」的粒度错配,正是很多检索效果差的隐藏元凶。
查询到达后的检索难点全在最后一步——百万、亿级向量里暴力扫描太慢,实际都走近似最近邻(ANN)索引,最常用的是 HNSW(分层可导航小世界图,Malkov 与 Yashunin,arXiv:1603.09320):多层跳表式的图结构,用「先粗后细」的导航把查找复杂度降到对数量级,代价是召回率略降与建图耗时。工程上的核心权衡永远是三元组:召回率、延迟、内存——索引参数调松调紧,就是在三者之间搬砖。
另一个绕不开的现实是混合检索。纯向量检索擅长语义泛化(「怎么退货」能匹配「售后政策」),但对编号、型号、罕见专有名词这类「一个 token 都不能错」的查询会幻觉出「差不多」的邻居。所以生产系统普遍是「BM25 + 向量」双路召回再融合(RRF),本站《一篇读懂 BM25》里那套词频统计的 1994 年公式,至今仍是向量检索的标配搭档——两条路各自补对方的盲区。
套娃表示:维度也可以按需伸缩
2026 年 embedding 模型最重要的架构思想是套娃表示学习(Matryoshka Representation Learning,arXiv:2205.13147)。训练时就让向量的前缀承载完整语义:前 128 维是一个粗粒度表示,前 256 维更细,直到全维。效果是存储与速度可以按需伸缩——初筛用截断到 128 维的短向量(内存省 95%、扫描更快),精排再用全维。前文提到的 EmbeddingGemma 2 正是官方支持从 768 维截断到 512、256、128 维使用;OpenAI 文档也明确 text-embedding-3 系列「支持截短向量而几乎不损失质量」。对亿级向量库来说,这不是锦上添花:维度砍半意味着索引内存与 ANN 扫描成本近乎砍半,这套「一个向量、多种精度」的设计正在成为新模型的默认配置。
边界与误区
最后是四个高频误区。其一,embedding 不是知识:它把语义压成一个固定长度的点,注定丢失细节——「相似」的判断可以外包给它,「正确」的判断不能,所以 RAG 里向量召回之后必须有精排与生成环节把关。其二,相似不等于相关:余弦分数高只说明「语义距离近」,查询与文档可能「都是关于错误处理的」但答案根本没在文档里;分数要当相对信号用,别当绝对判据。其三,模型换版本 = 全库重建:不同模型(甚至同一模型的不同版本)的向量空间互不兼容,混用等于拿伦敦的坐标在纽约找路;社区里出现过同一模型几天内输出细微漂移的报告,对可复现性敏感的系统应把向量落库留存、钉住模型版本。其四,它不擅长精确匹配:订单号、报错码、人名 ID 这类查询请直接交给关键词检索——向量会把「ERR_50021」模糊成「差不多也是 500 开头的错误」。
小结
embedding 的本质是一次「翻译」:把人类语言的语义,翻译成高维空间里的几何关系,让「意思相近」第一次成为计算机可以直接计算的东西。从 word2vec 的静态词向量,到 BERT 的上下文动态表示,再到今天的套娃多精度向量,这条技术线的每一步都在回答同一个问题——如何让「相似」这个模糊的人类判断,变成稳定、廉价、可规模化的算术。它不聪明,甚至有点笨:不懂因果、不辨真伪、记不住细节;但正因为它的简单与快,它成了今天每一个语义系统的地基。理解了 embedding,RAG、推荐、去重、聚类的入门文档就都从「天书」变成了「流程图」。
参考资料
- word2vec:Efficient Estimation of Word Representations in Vector Space(Mikolov et al.,2013):词向量与「国王−男人+女人」的经典出处。
- BERT: Pre-training of Deep Bidirectional Transformers(Devlin et al.,2018):上下文动态表示的奠基工作。
- Matryoshka Representation Learning(arXiv:2205.13147):套娃表示的原始论文,前缀即完整表示。
- HNSW:Efficient and robust approximate nearest neighbor search(Malkov & Yashunin):主流 ANN 索引的论文。
- OpenAI Embeddings 文档:text-embedding-3 系列维度、定价与截断支持的官方口径(2026-10-08 查证)。
- EmbeddingGemma 2(Google 官方博客):开源多模态 embedding、原生 768 维可截断至 128 维的最新示例。
读者留言
COMMENTS 暂无还没有留言,来说第一句?