DEV Community

Cover image for 向量数据库选型指南2026:Pinecone vs Qdrant vs Milvus实战对比
吴迦
吴迦

Posted on

向量数据库选型指南2026:Pinecone vs Qdrant vs Milvus实战对比

向量数据库是AI Agent的"记忆芯片"。RAG需要它、Agent记忆需要它、语义搜索需要它。但2026年市场上有几十种选择——Pinecone、Qdrant、Milvus、Weaviate、pgvector、ChromaDB……如何选?本文用数据说话。

一、为什么向量数据库是Agent的核心基础设施?

1.1 三大使用场景

# 场景1:RAG(检索增强生成)
query_embedding = embed("如何优化Lambda冷启动?")
relevant_docs = vector_db.search(query_embedding, k=5)
context = "\n".join([doc.content for doc in relevant_docs])
answer = llm.invoke(f"基于以下文档回答:{context}\n问题:如何优化Lambda冷启动?")

# 场景2:Agent长期记忆
memory_embedding = embed("用户偏好:中文回复,技术深度优先")
vector_db.upsert(id="mem_001", vector=memory_embedding, metadata={"type": "preference"})

# 场景3:语义搜索
results = vector_db.search(embed("serverless cost optimization"), 
                           k=10, filter={"category": "aws"})
Enter fullscreen mode Exit fullscreen mode

1.2 2026年市场格局

向量数据库QPS对比

向量数据库市场在2026年呈现明显分化:

  • 托管服务(Pinecone、Weaviate Cloud)—— 零运维,按量计费
  • 自托管(Qdrant、Milvus)—— 高性能,完全可控
  • 嵌入式/扩展(ChromaDB、pgvector)—— 最小化架构复杂度

二、性能Benchmark

2.1 延迟 vs 维度

延迟与维度关系

关键发现:

  • Milvus在高维(1024+)场景下延迟最低——GPU加速的优势
  • Qdrant在中维(384-768)最均衡——纯CPU也能做到15ms P99
  • Pinecone延迟稳定但不是最快——托管服务的网络开销

2.2 索引类型选择

索引类型对比

索引 速度 召回率 内存占用 适用场景
Flat 1x 100% <100K,精确搜索
IVF-Flat 15x 95% 100K-1M,平衡
IVF-PQ 50x 88% >1M,内存受限
HNSW 40x 97% <10M,高召回优先
ScaNN 55x 96% Google生态
DiskANN 35x 94% 极低 >10M,磁盘存储

推荐选择:

# 数据量 < 100K → Flat(别折腾,暴力搜索够了)
# 100K - 1M → HNSW(最佳召回率)
# 1M - 10M → IVF-PQ + 重排序
# > 10M → DiskANN 或 分片HNSW
Enter fullscreen mode Exit fullscreen mode

2.3 实战Benchmark脚本

import time
import numpy as np
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct

def benchmark_qdrant(num_vectors=100000, dim=768, num_queries=1000):
    client = QdrantClient("localhost", port=6333)

    # 创建collection
    client.create_collection("benchmark",
        vectors_config=VectorParams(size=dim, distance=Distance.COSINE))

    # 批量插入
    batch_size = 1000
    start = time.time()
    for i in range(0, num_vectors, batch_size):
        points = [
            PointStruct(id=j, vector=np.random.rand(dim).tolist(),
                       payload={"category": f"cat_{j % 10}"})
            for j in range(i, min(i + batch_size, num_vectors))
        ]
        client.upsert("benchmark", points)
    insert_time = time.time() - start

    # 搜索benchmark
    latencies = []
    for _ in range(num_queries):
        query = np.random.rand(dim).tolist()
        start = time.time()
        client.search("benchmark", query, limit=10)
        latencies.append((time.time() - start) * 1000)

    print(f"Insert: {num_vectors} vectors in {insert_time:.1f}s")
    print(f"Search P50: {np.percentile(latencies, 50):.1f}ms")
    print(f"Search P99: {np.percentile(latencies, 99):.1f}ms")
    print(f"QPS: {num_queries / sum(latencies) * 1000:.0f}")
Enter fullscreen mode Exit fullscreen mode

三、全面对比

3.1 特性雷达图

特性对比雷达图

3.2 详细对比表

特性 Pinecone Qdrant Milvus pgvector
部署方式 全托管 自托管/Cloud 自托管/Zilliz PG扩展
语言 - Rust Go+C++ C
混合检索 ⚠️ 需组合
多租户 ✅ Namespace ✅ Collection ✅ Partition ⚠️ 手动
RBAC ✅ (PG原生)
GPU加速
稀疏向量
全文搜索 ✅ (PG原生)

3.3 混合检索实现

