用于 RAG 比较的向量存储

发布: (2025年12月5日 GMT+8 13:39)
7 min read
原文: Dev.to

Source: Dev.to

向量存储用于 RAG 对比的封面图片

选择合适的 vector store 能决定你的 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扩展与 Postgres 集成自托管PostgreSQL

各向量存储详细解析

Pinecone — 托管领袖

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

from pinecone import Pinecone

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

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

# Query with metadata filtering
results = index.query(
    vector=query_embedding,
    top_k=5,
    filter={"source": {"$eq": "wiki"}}
)

优点

  • 零基础设施管理
  • 文档和 SDK 支持优秀
  • 无服务器层,按查询付费
  • 查询延迟低(约 50 ms P99)

缺点

  • 仅云端(不支持自托管)
  • 成本随使用量增长
  • 供应商锁定风险

最适合:注重快速上线和运维简易性的团队。

Chroma — 开发者最爱

Chroma 自称是 “AI 原生开源嵌入数据库”。因其简洁性以及与 LangChain、LlamaIndex 的无缝集成而备受喜爱。

import chromadb

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

# Add documents with auto‑embedding
collection.add(
    documents=["Doc content here", "Another doc"],
    metadatas=[{"source": "pdf"}, {"source": "web"}],
    ids=["doc1", "doc2"]
)

# Query
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")

# Create schema with vectorizer
client.schema.create_class({
    "class": "Document",
    "vectorizer": "text2vec-openai",
    "properties": [{"name": "content", "dataType": ["text"]}]
})

# Hybrid search (vector + keyword)
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")

# Define schema
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)

# Insert and search
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)

# Create collection
client.create_collection(
    collection_name="documents",
    vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
)

# Upsert with rich payload
client.upsert(
    collection_name="documents",
    points=[
        PointStruct(id=1, vector=embedding, payload={"category": "news", "source": "api"}),
        # Add more points as needed
    ]
)

# Search with filter
results = client.search(
    collection_name="documents",
    query_vector=query_embedding,
    limit=5,
    filter={"must": [{"key": "category", "match": {"value": "news"}}]}
)

优点

  • Rust 核心带来低延迟和高吞吐
  • 高级负载(元数据)过滤
  • 支持平面和 HNSW 索引
  • 易于自托管(Docker、二进制)

缺点

  • 生态系统相对 Pinecone/Weaviate 较小
  • 缺少内置向量化器(需外部嵌入步骤)

最适合:需要高速向量搜索并伴随复杂元数据过滤的应用。

Back to Blog

相关文章

阅读更多 »