用于 RAG 比较的向量存储

为你的RAG堆栈选择合适的向量数据库

目录

选择合适的向量数据库可以决定你的RAG应用的性能、成本和可扩展性。这篇全面的比较涵盖了2024-2025年最受欢迎的选项。

向量数据库中的事件链

什么是向量数据库,为什么RAG需要它

向量数据库是一种专门设计用于存储和查询高维嵌入向量的数据库。 在检索增强生成(RAG)系统中,向量数据库作为知识的骨干——它们通过语义相似性搜索实现上下文相关的文档检索。

当你构建一个RAG流水线时,文档会通过像OpenAI的text-embedding-3-small或开源替代品如BGEE5这样的模型转换为嵌入(密集的数值向量)。对于最先进的多语言性能,Qwen3嵌入和重排序模型与Ollama集成效果非常好,适合本地部署。对于多语言和多模态应用,跨模态嵌入可以将不同数据类型(文本、图像、音频)桥接到统一的表示空间。这些嵌入捕捉语义含义,允许你通过含义而非精确的关键词匹配来查找文档。

向量数据库负责:

  • 存储数百万到数十亿个向量
  • 索引以实现快速近似最近邻(ANN)搜索
  • 通过元数据过滤以缩小搜索范围
  • CRUD操作以维护你的知识库

在检索到相关文档后,使用嵌入模型进行重排序可以通过使用更复杂的相似性度量来进一步提高检索质量。

快速比较表

向量数据库 类型 最适合 主机 许可证
Pinecone 管理 生产,零运维 仅限云端 专有
Chroma 嵌入式/服务器 原型设计,简单性 自托管 Apache 2.0
Weaviate 服务器 混合搜索,GraphQL 自托管/云端 BSD-3
Milvus 服务器 规模,企业 自托管/云端 Apache 2.0
Qdrant 服务器 丰富的过滤,Rust性能 自托管/云端 Apache 2.0
FAISS 嵌入式,研究 内存中 MIT
pgvector 扩展 PostgreSQL集成 自托管 PostgreSQL

详细向量数据库分析

Pinecone — 管理领域的领导者

Pinecone 是专为机器学习应用构建的完全托管的向量数据库。

from pinecone import Pinecone

pc = Pinecone(api_key="YOUR_API_KEY")
index = pc.Index("my-rag-index")

# 插入向量
index.upsert(vectors=[
    {"id": "doc1", "values": embedding, "metadata": {"source": "wiki"}}
])

# 带元数据过滤的查询
results = index.query(
    vector=query_embedding,
    top_k=5,
    filter={"source": {"$eq": "wiki"}}
)

优点:

  • 无需管理基础设施
  • 优秀的文档和SDK支持
  • 无服务器层按查询收费
  • 快速查询延迟(P99约50毫秒)

缺点:

  • 仅限云端(无自托管)
  • 成本随使用量增长
  • 存在供应商锁定问题

最适合: 优先考虑快速部署和操作简单性的团队。


Chroma — 开发者最爱

Chroma 定位为“AI原生的开源嵌入数据库”。它因其简单性和与LangChain和LlamaIndex的无缝集成而受到喜爱。

import chromadb

client = chromadb.Client()
collection = client.create_collection("my-docs")

# 添加文档并自动嵌入
collection.add(
    documents=["Doc content here", "Another doc"],
    metadatas=[{"source": "pdf"}, {"source": "web"}],
    ids=["doc1", "doc2"]
)

# 查询
results = collection.query(
    query_texts=["semantic search query"],
    n_results=5
)

优点:

  • 极其简单的API
  • 内置嵌入支持
  • 支持嵌入(内存中)或客户端-服务器模式
  • 与LangChain/LlamaIndex的一流集成

缺点:

  • 对于非常大的数据集扩展性有限
  • 企业功能较少
  • 嵌入模式下的持久化可能较为复杂

最适合: 原型设计、中小型项目和以Python为主的团队。


Weaviate — 混合搜索冠军

Weaviate 将向量搜索与关键词(BM25)搜索结合,并提供GraphQL API。它非常适合需要混合搜索提高检索质量的场景。

