在人工智能技术爆发的今天,非结构化数据(文本、图像、音频、视频)的处理需求呈指数级增长。传统关系型数据库基于结构化数据设计,无法高效处理高维向量数据的相似性检索;而传统搜索引擎依赖关键词匹配,难以理解数据的语义信息。向量数据库作为 AI 原生应用的核心基础设施,通过将非结构化数据转换为高维向量,基于余弦相似度、欧氏距离等算法实现语义级检索,彻底改变了数据检索的范式。
Milvus 作为开源向量数据库领域的领军产品,自 2019 年开源以来,已成为 GitHub 上最受欢迎的向量数据库项目之一,被 Roblox、Salesforce、Palo Alto Networks 等全球知名企业采用。其核心定位是 “为海量高维向量提供高性能、高可靠、高可扩展的相似性搜索服务”,支持从百万级到百亿级向量规模的平滑扩展,覆盖 RAG、智能推荐、图像检索、 fraud detection 等多元场景。本文将从技术架构、核心功能、实践教程、性能优化、行业应用、竞品对比六个维度,全面解析 Milvus 的技术内核与应用价值。
Milvus 的架构设计遵循三大核心原则:存储与计算分离、控制平面与数据平面分离、云原生弹性扩展。这种设计使其能够适配从单机开发到集群部署的全场景需求,同时保证高吞吐量、低延迟和高可用性。
Milvus 的整体架构分为四层,自上而下分别为:接入层(Access Layer)、协调层(Coordinator Layer)、执行层(Execution Layer)、存储层(Storage Layer)。各层相互独立,可单独横向扩展,确保系统在高并发场景下的稳定性。

