向量数据库是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"})
1.2 2026年市场格局
向量数据库市场在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
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}")
三、全面对比
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
)
四、成本分析
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}
4.2 选型决策
你的场景是什么?
├── 已有PostgreSQL + 数据量<1M → pgvector(增量成本几乎为零)
├── 需要高性能 + 有运维能力 → Qdrant(性价比最高)
├── 数据量>10M + 需要GPU → Milvus
├── 零运维 + 快速上手 → Pinecone
└── 原型阶段 → ChromaDB(本地,免费)
五、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]
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}")
六、使用场景分布
Agent Memory(30%)和RAG/Search(35%)合计占65%——向量数据库在AI Agent生态中的核心地位毋庸置疑。
七、总结
向量数据库选型的核心原则:
- 已有PG且数据<1M → pgvector(零额外成本)
- 需要高性能+灵活性 → Qdrant(Rust写的,快且省内存)
- 超大规模+GPU → Milvus(为海量数据设计)
- 零运维+快速上手 → Pinecone(全托管)
- 原型阶段 → ChromaDB(本地免费)
最终建议:不要过度工程化。如果你的数据量不到100万,pgvector加个HNSW索引就够了。
作者:JiaDe Wu | AWS Solutions Architect | sample-OpenClaw-on-AWS-with-Bedrock Owner | GitHub: github.com/JiaDe-Wu






Top comments (0)