大模型的 Embedding:从"词"到"坐标",一篇讲透

Embedding(嵌入)是连接"人类语言"和"机器计算"的那座桥。它把离散的符号(字、词、句子)变成一串连续的数字向量,让模型能在"语义空间"里做加减、比远近、做检索。这篇文档用图文把四件事讲清楚:Embedding 是什么 → 有什么用 → 在模型流水线的哪个阶段工作 → 底层原理是什么,并配上大量示意图、公式和可直接运行的代码。

语义向量 查找表 分布式表示 余弦相似度 RAG 检索 权重共享

1. 什么是 Embedding

一句话:Embedding 是把"符号 / 文本"映射到"高维连续向量空间"的一种表示 —— 让"意思"变成"坐标"。

大模型内部只能做数值运算,但人类给它的是文字。Embedding 干的事,就是给每个"词 / 字 / 句子"分配一个固定长度的数字列表(向量),使得意思相近的东西,向量也离得近

📦 输入

离散符号:一个 Token ID、一个词、一句话。本质是"查字典的编号"。

🧮 中间

一个实数向量:例如 [0.21, -1.34, 0.88, …],长度 d(常见 768~3072)。

🎯 输出效果

"猫"和"狗"的向量近,"猫"和"汽车"的向量远。语义被编码进几何距离。

一个直觉:把"词"放进一张"语义地图"

想象有一张多维地图,每个词是一个点。Embedding 就是这张地图的坐标系:

语义维度① → 语义维度② → 动物:猫 / 狗 / 老虎 水果:苹果 / 香蕉 / 橙子 交通工具:汽车 / 飞机 / 火车
图:语义相近的词在向量空间里聚成簇。注意真实空间是高维的(几百~几千维),这里只是投影到 2D 方便理解。
核心直觉:Embedding 不是"记忆词义的字典",而是"把词义编码进几何关系"。向量本身没有可解释的字面意思,但它的方向和距离承载了语义。

2. Embedding 的作用是什么

三个核心作用:①让计算机"读得懂"文本(数值化)②让语义可比(相似度)③作为一切下游任务的通用输入。

2.1 为什么不能直接用文字?—— 从 One-Hot 到稠密向量

最朴素的表示是 One-Hot(独热):词表第 i 个词,向量就是第 i 位为 1、其余为 0。它有两个致命问题:

  • 维度爆炸且稀疏:词表 10 万,每个词就是 10 万维、且只有 1 个有效值,极浪费。
  • 完全丢失语义关系:"猫"和"狗"的 One-Hot 向量点积为 0,模型看不出它们有任何关联。
One-Hot(稀疏、无语义):词表大小 = 5 时的"猫" 1 0 0 0 0 稠密 Embedding(紧凑、有语义):d = 4 时的"猫" [0.2, -1.3, 0.9, 0.4] ← 每个分量都"有意义",且可比较
图:左边是"猫"的独热向量,只有一位有效;右边是稠密向量,所有维度都携带信息,且能度量相似度。

2.2 作用一:把"语义"变成可计算的"距离"

有了向量,就能回答"这两句话有多像"——这是搜索引擎、推荐、去重、聚类的基础。常用余弦相似度(看"方向"而非"长度")。

2.3 作用二:作为 LLM 的输入表示

在语言模型里,Token ID 必须先过 Embedding 层变成向量,模型后续所有运算(注意力、前馈)都围着这些向量转。没有 Embedding,模型就"读不进文字"。

2.4 作用三:独立做"语义检索 / 向量数据库"

把文档、图片描述、问题都变成向量存起来,来一个新问题时,只比较向量远近就能召回最相关内容——这正是 RAG(检索增强生成) 的基石。

🔍 检索 / 搜索

语义搜索:输入"怎么退订会员",能召回"取消订阅方法"这类字面不同但意思相近的内容。

🧩 分类 / 聚类

把工单、评论按语义自动分组;用 K-Means 在向量空间切簇。

🤝 推荐

用户向量与物品向量求相似,做"猜你喜欢"。

📐 类比推理

经典现象:vec(国王)-vec(男)+vec(女)≈vec(女王),说明向量里藏着关系。

3. Embedding 工作在哪个阶段

分两种角色:① 在 LLM 内部,它是最靠前的输入层;② 在应用侧,它是一个独立的"Embedding 模型",专门产出向量供检索。

3.1 在 LLM 流水线里的位置:输入侧第一步

一个 Token 从文本到生成,要走过这条流水线。Embedding 紧跟在分词之后、位置编码之前——是模型"看见文字"的第一道加工:

文本原始字符串 Tokenizer→ Token ID EmbeddingID → 向量 + 位置编码RoPE × N 层Transformer 输出头→ 下一 Token ↑ Embedding 在"输入阶段",把离散编号变成连续向量,之后全程都用向量
图:在 LLM 内部,Embedding 是输入侧最靠前的一层(高亮蓝框)。注意它处理的是"每个 Token",不是整句。

