03Bread RAG · 第 3 章
总进度 18 / 33

用 embedding 模型做语义检索

用户的说法 文档的说法 字面检索要面对的差异 公司在哪儿? 总部位于上海 用词不同 vegan 选项 植物基 语言不同 小麦粉从哪里来? 原料采购 问法与栏目名不同 想退货可以吗? 退换货政策 有共同字,但还要看排序和具体条款

2026-09-28约 40 分钟200 行代码难度 ★★

如果想获取全套课程资料,请关注微信公众号 「AI面包君」,回复 「课程资料」 即可领取。

1. 换一种说法,还能找到原文吗?

ch01 的词袋(BoW)检索能用,但它只看字面:

用户的说法文档的说法字面检索要面对的差异
公司在哪儿?总部位于上海用词不同
vegan 选项植物基语言不同
小麦粉从哪里来?原料采购问法与栏目名不同
想退货可以吗?退换货政策有共同字,但还要看排序和具体条款

用户未必知道文档中的准确用词。如果只能靠重复的字词,相关资料就可能排不到前面。

本章用 embedding 模型把文本转换成一组数字,尝试把相关的不同说法表示得更接近。示例 bge-m3 返回 1024 维向量,具体效果仍要通过检索结果检查。

流程仍然是先表示文本、再计算相似度、最后取片段。主要变化是:词频 Counter 换成了模型返回的向量。对照 ch01 阅读,会更容易找到这部分改动。

<!-- bread-visual:start -->

字不一样,意思可能很接近

图解: 把“数词频”替换为模型生成的语义向量。 检索仍然是向量相似度排序;图是概念示意,不代表实测坐标或分数。

<!-- bread-visual:end -->

2. 跑起来

cd ch02_embeddings
python main.py

本章需要 embedding key。如果你跟着课程在 .env 里配了 EMBEDDING_* 三行,开箱即用。 没配的话看仓库顶层 README 的 ".env 配置"小节。

预期输出(关键对比 ch01):

=== 问题 1: 公司在哪儿? ===
[检索] top-3 片段:
  - 第1块 (cos=0.513) ## 一、关于公司       ← BoW 这里基本是 0
  - 第7块 (cos=0.420) ## 七、招聘
  - 第5块 (cos=0.402) ## 五、加盟政策
AI: 总部位于上海。

=== 问题 2: 你们卖的 vegan 选项有哪些? ===
[检索] top-3 片段:
  - 第6块 (cos=0.599) ## 六、研发动态         ← "vegan" ≈ "植物基" 命中了
  - 第2块 (cos=0.581) ## 二、产品线
  - 第8块 (cos=0.541) ## 八、客户常见问题
AI: 目前有植物基羊角面包,正在研发中,预计 7 月推出。

=== 问题 3: 小麦粉是从哪里来的? ===
[检索] top-3 片段:
  - 第3块 (cos=0.645) ## 三、原料采购         ← "从哪里来" ≈ "采购"
  ...

试读到这里 · 后续内容已封存

关注公众号,继续把这章学完

在「AI面包君」发送关键词「学习AI」拿到口令。验证一次,这个浏览器就能继续阅读全部课程。