Agent Engineering 课程阅读

在 GitHub 查看原文

本页目录

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}")

对照矩阵里的值,确认一致。这就是矩阵里每个格子的计算过程。


✅ 完成本课后,你应该能回答

  1. embedding 把文本变成了什么?为什么这串数字能代表语义?
  2. 余弦相似度的公式是什么?值的范围和含义?
  3. 为什么 RAG 用余弦相似度而不是两点间距离?
  4. 为什么说 embedding 是 RAG 的质量上限?