向量数据库选型指南

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 系列)支持按需截断维度,灵活平衡精度与成本。

生产部署要点

  1. 索引选择:数据量 < 100万用 HNSW;> 100万考虑 IVF+PQ 或 DiskANN
  2. 过滤策略:先过滤再搜索(pre-filtering)比先搜索再过滤(post-filtering)更高效
  3. 批量写入:避免逐条 upsert,批量 1000-5000 条一次
  4. 监控指标:查询延迟 P99、召回率、索引构建时间、内存使用率
  5. 备份策略:定期快照;Qdrant 和 Milvus 支持增量备份
  6. 多租户隔离:Pinecone 用 Namespace、Qdrant 用 Payload 过滤、Milvus 用 Partition

Maurice | maurice_wen@proton.me