14.07-向量数据库选型
要点
- 向量数据库专门优化了向量相似度检索的性能
- 选型维度:性能、规模、过滤能力、运维成本、生态集成
- 主流方案分三类:专用向量数据库(Qdrant/Milvus/Pinecone)、扩展型(pgvector)、托管服务(Vectorize/Vertex AI)
- pgvector 适合「已经有 PostgreSQL」的场景——不需要新增数据库,但规模受限
- 专用向量数据库适合大规模、高性能场景
- 选型没有银弹——按团队技术栈、数据规模、运维能力选择
1. 三类方案
| 类型 | 代表 | 特点 |
|---|---|---|
| 专用向量数据库 | Qdrant、Milvus、Pinecone、Weaviate | 性能最好,功能最全,需要额外运维 |
| 扩展型 | pgvector(PostgreSQL)、Vespa | 复用现有数据库,运维成本低,规模受限 |
| 托管服务 | Cloudflare Vectorize、Azure AI Search | 零运维,但厂商锁定、功能受限 |
2. 选型决策树
团队已经用 PostgreSQL 且向量规模 < 100 万?
│
├── 是 → pgvector
│
└── 否 → 需要高级功能(分布式、混合检索、多租户)?
│
├── 是 → 专用向量数据库
│ │
│ ├── 自托管 → Qdrant 或 Milvus
│ └── 托管 → Pinecone 或云厂商服务
│
└── 否 → 用 Cloudflare Vectorize 或类似的轻量托管服务
3. 主流方案对比
| 维度 | pgvector | Qdrant | Milvus | Pinecone | Vectorize |
|---|---|---|---|---|---|
| 部署方式 | PostgreSQL 扩展 | 自托管 / Cloud | 自托管 / Zilliz Cloud | 全托管 | Cloudflare 托管 |
| 最大向量数 | 数十亿(受 PG 限制) | 数十亿 | 百亿级 | 数十亿 | 1000 万/索引 |
| 过滤能力 | SQL 完整能力 | 丰富的过滤语法 | 类似 SQL | 过滤语法 | metadata 过滤 |
| 混合检索 | ✅(配合 pg 全文检索) | ✅ | ✅ | ✅(稀疏向量) | ❌ |
| 多租户 | 按 schema 或 RLS | namespace | partition key | namespace | namespace |
| 运维 | 复用 PG 运维 | 需要独立运维 | 需要独立运维 | 零运维 | 零运维 |
| 价格 | 免费(PG 成本) | 开源免费 | 开源免费 | 按存储 + 查询 | 免费层 + 按用量 |
| 生态 | PG 生态 | REST / gRPC / 多语言 SDK | gRPC / 多语言 SDK | REST / 多语言 SDK | Workers 生态 |
4. pgvector:最务实的选择
如果团队已经在用 PostgreSQL,pgvector 是最务实的选择——不需要新增数据库,复用现有运维能力。
-- 安装扩展
CREATE EXTENSION IF NOT EXISTS vector;
-- 创建带向量列的表
CREATE TABLE documents (
id TEXT PRIMARY KEY,
content TEXT NOT NULL,
embedding VECTOR(768), -- 维度要和 Embedding 模型匹配
metadata JSONB,
created_at TIMESTAMP DEFAULT NOW()
);
-- 创建索引(IVFFlat 或 HNSW)
CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
-- 或
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);
-- 相似度查询
SELECT id, content, 1 - (embedding <=> $1) AS similarity
FROM documents
ORDER BY embedding <=> $1
LIMIT 5;pgvector 适合:
- 向量规模 < 100 万(更大性能下降明显)
- 需要和关系数据一起查询(如 JOIN 用户表过滤权限)
- 团队熟悉 PostgreSQL
- 不想引入新组件
pgvector 不适合:
- 超大规模(> 1000 万向量)
- 需要复杂的分布式能力
- 对查询延迟要求极高(< 10ms)
第 14.08 节会展开讲 pgvector 实践。
5. Qdrant:功能全面的专用方案
Qdrant 是 Rust 写的向量数据库,性能和功能都领先。
import { QdrantClient } from '@qdrant/js-client-rest'
const client = new QdrantClient({ url: 'http://localhost:6333' })
// 创建 collection
await client.createCollection('documents', {
vectors: { size: 768, distance: 'Cosine' },
})
// 写入
await client.upsert('documents', {
wait: true,
points: [
{
id: 'doc-1-chunk-0',
vector: embedding,
payload: { text: '...', documentId: 'doc-1' },
},
],
})
// 查询 + 过滤
const results = await client.query('documents', {
query: queryVector,
limit: 5,
filter: {
must: [{ key: 'documentId', match: { value: 'doc-1' } }],
},
})Qdrant 的优势:
- 过滤能力强——丰富的过滤语法,支持嵌套条件
- 混合检索——支持稀疏向量 + 稠密向量融合
- 多语言 SDK——TypeScript、Python、Go 等
- 分布式——支持集群部署
适合场景:中大规模、需要复杂过滤、团队有能力运维。
6. Milvus:超大规模
Milvus 是面向超大规模向量检索设计的,支持百亿级向量。
import { MilvusClient } from '@zilliz/milvus2-sdk-node'
const client = new MilvusClient({ address: 'localhost:19530' })
// 创建 collection
await client.createCollection({
collection_name: 'documents',
fields: [
{ name: 'id', data_type: 'VarChar', is_primary_key: true, type_params: { max_length: 64 } },
{ name: 'embedding', data_type: 'FloatVector', type_params: { dim: 768 } },
{ name: 'document_id', data_type: 'VarChar', type_params: { max_length: 64 } },
],
})
// 创建索引
await client.createIndex({
collection_name: 'documents',
field_name: 'embedding',
index_type: 'IVF_FLAT',
metric_type: 'COSINE',
params: { nlist: 1024 },
})
// 查询
const results = await client.search({
collection_name: 'documents',
vectors: [queryVector],
limit: 5,
filter: 'document_id == "doc-1"',
})Milvus 的优势:
- 超大规模——百亿级向量
- 多种索引类型——IVF_FLAT、IVF_SQ8、HNSW 等
- GPU 加速——支持 GPU 索引和查询
- 云原生——K8s 原生架构
适合场景:数据量巨大、对性能要求极高、团队有能力运维分布式系统。
7. Pinecone:全托管
Pinecone 是全托管的向量数据库,零运维。
import { Pinecone } from '@pinecone-database/pinecone'
const pc = new Pinecone({ apiKey: process.env.PINECONE_API_KEY })
const index = pc.index('documents')
// 写入
await index.upsert([
{
id: 'doc-1-chunk-0',
values: embedding,
metadata: { text: '...', documentId: 'doc-1' },
},
])
// 查询 + 过滤
const results = await index.query({
vector: queryVector,
topK: 5,
filter: { documentId: { $eq: 'doc-1' } },
includeMetadata: true,
})Pinecone 的优势:
- 零运维——不需要管服务器
- 全球部署——低延迟
- Serverless 计费——按用量付费
Pinecone 的限制:
- 贵——大规模场景成本明显高于自托管
- 厂商锁定——数据迁移成本高
- 功能受限——不如自托管方案灵活
适合场景:团队没有运维能力、想快速上线、规模不大。
8. Cloudflare Vectorize
Vectorize 是 Cloudflare Workers 生态的向量数据库,和 Workers AI 集成最方便。
第 14.19 节已经有详细的实践介绍。这里只列特点:
- 和 Workers 深度集成——直接在 Worker 里使用
- 免费版慷慨——100 索引、每索引 1000 万向量
- 限制明显——最大维度 1536、metadata 过滤有限
适合场景:已经在用 Cloudflare Workers、规模不大、想快速集成。
9. 选型的实际建议
小团队 / 个人项目
- 用 pgvector 或 Cloudflare Vectorize
- 不需要过早优化——先跑通流程,再看瓶颈
中型团队 / 创业公司
- 如果已经用 PostgreSQL → pgvector
- 如果需要更强的过滤和检索能力 → Qdrant
- 如果不想运维 → Pinecone 或 Qdrant Cloud
大团队 / 企业
- 数据量大 → Milvus 或 Qdrant 集群
- 多租户隔离 → Qdrant 或 Milvus 的 namespace 能力
- 合规要求 → 自托管方案
选型陷阱
- 过早优化:一开始就上 Milvus 集群,结果数据量只有几千条
- 忽视运维:选了自托管方案,但团队没有运维能力
- 忽视迁移成本:选了一个方案后发现不合适,迁移成本很高
- 过度依赖托管:厂商调价或下线服务,被锁死
10. 一个选型评估表
| 评估项 | 权重 | pgvector | Qdrant | Milvus | Pinecone | Vectorize |
|---|---|---|---|---|---|---|
| 当前数据规模适配 | 高 | ✅ | ✅ | ✅ | ✅ | ⚠️ |
| 未来 3 年扩展性 | 中 | ⚠️ | ✅ | ✅ | ✅ | ❌ |
| 运维成本 | 高 | ✅ | ⚠️ | ❌ | ✅ | ✅ |
| 过滤能力 | 中 | ✅ | ✅ | ✅ | ⚠️ | ⚠️ |
| 混合检索 | 中 | ✅ | ✅ | ✅ | ✅ | ❌ |
| 生态集成 | 中 | ✅ | ⚠️ | ⚠️ | ⚠️ | ✅ |
| 成本 | 高 | ✅ | ✅ | ⚠️ | ❌ | ✅ |
✅ 适合 ⚠️ 有限制 ❌ 不适合
总结
回顾这一节的要点:
- 三类方案:专用向量数据库、扩展型(pgvector)、托管服务
- pgvector 最务实——复用 PostgreSQL,规模受限
- Qdrant 功能全面——过滤、混合检索、多语言 SDK
- Milvus 面向超大规模——百亿级向量,需要分布式运维
- Pinecone 全托管——零运维但贵
- Vectorize 和 Workers 集成最方便——适合 Cloudflare 用户
- 选型按团队技术栈、数据规模、运维能力选择,不要过早优化
下一篇讲 pgvector 的具体实践。