本页目录
Lesson 02 — 深入 Embedding:向量如何表示语义
本课目标:把 embedding 这个黑盒拆开。你会亲眼看到文本如何变成向量、为什么相似的句子向量也相近、以及"余弦相似度"到底在算什么。
上一课的
embed_texts()一调,文本就变成一串数字,然后相似度就出来了。这一课我们就来搞懂这背后的原理。
1. 文本是怎么变成向量的?
回忆一下第 1 课,我们把每条知识文本喂给 embedding-3,它返回了一串浮点数(默认 2048 个)。这串数字就叫这个文本的向量(embedding)。
"年假制度:入职满1年享有5天..." → [0.023, -0.114, 0.087, ..., 0.041] (2048个数)
但你可能会问:这 2048 个数到底代表了什么?为什么它能表示语义?
直觉理解:向量 = 语义的"坐标"
想象一个二维坐标系。我们可以给每个词安排一个位置:
y (高)
↑
苹果 | 橘子 ← 水果都在右上角
|
| 汽车 ← 交通工具在右下
|
跑步 | ← 动作在左上
────────┼────────→ x (宽)
|
| 电脑 ← 电子设备在右下偏
在这个假想坐标系里,"苹果"和"橘子"靠得很近(都是水果),而"苹果"和"汽车"离得远。这就是 embedding 的核心思想——把语义"安排"成一个空间位置,相近含义的东西位置也相近。
真实模型用的是 2048 维而不是 2 维(因为语义太复杂,2 维装不下),但原理一样。
💡 你不需要懂模型内部怎么训练的。只要记住:embedding 模型经过海量文本训练,学会了把"含义相近"的文字映射到"空间位置相近"的向量。
2. 怎么衡量两个向量"近不近"?—— 余弦相似度
向量之间的"远近"有几种衡量方式,RAG 里最常用的是余弦相似度(Cosine Similarity)。
几何直觉
把两个向量想象成从原点出发的两支箭头。它们之间的夹角越小,方向越一致,就越相似。
vec_a ↗
/
/ 小夹角 → 很相似
/
──────/──────────
\
\
↘ vec_b(方向差别大 → 不相似)
公式(不复杂,看一眼就懂)
vec_a · vec_b (两向量点积)
cos(θ) = ──────────────────────────────
|vec_a| × |vec_b| (两向量长度乘积)
结果范围是 [-1, 1]:
| 值 | 含义 |
|---|---|
| 1 | 方向完全一致 → 语义极度相似 |
| 0 | 方向垂直(正交)→ 语义无关 |
| -1 | 方向相反 → 语义相反(实际上文本很少出现负值) |
💡 在 RAG 里,两个句子的余弦相似度通常落在 0.3 ~ 0.9 之间。>0.7 就算比较相关了。
为什么用余弦、不用两点距离?
因为文本向量通常很长,我们关心的是"方向是否一致"(语义维度),而不是"长度"。余弦相似度正好忽略了长度,只看夹角。
3. 为什么说 "embedding 质量 = RAG 质量上限"?
回想第 1 课的流水线:
问题 → embedding → 检索 → 喂给大模型
检索这一步,完全依赖"问题向量和文档向量是否足够接近"。如果 embedding 模型本身分不清"年假"和"病假"的区别,那不管你后面用什么花哨的检索算法,结果都不会好。
🎯 关键认知:embedding 是 RAG 的地基。地基不行,上面盖什么都会歪。所以选对 embedding 模型、必要时换更强的模型,往往比调检索参数更有效。
4. 本课代码会做什么
code.py 会做三件事,每一件都让你"看见" embedding:
① 打印向量长什么样
把一句话变成向量,看看它到底是个什么样的数字串(你会看到 2048 个浮点数的前几个)。
② 计算相似度矩阵
准备 8 个句子(分成 3 组语义),算它们两两之间的余弦相似度,打印成一张表。你会直观看到: - 同组句子(语义相近)→ 相似度高(数值大) - 跨组句子(语义无关)→ 相似度低(数值小)
③ 降维可视化
2048 维画不出来,但我们用 PCA 算法把它压缩到 2 维,画成散点图。你会亲眼看到相似的句子在图上聚成一团——这是理解 embedding 最震撼的一刻。
💡 关于 PCA:它是一种降维算法,尽量在 2D 平面上保留原始高维空间里"谁和谁近"的关系。不是 100% 精确,但足够直观。
5. 跑起来
python lessons/02_embedding/code.py
运行后: 1. 终端会打印向量样例、相似度矩阵 2. 会弹出一个图表窗口(散点图 + 热力图),看完后关掉窗口程序才结束
⚠️ 如果你跑在远程/无图形界面环境,图表窗口可能弹不出来。可以用环境变量
export MPLBACKEND=Agg改成存图模式(会存成 PNG 文件)。
下一课 Lesson 03 — 向量检索 会讲:有了向量,怎么在大量向量里快速找到最相似的那几个。