Agent Engineering 课程阅读
首页/课程一 · RAG 手写/深入 Embedding:向量如何表示语义

在 GitHub 查看原文

本页目录

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 — 向量检索 会讲:有了向量,怎么在大量向量里快速找到最相似的那几个。