向量数据库
向量数据库存储文档块的 Embedding,支持毫秒级相似度检索,是 RAG 召回层的核心。它解决的核心问题:精确 K 近邻(KNN)在百万级向量上逐对计算太慢,需要近似最近邻(ANN)算法换速度。
ANN 索引结构
| 结构 | 原理 | 特点 |
|---|---|---|
| HNSW | 分层可导航小世界图:上层稀疏长跳定位区域,下层稠密短边精细近邻 | 快、召回高,内存占用大,向量库主流默认 |
| IVF | 聚类分桶,查询只搜最近的桶 | 适合大规模,可配 PQ 量化进一步压缩 |
| DiskANN | 图结构放磁盘 | 数据量超出内存时的选择 |
| 暴力扫描 | 全量精确计算 | 数据量小时精度最高 |
HNSW 是面试最常见的考点:插入时贪心搜索找近邻并连边,查询从顶层入口贪心下降,兼顾召回与速度。它是“用空间换时间”的典型,索引常驻内存。
距离度量
- 余弦相似度:看方向不看长度,文本向量最常用
- 内积:适合归一化后的向量(此时与余弦等价)
- L2 欧氏距离:看绝对距离,适合图像等场景
选哪个取决于嵌入模型的训练目标,模型文档一般会说明。换度量方式不需要重建向量,但打分语义会变。
检索准确率之外的能力
生产级选型还要看四件事:
- 过滤能力:按元数据过滤(来源、时间、权限、租户),比检索后过滤快得多
- 混合检索支持:同库建 BM25 倒排索引加向量索引,一次查询两路并行(Elasticsearch、Milvus 2.5+、Weaviate、Qdrant 都原生支持)
- 多租户与权限:租户隔离、行级权限过滤
- 运维形态:托管(Pinecone)免运维但贵、开源自建(Milvus、Qdrant)灵活但要有 SRE 投入、pgvector 是 PostgreSQL 扩展适合已有 PG 的小规模场景、FAISS 是库不是服务
选型判断
| 场景 | 推荐 |
|---|---|
| 小规模、已有 PostgreSQL | pgvector,零新组件 |
| 演示和原型 | Chroma、FAISS |
| 生产级、要混合检索和过滤 | Milvus、Qdrant、Weaviate |
| 不想运维 | 托管服务 Pinecone、Zilliz |
| 数据量超内存 | DiskANN 类方案加 PQ 量化 |
规模指标:单机 QPS、数据量级、向量维度、是否需要标量过滤和混合检索。多租户场景优先考虑过滤能力强的库。
面试追问
- 向量数据库解决什么问题? 精确 KNN 在大规模数据上太慢,用 ANN 近似最近邻换速度。HNSW 是主流结构
- HNSW 怎么工作? 分层图:上层稀疏长跳快速定位,下层稠密精细近邻。插入贪心连边,查询从顶层贪心下降。内存占用大
- 为什么用余弦相似度? 文本向量看语义方向不看长度,余弦正好度量方向。归一化后与内积等价
- 混合检索为什么是生产标配? 纯向量对精确关键词、编号、专名弱;纯 BM25 对语义改写弱。同库双索引加 RRF 融合补齐两边
- 选型看什么? 数据量、QPS、过滤能力、混合检索支持、多租户、托管还是自建。pgvector 适合小规模,Milvus/Qdrant 适合生产