pymilvus

一.pymilvus介绍

pymilvus 是什么?

pymilvus 是连接和操作 Milvus 向量数据库的 Python SDK,用于处理大规模向量数据的存储、索引和搜索。

️ Milvus 向量数据库

什么是 Milvus?

  • 专业向量数据库 - 专门为向量数据设计的数据库系统
  • ☁️ 云原生架构 - 支持分布式部署和水平扩展
  • 高性能 - 基于 FAISS、Annoy 等多种向量索引引擎

pymilvus 基本使用

安装

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 vs FAISS 对比

特性 pymilvus (Milvus) FAISS
数据库特性 ✅ 完整的数据库系统 ❌ 只是检索库
分布式 ✅ 原生支持集群 ❌ 单机为主
数据持久化 ✅ 自动持久化 ❌ 需手动管理
CRUD操作 ✅ 完整增删改查 ❌ 主要是搜索
多租户 ✅ 支持 ❌ 不支持
性能
部署复杂度 需要服务端 ✅ 轻量级
学习成本 中等 ✅ 简单

pymilvus 的优势

1. 企业级特性

# 支持多种数据类型
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)
]

2. 高级索引算法

# 支持多种索引类型
index_types = [
    "FLAT",      # 暴力搜索
    "IVF_FLAT",  # 倒排索引
    "IVF_SQ8",   # 量化压缩
    "IVF_PQ",    # 乘积量化
    "HNSW",      # 层次导航小世界
    "ANNOY",     # 随机投影森林
]

3. 灵活的查询语法

# 支持标量字段过滤
results = collection.search(
    data=[query_vector],
    anns_field="embedding",
    param=search_params,
    expr="category == 'tech' and timestamp > 1640995200",  # 条件过滤
    limit=10
)

使用 pymilvus 的知名项目

1. Towhee

# 阿里达摩院的多模态框架
import towhee
dc = towhee.dc(["文本1", "文本2"]) \
    .text_embedding.transformers() \
    .to_milvus["id", "embedding"](collection="test")

2. VectorDBBench

  • 向量数据库性能测试平台
  • 专门测试Milvus vs其他向量数据库

3. 企业RAG应用

# 典型的企业级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 当:

  • 快速原型 - 简单快速上手
  • 单机应用 - 不需要分布式
  • 极致性能 - 对延迟要求极高
  • 自定义需求 - 需要算法层面控制

性能对比

数据规模 pymilvus FAISS 推荐选择
< 1M 向量 FAISS
1M-10M 都不错
10M-1B pymilvus
> 1B pymilvus

总结

pymilvus 是构建企业级向量搜索应用的强大工具,特别适合需要:

  • 完整数据库功能的场景
  • 大规模数据处理的需求
  • 复杂查询逻辑的应用

二.Milvus vs FAISS 替代分析

Milvus vs FAISS 替代分析

✅ Milvus 可以替代 FAISS 的场景

1. 企业级应用
# 用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)
2. 需要完整数据库功能
# 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")
3. 大规模分布式需求
  • 集群部署: Milvus原生支持,FAISS需要自己实现
  • 自动扩容: Milvus支持,FAISS需要手动管理
  • 负载均衡: Milvus内置,FAISS需要额外开发

不建议完全替代的场景

1. 轻量级应用

# 简单的向量搜索 - 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就显得大材小用了

2. 离线/嵌入式应用

# 移动端或离线应用
# FAISS可以打包到应用中
# Milvus需要独立的服务器,不现实

3. 极致性能要求

# 对延迟敏感的场景
# FAISS: 内存中直接搜索,微秒级
# Milvus: 需要网络通信,增加延迟

️ 架构对比分析

FAISS架构

应用程序 → FAISS库 → 内存/磁盘
  • 零延迟 - 没有网络开销
  • 轻量级 - 集成在应用中
  • 功能有限 - 只是索引库

Milvus架构

应用程序 → 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

总结建议

选择Milvus当你需要:

  • 企业级功能 (CRUD、权限、多租户)
  • 大规模数据 (>千万向量)
  • 复杂查询 (元数据过滤)
  • 团队协作 (多用户、API)

保留FAISS当你有:

  • 极致性能要求 (微秒级延迟)
  • 资源限制 (单机、嵌入式)
  • 快速原型 (快速验证)
  • 深度定制 (算法层面控制)

最佳实践: 根据项目发展阶段和具体需求来选择,不是非此即彼的关系!

你可能感兴趣的:(人工智能)