Skip to content

数据库选择

选择合适的向量数据库是构建高性能RAG系统的关键步骤。不同的向量数据库在性能、功能、部署方式等方面存在差异,需要根据具体应用场景进行选择。本章节将介绍主流向量数据库的特点、适用场景和选择策略。

1. 主流向量数据库

Pinecone

特点

  • 托管服务,无需自行部署和维护
  • 高性能,支持大规模向量存储和检索
  • 易用性高,提供简单的API接口
  • 支持元数据过滤和命名空间

适用场景

  • 企业级应用
  • 快速原型开发
  • 对可靠性和性能要求高的场景

示例代码

python
from langchain.vectorstores import Pinecone
from langchain.embeddings import OpenAIEmbeddings
import pinecone

# 初始化Pinecone
pinecone.init(
    api_key="your_api_key",
    environment="your_environment"
)

# 创建索引
index_name = "rag-demo"
if index_name not in pinecone.list_indexes():
    pinecone.create_index(
        name=index_name,
        dimension=1536,  # OpenAI Embeddings维度
        metric="cosine"
    )

# 创建嵌入模型
embeddings = OpenAIEmbeddings()

# 创建向量存储
vectorstore = Pinecone.from_documents(
    documents=texts,
    embedding=embeddings,
    index_name=index_name
)

Weaviate

特点

  • 开源和托管两种版本
  • 支持GraphQL查询接口
  • 内置向量化模块
  • 支持多模态数据

适用场景

  • 需要复杂查询的场景
  • 多模态应用
  • 对数据隐私有要求的场景(自托管)

示例代码

python
import weaviate
from langchain.vectorstores import Weaviate

# 连接到Weaviate
client = weaviate.Client("http://localhost:8080")

# 创建向量存储
vectorstore = Weaviate.from_documents(
    documents=texts,
    embedding=embeddings,
    client=client,
    index_name="Document"
)

Chroma

特点

  • 轻量级,易于使用
  • 支持本地存储
  • 集成度高,适合开发测试
  • 开源免费

适用场景

  • 开发测试
  • 小型项目
  • 本地原型开发

示例代码

python
from langchain.vectorstores import Chroma

# 创建本地向量存储
vectorstore = Chroma.from_documents(
    documents=texts,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

# 持久化存储
vectorstore.persist()

Milvus

特点

  • 开源,分布式架构
  • 高性能,支持十亿级向量
  • 丰富的索引类型
  • 企业级特性

适用场景

  • 大规模数据
  • 企业级应用
  • 需要分布式部署的场景

示例代码

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

# 连接Milvus
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=768)
]
schema = CollectionSchema(fields, "RAG Collection")

# 创建集合
collection = Collection("rag_collection", schema)

FAISS

特点

  • Facebook开源
  • 高性能,多种索引算法
  • 纯内存操作,速度极快
  • 需要自行管理持久化

适用场景

  • 高性能需求
  • 内存充足的环境
  • 需要自定义索引的场景

示例代码

python
from langchain.vectorstores import FAISS

# 创建FAISS向量存储
vectorstore = FAISS.from_documents(
    documents=texts,
    embedding=embeddings
)

# 保存到本地
vectorstore.save_local("faiss_index")

# 从本地加载
vectorstore = FAISS.load_local("faiss_index", embeddings)

2. 选择策略

评估维度

维度说明
性能检索速度、吞吐量
规模支持的向量数量
易用性学习曲线、文档质量
部署方式托管/自托管/本地
成本使用成本、维护成本
功能元数据过滤、混合搜索等

场景推荐

入门学习

  • 推荐:Chroma
  • 原因:轻量级,易于上手,无需额外配置

快速原型

  • 推荐:Chroma 或 Pinecone(免费层)
  • 原因:快速启动,专注于业务逻辑

小型生产环境

  • 推荐:Pinecone 或 Weaviate
  • 原因:托管服务,减少运维负担

大型企业应用

  • 推荐:Milvus 或 Pinecone
  • 原因:支持大规模数据,企业级特性

高性能需求

  • 推荐:FAISS 或 Milvus
  • 原因:极致的检索性能

3. 对比总结

数据库类型部署最佳适用规模学习曲线
Chroma轻量级本地< 100k
FAISS本地< 10M
Pinecone托管云服务无限制
Weaviate开源/托管两者无限制
Milvus开源自托管无限制

4. 迁移策略

从Chroma迁移到生产级数据库

python
# 1. 从Chroma导出数据
chroma_store = Chroma(persist_directory="./chroma_db")
docs = chroma_store.get()

# 2. 导入到Pinecone
pinecone_store = Pinecone.from_documents(
    documents=docs,
    embedding=embeddings,
    index_name="production_index"
)

5. 混合使用策略

多级存储

python
class TieredVectorStore:
    def __init__(self):
        # 热数据:内存中的FAISS
        self.hot_store = FAISS.from_documents(hot_docs, embeddings)
        # 温数据:Chroma本地存储
        self.warm_store = Chroma(persist_directory="./warm_db")
        # 冷数据:Milvus远程存储
        self.cold_store = Milvus(embeddings, "cold_collection")
    
    def search(self, query, k=10):
        # 先在热数据中搜索
        results = self.hot_store.similarity_search(query, k=k//2)
        if len(results) < k:
            # 补充温数据
            results.extend(self.warm_store.similarity_search(query, k=k-len(results)))
        return results