向量数据库检索原理:从 Embedding 到最近邻搜索
| 技术在 AI 时代,向量数据库是 RAG(检索增强生成)系统的核心基础设施。但它究竟是如何工作的?为什么能实现"语义搜索"而非传统的关键词匹配?本文用通俗的方式解释其背后的原理。
一、从文字到数字:什么是 Embedding?
要让计算机"理解"文字,最直接的方式是把文字转换成向量——一串数字。
这个转换过程叫 Embedding(嵌入),由 AI 模型完成。以文本为例,常见的 Embedding 模型(如 text-embedding-ada-002、BGE、M3E)会把一段文字转换为一个固定长度的向量,比如:
"我喜欢吃苹果" → [0.23, -0.45, 0.87, 0.12, ...] (1536 维的浮点数数组)
"水果很甜" → [0.18, -0.52, 0.91, 0.08, ...]
为什么这样有效?关键是:语义相近的文字,在向量空间中距离更近。
想象一个二维坐标系,“狗"和"猫"的向量会离得很近,因为它们都是动物;而"狗"和"汽车"会离得很远。这种"距离"和"方向"的关系,就是向量表示的精髓。
二、为什么需要向量数据库?
传统数据库的搜索依赖精确匹配:搜索"苹果”,只会返回包含"苹果"这个词的结果。
但这有几个问题:
- 无法理解语义:“金毛"和"狗"是同一个东西,但传统搜索找不到
- 无法处理同义词:“手机"和"移动电话”
- 无法跨模态:一张狗的图片,无法用文字"狗"搜到
向量数据库的核心能力是语义相似性搜索:给定一个查询向量,找到和它"最相似"的向量对应的原始内容。
三、相似度怎么度量?
知道了向量表示,下一步是如何衡量两个向量之间的"相似程度”。常用两种指标:
1. 余弦相似度(Cosine Similarity)
衡量两个向量的方向是否接近,取值范围 [-1, 1]:
cosine = (A · B) / (|A| × |B|)
值为 1 表示方向完全相同,0 表示正交(无关),-1 表示完全相反。
2. 欧几里得距离(Euclidean Distance)
衡量向量在空间中的直线距离:
distance = √(Σ(Aᵢ - Bᵢ)²)
距离越小,表示越相似。
两种方法各有适用场景:
- 余弦相似度:不考虑向量长度,适合文本相似度(词频不同但语义相近)
- 欧几里得距离:考虑向量长度,适合图片、音频等特征
四、KNN 与 ANN:精确搜索 vs 近似搜索
有了相似度度量,就可以做搜索了。最朴素的方法是暴力搜索:计算查询向量与数据库中每个向量的距离,返回最近邻的 K 个。
这就是 KNN(K-Nearest Neighbors)——线性扫描所有数据。
但问题来了:当向量规模达到百万、亿级时,线性扫描的计算量是无法承受的。假设有 10 亿条向量,每次查询要做 10 亿次距离计算——太慢了。
于是,ANN(Approximate Nearest Neighbor,近似最近邻搜索) 应运而生。ANN 的核心思想是:牺牲一点点精度,换取巨大的性能提升。它不追求找到绝对最近的 K 个,而是找到"差不多近"的 K 个,但在实际应用中,这种近似是可接受的。
ANN 的实现有多种路线,工业界主流的 ANN 索引可分为四大类:
| 类型 | 代表算法 | 核心思想 | 特点 |
|---|---|---|---|
| 基于图 | HNSW、NSW | 构建近邻图,贪婪遍历搜索 | 搜索速度快,召回率高,是目前工业界最流行的方案 |
| 基于量化 | PQ(乘积量化)、IVF | 用编码压缩向量,查表加速距离计算 | 内存占用低,适合超大规模数据 |
| 基于树 | KD-Tree、ANNOY | 用空间划分树做剪枝搜索 | 适合低维数据,高维下效果急剧下降 |
| 基于哈希 | LSH | 用局部敏感哈希映射到桶,只在桶内搜索 | 对分布均匀的数据效果好 |
其中 HNSW(Hierarchical Navigable Small World,分层可导航小世界) 是目前工业界最流行的 ANN 算法,我们重点介绍其原理。
HNSW 的核心思想
HNSW 基于"小世界网络"——你可能听说过"六度分隔理论",世界上任意两个人之间最多隔 6 层关系。小世界网络的特点正是:任意两个节点之间只有很短的距离。
HNSW 在此基础上构建了多层图结构:
Layer 3 (最上层): [A] ---- [B] # 只有少数几个节点
Layer 2: [A]---[C]---[D]---[B] # 中间层
Layer 1: [A]-[C]-[E]-[G]-[D]-[B] # 较密
Layer 0 (底层): [A]-[C]-[E]-[G]-[D]-[B]-[F]-[H] # 所有节点
底层包含所有数据点,越往上层节点越少、越稀疏。节点之间互相连接,构成"近邻图"。
HNSW 的搜索过程
HNSW 的搜索是自顶向下的——先在稀疏的上层快速定位目标区域,再在下层精细化搜索:
- 从顶层入口点开始:在最稀疏的层,找一个和查询向量相对接近的节点
- 贪婪遍历:在当前层,沿着边不断移动到更近的邻居,直到找不到更近的节点
- 进入下一层:用上层的终点作为下层的入口,重复贪婪遍历
- 到底层:最终在底层找到 K 个最近邻
search query
↓
Layer 3: 从 [A] 开始 → 贪婪遍历到 [B] 停下
↓
Layer 2: 从 [B] 开始 → 贪婪遍历到 [D] 停下
↓
Layer 1: 从 [D] 开始 → 贪婪遍历到 [G] 停下
↓
Layer 0: 从 [G] 开始 → 贪婪遍历,返回最近邻结果
为什么快?因为上层节点稀疏,每次跳转能跳过大量节点,快速定位到目标区域的大致位置。下层再逐步精细化搜索。
HNSW 的索引构建
HNSW 是增量构建的:新数据插入时,从顶层随机决定落在哪一层(层数越高概率越低),然后逐层找到最近的邻居并建立连接。这个过程保证了新数据插入无需重建整个索引,且搜索和插入都有不错的性能。
PQ(乘积量化) 和 IVF(倒排文件索引) 也是常见的 ANN 方案:
- IVF:先对向量做 K-Means 聚类,搜索时只在其最近的几个簇内搜索,大幅缩小范围
- PQ:把高维向量分成若干子空间,每个子空间独立量化编码(如 1536 维压缩到 16 字节),搜索时通过查表快速计算距离
IVF + PQ 常组合使用:IVF 负责减少搜索范围,PQ 负责加速距离计算,在 Milvus、Faiss 等数据库中广泛使用。
七、向量数据库在 RAG 中的角色
说了这么多原理,来看一个实际应用——RAG(检索增强生成)。
完整的 RAG 流程分为离线索引和在线检索两个阶段:
向量数据库在在线检索阶段扮演核心角色:用 ANN 算法快速从海量向量中找到和查询最相关的 K 个。
八、总结
| 概念 | 作用 |
|---|---|
| Embedding | 把文字/图片/音频转换成固定维度的向量 |
| 相似度度量 | 余弦相似度、欧几里得距离衡量向量间的相似程度 |
| KNN | 线性扫描所有向量,找最近的 K 个(精确但慢) |
| ANN | 近似最近邻搜索,用巧妙的数据结构换取速度和可接受精度 |
| 四大索引类型 | 图(HNSW)、量化(PQ/IVF)、树(KD-Tree)、哈希(LSH) |
理解这些核心概念后,你会发现向量数据库并不是什么黑科技——它本质上解决的是高维空间中快速找到相似项这个经典问题。只不过在 AI 时代,有了 Embedding 这个强大的"翻译器",让计算机终于能理解文字、图片的语义了。
参考资料: