向量数据库存储 Embedding,也就是文本、图像或音频的数值表示,并在查询时检索语义上最接近的结果。RAG 系统正是基于这一机制运作。本文对比三个主流方案,每个都附有 Python 代码,均来自实际在生产环境中使用三者的经验。
三种选择:Pinecone 用于生产级规模,Chroma 用于本地原型开发,Weaviate 用于混合搜索。
向量数据库究竟做了什么
对一段文本做 Embedding得到的是一个向量,比如说一个由 768 或 1,536 个数字组成的数组,代表该文本的语义含义。相似的文本产生相似的向量。向量数据库将这些向量存储下来并建立索引,以支持快速最近邻搜索。
用户提出问题时,先将问题做 Embedding再向向量数据库发起查询:"哪些已存储的向量与之最接近?"数据库返回语义上最相似的文本片段,随后将这些片段注入 LLM 的上下文。
检索环节的好坏直接决定 RAG 系统整体的表现,这一步出了偏差再好的 LLM 也只会给出自信却错误的回答。
Chroma:从原型开发开始
Chroma 开源,通过 pip install chromadb 安装,支持本地内存运行或持久化到磁盘,5 分钟内即可搭建一个可用的向量存储。
基本 Python 设置
import chromadb
from chromadb.utils import embedding_functions
client = chromadb.PersistentClient(path='./my_db')
ef = embedding_functions.OpenAIEmbeddingFunction(
api_key='your-key', model_name='text-embedding-3-small')
collection = client.get_or_create_collection('docs', embedding_function=ef)
# 添加文档
collection.add(documents=['doc1 text', 'doc2 text'], ids=['id1','id2'])
# 查询
results = collection.query(query_texts=['your question'], n_results=5)
但是Chroma 并非云原生。跨多台机器扩展需要自行管理服务器,一旦超出单机部署范围或数据集规模超过约 100 万条文档,迁移就不可避免。接口设计得干净的话过程不算痛苦,但仍需投入时间。
Pinecone:进入生产环境时的选择
Pinecone 是完全托管的云基础设施——无需自行运行服务器、管理内存或操心副本复制。免费层约可处理 100 万个 1,536 维向量,覆盖多数小型应用绰绰有余;付费层可扩展至数十亿量级。
基本 Python 设置
from pinecone import Pinecone
pc = Pinecone(api_key='your-pinecone-api-key')
index = pc.Index('my-index')
# Upsert(需要单独处理 Embedding)
index.upsert(vectors=[('id1', embedding_vector, {'text': 'doc text'})])
# 查询
results = index.query(vector=query_embedding, top_k=5, include_metadata=True)
Pinecone 的免费层确实有用。超出限额后成本随向量数量和查询量增长,日均 10,000 次查询的初创应用尚在可控范围,而大规模应用则会变成一笔可观支出。所以开始时保留切换向量存储的余地,把检索逻辑封装在清晰的接口后面。
Weaviate:用于混合搜索
纯语义搜索与纯关键词搜索都不总是最优解。语义搜索会漏掉精确匹配,用户查询"RFC 7519"时,关键词匹配远比语义相似度更快定位到结果。混合搜索将余弦相似度与 BM25 关键词匹配相结合,并对两者施加权重。
基本混合搜索
import weaviate
client = weaviate.connect_to_wcs(cluster_url='…', auth_credentials=…)
collection = client.collections.get('Document')
# 混合查询:结合语义 + 关键词
results = collection.query.hybrid(
query='your question',
alpha=0.5, # 0 = 仅关键词, 1 = 仅语义, 0.5 = 均衡
limit=5
)
知识库中若包含技术文档、API 参考或带有特定标识符、型号、代码的内容,混合搜索的表现会优于纯语义检索。一般性文本内容则差距不大,额外的复杂性未必划算。
常见问题
第一个项目应该使用哪个向量数据库?
Chroma没有悬念。pip 安装,本地运行,零配置,免费。先用 Chroma 搭建第一个 RAG 系统,日后需要扩展至生产环境,迁移到 Pinecone 或 Weaviate 只需几小时——前提是接口足够干净。
做 RAG 一定需要向量数据库吗,还是可以用普通数据库?
PostgreSQL 的 pgvector 扩展可以实现近似最近邻搜索,这是一个可行的生产方案。Supabase(托管式 Postgres)原生支持 pgvector,100 万向量以下的应用表现良好。规模再往上走专用向量数据库在性能上的优势才会真正体现出来。
应该使用哪个 Embedding 模型?
OpenAI 和google的API都是可以选择的质量可靠,价格低廉(约每百万 Token 0.02 美元),生态支持广泛。本地部署且注重隐私的场景下,通过 Ollama 运行 nomic-embed-text 是最佳免费方案;追求质量上限而不计成本,可选 text-embedding-3-large 或 Cohere 的 embed-v3。
by Pratham