编程基础篇 · AI 背后的数据结构

向量:RAG 检索是在「找最近的邻居」

Embedding 把语义变成坐标,相似度就是距离。在平面上拖动查询点看最近邻怎么变,再看 HNSW 为什么能在亿级向量里瞬间找到

本页解决的问题

先给结论

「向量:RAG 检索是在「找最近的邻居」」要解决的关键问题是什么?

Embedding 把语义变成坐标,相似度就是距离。在平面上拖动查询点看最近邻怎么变,再看 HNSW 为什么能在亿级向量里瞬间找到

判断标准

让这个结论先证明自己值得留下。 把这一页当成决策工具,而不是需要背下来的定义。把概念连到一个真实任务、一个可观察结果,以及一个能改变你判断的失败上。

下一步

写下一个问题:试完这个方法后,你能用什么证据回答它?

常见误区

结论听起来很完整,却没有检查最关键的假设。

先玩地图 · 语义相近 = 坐标相邻

下面是一张迷你语义地图:12 个词已经被 Embedding 安排好了座位,自然聚成三个「街区」。拖动黑色的 ❓ 查询点(或点击地图任意位置放置它),留意:连线永远指向最近的 3 个词,距离实时变化,最近的那个戴 👑。把 ❓ 拖到两个街区中间,看看邻居怎么换人。

试试把 ❓ 拖进「美食街区」,再拖去「科技街区」。
这就是 RAG 检索的全部原理。你的知识库里每段资料都被 Embedding 发了一个坐标(真实世界是 1536 维,不止 2 维,但道理一样);你提问时,问题也被发一个坐标;然后找离问题最近的几段资料,塞进上下文交给大模型。「语义搜索比关键词搜索聪明」的秘密,就是「奶茶」和「杨枝甘露」虽然一个字都不重叠,坐标却挨得很近。
再看速度 · 挨个算 vs 修高速公路

找最近的邻居,最笨的办法是把每个点都量一遍距离。60 个点无所谓,可 RAG 知识库动辄百万段、推荐系统动辄十亿条。下面同一张地图撒了 60 个点,🌟 是你的查询。先点「挨个算」数一数要几步,再点「HNSW 分层跳」对比——留意蓝色跳跃线是怎么「先大跳、再小跳」的。

🐢 挨个算(暴力遍历)
次距离计算
🚀 HNSW 分层跳
次距离计算
HNSW 的直觉:先修高速公路。除了底层的完整地图,再多存几层越来越稀疏的「捷径图」——查询时从最稀疏的高层出发,几大步锁定大区,逐层下降、越跳越细。又是一次空间换时间
60 个点是 60 次 vs 8 次,数据到亿级就是「等几分钟」和「毫秒」的区别。暴力遍历的次数跟着数据量一比一地涨;HNSW 每层跳几步就能砍掉一大片搜索范围,亿级向量也只要几十步。向量数据库(Milvus、Pinecone、FAISS 这些名字你迟早会遇到)卖的核心本事,就是把这几层「捷径图」建好、维护好。
这和 AI 有什么关系?
📚

RAG 检索

问题和资料都变坐标,找最近的几段资料塞给大模型——你每天用的「基于知识库回答」,底层就是本页这两个动画。

🖼

以图搜图

图片也能 Embedding 成坐标。拍张沙发照片搜同款,就是在几亿张图的语义地图上找你照片的邻居

🎯

猜你喜欢

你的口味是一个坐标,每首歌每部剧也是。推荐系统天天在做的事:找离你最近的那批内容,端上来。

「先玩地图 · 语义相近 = 坐标相邻」为什么能找到相关内容

「下面是一张迷你语义地图:12 个词已经被 Embedding 安排好了座位,自然聚成三个「街区」。」把检索问题从“把资料存起来”推进到“怎样找到真正相关的资料”。这一步决定了 RAG、推荐和以图搜图最后交给模型的输入质量。

相似度不是答案,召回之后还要核对

在「找最近的邻居,最笨的办法是把每个点都量一遍距离。60 个点无所谓,可 RAG 知识库动辄百万段、推荐系统动辄十亿条。下面同一张地图撒了 60 个点,🌟 是你的查询。」对应的流程里,Embedding 负责把对象放到可比较的语义空间,近邻索引负责减少搜索范围,最终的回答仍然依赖召回片段是否覆盖问题、距离指标是否合适,以及内容有没有过期。

  • 语义变坐标 :Embedding 给每句话、每张图发一个高维地图上的位置
  • 相似变距离 :意思越近坐标越近——「语义搜索」四个字的全部原理
  • 检索变找邻居 :RAG、以图搜图、猜你喜欢,全是同一个「近邻搜索」问题

