Embedding(嵌入)是连接"人类语言"和"机器计算"的那座桥。它把离散的符号(字、词、句子)变成一串连续的数字向量,让模型能在"语义空间"里做加减、比远近、做检索。这篇文档用图文把四件事讲清楚:Embedding 是什么 → 有什么用 → 在模型流水线的哪个阶段工作 → 底层原理是什么,并配上大量示意图、公式和可直接运行的代码。
一句话:Embedding 是把"符号 / 文本"映射到"高维连续向量空间"的一种表示 —— 让"意思"变成"坐标"。
大模型内部只能做数值运算,但人类给它的是文字。Embedding 干的事,就是给每个"词 / 字 / 句子"分配一个固定长度的数字列表(向量),使得意思相近的东西,向量也离得近。
离散符号:一个 Token ID、一个词、一句话。本质是"查字典的编号"。
一个实数向量:例如 [0.21, -1.34, 0.88, …],长度 d(常见 768~3072)。
"猫"和"狗"的向量近,"猫"和"汽车"的向量远。语义被编码进几何距离。
想象有一张多维地图,每个词是一个点。Embedding 就是这张地图的坐标系:
三个核心作用:①让计算机"读得懂"文本(数值化)②让语义可比(相似度)③作为一切下游任务的通用输入。
最朴素的表示是 One-Hot(独热):词表第 i 个词,向量就是第 i 位为 1、其余为 0。它有两个致命问题:
有了向量,就能回答"这两句话有多像"——这是搜索引擎、推荐、去重、聚类的基础。常用余弦相似度(看"方向"而非"长度")。
在语言模型里,Token ID 必须先过 Embedding 层变成向量,模型后续所有运算(注意力、前馈)都围着这些向量转。没有 Embedding,模型就"读不进文字"。
把文档、图片描述、问题都变成向量存起来,来一个新问题时,只比较向量远近就能召回最相关内容——这正是 RAG(检索增强生成) 的基石。
语义搜索:输入"怎么退订会员",能召回"取消订阅方法"这类字面不同但意思相近的内容。
把工单、评论按语义自动分组;用 K-Means 在向量空间切簇。
用户向量与物品向量求相似,做"猜你喜欢"。
经典现象:vec(国王)-vec(男)+vec(女)≈vec(女王),说明向量里藏着关系。
分两种角色:① 在 LLM 内部,它是最靠前的输入层;② 在应用侧,它是一个独立的"Embedding 模型",专门产出向量供检索。
一个 Token 从文本到生成,要走过这条流水线。Embedding 紧跟在分词之后、位置编码之前——是模型"看见文字"的第一道加工:
很多模型(如 GPT-2、LLaMA 等)采用 权重 tying(参数绑定):输入 Embedding 矩阵 E 和最后"输出头"把向量映射回词表的矩阵,用的是同一份参数。好处是省参数、且让"输入空间"和"输出空间"保持一致。
在实际应用中(尤其是 RAG),我们常不调用大模型本身,而是用一个专门的、更小的 Embedding 模型(如 OpenAI text-embedding-3、BGE、E5)来把文本变成向量。它只干一件事:给任意文本一个"语义坐标",不做生成。
是语言模型的一个层,服务于"下一个词预测",通常输出的是每个 Token 的向量。
是完整的小模型,输出整句 / 整段的一个向量(通过池化),专门用于检索与相似度。
四步拆开:①有一张"嵌入查找表";②通过训练让"上下文相似的词向量相近";③向量构成高维空间;④用余弦等度量"语义距离"。
Embedding 层在物理上就是一个可训练的矩阵 E,形状为 词表大小 V × 维度 d。给定一个 Token ID i,直接取第 i 行,就得到它的向量。
关键思想来自语言学家 Firth 的名言:"You shall know a word by the company it keeps"(观其伴而知其义)。 一个词的语义,由它常出现的上下文决定。
有了两个向量 a, b,怎么衡量"多像"?最常用余弦相似度——看它们夹角的余弦,只关心方向,不关心长度:
越高能存越多语义信息,但占存储、算得慢。常见 384 / 768 / 1024 / 1536 / 3072。
很多 Embedding 模型输出会把向量长度规整为 1(L2 归一化),这样"余弦相似度 = 点积",检索更快。
为省内存,向量可从 float32 压成 int8 / 二进制(二值化),相似度近似但体积骤降,代价是精度略损。
向量有几百到几千维,人眼看不见。用 PCA / t-SNE / UMAP 把高维压到 2D,就能画出"语义地图",直观看到聚类:
落地最常见的形态:先把文本变成向量存进"向量数据库",查询时把问题也变成向量,按余弦相似度取最相似的几条,再喂给 LLM。
选模型看三件事:维度 语言覆盖 检索效果(MTEB 榜单)。下面是常见选项(参数为大致区间,以官方为准)。
| 模型 | 维度 | 特点 / 适用 | 类型 |
|---|---|---|---|
| OpenAI text-embedding-3-small | 1536(可截断) | 通用、易用、支持 Matryoshka 可变维度 | 闭源 API |
| OpenAI text-embedding-3-large | 3072(可截断) | 效果更强,维度更高、成本更高 | 闭源 API |
| BGE(bge-large-zh / bge-m3) | 1024(m3 多语言) | 中文很强,开源可私有部署,MTEB 前列 | 开源 |
| E5 / multilingual-e5 | 1024 | 多语言,需按 "query: / passage:" 前缀规范输入 | 开源 |
| GTE / gte-large | 1024 | 阿里开源,中英文均衡,效果好 | 开源 |
| Jina Embeddings | 512~8192 | 支持超长文本(8K Token),多语言 | 开源 / API |
| M3-Embedding | 1024 | 百川,100+ 语言、支持稠密/稀疏/多向量混合检索 | 开源 |
维度怎么选?
Q1:Embedding 和 Token 什么关系?
A:Tokenizer 把文本切成 Token ID;Embedding 再把每个 ID 变成向量。Embedding 是"ID → 向量"那一步,紧接在分词之后。
Q2:为什么"猫"和"狗"向量近,但模型并不知道它们字面叫什么?
A:向量只编码"关系/语境",不编码"名字"。模型靠训练目标学会:相似的上下文 → 相近的向量。
Q3:整句 Embedding 和逐 Token Embedding 一样吗?
A:不一样。LLM 内部给每个 Token 一个向量;独立 Embedding 模型会对整句的 Token 向量做池化(平均 / CLS),压成一个句向量。
Q4:余弦相似度和点积哪个好?
A:若向量已 L2 归一化,两者等价且点积更快;未归一化时,余弦更稳(不受长度影响)。检索库通常先归一化再用点积。
Q5:Embedding 会"过时"吗?
A:模型是静态的,训练数据截止前的知识才可靠。新概念(如刚出的产品名)可能向量不准——这正是 RAG 要"外接最新资料"的原因。