3.2 输入 Embedding 与输出层:权重常常"共享"

很多模型(如 GPT-2、LLaMA 等)采用 权重 tying(参数绑定):输入 Embedding 矩阵 E 和最后"输出头"把向量映射回词表的矩阵,用的是同一份参数。好处是省参数、且让"输入空间"和"输出空间"保持一致。

输入:token_id iE[i] (取第 i 行,d 维向量)
输出:最后一层向量 h → logits = h · Eᵀ (与同一矩阵相乘得到每词分数)

3.3 独立 Embedding 模型:专做"向量化"的小模型

在实际应用中(尤其是 RAG),我们常不调用大模型本身,而是用一个专门的、更小的 Embedding 模型(如 OpenAI text-embedding-3、BGE、E5)来把文本变成向量。它只干一件事:给任意文本一个"语义坐标",不做生成。

LLM 内部的 Embedding

是语言模型的一个,服务于"下一个词预测",通常输出的是每个 Token 的向量。

独立 Embedding 模型

是完整的小模型,输出整句 / 整段的一个向量(通过池化),专门用于检索与相似度。

一句话区分阶段:在"模型训练 / 推理"里,Embedding 是输入阶段;在"应用架构"里,Embedding 是一个前置的向量化服务,发生在检索 / 入库时,而不是生成时。

4. Embedding 的原理是什么

四步拆开:①有一张"嵌入查找表";②通过训练让"上下文相似的词向量相近";③向量构成高维空间;④用余弦等度量"语义距离"。

4.1 本质是一张巨大的"查找表"(矩阵)

Embedding 层在物理上就是一个可训练的矩阵 E,形状为 词表大小 V × 维度 d。给定一个 Token ID i,直接取第 i 行,就得到它的向量。

E ∈ V × d ,例如 V=128000,d=4096 → 矩阵共约 5.2 亿个参数
Embedding(i) = E[i] ∈ d
嵌入查找表 E(每一行 = 一个 Token 的向量) ID 0 ID 1 ID 2 ID 3 ID V-1 "猫" "狗" "汽车" "苹果" "…" d 维 "猫"与"狗"两行颜色模式相近 → 向量相近 → 语义相近
图:Embedding 层就是一张 V×d 的表。查表是 O(1) 的"按行取向量"操作,不是矩阵乘法(推理时)。训练时它才随梯度更新。

4.2 它是怎么"学会"语义的?—— 分布式假设

关键思想来自语言学家 Firth 的名言:"You shall know a word by the company it keeps"(观其伴而知其义)。 一个词的语义,由它常出现的上下文决定。

  • 经典方式(word2vec / GloVe):让"经常出现在相似上下文里的词"向量相近。比如"猫"和"狗"都常跟"宠物 / 喂 / 可爱"同现,于是向量被拉近。
  • 现代方式(LLM 训练):Embedding 是和整个模型一起,通过"预测下一个 Token"这个目标端到端训练出来的。模型为了把句子接对,被迫把语义相近的 Token 表示得相近。
"我养了一只__" "这只__很可爱" "__在睡觉" 猫 / 狗 / 兔 猫 / 狗 / 兔 猫 / 狗 / 兔 同一批词填进相似句式 → 共享上下文 → 训练后向量被拉近
图:分布式假设。"猫/狗/兔"常出现在同一类句子里,于是它们的 Embedding 在训练中自然靠近。

4.3 高维空间里的"几何":余弦相似度

有了两个向量 a, b,怎么衡量"多像"?最常用余弦相似度——看它们夹角的余弦,只关心方向,不关心长度:

cos(a, b) = (a · b) / (‖a‖ × ‖b‖) ∈ [−1, 1]
相似度越接近 1 → 越像;接近 0 → 无关;接近 −1 → 相反
原点 a = "猫" b = "狗" c = "汽车" θ 小 → 相似度高 θ 大 → 相似度低
图:"猫"与"狗"夹角小 → 余弦接近 1;"猫"与"汽车"夹角大 → 余弦接近 0。语义相似度被编码成几何角度。

4.4 维度、归一化与量化

维度 d

越高能存越多语义信息,但占存储、算得慢。常见 384 / 768 / 1024 / 1536 / 3072。

归一化

很多 Embedding 模型输出会把向量长度规整为 1(L2 归一化),这样"余弦相似度 = 点积",检索更快。

量化

为省内存,向量可从 float32 压成 int8 / 二进制(二值化),相似度近似但体积骤降,代价是精度略损。

4.5 我们怎么"看见"高维向量?—— 降维可视化