先区分找得到和找得准

把「你的口味是一个坐标,每首歌每部剧也是。推荐系统天天在做的事: 找离你最近的那批内容 ,端上来」落成一次小测试:准备几条有明确答案的查询,记录召回的相关性、遗漏和无关结果,再决定是否需要换切分方式、索引或重排。

从「先玩地图 · 语义相近 = 坐标相邻」走到「再看速度 · 挨个算 vs 修高速公路」

「先玩地图 · 语义相近 = 坐标相邻」先把问题落在「下面是一张迷你语义地图:12 个词已经被 Embedding 安排好了座位,自然聚成三个「街区」。 拖动黑色的 ❓ 查询点 (或点击地图任意位置放置它),留意:连线永远指向 最近的 3 个词 ,距离实时变化,最近的那个戴 👑。把 ❓ 拖到两个街区中间,看看邻居怎么换人」上;到了「再看速度 · 挨个算 vs 修高速公路」,讨论继续推进到「找最近的邻居,最笨的办法是把每个点都量一遍距离。60 个点无所谓,可 RAG 知识库动辄百万段、推荐系统动辄十亿条。下面同一张地图撒了 60 个点,🌟 是你的查询。 先点「挨个算」数一数要几步,再点「HNSW 分层跳」对比 ——留意蓝色跳跃线是怎么「先大跳、再小跳」的」。两段连起来,重点就不只是记住一个结论,而是看清它成立所依赖的条件。

把这条判断带到下一个场景

检索系统也可以这样看:先确定什么算相关,再观察召回是否覆盖问题,最后检查排序、切分和时效性有没有把真正有用的内容挤出去。

  • 「先玩地图 · 语义相近 = 坐标相邻」:下面是一张迷你语义地图:12 个词已经被 Embedding 安排好了座位,自然聚成三个「街区」。 拖动黑色的 ❓ 查询点 (或点击地图任意位置放置它),留意:连线永远指向 最近的 3 个词 ,距离实时变化,最近的那个戴 👑。把 ❓ 拖到两个街区中间,看看邻居怎么换人
  • 「再看速度 · 挨个算 vs 修高速公路」:找最近的邻居,最笨的办法是把每个点都量一遍距离。60 个点无所谓,可 RAG 知识库动辄百万段、推荐系统动辄十亿条。下面同一张地图撒了 60 个点,🌟 是你的查询。 先点「挨个算」数一数要几步,再点「HNSW 分层跳」对比 ——留意蓝色跳跃线是怎么「先大跳、再小跳」的
  • 「最后的要点」:又是空间换时间 :多花存储建捷径图,换检索从分钟级降到毫秒级

最后的「最后的要点」把讨论落到「又是空间换时间 :多花存储建捷径图,换检索从分钟级降到毫秒级」。回看这条线索时,最值得保留的是:当输入、规模或风险改变,哪些判断需要重新做一遍。

✅ 这一课想和你分享的

  • 语义变坐标:Embedding 给每句话、每张图发一个高维地图上的位置
  • 相似变距离:意思越近坐标越近——「语义搜索」四个字的全部原理
  • 检索变找邻居:RAG、以图搜图、猜你喜欢,全是同一个「近邻搜索」问题
  • 快靠分层捷径:HNSW 多存几层稀疏「高速公路」,亿级数据几十步到达
  • 又是空间换时间:多花存储建捷径图,换检索从分钟级降到毫秒级
标记为已学完 阅读进度会自动记录
← 上一篇下一篇 →

继续阅读

同一条线上的下一篇。

文章讨论

读到这里,留下一个判断。

把刚想明白的地方、还没想通的问题,留给下一位一起学习的人。

正在讨论 向量:RAG 检索是在「找最近的邻居」 AI 背后的数据结构
3条讨论文章讨论 · 与共学社区同步
在共学社区查看
AM
Asha Morgan内容编辑
观点实践记录

我把这篇文章里的一个判断改写成了今天可以验证的小实验。比记住结论更有用的是,知道下一步要观察什么。

文章讨论7 有帮助
LH
Lin Harper独立开发者
观点观点

读完以后我先回头找它成立的条件,而不是直接把方法搬进项目。这个顺序让后面的取舍清楚很多。

文章讨论5 有帮助
KM
Kiki Moore产品运营
问题问题

如果把这个判断放到真实工作里,最先需要补的约束是什么?我想知道从阅读到第一次实践之间,哪一步最值得先做。

文章讨论4 有帮助