Lesson 02 练习
改
code.py里对应的代码,运行python lessons/02_embedding/code.py观察变化。 每次改完重新跑,重点看终端的相似度矩阵和弹出的图表。
练习 1:加一个"捣乱句子"
在 SENTENCES 最后加一条和三个主题都无关的句子,比如:
"今天天气晴朗,适合出门散步。",
(别忘了在 GROUP_LABELS 加一个新组,比如 "天气",并在 GROUP_COLORS 加个颜色比如 "purple")
观察:这条新句子和其他句子的相似度是多少?在散点图上它是不是孤零零地飘在一边?
思考:这说明 embedding 能区分"语义无关"——这正是检索时不误召回无关内容的基础。
练习 2:测试"反义/对比"句子
加两条语义相反或对比的句子,看它们的相似度:
"远程办公非常自由,推荐大家多用。", # 正面
"远程办公效率低,应该全面禁止。", # 反面
观察:这两条的相似度是高还是低?
思考:这有点反直觉——明明是相反的观点,为什么向量可能还挺接近? (提示:embedding 主要捕捉"话题/主题"的相似度,而不是"立场"。它们都在讨论"远程办公"这个话题,所以向量接近。情感、立场通常需要专门的模型来区分。)
练习 3:长句 vs 短句
把第一条年假句子改成很简短的版本:
"年假5天。",
再保留原版 "入职满一年有 5 天带薪年假。"。看这两条的相似度。
思考:长短不同的句子,只要语义一致,相似度依然很高吗?为什么余弦相似度能不受长度影响?(提示:回顾 README 里"为什么用余弦不用距离"——它只看方向不看长度。)
练习 4:手算一个余弦相似度(巩固公式)
在 code.py 跑完后,挑两个句子,比如 [0] 和 [1],在终端输出里找到它们在相似度矩阵里的值。
然后用下面的代码单独算一下,验证理解:
# 临时加在 main() 末尾跑
import numpy as np
a, b = vectors[0], vectors[1]
dot = np.dot(a, b) # 点积
norm_a = np.linalg.norm(a) # |a|
norm_b = np.linalg.norm(b) # |b|
cos = dot / (norm_a * norm_b) # 余弦相似度
print(f"点积={dot:.2f}, |a|={norm_a:.2f}, |b|={norm_b:.2f}, cos={cos:.4f}")
对照矩阵里的值,确认一致。这就是矩阵里每个格子的计算过程。
✅ 完成本课后,你应该能回答
- embedding 把文本变成了什么?为什么这串数字能代表语义?
- 余弦相似度的公式是什么?值的范围和含义?
- 为什么 RAG 用余弦相似度而不是两点间距离?
- 为什么说 embedding 是 RAG 的质量上限?