前言:为什么要向量数据库?
在AI时代,我们处理的数据形态发生了根本变化:
传统数据库存储的是结构化数据:数字、字符串、日期
AI应用处理的是语义:一段文本的含义、一张图片的内容、一段语音的意思
这些语义信息被表示成向量(Vector)——一串浮点数,比如 [0.123, -0.456, 0.789, ...]。
向量数据库就是专门用来存储、索引、查询这些向量的数据库。它的核心价值是:在百万级甚至十亿级向量中,毫秒级找出与查询向量最相似的前K个结果。
一、向量相似度搜索的挑战
理解为什么需要专门的算法,先看暴力搜索的问题。
1.1 暴力搜索的复杂度
最简单的思路:计算查询向量与库中每个向量的相似度,排序取前K个。
python
复制
下载
import numpy as np from typing import List, Tuple def brute_force_search(query: np.ndarray, vectors: List[np.ndarray], top_k: int = 5): """暴力搜索:计算与所有向量的距离,排序返回Top K""" distances = [(idx, np.sqrt(np.sum((query - vec) ** 2))) for idx, vec in enumerate(vectors)] distances.sort(key=lambda x: x[1]) return distances[:top_k] # 10000个128维向量 np.random.seed(42) vectors = [np.random.randn(128) for _ in range(10000)] query = np.random.randn(128) results = brute_force_search(query, vectors, top_k=5) print("搜索结果:", results)问题很明显:100万向量要算100万次距离,10亿向量要算10亿次——生产环境完全不可接受。
| 数据规模 | 暴力搜索耗时 | 能否接受? |
|---|---|---|
| 1万 | ~1ms | ✅ 可以 |
| 100万 | ~100ms | ⚠️ 有点慢 |
| 1000万 | ~1s | ❌ 太慢 |
| 1亿 | ~10s | ❌ 不可用 |
1.2 维度诅咒
向量通常是高维的。OpenAI的text-embedding-3-small是1536维,large是3072维。高维空间里,传统空间索引(如KD-Tree)效率急剧下降,甚至比暴力搜索还慢。
这就是为什么需要近似最近邻(ANN)算法:放弃100%准确率,换取100倍甚至1000倍的速度提升。
二、主流ANN算法
2.1 HNSW:分层小世界图
HNSW(Hierarchical Navigable Small World)是目前最流行的算法,灵感来自六度分隔理论。
核心思想:构建多层图结构,高层稀疏节点作为"高速通道",快速定位大致区域;底层全量数据精细搜索。
分层结构:
Layer 0:存全部向量
层数越高,节点越少,充当高速通道
<