向量检索与数据库
问题
向量数据库有哪些?如何选择?向量索引算法有什么区别?
答案
向量数据库是 RAG 系统的存储和检索引擎,负责高效存储和查找语义相似的文档向量。
一、主流向量数据库
| 数据库 | 类型 | 特点 | 适用场景 |
|---|---|---|---|
| FAISS | 库(Meta) | 高性能,纯内存/磁盘 | 本地开发、研究 |
| Pinecone | 云服务 | 全托管,零运维 | 快速上线 |
| Milvus | 开源/云 | 分布式,功能丰富 | 企业级大规模 |
| Qdrant | 开源/云 | Rust 实现,过滤强 | 需复杂过滤 |
| Weaviate | 开源/云 | 内置向量化、GraphQL | 多模态 |
| Chroma | 开源 | 轻量,Python 友好 | 原型验证 |
| pgvector | PG 扩展 | 与 PostgreSQL 集成 | 已有 PG 基础设施 |
二、向量索引算法
暴力搜索(Flat)
计算 query 与所有向量的距离,返回 Top-K
- 100% 精确,但 复杂度
- 只适合小数据量(
<10万条)
HNSW(Hierarchical Navigable Small World)
- 多层图结构,从稀疏层向密集层逐步定位
- 查询速度快,精度高(最常用算法)
- 缺点:内存消耗大
IVF(Inverted File Index)
- 将向量空间划分为多个聚类(Voronoi 区域)
- 查询时只搜索最近的几个聚类
- 适合大规模数据,但需要训练聚类中心
PQ(Product Quantization)
- 将高维向量压缩为低维编码
- 大幅减少内存,但有精度损失
- 常与 IVF 组合使用:IVF-PQ
| 算法 | 速度 | 精度 | 内存 | 适用规模 |
|---|---|---|---|---|
| Flat | 慢 | 100% | 大 | <10万 |
| HNSW | 快 | ~99% | 大 | <1000万 |
| IVF | 中 | ~95% | 中 | 百万-亿级 |
| IVF-PQ | 快 | ~90% | 小 | 亿级 |
三、代码示例
FAISS
import faiss
import numpy as np
# 构建 HNSW 索引
dimension = 1536
index = faiss.IndexHNSWFlat(dimension, 32) # 32 = 每个节点的连接数
index.hnsw.efSearch = 64 # 搜索时探索的节点数
# 添加向量
vectors = np.random.random((10000, dimension)).astype("float32")
index.add(vectors)
# 搜索
query = np.random.random((1, dimension)).astype("float32")
distances, indices = index.search(query, k=5) # Top-5
pgvector
-- 启用扩展
CREATE EXTENSION vector;
-- 创建表
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536) -- 1536 维向量
);
-- 创建索引(HNSW)
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops);
-- 相似度搜索
SELECT content, 1 - (embedding <=> '[0.12, -0.34, ...]') AS similarity
FROM documents
ORDER BY embedding <=> '[0.12, -0.34, ...]'
LIMIT 5;
四、选型建议
常见面试问题
Q1: HNSW 和 IVF 的核心区别是什么?
答案:
- HNSW:基于图的近似搜索,构建多层图结构,查询时从高层向低层逐步逼近目标。优点是查询速度快、精度高;缺点是内存消耗大
- IVF:基于聚类的近似搜索,将向量空间划分为多个区域,查询时只搜索最近的几个区域。优点是内存可控;缺点是需要预训练聚类中心
Q2: 向量数据库和传统数据库可以共存吗?
答案: 可以,而且推荐共存:
- 向量数据库负责语义搜索
- 传统数据库负责元数据过滤、权限控制、精确查询
- 典型流程:先用元数据(时间、类别)过滤,再在过滤结果中做向量搜索
- pgvector 直接在 PostgreSQL 中同时支持两者