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)。
- ANN 的核心妥协:用一点点精度换巨大的速度(和上篇量化同源)——「几乎最近」对 RAG 足够。
- 向量库快 ≠ 结果准:它只负责「快速找相似向量」,找得对不对仍取决于嵌入模型和切块质量。
延伸阅读
- HNSW 论文(2016)——当前最主流 ANN 索引的原始工作。
- 上篇 6.3 量化——「用精度换效率」的同款哲学,也是向量压缩(PQ)的基础。
- 下一节 K1 小结与自测:把语义检索的两块拼图收成一张图。