pymilvus 是连接和操作 Milvus 向量数据库的 Python SDK,用于处理大规模向量数据的存储、索引和搜索。
pip install pymilvus
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
# 1. 连接到Milvus服务器
connections.connect("default", host="localhost", port="19530")
# 2. 定义Collection Schema
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128),
FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=1000)
]
schema = CollectionSchema(fields, "向量搜索集合")
# 3. 创建Collection
collection = Collection("my_collection", schema)
# 4. 插入数据
data = [
[[0.1, 0.2, ...], [0.3, 0.4, ...]], # embedding向量
["文本1", "文本2"] # 对应文本
]
collection.insert(data)
# 5. 创建索引
index_params = {
"metric_type": "L2",
"index_type": "IVF_FLAT",
"params": {"nlist": 128}
}
collection.create_index("embedding", index_params)
# 6. 搜索
collection.load()
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
results = collection.search(
data=[query_vector],
anns_field="embedding",
param=search_params,
limit=10
)
特性 | pymilvus (Milvus) | FAISS |
---|---|---|
数据库特性 | ✅ 完整的数据库系统 | ❌ 只是检索库 |
分布式 | ✅ 原生支持集群 | ❌ 单机为主 |
数据持久化 | ✅ 自动持久化 | ❌ 需手动管理 |
CRUD操作 | ✅ 完整增删改查 | ❌ 主要是搜索 |
多租户 | ✅ 支持 | ❌ 不支持 |
性能 | ||
部署复杂度 | 需要服务端 | ✅ 轻量级 |
学习成本 | 中等 | ✅ 简单 |
# 支持多种数据类型
fields = [
FieldSchema(name="id", dtype=DataType.INT64),
FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=768),
FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=200),
FieldSchema(name="timestamp", dtype=DataType.INT64),
FieldSchema(name="category", dtype=DataType.VARCHAR, max_length=50)
]
# 支持多种索引类型
index_types = [
"FLAT", # 暴力搜索
"IVF_FLAT", # 倒排索引
"IVF_SQ8", # 量化压缩
"IVF_PQ", # 乘积量化
"HNSW", # 层次导航小世界
"ANNOY", # 随机投影森林
]
# 支持标量字段过滤
results = collection.search(
data=[query_vector],
anns_field="embedding",
param=search_params,
expr="category == 'tech' and timestamp > 1640995200", # 条件过滤
limit=10
)
# 阿里达摩院的多模态框架
import towhee
dc = towhee.dc(["文本1", "文本2"]) \
.text_embedding.transformers() \
.to_milvus["id", "embedding"](collection="test")
# 典型的企业级RAG实现
class EnterpriseRAG:
def __init__(self):
self.milvus_client = MilvusClient()
self.collection = "knowledge_base"
def add_documents(self, docs):
embeddings = self.get_embeddings(docs)
self.milvus_client.insert(collection_name=self.collection, data=embeddings)
数据规模 | pymilvus | FAISS | 推荐选择 |
---|---|---|---|
< 1M 向量 | FAISS | ||
1M-10M | 都不错 | ||
10M-1B | pymilvus | ||
> 1B | pymilvus |
pymilvus 是构建企业级向量搜索应用的强大工具,特别适合需要:
# 用Milvus替代FAISS - 企业级RAG
from pymilvus import MilvusClient
# 原来用FAISS的代码
# import faiss
# index = faiss.IndexFlatL2(768)
# index.add(vectors)
# 现在用Milvus
client = MilvusClient()
client.create_collection(
collection_name="knowledge_base",
dimension=768,
metric_type="L2"
)
client.insert(collection_name="knowledge_base", data=data)
# Milvus提供FAISS没有的功能
# ✅ 元数据过滤
results = client.search(
collection_name="docs",
data=[query_vector],
filter="category == 'tech' and date > '2024-01-01'", # FAISS做不到
limit=10
)
# ✅ 数据更新
client.delete(collection_name="docs", ids=[1, 2, 3]) # FAISS很麻烦
# ✅ 多用户隔离
client.create_collection("user_1_data") # FAISS没有概念
client.create_collection("user_2_data")
# 简单的向量搜索 - FAISS更合适
import faiss
import numpy as np
# 只需要10行代码
d = 128
index = faiss.IndexFlatL2(d)
index.add(vectors.astype('float32'))
distances, indices = index.search(query, 5)
# 用Milvus就显得大材小用了
# 移动端或离线应用
# FAISS可以打包到应用中
# Milvus需要独立的服务器,不现实
# 对延迟敏感的场景
# FAISS: 内存中直接搜索,微秒级
# Milvus: 需要网络通信,增加延迟
应用程序 → FAISS库 → 内存/磁盘
应用程序 → pymilvus → 网络 → Milvus服务器 → 存储
需求场景 | 推荐方案 | 理由 |
---|---|---|
个人项目/原型 | FAISS | 简单、快速 |
小团队应用 | FAISS | 部署简单 |
企业级产品 | Milvus | 功能完整 |
大规模数据 | Milvus | 性能和扩展性 |
实时推荐 | FAISS | 延迟最低 |
内容管理 | Milvus | 支持CRUD |
移动/边缘 | FAISS | 无需服务器 |
多租户SaaS | Milvus | 隔离和管理 |
# 阶段1: 原型阶段用FAISS
import faiss
# 快速验证想法
# 阶段2: 产品化用Milvus
from pymilvus import MilvusClient
# 添加完整功能
# 阶段3: 根据需求选择
# 如果够用就继续Milvus
# 如果性能瓶颈再考虑FAISS优化
# 核心搜索用FAISS(性能)
faiss_index = faiss.IndexHNSWFlat(768, 32)
# 元数据管理用数据库
# 复杂查询用Milvus的其他collection
最佳实践: 根据项目发展阶段和具体需求来选择,不是非此即彼的关系!