Embedding 向量
是什么
Embedding(嵌入)是将离散的高维符号(如单词、句子、图片、用户ID)映射到连续的低维稠密向量空间的技术。
"猫" → [0.23, -0.81, 0.45, 0.12, ...] # 例:768维向量
"狗" → [0.21, -0.79, 0.43, 0.15, ...] # 语义相近,向量相近
"汽车" → [-0.55, 0.32, -0.11, 0.88, ...] # 语义不同,向量差异大
核心思想:语义相似的事物,在向量空间中距离相近。
为什么需要 Embedding
问题:计算机无法直接处理符号
传统方法用 One-Hot 编码:
| 词汇 | 猫 | 狗 | 汽车 |
|---|---|---|---|
| 猫 | 1 | 0 | 0 |
| 狗 | 0 | 1 | 0 |
| 汽车 | 0 | 0 | 1 |
缺陷:
- 维度爆炸:词汇表10万词 → 10万维向量
- 无语义信息:猫和狗的相似度 = 猫和汽车的相似度(都是0)
- 稀疏低效:99.999% 的值都是0
解决:Embedding 的优势
| 特性 | One-Hot | Embedding |
|---|---|---|
| 维度 | 词汇表大小(万级) | 固定低维(128~4096) |
| 语义 | 无 | 有(相似词向量相近) |
| 稠密度 | 极稀疏 | 稠密 |
| 可计算 | 不可做算术 | 可做向量运算 |
核心原理
分布式假设
“一个词的含义由它的上下文决定” —— J.R. Firth, 1957
出现在相似上下文中的词,语义相近 → 向量相近。
向量空间的几何意义
国王 - 男人 + 女人 ≈ 女王
巴黎 - 法国 + 中国 ≈ 北京
向量之间的加减法可以捕捉语义关系,这是 Embedding 最神奇的特性。
相似度度量
# 余弦相似度(最常用)
similarity = cos(θ) = (A · B) / (|A| × |B|)
# 值域 [-1, 1],越接近1越相似
如何训练 Embedding
Word2Vec(2013,Mikolov)
两种训练方式:
CBOW(Continuous Bag of Words)
- 输入:上下文词 → 预测:中心词
- 适合:高频词
Skip-gram
- 输入:中心词 → 预测:上下文词
- 适合:低频词、罕见词
窗口大小=2,句子:"我 喜欢 吃 苹果 派"
Skip-gram 训练样本:
(吃, 我), (吃, 喜欢), (吃, 苹果), (吃, 派)
GloVe(2014,Stanford)
结合全局共现矩阵统计,比 Word2Vec 更稳定。
BERT / Transformer 时代的 Embedding
现代 LLM 中,Embedding 不再是静态的:
- 静态 Embedding(Word2Vec/GloVe):每个词只有一个固定向量
- 动态 Embedding(BERT/GPT):同一个词在不同上下文中有不同向量
"苹果" 在 "我吃了一个苹果" → 水果语义向量
"苹果" 在 "苹果发布了新iPhone" → 公司语义向量
Embedding 的类型
| 类型 | 示例 | 应用场景 |
|---|---|---|
| 词 Embedding | Word2Vec, GloVe | NLP基础任务 |
| 句子 Embedding | Sentence-BERT | 语义搜索、相似度 |
| 文档 Embedding | Doc2Vec | 文档分类、检索 |
| 图像 Embedding | CLIP, ResNet特征 | 图像搜索、多模态 |
| 用户 Embedding | 推荐系统 | 个性化推荐 |
| 代码 Embedding | CodeBERT | 代码搜索、补全 |
在 LLM 中的位置
输入文本
↓
Token化(分词)
↓
Token ID → Embedding 层(查表)
↓
位置编码(Positional Encoding)叠加
↓
Transformer 层(注意力机制处理)
↓
输出
LLM 的第一层就是 Embedding 层,将 token ID 转换为向量,是整个模型的入口。
位置编码(Positional Encoding)
Transformer 本身无序列感知,需要额外注入位置信息:
最终向量 = Token Embedding + Positional Embedding
RAG 中的 Embedding
RAG(检索增强生成) 的核心就是 Embedding:
1. 建库阶段:文档 → Embedding → 存入向量数据库
2. 检索阶段:用户问题 → Embedding → 向量相似度搜索 → 找到相关文档
3. 生成阶段:相关文档 + 问题 → LLM → 回答
常用向量数据库:Faiss、Chroma、Pinecone、Weaviate、Milvus
维度选择
| 维度 | 代表模型 | 特点 |
|---|---|---|
| 128~256 | 轻量级 | 速度快,精度低 |
| 768 | BERT-base | 平衡 |
| 1536 | OpenAI text-embedding-ada-002 | 高精度 |
| 3072 | text-embedding-3-large | 最高精度 |
维度越高,表达能力越强,但存储和计算成本也越高。
实践代码示例
# 使用 sentence-transformers 生成句子 Embedding
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
sentences = ["我喜欢吃苹果", "我爱吃水果", "今天天气很好"]
embeddings = model.encode(sentences) # shape: (3, 384)
# 计算相似度
from sklearn.metrics.pairwise import cosine_similarity
sim = cosine_similarity(embeddings)
# sim[0][1] ≈ 0.85(前两句相似)
# sim[0][2] ≈ 0.12(第一句和第三句不相似)
# 使用 OpenAI Embedding API
from openai import OpenAI
client = OpenAI()
response = client.embeddings.create(
input="你好,世界",
model="text-embedding-3-small"
)
vector = response.data[0].embedding # 1536维向量
关键概念速查
| 概念 | 解释 |
|---|---|
| 语义空间 | Embedding 向量所在的高维空间 |
| 余弦相似度 | 衡量两向量夹角,与长度无关 |
| 欧氏距离 | 衡量两向量的直线距离 |
| ANN 搜索 | 近似最近邻搜索,向量数据库的核心算法 |
| 微调 Embedding | 在特定领域数据上继续训练,提升领域相关性 |
| 量化 | 将float32压缩为int8,减少存储,略损精度 |