向量数据库深入
问题
向量数据库的核心索引算法有哪些?如何选择适合自己场景的向量数据库?
答案
一、向量数据库全景
二、核心索引算法
1. 暴力搜索(Flat / Brute-Force)
| 项目 | 说明 |
|---|---|
| 原理 | 逐一计算 query 与所有向量的距离 |
| 精度 | 100%(精确搜索) |
| 时间复杂度 | (n=向量数,d=维度) |
| 适用 | 数据量 < 10 万,需要精确结果 |
2. IVF(Inverted File Index)
- 构建:将向量用 K-Means 分成
nlist个簇 - 搜索:只在最接近的
nprobe个簇中搜索 - 权衡:
nprobe越大 → 精度越高、速度越慢
3. HNSW(Hierarchical Navigable Small World)
面试重点
HNSW 是目前最主流的向量索引算法,几乎所有向量数据库都支持。
- 原理:多层图结构,上层节点少(快速定位),下层节点全(精确搜索)
- 优势:查询速度快(),精度高(Recall > 95%)
- 关键参数:
M:每个节点的最大连接数(越大精度越高,内存越大)ef_construction:构建时搜索范围(越大索引越好,构建越慢)ef_search:查询时搜索范围(越大精度越高,查询越慢)
4. PQ(Product Quantization)
将高维向量切分为子空间,每个子空间独立量化:
- 压缩比:128 维 float32 (512B) → 16 个 codebook (16B),压缩 32x
- 常见组合:IVF + PQ = IVFPQ(先粗筛后量化搜索)
三、索引算法对比
| 算法 | 精度 | 速度 | 内存 | 构建时间 | 适用数据量 |
|---|---|---|---|---|---|
| Flat | 100% | 慢 | 高 | 无 | < 10 万 |
| IVF | 高 | 快 | 中 | 快 | 10 万 ~ 1000 万 |
| HNSW | 很高 | 很快 | 高 | 慢 | 100 万 ~ 1 亿 |
| PQ | 中 | 快 | 低 | 快 | > 1 亿 |
| HNSW+PQ | 高 | 很快 | 中 | 慢 | > 1 亿 |
四、主流向量数据库对比
| 数据库 | 开源 | 托管 | 索引算法 | 过滤 | 特点 |
|---|---|---|---|---|---|
| Pinecone | ❌ | ✅ | 自研 | ✅ | 全托管,开箱即用 |
| Milvus | ✅ | ✅ | HNSW/IVF/PQ | ✅ | 功能最全,适合大规模 |
| Qdrant | ✅ | ✅ | HNSW | ✅ | Rust 编写,性能好 |
| Weaviate | ✅ | ✅ | HNSW | ✅ | GraphQL API |
| pgvector | ✅ | — | HNSW/IVFFlat | ✅ | PostgreSQL 扩展 |
| Chroma | ✅ | — | HNSW | ✅ | 轻量,适合原型 |
| FAISS | ✅ | — | 全部 | ❌ | 搜索库,非数据库 |
五、选型决策
常见面试问题
Q1: HNSW 为什么比暴力搜索快?
答案:
- 暴力搜索需要计算 query 与所有 N 个向量的距离:
- HNSW 构建多层图,从顶层快速定位到目标附近区域,逐层细化:
- 类比:暴力搜索像翻字典每一页,HNSW 像先查目录再翻到对应章节
Q2: pgvector 和专用向量数据库有什么区别?
答案:
- pgvector:PostgreSQL 扩展,适合数据量 < 100 万、已有 PG 基础设施的项目,运维简单
- 专用数据库(Milvus/Qdrant):千万~亿级数据、分布式部署、更丰富的索引和过滤能力
- 建议:初期用 pgvector 快速验证,数据量增长后迁移到专用数据库
Q3: 向量检索如何实现过滤(metadata filtering)?
答案:
- Pre-filtering:先按元数据过滤,再在子集中向量搜索(精确但可能慢)
- Post-filtering:先向量搜索,再过滤结果(可能返回不够 K 条)
- Integrated filtering:搜索过程中同时过滤(Qdrant、Milvus 支持)
- 实践中推荐 integrated filtering,兼顾精度和效率