什么是 Embedding
Embedding(嵌入) 指把文本、图像、音频等非结构化数据转换为固定长度的数值向量(如 1536 维浮点数数组),使得语义相近的内容在向量空间中距离更近。
打个比方:
- 关键词搜索 = 字面匹配("苹果"和"iPhone"是两个词,不匹配)
- Embedding = 语义匹配("苹果"和"iPhone"在向量空间中很近,因为语义相关)
Embedding 是让机器"理解语义"的核心技术,是 RAG、语义搜索、推荐系统、聚类分析的底层基石。
Embedding 的直觉理解
一维示例
假设用 1 个维度表示"积极-消极":
消极 ←--- -0.8 --- -0.3 --- 0 --- 0.5 --- 0.9 ---→ 积极
"糟糕" → -0.8
"一般" → -0.3
"还行" → 0.5
"棒极了" → 0.9
"糟糕"和"一般"距离近(都偏消极),"还行"和"棒极了"距离近(都偏积极)。
多维扩展
实际 Embedding 用几百到几千维:
"苹果手机" → [0.12, -0.34, 0.56, ..., 0.78] (1536 维)
"iPhone" → [0.11, -0.32, 0.55, ..., 0.80] (1536 维)
"香蕉" → [-0.45, 0.67, -0.12, ..., 0.03] (1536 维)
用余弦相似度计算:
- "苹果手机" vs "iPhone" → 0.95(很近)
- "苹果手机" vs "香蕉" → 0.21(很远)
这就是语义搜索的原理:把查询和文档都转成向量,找最近的。
Embedding vs 关键词搜索
| 维度 | 关键词搜索(BM25) | Embedding 语义搜索 |
|---|---|---|
| 匹配方式 | 字面匹配 | 语义匹配 |
| "苹果手机"搜"iPhone" | ❌ 不匹配 | ✅ 匹配 |
| 同义词 | ❌ | ✅ |
| 多语言 | ❌ | ✅(跨语言模型) |
| 错别字容忍 | ❌ | ✅ |
| 精确匹配 | ✅ 强 | ⚠️ 弱 |
| 计算成本 | 低 | 中(向量计算) |
| 可解释性 | 高(哪个词命中) | 低(黑盒) |
| 适合场景 | 精确检索、代码搜索 | 语义检索、问答 |
最佳实践:两者结合(Hybrid Search)。关键词搜索保精确,Embedding 补语义。
Embedding 的生成流程
文本 → Tokenize → Embedding 模型 → 向量 → 存入向量数据库
步骤 1:Tokenize
把文本切分为 token(词/子词):
"我爱AI编程" → ["我", "爱", "AI", "编程"]
步骤 2:模型推理
Embedding 模型(如 text-embedding-3-small)把 token 序列转为向量:
from openai import OpenAI
client = OpenAI()
response = client.embeddings.create(
model="text-embedding-3-small",
input="我爱AI编程"
)
vector = response.data[0].embedding # 1536 维浮点数组
步骤 3:存储与检索
把向量存入向量数据库(Pinecone / Milvus / Qdrant),查询时用余弦相似度找最近邻。
主流 Embedding 模型对比
| 模型 | 维度 | 最大输入 | 中文支持 | 价格 | 适合 |
|---|---|---|---|---|---|
| OpenAI text-embedding-3-small | 1536 | 8191 token | ✅ | $0.02/1M token | 通用首选 |
| OpenAI text-embedding-3-large | 3072 | 8191 token | ✅ | $0.13/1M token | 高精度 |
| Cohere embed-multilingual-v3 | 1024 | 512 token | ✅ | $0.10/1M token | 多语言 |
| BGE-large-zh-v1.5(开源) | 1024 | 512 token | ✅ 优秀 | 免费 | 中文自部署 |
| M3E-base(开源) | 768 | 512 token | ✅ 优秀 | 免费 | 中文自部署 |
| Jina embeddings v2 | 8192 | 8192 token | ✅ | $0.02/1M token | 长文本 |
| Voyage AI voyage-2 | 1024 | 4000 token | ✅ | $0.10/1M token | 检索优化 |
选型建议
- 通用 + 省钱:OpenAI text-embedding-3-small
- 中文 + 自部署:BGE-large-zh-v1.5 或 M3E-base
- 长文本:Jina embeddings v2(8K 上下文)
- 高精度:OpenAI text-embedding-3-large
- 多语言:Cohere embed-multilingual-v3
维度与成本的权衡
维度越高,表达力越强,但存储和计算成本越高:
| 维度 | 存储成本(1M 向量) | 检索延迟 | 表达力 |
|---|---|---|---|
| 384 | ~1.5 GB | 快 | 中 |
| 768 | ~3 GB | 中 | 良 |
| 1024 | ~4 GB | 中 | 优 |
| 1536 | ~6 GB | 中 | 优+ |
| 3072 | ~12 GB | 慢 | 极优 |
技巧:OpenAI text-embedding-3 支持降维,可从 3072 降到 256,损失少量精度换取大幅成本节省:
response = client.embeddings.create(
model="text-embedding-3-large",
input=text,
dimensions=256 # 从 3072 降到 256
)
相似度计算方法
| 方法 | 公式 | 特点 | 适合 |
|---|---|---|---|
| 余弦相似度 | cos(A,B) = A·B / ( | A | |
| 点积 | A·B | 看方向+长度 | 已归一化的向量 |
| 欧氏距离 | √Σ(Ai-Bi)² | 看绝对距离 | 图像 Embedding |
| 曼哈顿距离 | Σ | Ai-Bi |
最常用:余弦相似度,范围 [-1, 1],越接近 1 越相似。
Embedding 的应用场景
1. RAG(检索增强生成)
用户问题 → Embedding → 向量数据库检索 → Top-K 相关文档 → 喂给 LLM 生成答案
详见 RAG 术语详解。这是 Embedding 最重要的应用。
2. 语义搜索
查询 "怎么提高转化率" → Embedding → 找到 "提升下单率的 5 个方法"
3. 推荐系统
用户浏览历史 → Embedding → 找语义相近的内容推荐
4. 聚类分析
把所有文档 Embedding → K-Means 聚类 → 自动发现主题分组
5. 去重与相似检测
文档 A Embedding vs 文档 B Embedding → 相似度 > 0.9 → 判定为重复
6. 分类
文本 Embedding → 训练分类器 → 情感分类 / 意图识别
主流向量数据库
| 数据库 | 特点 | 适合 |
|---|---|---|
| Pinecone | 托管 SaaS,零运维 | 快速上线 |
| Milvus | 开源,高性能 | 自部署大规模 |
| Qdrant | 开源,Rust 写 | 性能与轻量 |
| Weaviate | 开源,内置模块化 | 多模态 |
| pgvector | PostgreSQL 扩展 | 已有 PG 的团队 |
| Chroma | 轻量,Python 原生 | 原型开发 |
选型建议:已有 PostgreSQL 用 pgvector;快速原型用 Chroma;生产大规模用 Milvus 或 Pinecone。
常见误区
- 误区 1:维度越高越好。超过 1536 维收益递减,成本翻倍。
- 误区 2:Embedding 能理解所有语义。它只懂训练数据见过的模式,领域术语需微调。
- 误区 3:换模型后向量能混用。不同模型的向量空间不同,换模型必须重新 Embedding 全量数据。
- 误区 4:Embedding 适合精确匹配。代码搜索、ID 查找用关键词搜索更好。
- 误区 5:Embedding 永久有效。模型升级后旧向量可能失效,需定期重新生成。
- 误区 6:长文本直接 Embedding。超过模型最大输入会被截断,需先分块(chunking)。
分块(Chunking)策略
长文档不能直接 Embedding(超长度限制),需先分块:
| 策略 | 方法 | 适合 |
|---|---|---|
| 固定长度 | 每 500 字一块 | 简单通用 |
| 按段落 | 按自然段分 | 文章、博客 |
| 按语义 | 用模型检测语义边界 | 技术文档 |
| 滑动窗口 | 重叠 10-20% | 防止边界信息丢失 |
| 递归分块 | 先大块再小块 | 层级结构文档 |
最佳实践:块大小 200-500 token,重叠 10-20%,按语义分块优于固定长度。
与其他术语的关系
- LLM:大语言模型,Embedding 是它的"眼睛"
- RAG:检索增强生成,Embedding 是检索的基础
- Fine-tuning:微调,可定制 Embedding 模型
- Hallucination:幻觉,RAG + Embedding 是缓解方案
- Token:token,Embedding 的输入单位
小结
Embedding 是让机器"理解语义"的核心技术:把文本变成向量,用距离表达语义相似度。它是 RAG 的地基、语义搜索的引擎、推荐系统的内核。
选型原则:
- 通用场景用 OpenAI text-embedding-3-small(便宜好用)
- 中文自部署用 BGE-large-zh-v1.5
- 已有 PostgreSQL 用 pgvector 存向量
- 长文本先分块再 Embedding
理解 Embedding,才能理解 RAG 为什么能"查着答"、语义搜索为什么能"懂你意思"。这是 AI 应用开发者的必修课。