Milvus — 开源向量数据库
待复核Milvus 是一个开源的向量数据库——把”找相似图片 / 文本 / 音频”这件事做成像 SQL 查询一样直白的引擎。它存的不是文字本身,而是 clip 这种模型把图片或文本”翻译”出来的高维数字向量。
日常类比:
- postgresql 按订单号查——你给”订单 123”,它给你这一行
- Milvus 按”长得像”查——你给一张猫的照片,它给你全库最像这只猫的 10 张
具体场景:你有 100 万张商品图,用户拍一张沙发照片想”找同款”。传统数据库做不到(像素 ≠ 标签);Milvus 把每张图变成 768 维向量,比”哪条向量距离最近”。
不理解向量数据库,下面这些产品都讲不清:
- RAG(检索增强生成):ChatGPT 答你的私有文档问题,背后是把文档切片 → 向量化 → 存进 Milvus → 提问时检索最相关 3 段塞进 prompt
- 推荐系统:抖音 / 小红书算”猜你喜欢”,本质是把用户行为变成向量,找相似用户喜欢的内容
- 以图搜图 / 多模态搜索:拼多多”拍立淘”、Google Lens 都是这类技术
- 赛道格局:Pinecone(闭源 SaaS) / Weaviate / Qdrant / Chroma / Milvus 五家竞争。Milvus 是国产(Zilliz 出品)+ Apache 2.0 开源,也是该赛道里较早进入 LF AI & Data Foundation 并毕业的项目
一句话:大模型时代每多一个 RAG 应用,向量数据库的市场就大一格。
数据模型:Collection + Vector + Metadata
Section titled “数据模型:Collection + Vector + Metadata”每条记录有两部分:
- 向量字段:一串浮点数(如
[0.12, -0.45, ..., 0.88],维度通常 128 / 768 / 1536) - 标量字段:传统的 id / category / timestamp / text
这种”向量 + 元数据”混合让你既能”按相似度排”又能”按业务条件过滤”。
索引:决定速度 vs 精度 vs 成本的三角
Section titled “索引:决定速度 vs 精度 vs 成本的三角”向量搜索本质是 ANN(Approximate Nearest Neighbor,近似最近邻)——精确比所有向量太慢,所以用索引牺牲一点准确率换 100 倍速度。
| 索引 | 特点 | 适合场景 |
|---|---|---|
| HNSW | 层级图,内存占用大但查询最快 | 亿级以下、要低延迟 |
| IVF | 把向量分桶,磁盘存储省钱 | 十亿级、对延迟没那么苛刻 |
| DiskANN | 微软出品,磁盘上跑 HNSW 思路 | 百亿级、单机塞不下内存 |
混合查询:向量相似 + 标量 filter
Section titled “混合查询:向量相似 + 标量 filter”client.search( collection_name="docs", data=[query_vector], top_k=10, filter="category == 'tech' AND created_at > '2025-01-01'")意思是”找最像 query 的文档,但只看 2025 之后的科技类”。这是 Milvus 区别于纯向量库(如早期 Faiss)的核心能力。
案例 1:Docker 起 standalone
Section titled “案例 1:Docker 起 standalone”最简单的玩法——一台机器、一个 docker compose 命令:
git clone https://github.com/milvus-io/milvuscd milvus/deployments/docker/standalonedocker compose up -d启动后默认监听 localhost:19530。生产环境用 Kubernetes 集群版(分离 etcd / minio / pulsar 等组件)。
案例 2:Python SDK 写入 + 检索
Section titled “案例 2:Python SDK 写入 + 检索”from pymilvus import MilvusClient
client = MilvusClient("http://localhost:19530")
# 建集合client.create_collection( collection_name="docs", dimension=768,)
# 写入client.insert("docs", [ {"id": 1, "vector": [0.1, 0.2, ...], "text": "向量数据库入门"}, {"id": 2, "vector": [0.3, 0.1, ...], "text": "RAG 实战指南"},])
# 检索results = client.search( collection_name="docs", data=[query_vec], top_k=10, filter="text like '%RAG%'",)代码风格刻意做得像 postgresql——create_collection / insert / search 三步走,降低学习成本。
案例 3:与 LangChain 接 RAG
Section titled “案例 3:与 LangChain 接 RAG”LangChain 已经把 Milvus 包成 vectorstore,三行代码接进去:
from langchain_milvus import Milvusvs = Milvus.from_documents(docs, embeddings, connection_args={"uri": "http://localhost:19530"})retriever = vs.as_retriever(search_kwargs={"k": 4})之后你的 RAG chain 就能从 Milvus 拉相关文档片段。
-
索引构建慢得离谱:1000 万条 768 维向量 + HNSW 索引,单机几小时是常态。生产环境要么离线建好再 load,要么用 GPU 索引(Milvus 2.4+ 支持 NVIDIA cuVS)。
-
HNSW 是内存吃货:每条向量除了原始 768 × 4 字节,还要存图结构指针。10 亿向量大约要 1.5 TB RAM——所以大规模场景必须切到 IVF 或 DiskANN。
-
一致性级别四档容易混:
- Strong:写完立刻能读到,但慢
- Bounded:默认,最多 5 秒延迟
- Session:只保证自己写的自己能读到
- Eventually:最快但可能读到旧数据 选错了要么慢要么”明明插入了搜不到”。
-
schema 改动重型操作:加字段或换索引要先
release整个集合,再rebuild,期间不可用。提前规划比事后改便宜十倍。 -
PK 自动 ID 的坑:开
auto_id后插入不能传 id,否则 silent fail;关auto_id又要自己保证不重——两边都踩过。
适用 vs 不适用
Section titled “适用 vs 不适用”适用:
- 千万级到百亿级向量检索
- 需要混合查询(向量 + 业务字段过滤)
- 自部署 + 不愿被 Pinecone 这种闭源 SaaS 锁定
- 国内合规要求(数据不出境)
不适用:
- 数据量 < 10 万条 → SQLite + chroma 这种轻量库够用,不必上集群
- 需要事务 / 强一致 → 找传统关系数据库
- 只查 metadata 不查向量 → 退回 postgresql + pgvector 扩展更省心
历史小故事(可跳过)
Section titled “历史小故事(可跳过)”- 2017 年:上海 Zilliz 创立,从 FAISS 起步做非结构化数据管理
- 2019 年:Milvus 1.0 开源,定位”为 AI 设计的向量数据库”
- 2020–2021:加入 LF AI & Data 孵化,2021-06 毕业;同年 2.0 改成云原生分离架构
- 2023 年:ChatGPT 引爆 RAG,Milvus 下载量年增约 10 倍
- 2024 年:2.4 引入 GPU 索引与 sparse vector(关键词 + 语义混合)
- 向量库不是新 SQL——解决”按语义找”,与关系库互补而非替代
- 索引 = 三角妥协:内存 / 延迟 / 准确率,HNSW / IVF / DiskANN 各占一角
- ANN 是工程权衡——高维精确最近邻太慢(维度灾难),工业界用近似换速度
- 国产开源可进全球第一梯队:Milvus 现 30k+ star,与 Pinecone 等长期共存
- 官方文档:milvus.io(中英双语)
- 论文:Milvus (SIGMOD 2021)
- HNSW:Malkov & Yashunin 2018
- clip —— 图文统一向量化,Milvus 常见输入源
- chroma —— 同赛道轻量竞品
- clip —— 把图文映射到同一向量空间,Milvus 负责存与搜
- postgresql —— 关系库代表;Milvus API 学了 create / insert / search
- chroma —— 更轻量的开源向量库,Milvus 走集群路线
- faiss —— 底层 ANN 算法库,许多向量库的起点
- rag-lewis-2020 —— RAG 奠基;向量库是其检索层常见实现
- filip-2021 —— FILIP — 把 CLIP 的图文对齐细化到 token 级
- rag-lewis-2020 —— RAG (Lewis 2020) — 检索增强生成奠基
- ann-benchmarks —— ANN-Benchmarks — 近似最近邻算法的统一擂台
- chroma —— Chroma — Python 优先的向量数据库
- faiss —— FAISS — 向量检索的标准件库
- hnswlib —— hnswlib — HNSW 论文作者写的参考实现,业界向量库都基于它
- lancedb —— LanceDB — 嵌入式向量库(进程内 + 对象存储)
- langchain —— LangChain — LLM 应用开发框架
- opensearch —— OpenSearch — AWS 主导的 Apache 2.0 搜索引擎分叉
- pgvector —— pgvector — PostgreSQL 向量扩展
- qdrant —— Qdrant — Rust 向量数据库
- typesense —— Typesense — 高性能搜索引擎
- vespa —— Vespa — Yahoo 检索 + 排序引擎
- weaviate —— Weaviate — 模块化向量数据库