跳到主要内容

向量检索与数据库

问题

向量数据库有哪些?如何选择?向量索引算法有什么区别?

答案

向量数据库是 RAG 系统的存储和检索引擎,负责高效存储和查找语义相似的文档向量。

一、主流向量数据库

数据库类型特点适用场景
FAISS库(Meta)高性能,纯内存/磁盘本地开发、研究
Pinecone云服务全托管,零运维快速上线
Milvus开源/云分布式,功能丰富企业级大规模
Qdrant开源/云Rust 实现,过滤强需复杂过滤
Weaviate开源/云内置向量化、GraphQL多模态
Chroma开源轻量,Python 友好原型验证
pgvectorPG 扩展与 PostgreSQL 集成已有 PG 基础设施

二、向量索引算法

暴力搜索(Flat)

计算 query 与所有向量的距离,返回 Top-K
  • 100% 精确,但 O(n)O(n) 复杂度
  • 只适合小数据量(<10万条

HNSW(Hierarchical Navigable Small World)

  • 多层图结构,从稀疏层向密集层逐步定位
  • 查询速度快,精度高(最常用算法)
  • 缺点:内存消耗大

IVF(Inverted File Index)

  • 将向量空间划分为多个聚类(Voronoi 区域)
  • 查询时只搜索最近的几个聚类
  • 适合大规模数据,但需要训练聚类中心

PQ(Product Quantization)

  • 将高维向量压缩为低维编码
  • 大幅减少内存,但有精度损失
  • 常与 IVF 组合使用:IVF-PQ
算法速度精度内存适用规模
Flat100%<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 中同时支持两者

相关链接