跳到主要内容

K1.2 向量数据库:在亿万个坐标里秒级找最近邻

「找最近的点」有个隐藏的坑​

上一节说,语义检索的本质是「找坐标离查询最近的点」。在实验里那个只有 11 段资料的小知识库,这没问题——挨个算一遍距离,11 次比较,一眨眼就完。

但真实的知识库不是 11 段。一家公司的全部文档、一个网站的所有页面,切完块动辄几百万上千万段。如果每来一个用户查询,都要和库里全部向量各算一次距离,那就是几百万次计算——慢到用户等得睡着。这个「和全部逐一比对」的笨办法叫线性扫描,库越大越慢,根本没法用在生产上。

于是需要一个专门的工具来解决它。

向量数据库登场​

向量数据库就是专门为这件事造的:它存海量向量,并能极快地找出「离给定查询最近的几个邻居」。它不像普通数据库那样按「等于/大于」查行,而是按「谁离我最近」查向量。

它靠什么快?靠一个关键的妥协——不追求「最近」,只追求「几乎最近」。

近似最近邻:用一点点精度换巨大的速度​

这个妥协有个正式名字:近似最近邻(ANN,Approximate Nearest Neighbor)。

它的思路是:精确地找到「那个绝对最近的点」代价太高;但如果允许偶尔漏掉真正第一名、返回一个「几乎最近」的,速度就能快上几个数量级。对 RAG 来说这笔买卖太划算了——检索本来就要返回好几段(top-k),个别名次错一位、极偶尔漏掉一个边缘结果,对最终答案几乎没影响,换来的却是从「几百万次比对」到「几十次比对」的飞跃。

这和上篇 6.3 节量化是同一种工程哲学:用一点点精度,换巨大的效率。整个 AI 工程里,这种「够用就好」的取舍无处不在。

打个比方帮你记住 ANN 的聪明之处:

你要找「离你最近的餐馆」。笨办法是量出你到全城每一家餐馆的距离,再挑最小的——这是线性扫描。聪明办法是:城市早就按区、商圈分好了层,你只需要「先定位到自己所在的商圈,再在这一小片里找」。ANN 就是给向量空间提前建好了这样一张分区地图,让你不必走遍全城。

向量库不只是「快」​

除了 ANN 索引,一个生产级向量数据库通常还负责:

  • 存向量 + 元数据:每段向量旁边挂着「来自哪篇文档、哪一节、什么日期」等信息(这些元数据在 K5 引用和下面的过滤里都要用);
  • 带过滤的检索:「只在 2025 年之后的文档里找」「只在『财务』分类里找」——先按元数据缩小范围,再在里面找最近邻;
  • 增删改:文档更新了,能高效地插入新向量、删除旧的(回扣 K0:知识库随时可更新,正是 RAG 的核心优势)。

主流选型(2025–2026 年生态,不展开):专用向量库如 Milvus、Qdrant、Weaviate;也有传统数据库/搜索引擎加向量扩展的路线,如 PostgreSQL 的 pgvector、Elasticsearch——后者的好处是「一套系统同时做关键词和向量检索」,为 K3 混合检索提供便利。

向量库快 ≠ 结果准

两个必须澄清的点。其一:ANN 是近似——它极少数情况下会漏掉真正最近的那个。生产中要在「召回率」(找全的比例)和「速度」之间调参数,追求极致召回就得牺牲速度,反之亦然,没有免费的午餐。其二,也更重要:向量库只解决「快速找到相似向量」这一件事。至于找回来的东西对不对、全不全,取决于前面两步——嵌入模型好不好(K1.1)、切块切得对不对(K2)。库再快,喂进去的是烂向量,捞出来的也是烂结果。别把「检索快」误当成「检索好」。

小结​

本节要点
  • 语义检索要「找最近的点」,但库有几百万段时,和全部逐一比对(线性扫描)慢到没法用。
  • 向量数据库专门解决这个:存海量向量并极快找最近邻,靠的是近似最近邻(ANN)。
  • ANN 的核心妥协:用一点点精度换巨大的速度(和上篇量化同源)——「几乎最近」对 RAG 足够。
  • 向量库快 ≠ 结果准:它只负责「快速找相似向量」,找得对不对仍取决于嵌入模型和切块质量。
📝 动手自测0/3
1. 为什么真实 RAG 系统不能用「和库里全部向量逐一算距离」的办法做语义检索?
2. 「近似最近邻(ANN)」的核心取舍是什么?
3. 「我们把向量库换成了最快的那个,RAG 效果应该就好了」——这个想法的问题在哪?

延伸阅读​

  • HNSW 论文(2016)——当前最主流 ANN 索引的原始工作。
  • 上篇 6.3 量化——「用精度换效率」的同款哲学,也是向量压缩(PQ)的基础。
  • 下一节 K1 小结与自测:把语义检索的两块拼图收成一张图。