Embedding 与向量表示
是什么
Embedding 是将离散的符号(文字、Token、图片)映射为连续的高维数值向量的技术。
人类用文字理解世界,机器用向量理解世界。Embedding 就是连接两者的桥梁。
一句话:Embedding 让计算机能够用数学方式衡量”两个东西有多像”。
"国王" → [0.12, -0.45, 0.78, ..., 0.33] (一个 768 维的向量)
"王后" → [0.13, -0.44, 0.76, ..., 0.35] (非常相似!)
"自行车" → [-0.67, 0.23, -0.11, ..., 0.89](完全不同)
为什么需要 Embedding
计算机不懂文字
计算机只能做数学运算。如果不把文字转成数字,模型无法处理任何自然语言任务。
传统编码的问题
One-Hot 编码(最朴素的方案):
词表: [猫, 狗, 鱼, 鸟]
猫 → [1, 0, 0, 0]
狗 → [0, 1, 0, 0]
鱼 → [0, 0, 1, 0]
鸟 → [0, 0, 0, 1]
问题:
- 维度爆炸:词表有 10 万个词,每个向量就是 10 万维,绝大部分是 0
- 语义丢失:猫和狗的距离 = 猫和鱼的距离 = 猫和桌子的距离。所有词彼此等距,完全没有语义关系
Embedding 的解法
Embedding 将每个词压缩到一个低维稠密向量(如 768 维),并且语义相似的词在向量空间中距离更近:
"猫" 和 "狗" → 向量距离 0.15(近,都是宠物)
"猫" 和 "汽车" → 向量距离 0.92(远,毫无关系)
关键概念辨析
Token 向量、词向量、句向量
这三个概念容易混淆,但含义不同:
| 概念 | 粒度 | 说明 | 典型维度 |
|---|---|---|---|
| Token 向量 | 子词级 | LLM 内部的基本表示单元。一个 Token 可能是一个字、半个词、一个标点 | 4096-12288 |
| 词向量(Word Embedding) | 词级 | 给每个完整的词一个固定向量。代表:Word2Vec、GloVe | 100-300 |
| 句向量(Sentence Embedding) | 句子/段落级 | 将整个句子压缩为一个向量。代表:Sentence-BERT、text-embedding-ada-002 | 768-1536 |
上下文无关 vs 上下文相关
词向量(Word2Vec 等)—— 上下文无关:
"bank"(银行)→ [0.5, 0.3, ...]
"bank"(河岸)→ [0.5, 0.3, ...] ← 同一个向量!无法区分歧义
每个词有且只有一个固定向量,无论它出现在什么上下文中。
Token 向量(Transformer 等)—— 上下文相关:
"I went to the bank to deposit money" 中的 "bank" → 偏向"银行"的向量
"I sat on the bank of the river" 中的 "bank" → 偏向"河岸"的向量
同一个词在不同上下文中会生成不同的向量——这就是 Transformer 自注意力机制的威力。
Embedding 的生成方式
1. 查表(Token Embedding Layer)
LLM 内部最基础的 Embedding 方式:
Token ID → 查 Embedding 矩阵 → 得到向量
Embedding 矩阵大小 = 词表大小 × 向量维度
例:32000 × 4096 = 约 1.3 亿参数(仅 Embedding 层)
这个矩阵在训练过程中学习得到——初始是随机的,随着训练不断调整,语义相似的 Token 会自然聚到一起。
2. 专用 Embedding 模型
当需要将任意长度的文本(句子、段落、文档)压缩为一个向量时,使用专用 Embedding 模型:
| 模型 | 开发方 | 维度 | 特点 |
|---|---|---|---|
| text-embedding-ada-002 | OpenAI | 1536 | API 调用,通用能力强 |
| text-embedding-3-large | OpenAI | 3072 | 更高精度,支持维度截断 |
| BGE-large | BAAI(智源) | 1024 | 开源,中文能力强 |
| E5-mistral-7b-instruct | Microsoft | 4096 | 基于 LLM 的重量级方案 |
| Sentence-BERT | UKP Lab | 768 | 开源经典 |
这些模型的核心作用是为 RAG 系统 提供语义检索能力。
向量空间的性质
语义相似度
两个向量越”近”,语义越相似。最常用的距离度量:
余弦相似度(Cosine Similarity):
cos(A, B) = (A · B) / (|A| × |B|)
范围:-1 到 1
1 = 完全相同方向(语义一致)
0 = 正交(无关)
-1 = 完全相反方向(语义对立)
为什么用余弦而不是欧氏距离? 余弦只关注方向,不关注长度,对向量的缩放不敏感,更适合衡量”语义方向”。
向量算术
经典发现(Word2Vec 时代):
向量("国王") - 向量("男人") + 向量("女人") ≈ 向量("王后")
这说明 Embedding 空间中捕捉到了”性别”这个语义维度。类似地:
向量("巴黎") - 向量("法国") + 向量("日本") ≈ 向量("东京")
向量空间具有线性可加性,语义关系可以通过向量运算表达。
在 AI 系统中的应用
1. LLM 内部表示
每个 Token 在 LLM 内部都是一个向量,流经每一层 Transformer Block 后不断被修改、丰富语义:
输入层 Token 向量:只含基本语义
↓
第 1 层:融入局部上下文
↓
第 N/2 层:融入句法、语义结构
↓
第 N 层:融入全局理解和任务信息
2. 语义检索(RAG)
将用户查询和文档库都转为向量,通过余弦相似度找最相关的文档:
用户查询: "如何配置 Docker 网络?"
↓ Embedding 模型
查询向量: [0.23, -0.11, ...]
↓ 在向量数据库中搜索最近邻
匹配文档: "Docker 网络模式配置指南"(相似度 0.92)
这是 RAG 系统的核心环节,详见 05-RAG 原理。
3. 聚类与分类
将大量文本 Embedding 后,可以用聚类算法(K-Means 等)自动发现主题分组,或用向量作为特征训练分类器。
4. 推荐系统
将用户和内容都映射到同一向量空间,通过距离计算实现个性化推荐。
向量数据库
当文档量达到百万级以上时,暴力搜索所有向量不现实。向量数据库提供高效的近似最近邻(ANN)搜索:
| 数据库 | 类型 | 特点 |
|---|---|---|
| Pinecone | 云服务 | 全托管,开箱即用 |
| Weaviate | 自托管/云 | 开源,支持混合搜索 |
| Milvus | 自托管 | 开源,大规模高性能 |
| ChromaDB | 本地/嵌入式 | 轻量,适合开发与原型 |
| pgvector | PostgreSQL 扩展 | 无需新数据库,直接在 PG 中使用 |
| FAISS | 库(非数据库) | Meta 出品,纯计算库,极快 |
核心索引算法:
- IVF(Inverted File Index):先聚类,再在最近的几个簇中精确搜索
- HNSW(Hierarchical Navigable Small World):构建多层图结构,快速导航到目标
- PQ(Product Quantization):压缩向量减少内存,牺牲少量精度
延伸阅读
- 01-LLM 原理:Token 和 Tokenizer 的基础
- 02-Transformer 架构:自注意力如何利用向量
- 05-RAG 原理:Embedding 在检索增强生成中的核心作用