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. 主流方案对比

维度pgvectorQdrantMilvusPineconeVectorize
部署方式PostgreSQL 扩展自托管 / Cloud自托管 / Zilliz Cloud全托管Cloudflare 托管
最大向量数数十亿(受 PG 限制)数十亿百亿级数十亿1000 万/索引
过滤能力SQL 完整能力丰富的过滤语法类似 SQL过滤语法metadata 过滤
混合检索✅(配合 pg 全文检索)✅(稀疏向量)
多租户按 schema 或 RLSnamespacepartition keynamespacenamespace
运维复用 PG 运维需要独立运维需要独立运维零运维零运维
价格免费(PG 成本)开源免费开源免费按存储 + 查询免费层 + 按用量
生态PG 生态REST / gRPC / 多语言 SDKgRPC / 多语言 SDKREST / 多语言 SDKWorkers 生态

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 能力
  • 合规要求 → 自托管方案

选型陷阱

  1. 过早优化:一开始就上 Milvus 集群,结果数据量只有几千条
  2. 忽视运维:选了自托管方案,但团队没有运维能力
  3. 忽视迁移成本:选了一个方案后发现不合适,迁移成本很高
  4. 过度依赖托管:厂商调价或下线服务,被锁死

10. 一个选型评估表

评估项权重pgvectorQdrantMilvusPineconeVectorize
当前数据规模适配⚠️
未来 3 年扩展性⚠️
运维成本⚠️
过滤能力⚠️⚠️
混合检索
生态集成⚠️⚠️⚠️
成本⚠️

✅ 适合 ⚠️ 有限制 ❌ 不适合

总结

回顾这一节的要点:

  • 三类方案:专用向量数据库、扩展型(pgvector)、托管服务
  • pgvector 最务实——复用 PostgreSQL,规模受限
  • Qdrant 功能全面——过滤、混合检索、多语言 SDK
  • Milvus 面向超大规模——百亿级向量,需要分布式运维
  • Pinecone 全托管——零运维但贵
  • Vectorize 和 Workers 集成最方便——适合 Cloudflare 用户
  • 选型按团队技术栈、数据规模、运维能力选择,不要过早优化

下一篇讲 pgvector 的具体实践。

14.07-向量数据库选型 - Hono AI 项目知识体系 - AI共学社