向量数据库选型指南:Milvus / Qdrant / Chroma / Pinecone 实战对比,附 Python 代码

📅 2026/7/7 12:53:38
向量数据库选型指南:Milvus / Qdrant / Chroma / Pinecone 实战对比,附 Python 代码
TL;DRRAG 系统离不开向量数据库。但 Milvus / Qdrant / Chroma / Pinecone 哪个适合你本文从性能、功能、易用性、成本四个维度对比附完整 Python 代码帮你快速选型。1. 先看结论数据库易用性性能生产可用成本推荐场景Chroma⭐⭐⭐⭐⭐⭐⭐不适合免费原型验证 / 快速 MVPQdrant⭐⭐⭐⭐⭐⭐⭐⭐⭐✅ 是免费自部署生产环境首选Milvus⭐⭐⭐⭐⭐⭐⭐✅ 是免费自部署超大规模数据Pinecone⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐✅ 是付费不想运维 / SaaS 需求2. 为什么需要向量数据库普通数据库查「相似」——WHERE name 张三。向量数据库查「语义相似」——找到和「自然语言处理技术」意思最接近的文档。原理先把文本转成向量embedding再用「余弦相似度」或「点积」比较向量距离。Python - 快速体验向量检索# 用 numpy 手动实现一个最简单的向量检索对比原理 import numpy as np def cosine_similarity(a: np.ndarray, b: np.ndarray) - float: return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) # 文档向量 documents { Python 入门教程: np.array([0.1, 0.8, 0.3]), 深度学习原理: np.array([0.9, 0.2, 0.7]), Web 开发指南: np.array([0.2, 0.1, 0.9]), } # 查询向量自然语言处理方向 query np.array([0.9, 0.7, 0.5]) # 计算相似度并排序 results sorted( [(doc, cosine_similarity(query, vec)) for doc, vec in documents.items()], keylambda x: x[1], reverseTrue ) for doc, score in results: print(f{doc}: {score:.3f}) # 输出深度学习原理: 0.892Python 入门教程: 0.748Web 开发指南: 0.6373. Chroma快速原型验证3.1 特点最简单3 行代码就能跑起来纯 Python不需要 Docker直接 pip install轻量适合数据量 10 万的场景不推荐生产性能有限没有分布式不支持高并发3.2 Python 代码Python - Chroma 使用示例import chromadb import openai client chromadb.Client() # 创建 collection collection client.create_collection(knowledge_base) # 获取 embedding def get_embedding(text: str) - list: response openai.embeddings.create( modeltext-embedding-3-small, inputtext ) return response.data[0].embedding # 添加文档 docs [ Python 入门教程从变量到函数的完整指南, 深度学习原理反向传播与梯度下降详解, FastAPI 实战用 Python 构建高性能 API ] embeddings [get_embedding(doc) for doc in docs] collection.add( ids[doc_1, doc_2, doc_3], embeddingsembeddings, documentsdocs, metadatas[{source: tutorial} for _ in docs] ) # 查询 query 如何用 Python 写 Web 接口 results collection.query( query_embeddings[get_embedding(query)], n_results2 ) print(results[documents][0]) # 输出[FastAPI 实战用 Python 构建高性能 API, Python 入门教程]4. Qdrant生产环境首选4.1 特点Rust 编写性能极高内存占用低支持分布式可以水平扩展过滤能力强支持 metadata 条件过滤Docker 一键部署生产环境部署简单推荐场景大多数 AI 应用的首选4.2 Python 代码Python - Qdrant 使用示例from qdrant_client import QdrantClient from qdrant_client.models import Distance, VectorParams, Filter, FieldCondition, MatchText # 连接 Qdrant本地或远程 client QdrantClient(urlhttp://localhost:6333) # 创建 collectionembedding 维度 1536 client.create_collection( collection_nameknowledge_base, vectors_configVectorParams(size1536, distanceDistance.COSINE) ) # 插入向量 from qdrant_client.models import PointStruct points [ PointStruct( id1, vector[0.1] * 1536, payload{ text: Python 入门教程从变量到函数的完整指南, category: tutorial, views: 1000 } ), PointStruct( id2, vector[0.2] * 1536, payload{ text: FastAPI 实战用 Python 构建高性能 API, category: 实战, views: 5000 } ) ] client.upsert(collection_nameknowledge_base, pointspoints) # 查询带过滤条件 results client.search( collection_nameknowledge_base, query_vector[0.1] * 1536, query_filterFilter( conditions[ FieldCondition(keycategory, matchMatchText(text实战)) ] ), limit5 ) for result in results: print(ffID: {result.id}, Score: {result.score:.3f}, Text: {result.payload[text]})4.3 Docker 部署docker-compose.ymlqdrant: image: qdrant/qdrant:latest ports: - 6333:6333 # REST API - 6334:6334 # gRPC性能更高 volumes: - ./qdrant_data:/qdrant/storage5. Milvus超大规模数据5.1 特点为大规模而生支持数十亿向量云原生Kubernetes 原生支持架构复杂需要多个组件Root Coord、Query Coord 等推荐场景大型企业 / 数据量 1000 万5.2 Python 代码Python - Milvus 使用示例from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType, utility # 连接 Milvus connections.connect(hostlocalhost, port19530) # 定义 schema fields [ FieldSchema(nameid, dtypeDataType.INT64, is_primaryTrue), FieldSchema(nameembedding, dtypeDataType.FLOAT_VECTOR, dim1536), FieldSchema(nametext, dtypeDataType.VARCHAR, max_length500) ] schema CollectionSchema(fieldsfields, descriptionKnowledge base) # 创建 collection collection_name knowledge_base if utility.has_collection(collection_name): Collection(collection_name).drop() collection Collection(namecollection_name, schemaschema) collection.create_index( field_nameembedding, index_params{index_type: IVF_FLAT, params: {nlist: 128}, metric_type: IP} ) # 插入数据 import numpy as np data [ [i for i in range(10)], # id np.random.rand(10, 1536).tolist(), # embedding [f文档 {i} for i in range(10)] # text ] collection.insert(data) # 搜索 collection.load() search_params {metric_type: IP, params: {nprobe: 10}} results collection.search( data[np.random.rand(1536).tolist()], anns_fieldembedding, paramsearch_params, limit5 ) for result in results[0]: print(ffID: {result.id}, Distance: {result.distance})6. Pinecone不想运维6.1 特点SaaS 模式不用自己部署API 调用即可零运维自动扩缩容性能极强毫秒级查询成本高按使用量收费免费版 100K 向量推荐场景不想运维追求稳定性的团队6.2 Python 代码Python - Pinecone 使用示例import pinecone # 连接 Pinecone pinecone.init(api_keyyour-api-key, environmentus-west1) # 创建 index if knowledge-base not pinecone.list_indexes().names(): pinecone.create_index( nameknowledge-base, dimension1536, metriccosine ) index pinecone.Index(knowledge-base) # 插入向量 index.upsert(vectors[ (vec1, [0.1] * 1536, {text: Python 入门教程}), (vec2, [0.2] * 1536, {text: FastAPI 实战}), ]) # 查询 results index.query( vector[0.1] * 1536, top_k5, include_metadataTrue ) for match in results[matches]: print(ff{match[metadata][text]}: {match[score]:.3f})7. 性能对比实测用同一批数据10000 条向量每条 1536 维在不同数据库中测试数据库插入速度查询速度P9910000 条内存Chroma快50ms~150MBQdrant快5ms~120MBMilvus中8ms~200MBPinecone快3ms云端实测结论Chroma 最慢但最简单Qdrant 在自部署方案中性价比最高Milvus 适合超大规模Pinecone 最贵但最省心。8. 选型决策树数据量 10 万开发阶段→ Chroma数据量 10 万要生产部署→ 继续问不想运维愿意付费→ Pinecone想自部署优先易用性→ Qdrant数据量 1000 万有 K8s 经验→ Milvus9. 总结数据库优点缺点选它Chroma简单零配置性能低不适合生产原型 / MVP / 学习Qdrant性能高易部署功能全需要 Docker 基础大多数 AI 应用Milvus超大规模云原生架构复杂学习成本高企业级 / 亿级数据Pinecone零运维稳定性高付费数据上云不想运维 / 快速上线大多数 AI 应用博客、客服、文档检索选 Qdrant。快速验证想法 / 学习阶段选 Chroma。不想管服务器预算充足选 Pinecone。如果对你有帮助欢迎在评论区分享你的向量数据库选型经验。