图 1:Milvus 2.4 版本高可用架构图(来源:Milvus 官方文档)
接入层由一组无状态的 Proxy 节点组成,是用户与 Milvus 集群的交互入口。其核心功能包括:
Proxy 节点的无状态设计使其可根据请求量动态扩容,例如在电商大促期间增加 Proxy 节点数量,提升并发处理能力。
协调层是 Milvus 集群的 “大脑”,负责集群拓扑管理、任务调度与一致性保障。集群中同一时刻仅有一个活跃的 Coordinator 节点(通过 Raft 协议实现主从切换),其核心职责包括:
执行层是 Milvus 的计算核心,包含三种核心节点,分别负责实时写入、历史数据查询与批量处理:
执行层节点支持弹性扩缩容,例如在数据量激增时增加 Data Node 节点加速索引构建,在查询峰值时增加 Query Node 节点提升吞吐量。
Milvus 采用分层存储架构,将数据分为三类,分别存储在不同的存储系统中,实现性能与成本的平衡:
存储层的核心设计是 “无状态计算 + 共享存储”,所有执行节点通过共享存储访问数据,避免数据冗余,同时提升扩容效率。
Milvus 的数据模型与传统数据库类似,但针对向量数据进行了优化,核心概念包括:
Milvus 的数据写入流程采用 “实时写入 + 异步归档” 模式,确保高吞吐量与低延迟:
Milvus 的核心功能是向量相似性搜索,支持多种距离度量方式与索引算法,满足不同场景的性能需求。
向量相似性的本质是计算两个向量之间的 “距离”,距离越近表示相似度越高。Milvus 支持以下主流度量方式:
用户可在创建集合时指定度量方式,示例代码如下:
from pymilvus import CollectionSchema, FieldSchema, DataType
# 定义字段
id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True)
vector_field = FieldSchema(
name="vector",
dtype=DataType.FLOAT_VECTOR,
dim=768, # 向量维度
metric_type=DataType.METRIC_TYPE_COSINE # 指定余弦相似度
)
scalar_field = FieldSchema(name="category", dtype=DataType.VARCHAR, max_length=50)
# 创建集合
schema = CollectionSchema(fields=[id_field, vector_field, scalar_field], description="示例集合")
collection = client.create_collection(name="demo_collection", schema=schema)向量索引是提升搜索性能的关键,Milvus 集成了多种业界领先的索引算法,用户可根据数据规模、查询延迟需求选择合适的索引:
索引创建示例代码:
# 为向量字段创建HNSW索引
index_params = {
"index_type": "HNSW",
"metric_type": "COSINE",
"params": {
"M": 16, # 每个节点的邻居数量
"efConstruction": 200 # 构建索引时的搜索范围
}
}
collection.create_index(field_name="vector", index_params=index_params)
# 加载索引到内存(查询前必须加载)
collection.load()Milvus 不仅支持基础的向量搜索,还提供多种高级搜索功能,满足复杂场景需求:
混合搜索是指结合向量相似性搜索与标量字段过滤,例如 “查询属于‘科技’分类且与‘人工智能’语义相似的文章”。这种方式可大幅提升查询精度,减少无关结果。
示例代码:
# 准备查询向量(假设已通过嵌入模型生成)
query_vector = [0.12, 0.34, ..., 0.56] # 768维向量
# 定义过滤条件(category为"科技",发布时间大于2024-01-01)
filter_expr = 'category == "科技" and publish_time > "2024-01-01"'
# 执行混合搜索
search_params = {
"metric_type": "COSINE",
"params": {"ef": 64} # 查询时的搜索范围
}
results = collection.search(
data=[query_vector],
anns_field="vector",
param=search_params,
limit=10, # 返回Top10结果
expr=filter_expr, # 过滤条件
output_fields=["title", "publish_time"] # 返回指定字段
)
# 解析结果
for hit in results[0]:
print(f"文章标题:{hit.entity.get('title')}")
print(f"相似度:{hit.score:.4f}")
print(f"发布时间:{hit.entity.get('publish_time')}")传统向量搜索基于稠密向量(如 BERT 模型生成的 768 维向量),而稀疏向量(如 TF-IDF 生成的高维稀疏向量)在文本检索中仍有广泛应用。Milvus 支持稀疏向量存储与搜索,可同时处理稠密与稀疏向量,适用于混合模型场景。
示例代码:
# 定义稀疏向量字段(dim为稀疏向量的最大维度)
sparse_vector_field = FieldSchema(
name="sparse_vector",
dtype=DataType.SPARSE_FLOAT_VECTOR,
dim=10000 # 最大维度
)
# 创建集合时包含稀疏向量字段
schema = CollectionSchema(fields=[id_field, sparse_vector_field, scalar_field])
collection = client.create_collection(name="sparse_demo", schema=schema)
# 插入稀疏向量数据(格式:{indices: [0, 5, 10], values: [0.2, 0.5, 0.8]})
sparse_data = [
{"indices": [10, 25, 42], "values": [0.3, 0.6, 0.9]},
{"indices": [5, 18, 33], "values": [0.1, 0.4, 0.7]}
]
insert_data = [
[1, 2], # id字段
sparse_data, # 稀疏向量字段
["科技", "教育"] # category字段
]
collection.insert(insert_data)Milvus 支持在一个集合中定义多个向量字段(如文本向量、图像向量),可同时对多个向量字段进行搜索,适用于多模态数据场景(如 “根据文本描述搜索相似图像”)。
示例代码:
# 定义两个向量字段:文本向量(768维)、图像向量(512维)
text_vector_field = FieldSchema(name="text_vector", dtype=DataType.FLOAT_VECTOR, dim=768)
image_vector_field = FieldSchema(name="image_vector", dtype=DataType.FLOAT_VECTOR, dim=512)
# 创建集合
schema = CollectionSchema(fields=[id_field, text_vector_field, image_vector_field, scalar_field])
collection = client.create_collection(name="multimodal_demo", schema=schema)
# 执行多向量字段搜索(同时搜索文本向量和图像向量)
query_text_vector = [0.1, 0.2, ..., 0.7] # 文本查询向量
query_image_vector = [0.3, 0.4, ..., 0.9] # 图像查询向量
# 定义多字段搜索参数
search_params = {
"text_vector": {"metric_type": "COSINE", "params": {"ef": 64}},
"image_vector": {"metric_type": "L2", "params": {"ef": 64}}
}
# 执行搜索(指定多个向量字段)
results = collection.search(
data=[[query_text_vector], [query_image_vector]], # 多个查询向量
anns_field=["text_vector", "image_vector"], # 多个向量字段
param=search_params,
limit=10
)Milvus 支持多种部署模式,适配从开发测试到生产环境的全场景需求:
各部署模式对比:
部署模式 | 适用场景 | 向量规模 | 部署复杂度 | 运维成本 |
|---|---|---|---|---|
Milvus Lite | 开发测试、小型应用 | 万级 - 百万级 | 极低(一行代码启动) | 无 |
单机模式 | 小规模生产、原型验证 | 百万级 - 千万级 | 低(Docker 一键部署) | 低 |
集群模式 | 大规模生产、高并发 | 千万级 - 百亿级 | 中(Kubernetes 部署) | 中 |
Zilliz Cloud | 企业级生产、无运维资源 | 不限 | 极低(控制台配置) | 无 |
Milvus 与 AI 生态工具深度集成,降低开发门槛:
本实战项目将构建一个基于 Milvus 的 RAG(Retrieval-Augmented Generation)知识库系统,实现 “用户提问→检索相关文档→LLM 生成答案” 的完整流程。技术栈如下:
# 安装Milvus客户端(包含Milvus Lite)
pip install -U pymilvus
# 安装嵌入模型依赖
pip install "pymilvus[model]"
# 安装LLM与LangChain依赖
pip install transformers torch langchain通过 Hugging Face 下载 ChatGLM-6B 模型(可使用镜像加速):
from transformers import AutoModel, AutoTokenizer
# 下载模型(国内用户可使用hf-mirror)
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
model = model.eval() # 切换为评估模式from pymilvus import MilvusClient
# 初始化Milvus Lite客户端(数据存储在本地文件milvus_rag.db)
client = MilvusClient("milvus_rag.db")
# 定义集合名称
COLLECTION_NAME = "knowledge_base"# 检查集合是否存在,若存在则删除
if client.has_collection(collection_name=COLLECTION_NAME):
client.drop_collection(collection_name=COLLECTION_NAME)
# 创建集合(向量维度768,与嵌入模型输出一致)
client.create_collection(
collection_name=COLLECTION_NAME,
dimension=768, # paraphrase-albert-small-v2模型输出768维向量
metric_type="COSINE", # 余弦相似度
schema={
"fields": [
{
"name": "id",
"dtype": "INT64",
"is_primary": True
},
{
"name": "vector",
"dtype": "FLOAT_VECTOR",
"dim": 768
},
{
"name": "content",
"dtype": "VARCHAR",
"max_length": 2000 # 文档内容字段
},
{
"name": "category",
"dtype": "VARCHAR",
"max_length": 50 # 文档分类字段
}
]
}
)假设我们有一批关于 Milvus 的技术文档,示例数据如下:
# 知识库文档数据
knowledge_documents = [
{
"id": 1,
"content": "Milvus是一款开源向量数据库,支持高维向量的相似性搜索。其核心特性包括高吞吐量、低延迟、可扩展性强,支持从百万级到百亿级向量的平滑扩展。",
"category": "技术介绍"
},
{
"id": 2,
"content": "Milvus支持多种索引算法,包括FLAT、IVF_FLAT、IVF_SQ8、IVF_PQ、HNSW、DISKANN等。其中HNSW索引适用于实时查询场景,召回率高且延迟低;DISKANN适用于超大规模数据存储。",
"category": "索引算法"
},
{
"id": 3,
"content": "Milvus的部署模式包括Milvus Lite、单机模式、集群模式和Zilliz Cloud托管服务。Milvus Lite适用于开发测试,集群模式适用于大规模生产环境。",
"category": "部署模式"
},
{
"id": 4,
"content": "Milvus支持混合搜索功能,可结合向量相似性搜索与标量字段过滤。用户可通过expr参数指定过滤条件,例如按分类、时间范围等筛选结果。",
"category": "搜索功能"
},
{
"id": 5,
"content": "使用PyMilvus操作Milvus的基本流程:1. 初始化客户端;2. 创建集合;3. 插入数据;4. 创建索引;5. 加载集合;6. 执行搜索/查询。",
"category": "使用教程"
}
]from pymilvus import model
# 加载嵌入模型(paraphrase-albert-small-v2)
embedding_fn = model.default_embedding_function()
# 提取文档内容并生成向量
document_contents = [doc["content"] for doc in knowledge_documents]
vectors = embedding_fn.encode_documents(document_contents)
# 准备插入数据
insert_data = [
[doc["id"] for doc in knowledge_documents],
vectors,
[doc["content"] for doc in knowledge_documents],
[doc["category"] for doc in knowledge_documents]
]
# 插入数据到Milvus
insert_result = client.insert(
collection_name=COLLECTION_NAME,
data=insert_data
)
print(f"插入数据条数:{len(insert_result.primary_keys)}")# 为向量字段创建HNSW索引
client.create_index(
collection_name=COLLECTION_NAME,
field_name="vector",
index_params={
"index_type": "HNSW",
"params": {
"M": 16,
"efConstruction": 200
}
}
)
# 加载集合到内存(查询前必须加载)
client.load_collection(collection_name=COLLECTION_NAME)def retrieve_relevant_docs(query, top_k=3):
"""
根据用户查询检索相关文档
:param query: 用户提问
:param top_k: 返回Top K相关文档
:return: 相关文档列表
"""
# 生成查询向量
query_vector = embedding_fn.encode_queries([query])[0]
# 执行向量搜索
search_results = client.search(
collection_name=COLLECTION_NAME,
data=[query_vector],
anns_field="vector",
param={"metric_type": "COSINE", "params": {"ef": 64}},
limit=top_k,
output_fields=["content", "category"]
)
# 解析结果
relevant_docs = []
for hit in search_results[0]:
relevant_docs.append({
"content": hit.entity.get("content"),
"category": hit.entity.get("category"),
"similarity": hit.score
})
return relevant_docsdef generate_answer(query, relevant_docs):
"""
结合检索到的文档生成答案
:param query: 用户提问
:param relevant_docs: 相关文档列表
:return: LLM生成的答案
"""
# 构建Prompt
prompt_template = """
你是一个专业的技术顾问,基于以下参考文档回答用户的问题。
参考文档:
{reference_docs}
问题:{user_query}
要求:
1. 答案必须基于参考文档,不得编造信息;
2. 语言简洁明了,直击要点;
3. 若参考文档中没有相关信息,回复"抱歉,暂无相关信息可提供。"
"""
# 格式化参考文档
reference_docs_str = "\n".join([f"- {doc['content']}" for doc in relevant_docs])
# 填充Prompt
prompt = prompt_template.format(
reference_docs=reference_docs_str,
user_query=query
)
# 生成答案
response = model.generate(
**tokenizer(
prompt,
return_tensors="pt",
truncation=True,
max_length=2048
).to("cuda")
)
# 解码答案
answer = tokenizer.decode(response[0], skip_special_tokens=True)
return answer# 测试查询1:Milvus支持哪些部署模式?
query1 = "Milvus支持哪些部署模式?"
relevant_docs1 = retrieve_relevant_docs(query1)
answer1 = generate_answer(query1, relevant_docs1)
print(f"用户提问:{query1}")
print(f"生成答案:{answer1}\n")
# 测试查询2:HNSW索引适用于什么场景?
query2 = "HNSW索引适用于什么场景?"
relevant_docs2 = retrieve_relevant_docs(query2)
answer2 = generate_answer(query2, relevant_docs2)
print(f"用户提问:{query2}")
print(f"生成答案:{answer2}\n")
# 测试查询3:如何使用PyMilvus操作Milvus?
query3 = "如何使用PyMilvus操作Milvus?"
relevant_docs3 = retrieve_relevant_docs(query3)
answer3 = generate_answer(query3, relevant_docs3)
print(f"用户提问:{query3}")
print(f"生成答案:{answer3}\n")用户提问:Milvus支持哪些部署模式?
生成答案:Milvus的部署模式包括Milvus Lite、单机模式、集群模式和Zilliz Cloud托管服务。Milvus Lite适用于开发测试,集群模式适用于大规模生产环境。
用户提问:HNSW索引适用于什么场景?
生成答案:HNSW索引适用于实时查询场景,召回率高且延迟低。
用户提问:如何使用PyMilvus操作Milvus?
生成答案:使用PyMilvus操作Milvus的基本流程:1. 初始化客户端;2. 创建集合;3. 插入数据;4. 创建索引;5. 加载集合;6. 执行搜索/查询。索引是影响 Milvus 查询性能的核心因素,需根据数据规模、查询场景选择合适的索引类型并优化参数。
数据规模 | 查询场景 | 推荐索引 | 核心优势 |
|---|---|---|---|
万级以下 | 追求 100% 召回率 | FLAT | 无近似误差,查询简单 |
百万级 | 平衡性能与召回率 | IVF_FLAT | 检索速度快,召回率高(约 90%) |
千万级 | 内存有限 | IVF_SQ8 | 内存占用低,性能接近 IVF_FLAT |
亿级 | 高并发实时查询 | HNSW | 低延迟(毫秒级),高召回率(约 95%) |
十亿级以上 | 超大规模存储 | DISKANN | 磁盘存储,成本低,支持海量数据 |
高并发场景 | GPU 资源充足 | GPU 索引 | 吞吐量提升 10-100 倍 |
以常用的 HNSW 索引为例,核心参数包括:
调优建议:
根据业务规模调整集群节点的 CPU、内存、GPU 配置:
Milvus 提供多种监控工具,帮助用户定位性能瓶颈:
企业构建内部知识库(如产品文档、技术手册),通过 RAG 技术实现智能问答,提升员工查询效率与客户服务质量。
Otter.ai 是一家专注于会议转录与智能问答的公司,其产品需要从海量会议转录文本中快速检索相关信息。Otter.ai 采用 Milvus 作为向量数据库,将会议文本转换为向量存储,用户提问时通过向量搜索快速定位相关转录片段,再结合 LLM 生成答案。通过 Milvus,Otter.ai 的问答响应时间从秒级降至毫秒级,检索准确率提升 30%。
电商、内容平台基于用户行为(如浏览、购买、点赞)生成用户向量,与商品 / 内容向量进行相似性匹配,实现个性化推荐。
Poshmark 是美国知名的时尚电商平台,需要为 millions of 用户提供个性化商品推荐。Poshmark 采用 Milvus 存储用户行为向量与商品特征向量,通过向量相似性搜索快速匹配用户感兴趣的商品。Milvus 的高吞吐量支持每秒处理 10 万 + 推荐请求,同时分布式架构确保系统可扩展至百亿级商品向量,推荐点击率提升 25%。
基于图像特征向量实现相似图像搜索(如商品搜索、版权检测),或结合文本、图像向量实现多模态检索(如 “搜索红色连衣裙的图片”)。
Mozat 是一家专注于时尚 AI 的公司,其产品 StylePedia 需要从数十亿张服装图片中快速检索相似款式。Mozat 采用 Milvus 存储服装图像的特征向量,支持实时相似性搜索与过滤(如按颜色、款式、价格筛选)。Milvus 的 GPU 加速功能使检索吞吐量提升 50 倍,同时支持百亿级向量存储,满足业务快速增长的需求。
金融、网络安全领域通过分析用户行为向量(如登录时间、地点、设备),检测异常行为,识别欺诈风险。
Palo Alto Networks 是全球领先的网络安全公司,需要实时检测网络中的欺诈行为。该公司采用 Milvus 存储用户行为向量与恶意行为特征向量,通过向量相似性搜索快速识别异常行为。Milvus 的低延迟(毫秒级)支持实时检测,分布式架构确保系统可处理海量网络数据,欺诈检测准确率提升 40%。
选取市场上主流的向量数据库(Milvus、Pinecone、Weaviate、Qdrant)进行核心特性对比:
特性维度 | Milvus | Pinecone | Weaviate | Qdrant |
|---|---|---|---|---|
开源协议 | Apache 2.0(开源) | 商业闭源 | BSD-3 Clause(开源) | Apache 2.0(开源) |
部署模式 | Milvus Lite、单机、集群、Zilliz Cloud | 纯 SaaS | 单机、集群、托管服务 | 单机、集群、托管服务 |
支持语言 | Python、Java、Go、Node.js、C#、Rust | Python、JavaScript/TypeScript | Python、Go、JavaScript | Python、Go、JavaScript |
向量类型 | 稠密向量、稀疏向量、二进制向量 | 稠密向量 | 稠密向量、多模态向量 | 稠密向量、二进制向量 |
索引算法 | FLAT、IVF_FLAT、IVF_SQ8、IVF_PQ、HNSW、DISKANN、GPU 索引 | P - 家族、S - 家族 | HNSW、FLAT | FLAT、IVF_FLAT、HNSW、DISKANN |
混合搜索 | 支持(向量 + 标量过滤) | 支持(向量 + 元数据) | 支持(向量 + 关键词) | 支持(向量 + 标量过滤) |
多模态支持 | 支持 | 文本为主 | 支持(文本 / 图像 / 音频) | 支持(文本 / 图像) |
可扩展性 | 向外 / 向内扩展、向上 / 向下扩展 | 仅向上 / 向下扩展 | 水平扩展 | 水平扩展 |
GPU 加速 | 支持 | 不支持 | 不支持 | 支持 |
免费版本 | 有(Milvus Lite、开源版) | 无 | 有(开源版) | 有(开源版) |
基于公开的基准测试数据(百万级 768 维向量,查询 Top10),各数据库的性能表现如下:
指标 | Milvus(HNSW) | Pinecone | Weaviate(HNSW) | Qdrant(HNSW) |
|---|---|---|---|---|
单次查询延迟(毫秒) | 8-15 | 10-20 | 12-25 | 10-18 |
吞吐量(QPS) | 3000-5000 | 2000-3500 | 2500-4000 | 2800-4500 |
召回率 | 95%-98% | 92%-95% | 93%-96% | 94%-97% |
索引构建时间(分钟) | 5-8 | 6-10 | 7-12 | 6-9 |
注:Milvus 开启 GPU 加速后,吞吐量可提升至 10000+ QPS,延迟降至 5 毫秒以内。
Milvus 作为开源向量数据库的领军产品,凭借其高性能、高可扩展、功能丰富的特点,已成为 AI 原生应用的核心基础设施。其分层架构设计、多种索引算法支持、灵活的部署模式,使其能够适配从开发测试到大规模生产的全场景需求,覆盖 RAG、智能推荐、图像检索、欺诈检测等多元行业应用。
随着 AI 技术的持续发展,Milvus 未来的发展方向包括:
对于开发者与企业而言,Milvus 不仅是一个向量数据库产品,更是 AI 时代数据检索与知识管理的解决方案。无论是构建小型 Demo 还是大规模生产系统,Milvus 都能提供稳定、高效、灵活的技术支持,助力企业在 AI 浪潮中抢占先机。