import weaviate

client = weaviate.Client("http://localhost:8080")

# 创建带有向量化器的模式
client.schema.create_class({
    "class": "Document",
    "vectorizer": "text2vec-openai",
    "properties": [{"name": "content", "dataType": ["text"]}]
})

# 混合搜索(向量 + 关键词)
result = client.query.get("Document", ["content"]) \
    .with_hybrid(query="RAG architecture", alpha=0.5) \
    .with_limit(5) \
    .do()

优点:

  • 原生混合搜索(alpha参数平衡向量/关键词)
  • 内置向量化模块
  • GraphQL查询语言
  • 多租户支持

缺点:

  • 操作复杂度较高
  • 学习曲线较陡
  • 资源密集型

最适合: 需要混合搜索和GraphQL API的生产应用。


Milvus — 企业级规模

Milvus 专为十亿级向量相似性搜索设计。它是企业级部署需要大规模处理的首选。

from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType

connections.connect("default", host="localhost", port="19530")

# 定义模式
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1536)
]
schema = CollectionSchema(fields)
collection = Collection("documents", schema)

# 插入和搜索
collection.insert([[1, 2, 3], [embedding1, embedding2, embedding3]])
collection.search(
    data=[query_embedding],
    anns_field="embedding",
    param={"metric_type": "COSINE", "params": {"nprobe": 10}},
    limit=5
)

优点:

  • 在十亿级向量规模上经过验证
  • 多种索引类型(IVF, HNSW, DiskANN)
  • GPU加速支持
  • 活跃的企业社区(Zilliz Cloud)

缺点:

  • 复杂的部署(需要etcd, MinIO)
  • 对于小型项目来说过于复杂
  • 操作开销较高

最适合: 大规模企业级部署和具备DevOps能力的团队。


Qdrant — 性能与过滤的结合

Qdrant 用Rust编写,提供出色的性能和丰富的元数据过滤功能。它在生产RAG中越来越受欢迎。

from qdrant_client import QdrantClient
from qdrant_client.models import VectorParams, Distance, PointStruct

client = QdrantClient("localhost", port=6333)

# 创建集合
client.create_collection(
    collection_name="documents",
    vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
)

# 带丰富负载的插入
client.upsert(
    collection_name="documents",
    points=[
        PointStruct(id=1, vector=embedding, payload={"category": "tech", "date": "2024-01"})
    ]
)

# 带复杂过滤的搜索
client.search(
    collection_name="documents",
    query_vector=query_embedding,
    query_filter={"must": [{"key": "category", "match": {"value": "tech"}}]},
    limit=5
)

优点:

  • 出色的查询性能(Rust)
  • 丰富的过滤功能(嵌套条件)
  • 量化以提高内存效率
  • 功能与简洁性之间的良好平衡

缺点:

  • 生态系统不如Pinecone/Weaviate大
  • 云服务较新

最适合: 需要高性能和复杂过滤需求的团队。


FAISS — 研究领域的主力

FAISS(Facebook AI Similarity Search)是一个库,而不是数据库。它是许多向量数据库构建的基础。

import faiss
import numpy as np

# 创建索引
dimension = 1536
index = faiss.IndexFlatIP(dimension)  # 内积相似性

# 添加向量
vectors = np.array(embeddings).astype('float32')
index.add(vectors)

# 搜索
D, I = index.search(query_embedding.reshape(1, -1), k=5)

优点:

  • 极快的内存搜索
  • 多种索引类型(Flat, IVF, HNSW, PQ)
  • GPU支持
  • 无网络开销

缺点:

  • 无持久化(需手动保存/加载)
  • 无元数据过滤
  • 无CRUD(更新需重建索引)
  • 仅限单节点

最适合: 研究、原型设计和向量适合内存的场景。


pgvector — PostgreSQL原生

pgvector 为PostgreSQL添加了向量相似性搜索功能。使用现有的PostgreSQL基础设施进行向量处理。

我可以使用像PostgreSQL这样的传统数据库进行向量搜索吗? 当然可以——pgvector使这成为可能并实用。