# Qdrant: 向量 + 关键词混合检索
from qdrant_client.models import Filter, FieldCondition, MatchText

# 场景:Agent记忆检索——语义相似 + 时间过滤 + 关键词匹配
results = client.search(
    collection_name="agent_memory",
    query_vector=embed("用户的AWS架构偏好"),
    query_filter=Filter(
        must=[
            FieldCondition(key="user_id", match=MatchValue(value="user_001")),
            FieldCondition(key="timestamp", range=Range(gte=last_week)),
        ],
        should=[
            FieldCondition(key="content", match=MatchText(text="AWS")),
        ]
    ),
    limit=10,
    score_threshold=0.7
)
Enter fullscreen mode Exit fullscreen mode

四、成本分析

成本对比

4.1 TCO计算

def calculate_tco(vectors, queries_per_day, months=12):
    """总拥有成本计算"""

    # Pinecone (托管)
    pinecone = {
        "compute": 70 * months if vectors <= 1_000_000 else 230 * months,
        "storage": 0,  # 包含在compute中
        "ops": 0,  # 零运维
        "total": None
    }
    pinecone["total"] = sum(v for v in pinecone.values() if v)

    # Qdrant (自托管 on AWS)
    qdrant = {
        "compute": 50 * months,   # t3.xlarge
        "storage": 10 * months,    # EBS
        "ops": 500 * months * 0.1, # 运维人力10%
        "total": None
    }
    qdrant["total"] = sum(v for v in qdrant.values() if v)

    # pgvector (RDS已有)
    pgvector = {
        "compute": 0,   # 已有RDS,增量几乎为零
        "storage": 5 * months,
        "ops": 200 * months * 0.05,
        "total": None
    }
    pgvector["total"] = sum(v for v in pgvector.values() if v)

    return {"pinecone": pinecone, "qdrant": qdrant, "pgvector": pgvector}
Enter fullscreen mode Exit fullscreen mode

4.2 选型决策

你的场景是什么?
├── 已有PostgreSQL + 数据量<1M → pgvector(增量成本几乎为零)
├── 需要高性能 + 有运维能力 → Qdrant(性价比最高)
├── 数据量>10M + 需要GPU → Milvus
├── 零运维 + 快速上手 → Pinecone
└── 原型阶段 → ChromaDB(本地,免费)
Enter fullscreen mode Exit fullscreen mode

五、Agent场景最佳实践

5.1 记忆存储

class AgentMemoryStore:
    def __init__(self, qdrant_url="localhost:6333"):
        self.client = QdrantClient(qdrant_url)
        self.collection = "agent_memory"

    async def remember(self, content, metadata):
        vector = await embed(content)
        self.client.upsert(self.collection, [
            PointStruct(
                id=str(uuid4()),
                vector=vector,
                payload={
                    "content": content,
                    "importance": metadata.get("importance", 0.5),
                    "timestamp": time.time(),
                    **metadata
                }
            )
        ])

    async def recall(self, query, k=5, min_score=0.7):
        vector = await embed(query)
        results = self.client.search(
            self.collection, vector, limit=k,
            score_threshold=min_score)
        return [{"content": r.payload["content"], 
                 "score": r.score} for r in results]
Enter fullscreen mode Exit fullscreen mode

5.2 RAG Pipeline

class AgentRAG:
    def __init__(self, vector_store, llm):
        self.store = vector_store
        self.llm = llm

    async def answer(self, question):
        # 1. 检索
        docs = await self.store.recall(question, k=5)

        # 2. 重排序(可选,用Cross-Encoder提升精度)
        reranked = await self.rerank(question, docs)

        # 3. 生成
        context = "\n---\n".join([d["content"] for d in reranked[:3]])
        return await self.llm.invoke(
            f"基于以下资料回答问题。如果资料不够,说明不确定。\n\n资料:{context}\n\n问题:{question}")
Enter fullscreen mode Exit fullscreen mode

六、使用场景分布

使用场景分布

Agent Memory(30%)和RAG/Search(35%)合计占65%——向量数据库在AI Agent生态中的核心地位毋庸置疑。

七、总结

向量数据库选型的核心原则:

  1. 已有PG且数据<1M → pgvector(零额外成本)
  2. 需要高性能+灵活性 → Qdrant(Rust写的,快且省内存)
  3. 超大规模+GPU → Milvus(为海量数据设计)
  4. 零运维+快速上手 → Pinecone(全托管)
  5. 原型阶段 → ChromaDB(本地免费)

最终建议:不要过度工程化。如果你的数据量不到100万,pgvector加个HNSW索引就够了。


作者:JiaDe Wu | AWS Solutions Architect | sample-OpenClaw-on-AWS-with-Bedrock Owner | GitHub: github.com/JiaDe-Wu

Top comments (0)