第4章 Embedding¶
学习目标¶
- 理解文本向量化的原理与意义
- 掌握余弦、欧氏、点积三种距离度量的差异
- 了解主流 Embedding 模型及其适用场景
- 理解向量维度对存储与性能的影响
- 使用 Python 生成文本向量并完成语义相似度计算
问题导入¶
"猫"和"小猫咪"在字面上不同,但语义高度相似;传统关键词匹配无法识别这种关系,导致搜索"猫咪粮"时找不到标注为"猫粮"的商品。Embedding(向量化)技术解决了这一难题:它把文本映射为高维向量,使语义相近的内容在向量空间中距离更近。Embedding 是语义搜索、推荐系统、RAG(检索增强生成)乃至 Agent 长期记忆的底层基石。掌握 Embedding,就掌握了让 AI"理解语义"的钥匙。本章将从原理、模型、度量到实战,系统讲解这一核心能力。
核心概念¶
1. 向量化原理¶
Embedding 是将离散文本(词、句、文档)映射为连续稠密向量(如 1536 维浮点数)的过程。模型通过对比学习训练:让语义相近的文本对距离缩小、不相关的文本对距离拉大。最终向量空间的几何结构反映了语义关系——例如经典的 king - man + woman ≈ queen。
2. 距离度量¶
- 余弦相似度(Cosine Similarity):衡量向量方向夹角,范围 [-1, 1],对向量长度不敏感,是文本相似度最常用度量。
- 欧氏距离(Euclidean Distance):衡量向量空间绝对距离,对长度敏感。
- 点积(Dot Product):同时考虑方向与模长,归一化后等价于余弦相似度,计算最快。
选择原则:归一化向量用点积(最快);关注方向相似性用余弦;关注绝对差异用欧氏。
3. 主流 Embedding 模型¶
| 模型 | 厂商 | 维度 | 特点 |
|---|---|---|---|
| text-embedding-3-small/large | OpenAI | 1536/3072(可降维) | 通用性强,性价比高 |
| voyage-3 / voyage-large | Voyage AI | 1024/2048 | 检索质量领先 |
| bge-m3 / bge-large-zh | 智源 | 1024 | 中文开源领先 |
| Qwen3-Embedding | 阿里 | 1024/2048 | 中英文双语优秀 |
| CLIP | OpenAI | 512 | 跨模态(图+文) |
| BERT / sentence-transformers | Google/社区 | 768 | 经典开源方案 |
4. 向量维度与性能¶
- 高维(如 3072):表达能力强,召回精度高,但存储与检索成本上升。
- 低维(如 384/768):速度快、占用小,适合大规模初筛。
- Matryoshka 维度降维:OpenAI text-embedding-3 支持指定
dimensions参数,从 3072 降到 256 仍保留主要语义,便于按需权衡精度与成本。
5. 多模态 Embedding¶
CLIP 等模型将图像与文本映射到同一向量空间,使"以图搜文""以文搜图"成为可能。这对电商商品检索、内容审核等场景价值巨大。
6. Embedding 在 Agent 中的作用¶
- 长期记忆:将历史对话向量化存储,按需检索。
- 工具路由:根据用户意图向量匹配最相关工具。
- 示例选择:在 few-shot 中动态挑选最相似的示例。
原理图¶
flowchart TD
TextA[文本A: 猫咪粮] --> Model[Embedding模型]
TextB[文本B: 猫粮] --> Model
TextC[文本C: 狗粮] --> Model
Model --> VecA[向量A\n0.12, 0.88, ...]
Model --> VecB[向量B\n0.15, 0.85, ...]
Model --> VecC[向量C\n0.71, 0.30, ...]
VecA --> Sim{相似度计算}
VecB --> Sim
Sim --> Result[A与B相似度高\nA与C相似度低]
subgraph 向量空间
VecA -.近.-> VecB
VecC -.远.-> VecA
end
图:Embedding 将语义相近的文本映射到向量空间相近位置
示例代码¶
使用 OpenAI Embedding API 生成文本向量,并用余弦相似度比较语义。
import os
import math
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
def get_embedding(text: str, model: str = "text-embedding-3-small") -> list[float]:
"""获取文本的 Embedding 向量。
Args:
text: 待向量化的文本。
model: Embedding 模型名称。
"""
resp = client.embeddings.create(model=model, input=text)
return resp.data[0].embedding
def cosine_similarity(vec_a: list[float], vec_b: list[float]) -> float:
"""计算两个向量的余弦相似度。
Args:
vec_a: 向量 A。
vec_b: 向量 B。
"""
dot = sum(a * b for a, b in zip(vec_a, vec_b))
norm_a = math.sqrt(sum(a * a for a in vec_a))
norm_b = math.sqrt(sum(b * b for b in vec_b))
return dot / (norm_a * norm_b)
if __name__ == "__main__":
texts = ["猫咪粮", "猫粮", "狗粮", "汽车保养"]
embeddings = {t: get_embedding(t) for t in texts}
query = "给小猫吃什么"
query_vec = get_embedding(query)
print(f"查询: {query}")
for t in texts:
sim = cosine_similarity(query_vec, embeddings[t])
print(f" 与 '{t}' 相似度: {sim:.4f}")
运行结果说明:会输出"给小猫吃什么"与四个文本的相似度,"猫咪粮""猫粮"得分最高,"汽车保养"最低,直观展示语义检索能力。
企业案例¶
案例 1:电商语义搜索¶
某电商平台用 text-embedding-3-large 将 5000 万商品标题向量化并存入向量数据库,用户搜索"夏天的薄外套"能精准召回"轻薄防晒衣""夏季透气夹克"等结果,CTR 较关键词搜索提升 35%。
案例 2:客服知识库检索¶
某银行将 2 万条 FAQ 向量化,客服 Agent 接到用户问题时先做向量检索,命中 Top-3 后再交给 LLM 生成回答。准确率从 72% 提升至 91%,且新增 FAQ 无需重新训练模型。
案例 3:跨模态商品推荐¶
某时尚电商使用 CLIP 将商品图片与用户浏览文本统一向量化,实现"看到一张连衣裙图片→推荐相似款文字描述"的跨模态推荐,转化率提升 22%。
常见问题¶
Q1:Embedding 维度越高效果越好吗? A:不一定。维度提升带来的边际收益递减,且存储和检索成本线性增长。建议先在小规模数据上对比 768/1536/3072 的召回率,选择性价比最优的。
Q2:不同 Embedding 模型的向量能直接比较吗? A:不能。每个模型的向量空间不同,跨模型比较相似度无意义。换模型需重建整个向量库。
Q3:中文该用 OpenAI 还是国产模型? A:中文场景下 bge-large-zh、Qwen3-Embedding 通常优于 OpenAI 的通用模型,且支持本地部署。但 OpenAI 模型在多语言混合场景更稳定。
Q4:向量需要定期更新吗? A:Embedding 模型升级或业务语料发生显著变化时需要重新生成。建议设计版本管理机制,支持灰度切换。
面试题¶
1. 解释余弦相似度与欧氏距离的区别及适用场景。 参考答案:余弦只关注方向,对向量长度不敏感,适合文本语义相似度;欧氏关注绝对距离,对长度敏感,适合需要考虑"强度"的场景(如用户画像差异)。
2. 为什么归一化向量后点积等价于余弦相似度?
答题要点:归一化后向量模长为 1,点积公式 a·b = |a||b|cosθ 退化为 cosθ。
3. 如何选择 Embedding 模型? 答题要点:看语言(中/英/多语)、维度需求、是否需本地部署、MTEB 榜单表现、成本预算,并用自己的业务数据做 A/B 评测。
4. 简述 Matryoshka 降维的原理与价值。 参考答案:在训练时让向量的不同维度子集都保持语义信息,推理时可截断到更低维度,实现"一次训练,按需降维",平衡精度与成本。
练习题¶
- 相似度实验:用
text-embedding-3-small计算"苹果手机""iPhone""华为手机"两两相似度,观察语义关系。 - 维度对比:分别用 1536 维与 256 维(
dimensions参数)对 100 条文本做检索,对比 Top-5 召回率差异。 - 思考题:如果两条文本向量余弦相似度为 0.99,是否说明它们一定语义相同?举一个反例。
小结¶
Embedding 将文本映射为高维向量,使语义相似性可计算,是语义搜索、RAG 与 Agent 记忆的底层基础。余弦相似度是最常用的度量;OpenAI、Voyage、bge、Qwen 等模型各有优势,需结合语言、维度、成本选型。延伸阅读:OpenAI Embeddings 指南、MTEB 中文榜单、CLIP 论文《Learning Transferable Visual Models From Natural Language Supervision》。