-- 启用扩展
CREATE EXTENSION vector;

-- 创建带有向量列的表
CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    content TEXT,
    embedding vector(1536)
);

-- 创建HNSW索引
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);

-- 相似性搜索
SELECT id, content, embedding <=> '[0.1, 0.2, ...]' AS distance
FROM documents
WHERE category = 'tech'
ORDER BY distance
LIMIT 5;

优点:

  • 使用现有的PostgreSQL技能/基础设施
  • 与向量结合使用ACID事务
  • 将关系查询与向量搜索结合
  • 无需操作新数据库

缺点:

  • 与专用数据库相比性能上限较低
  • 限于PostgreSQL生态系统
  • 索引构建可能较慢

最适合: 已使用PostgreSQL且希望无需新基础设施进行向量处理的团队。

选择合适的向量数据库

决策框架

从这些问题开始:

  1. 你的规模是多少?

    • < 100K向量 → Chroma, pgvector, FAISS
    • 100K - 10M向量 → Qdrant, Weaviate, Pinecone
    • 10M向量 → Milvus, Pinecone, Qdrant

  2. 自托管还是托管?

    • 托管 → Pinecone, Zilliz(Milvus), Weaviate Cloud
    • 自托管 → Qdrant, Milvus, Chroma, Weaviate
  3. 你需要混合搜索吗?

    • 是 → Weaviate, Elasticsearch
    • 否 → 任何选项都可以
  4. 你的过滤复杂度如何?

    • 简单 → Chroma, Pinecone
    • 复杂嵌套过滤 → Qdrant, Weaviate
  5. FAISS和专用向量数据库之间的区别是什么? 如果你需要持久性、分布式搜索或生产功能——选择数据库。FAISS适合嵌入式研究场景。

常见RAG架构模式

对于生产系统,考虑高级RAG变体如LongRAG用于扩展上下文、具有自我反思能力的Self-RAG或使用知识图谱的GraphRAG以实现更复杂的检索策略。

模式1:使用Chroma的简单RAG

文档 → 嵌入 → Chroma → LangChain → LLM

最适合MVP和内部工具。

模式2:使用Qdrant的生产RAG

文档 → 嵌入 → Qdrant(自托管)
                           ↓
                      FastAPI → LLM

最适合成本敏感的生产部署。

模式3:使用Pinecone的企业级RAG

文档 → 嵌入 → Pinecone(托管)
                           ↓
                      你的应用 → LLM

最适合将可靠性优先于成本的团队。

在将LLM集成到你的RAG流水线时,结构化输出技术与Ollama和Qwen3结合使用,可以帮助确保从语言模型获得一致、可解析的响应,从而更容易提取和处理检索到的信息。

性能基准

实际性能因数据集、查询和硬件而异。一般观察:

操作 FAISS Qdrant Milvus Pinecone Chroma
插入1M向量 30秒 2分钟 3分钟 5分钟 4分钟
查询延迟(P50) 1毫秒 5毫秒 10毫秒 30毫秒 15毫秒
查询延迟(P99) 5毫秒 20毫秒 40毫秒 80毫秒 50毫秒
内存/1M向量 6GB 8GB 10GB 8GB

注:Pinecone延迟包括网络开销;其他为本地。

迁移考虑

如何为我的RAG项目选择Chroma和Weaviate? 还要考虑你的迁移路径:

  • Chroma → 生产: 导出嵌入,重新导入到Qdrant/Pinecone
  • pgvector → 专用: 使用COPY导出,转换并加载
  • FAISS → 数据库: 保存索引,将向量加载到目标数据库

大多数框架(LangChain, LlamaIndex)抽象向量数据库,使迁移在应用层更容易。

成本比较

托管选项(每月,1M向量,10K查询/天):

  • Pinecone Serverless:约50-100美元
  • Pinecone Standard:约70-150美元
  • Weaviate Cloud:约25-100美元
  • Zilliz Cloud:约50-200美元

自托管(基础设施成本):

  • 小型VM(4GB内存):20-40美元/月
  • 中型VM(16GB内存):80-150美元/月
  • Kubernetes集群:200+美元/月

有用链接