向量数据库选型指南
原创
灵阙教研团队
A 推荐 入门 |
约 5 分钟阅读
更新于 2026-02-27 AI 导读
向量数据库选型指南 Maurice | 灵阙学院 2026-02-27 为什么需要专用向量数据库 传统数据库按精确匹配设计(WHERE id = 123),而 AI 应用需要按语义相似度检索("找到含义最接近的前 10 条记录")。向量数据库专为高维向量的近似最近邻(ANN)搜索优化,是 RAG、推荐系统、图像检索等 AI 应用的基础设施。 核心索引算法...
向量数据库选型指南
Maurice | 灵阙学院 2026-02-27
为什么需要专用向量数据库
传统数据库按精确匹配设计(WHERE id = 123),而 AI 应用需要按语义相似度检索("找到含义最接近的前 10 条记录")。向量数据库专为高维向量的近似最近邻(ANN)搜索优化,是 RAG、推荐系统、图像检索等 AI 应用的基础设施。
核心索引算法
┌─────────────────────────────────────────────────────────┐
│ ANN 索引算法 │
├──────────┬──────────────┬──────────────┬───────────────┤
│ HNSW │ IVF │ PQ │ DiskANN │
│ │ │ │ │
│ 图遍历 │ 聚类倒排 │ 乘积量化 │ 磁盘友好图 │
│ 精度最高 │ 可扩展性好 │ 极致压缩 │ 超大数据集 │
│ 内存占用大│ 精度中等 │ 精度有损 │ 性价比高 │
└──────────┴──────────────┴──────────────┴───────────────┘
算法对比
| 算法 | 原理 | 查询速度 | 精度(recall@10) | 内存占用 | 构建时间 | 适用规模 |
|---|---|---|---|---|---|---|
| HNSW | 多层跳表式图结构 | 极快 | 95-99% | 高 | 中 | <50M 向量 |
| IVF | K-means 聚类 + 倒排列表 | 快 | 85-95% | 中 | 快 | <100M 向量 |
| PQ | 子空间量化压缩 | 中 | 80-90% | 极低 | 快 | 任意规模 |
| HNSW+PQ | 图索引 + 量化压缩 | 快 | 92-97% | 中 | 中 | <200M 向量 |
| DiskANN | SSD 友好的图索引 | 快 | 95-98% | 极低(磁盘) | 慢 | >100M 向量 |
主流向量数据库全面对比
基本特性
| 特性 | Pinecone | Weaviate | Qdrant | Milvus | Chroma | pgvector |
|---|---|---|---|---|---|---|
| 类型 | 全托管 SaaS | 开源/Cloud | 开源/Cloud | 开源/Cloud | 开源 | PG 扩展 |
| 语言 | -- | Go | Rust | Go/C++ | Python | C |
| 许可证 | 商业 | BSD-3 | Apache 2.0 | Apache 2.0 | Apache 2.0 | PostgreSQL |
| 索引算法 | 专有 | HNSW | HNSW | IVF/HNSW/DiskANN | HNSW | IVF/HNSW |
| 混合搜索 | 支持 | 支持(BM25) | 支持 | 支持 | 基础 | 需配合 FTS |
| 多租户 | 原生 Namespace | 原生 | 支持 | Partition Key | Collection | Row-level |
| 最大维度 | 20000 | 65535 | 65536 | 32768 | 无限制 | 2000 |
| GPU 加速 | -- | -- | -- | 支持 | -- | -- |
性能与规模
| 维度 | Pinecone | Weaviate | Qdrant | Milvus | Chroma | pgvector |
|---|---|---|---|---|---|---|
| 百万级 QPS | 高 | 中 | 高 | 最高 | 低 | 低 |
| 十亿级支持 | 支持 | 部分 | 支持 | 支持(分布式) | 不适合 | 不适合 |
| P99 延迟 | <50ms | <100ms | <30ms | <50ms | 视规模 | 视规模 |
| 写入吞吐 | 中 | 中 | 高 | 最高 | 中 | 中 |
价格(月费估算,100万向量 x 1536维)
| 方案 | Pinecone | Weaviate Cloud | Qdrant Cloud | Milvus (Zilliz) | Chroma | pgvector |
|---|---|---|---|---|---|---|
| 免费层 | 100K 向量 | 沙盒 | 1GB | 免费层 | 完全免费 | 完全免费 |
| 生产环境 | ~$70/月 | ~$25/月 | ~$30/月 | ~$65/月 | 自运维 | 自运维 |
| 企业级 | 联系销售 | 联系销售 | 联系销售 | 联系销售 | -- | -- |
选型决策树
你需要向量数据库吗?
│
├── 向量数 < 10万 且只是原型
│ └── Chroma (零配置,pip install 即用)
│
├── 已有 PostgreSQL 且不想加新组件
│ └── pgvector (ALTER TABLE + CREATE INDEX)
│
├── 需要全托管,不想运维
│ ├── 预算充足 → Pinecone (最省心)
│ └── 预算敏感 → Qdrant Cloud 或 Weaviate Cloud
│
├── 需要自部署,对性能要求高
│ ├── 数据量 < 5000万 → Qdrant (Rust,单机性能最强)
│ └── 数据量 > 5000万 → Milvus (分布式,GPU 加速)
│
└── 需要丰富的混合搜索 + 对象存储
└── Weaviate (GraphQL API + 内置 BM25 + 模块化)
代码示例
Chroma(开发/原型)
import chromadb
from chromadb.utils.embedding_functions import OpenAIEmbeddingFunction
client = chromadb.PersistentClient(path="./chroma_db")
embedding_fn = OpenAIEmbeddingFunction(
model_name="text-embedding-3-small",
api_key="sk-..."
)
collection = client.get_or_create_collection(
name="tax_docs",
embedding_function=embedding_fn,
metadata={"hnsw:space": "cosine"},
)
# 插入
collection.add(
documents=["增值税税率分为13%、9%、6%三档", "小规模纳税人适用3%征收率"],
metadatas=[{"source": "tax_law", "chapter": 2}, {"source": "tax_law", "chapter": 3}],
ids=["doc1", "doc2"],
)
# 查询
results = collection.query(query_texts=["增值税税率是多少"], n_results=5)
print(results["documents"])
Qdrant(生产环境)
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct, Filter, FieldCondition, MatchValue
client = QdrantClient(url="http://localhost:6333")
# 创建 collection
client.create_collection(
collection_name="tax_docs",
vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
)
# 插入(带 payload 过滤字段)
client.upsert(
collection_name="tax_docs",
points=[
PointStruct(id=1, vector=embedding_1, payload={"source": "tax_law", "year": 2025}),
PointStruct(id=2, vector=embedding_2, payload={"source": "regulation", "year": 2024}),
],
)
# 带过滤的向量搜索
results = client.query_points(
collection_name="tax_docs",
query=query_vector,
query_filter=Filter(
must=[FieldCondition(key="year", match=MatchValue(value=2025))]
),
limit=10,
)
pgvector(PostgreSQL 扩展)
-- 启用扩展
CREATE EXTENSION IF NOT EXISTS vector;
-- 创建表
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT NOT NULL,
source VARCHAR(100),
embedding vector(1536)
);
-- 创建 HNSW 索引
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 128);
-- 相似度搜索(余弦距离)
SELECT id, content, source,
1 - (embedding <=> $1::vector) AS similarity
FROM documents
WHERE source = 'tax_law'
ORDER BY embedding <=> $1::vector
LIMIT 10;
Embedding 维度对性能的影响
| 维度 | 存储(100万向量) | HNSW 内存 | 查询延迟 | 精度 |
|---|---|---|---|---|
| 256 | ~1 GB | ~2 GB | 基准 | 基线 |
| 768 | ~3 GB | ~5 GB | 1.2x | +5-8% |
| 1024 | ~4 GB | ~7 GB | 1.4x | +7-10% |
| 1536 | ~6 GB | ~10 GB | 1.8x | +8-12% |
| 3072 | ~12 GB | ~20 GB | 2.5x | +9-13% |
建议:768-1024 维是性价比甜点;除非有极高精度要求,否则不建议用 3072 维。Matryoshka Embedding(如 OpenAI text-embedding-3 系列)支持按需截断维度,灵活平衡精度与成本。
生产部署要点
- 索引选择:数据量 < 100万用 HNSW;> 100万考虑 IVF+PQ 或 DiskANN
- 过滤策略:先过滤再搜索(pre-filtering)比先搜索再过滤(post-filtering)更高效
- 批量写入:避免逐条 upsert,批量 1000-5000 条一次
- 监控指标:查询延迟 P99、召回率、索引构建时间、内存使用率
- 备份策略:定期快照;Qdrant 和 Milvus 支持增量备份
- 多租户隔离:Pinecone 用 Namespace、Qdrant 用 Payload 过滤、Milvus 用 Partition
Maurice | maurice_wen@proton.me