向量有几百到几千维,人眼看不见。用 PCA / t-SNE / UMAP 把高维压到 2D,就能画出"语义地图",直观看到聚类:

注意:降维会丢失信息、且距离会被扭曲,只能用于"看个大概",不能拿降维后的坐标去算真实相似度。真实检索永远在高维原空间做。
动物 水果 交通工具 情感词 t-SNE 把高维向量压到 2D:语义相近自动聚成一团
图:经典可视化效果。同类概念(动物 / 水果 / 交通工具 / 情感)在降维后自然成簇,印证了"语义被编码进距离"。

5. Embedding 怎么用(代码 + RAG 全流程)

落地最常见的形态:先把文本变成向量存进"向量数据库",查询时把问题也变成向量,按余弦相似度取最相似的几条,再喂给 LLM。

5.1 单句向量化(OpenAI / 开源均可)

# 用 OpenAI Embedding 模型把文本变成向量 from openai import OpenAI client = OpenAI() resp = client.embeddings.create( model="text-embedding-3-small", input="猫是一种常见的家养宠物", ) vec = resp.data[0].embedding # 一个 Python list,长度 = 1536 print("维度:", len(vec)) # → 1536 # 开源方案(HuggingFace,例如 BGE)等价思路: # vec = model.encode("猫是一种常见的家养宠物") # 返回 numpy 数组

5.2 相似度计算

import numpy as np def cosine(a, b): a, b = np.array(a), np.array(b) return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) s = cosine(vec_猫, vec_狗) # 较高,如 0.8+ s2 = cosine(vec_猫, vec_汽车) # 较低,接近 0

5.3 完整 RAG 检索流程

① 入库(离线 / 定时) 文档切片chunk Embedding 模型→ 向量 向量数据库存 (向量,原文) ② 查询(在线 / 实时) 用户问题"怎么退订?" Embedding 模型→ 查询向量 相似度检索top-k 最邻近 LLM:问题 + 召回原文 → 生成答案 Embedding 不参与"生成",只负责把对的资料"找出来"喂给 LLM。
图:RAG 全景。Embedding 模型在"入库"和"查询"两侧各跑一次,把文本变成可比的向量;真正的"理解 + 回答"由 LLM 完成。
工程提醒:入库和查询必须用同一个 Embedding 模型,否则向量不在同一空间,相似度毫无意义。这也是 RAG 最容易踩的坑。

6. 常见 Embedding 模型一览

选模型看三件事:维度 语言覆盖 检索效果(MTEB 榜单)。下面是常见选项(参数为大致区间,以官方为准)。

模型维度特点 / 适用类型
OpenAI text-embedding-3-small1536(可截断)通用、易用、支持 Matryoshka 可变维度闭源 API
OpenAI text-embedding-3-large3072(可截断)效果更强,维度更高、成本更高闭源 API
BGE(bge-large-zh / bge-m3)1024(m3 多语言)中文很强,开源可私有部署,MTEB 前列开源
E5 / multilingual-e51024多语言,需按 "query: / passage:" 前缀规范输入开源
GTE / gte-large1024阿里开源,中英文均衡,效果好开源
Jina Embeddings512~8192支持超长文本(8K Token),多语言开源 / API
M3-Embedding1024百川,100+ 语言、支持稠密/稀疏/多向量混合检索开源
Matryoshka(套娃)表示:text-embedding-3 系列支持把 3072 维向量直接截断到 256 / 512 / 1024 维使用,精度损失很小,却能大幅省存储与检索耗时——相当于"一个模型多种尺寸"。

维度怎么选?

  • 资源敏感 / 海量文档:优先低维(384~768)+ 量化,检索快、省钱。
  • 效果优先 / 精细语义:中高维(1024~3072),尤其跨语言、长文本场景。
  • 中英混合:优先 BGE / GTE / m3 这类对中文优化过的开源模型。

7. 小结与常见问答

核心结论

  • 是什么:Embedding 是把离散符号(字/词/句)映射成高维连续向量的表示,让"语义"变成"坐标"。
  • 作用:①数值化(让模型读得进文本)②可计算相似度(语义检索/聚类/推荐)③作为 LLM 输入与独立检索服务的通用底座。
  • 阶段:在 LLM 内部,它是输入阶段最靠前的一层(Tokenizer 之后);在应用侧,它是独立的前置向量化服务(入库 / 查询时跑,不参与生成)。
  • 原理:本质是一张 V×d 的查找表;由"分布式假设 / 语言模型目标"训练,使上下文相近者向量相近;用余弦相似度度量语义距离;高维向量可经 t-SNE 等降维"看"聚类。
  • 落地:RAG = 同一 Embedding 模型双向向量化 + 向量库相似检索 + LLM 生成;入库与查询必须同模型。

FAQ

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 要"外接最新资料"的原因。