如何开始使用 Milvus
如何开始使用 Milvus
最后更新于 2025 年 1 月
随着大型语言模型(LLMs)的进步和数据量的不断增加,有必要建立一个灵活且可扩展的基础设施来存储海量信息,例如数据库。然而,传统数据库是为存储表格和结构化数据而设计的,而通常对利用复杂 LLMs 和信息检索算法的强大功能有用的信息都是非结构化的,如文本、图像、视频或音频。
向量数据库是专门为非结构化数据设计的数据库系统。我们不仅可以用向量数据库存储海量非结构化数据,还可以用向量数据库进行向量搜索。向量数据库拥有先进的索引方法,如反转文件索引(IVFFlat)或分层导航小世界(HNSW),可以执行快速高效的向量搜索和信息检索过程。
Milvus是一个开源矢量数据库,我们可以利用它来发挥矢量数据库所能提供的所有有益功能。以下是我们将在本篇文章中介绍的内容:
Milvus 是什么?
Milvus是 一个开源向量数据库,使我们能够存储海量非结构化数据,并对其执行快速高效的向量搜索。Milvus 对于推荐系统、个性化聊天机器人、异常检测、图像搜索、自然语言处理和检索增强生成(RAG)等许多流行的 GenAI 应用非常有用。
使用 Milvus 作为向量数据库可以获得以下几个优势:
Milvus 提供多种部署选项,您可以根据自己的使用情况和要构建的应用程序的规模进行选择。
Milvus 支持多样化的索引方法,以满足各种数据和性能需求,包括 FLAT、IVFFlat、HNSW 和SCANN 等内存内选项,提高内存效率的量化变体,用于大型数据集的磁盘上DANN,以及 GPU_CAGRA、GPU_IVF_FLAT 和 GPU_IVF_PQ 等 GPU 优化索引,以实现加速的内存效率搜索。
Milvus 还提供混合搜索,我们可以在向量搜索操作过程中结合使用密集嵌入、稀疏嵌入和元数据过滤,从而获得更准确的检索结果。此外,Milvus 2.5现在还支持混合全文检索和向量搜索,使您的检索更加精确。
Milvus 可通过Zilliz Cloud 在云上全面使用,由于具有逻辑集群、流数据和历史数据分解、分层存储、自动扩展和多租户冷热分离等四种高级功能,您可以优化其操作符和向量搜索速度。
使用 Milvus 作为向量数据库时,您可以选择三种不同的部署方案,每种方案都有其优势和好处。我们将在下一节逐一介绍。
Milvus 部署选项
我们可以选择四种部署方案来开始使用 Milvus:Milvus Lite、Milvus Standalone、Milvus Distributed 和 Zilliz Cloud(托管 Milvus)。每种部署选项都是为了适应我们使用案例中的各种情况而设计的,例如我们的数据规模、我们的应用目的以及我们的应用规模。
Milvus Lite
Milvus Lite是 Milvus 的轻量级版本,也是我们最容易上手的方法。在下一节中,我们将看到如何实际运行 Milvus Lite,而要开始使用,我们只需用 pip 安装 Pymilvus 库。之后,我们就可以执行 Milvus 作为向量数据库的大部分核心功能。
Milvus Lite 非常适合快速制作原型或学习之用,无需任何复杂设置即可在 Jupyter 笔记本中运行。在向量存储方面,Milvus Lite 适合存储大约一百万个向量嵌入。由于其轻量级特性和存储容量,Milvus Lite 是与边缘设备合作的完美部署选择,例如私人文档搜索引擎、设备上的对象检测等。
Milvus 单机版
Milvus Standalone 是打包在 Docker 镜像中的单机服务器部署。因此,我们只需在 Docker 中安装 Milvus,然后启动 Docker 容器即可开始使用。我们还将在下一节看到 Milvus Standalone 的详细实现。
Milvus Standalone 是构建和生产中小型应用的理想选择,因为它能够存储多达 10M 的向量嵌入。此外,Milvus Standalone 通过主备份模式提供高可用性,使其在生产就绪的应用程序中使用时具有很高的可靠性。
例如,在使用 Milvus Lite 快速创建原型和学习 Milvus 功能之后,我们还可以使用 Milvus Standalone,因为 Milvus Standalone 和 Milvus Lite 共享相同的客户端 API。
分布式 Milvus
Milvus Distributed 是一种部署选项,利用基于云的架构,数据摄取和检索分开处理,从而实现高度可扩展和高效的应用。
要运行 Milvus Distributed,我们通常需要使用 Kubernetes 集群,让容器在多台机器和环境中运行。Kubernetes 集群的应用确保了 Milvus Distributed 的可扩展性和灵活性,可以根据需求和工作量定制分配资源。这也意味着,如果一个部分出现故障,其他部分可以接替,确保整个系统不中断。
Milvus Distributed 能够处理多达数百亿的向量 Embeddings,专为数据量太大、无法存储在单台服务器机器中的使用案例而设计。因此,这种部署方案非常适合服务于庞大用户群的企业客户端。
图不同 Milvus 部署选项的向量嵌入存储能力。
在本文中,我们将向你介绍如何开始使用 Milvus Lite 和 Milvus Standalone,因为这两种方法都可以快速上手,无需复杂的设置。而 Milvus Distributed 的设置则比较复杂。我们设置好 Milvus Distributed 后,创建 Collections、摄取数据、执行向量搜索等的代码和逻辑过程与 Milvus Lite 和 Milvus Standalone 类似,因为它们共享相同的客户端 API。
除了上述三种部署方案,您还可以尝试在Zilliz Cloud上托管 Milvus,获得无忧体验。我们还将在本文后面谈谈 Zilliz Cloud。
开始使用 Milvus Lite
使用 pip 导入一个名为 Pymilvus 的库,就可以直接用 Python 实现 Milvus Lite。在安装 Pymilvus 之前,请确保您的环境满足以下要求:
Ubuntu >= 20.04 (x86_64 和 arm64)
MacOS >= 11.0(Apple Silicon M1/M2 和 x86_64)
Python 3.7 或更高版本
满足这些要求后,你就可以使用以下命令安装 Milvus Lite 和演示所需的依赖程序:
!pip install -U pymilvus
!pip install "pymilvus[model]"
!pip install -U pymilvus
:该命令安装或升级pymilvus
库,即 Milvus 的 Python SDK。Milvus Lite 与 PyMilvus 捆绑在一起,因此只需这一行代码就能安装 Milvus Lite。!pip install "pymilvus[model]"
:该命令添加了 Milvus 预集成的高级功能和额外工具,包括机器学习模型,如 Hugging Face Transformers、Jina AI 嵌入模型和 Rerankers 模型。
下面是我们使用 Milvus Lite 的步骤:
使用嵌入模型将文本数据转换为它们的嵌入表示。
在 Milvus 数据库中创建一个 Schema,用于存储文本数据及其嵌入表示。
在 Schema 中存储数据并编制索引。
对存储的数据执行简单的向量搜索。
图向量搜索操作符的工作流程。
为了将文本数据转换为向量嵌入,我们将使用 SentenceTransformers 中名为 "all-MiniLM-L6-v2 "的嵌入模型。该嵌入模型可将我们的文本转换为 384 维向量嵌入。让我们加载模型,转换文本数据,并将所有内容打包在一起。
from pymilvus import model
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
sentence_transformer_ef = model.dense.SentenceTransformerEmbeddingFunction(
model_name='all-MiniLM-L6-v2',
device='cpu'
)
vectors = sentence_transformer_ef.encode_documents(docs)
data = [ {"id": i, "vector": vectors[i], "text": docs[i]} for i in range(len(vectors)) ]
接下来,让我们创建一个 Schema,将上述所有数据存储到 Milvus 中。如上图所示,我们的数据由三个字段组成:ID、向量和文本。因此,我们要创建一个包含这三个字段的 Schema。
from pymilvus import MilvusClient, DataType, db, connections
schema = MilvusClient.create_schema(
auto_id=False,
enable_dynamic_field=True,
)
# Add fields to schema
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=384)
schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=512)
有了 Milvus Lite,我们只需几行代码,就能根据上面定义的 Schema 在特定数据库上轻松创建一个 Collections,还能将数据插入到 Collections 中并建立索引。
client = MilvusClient("./milvus_demo.db")
index_params = client.prepare_index_params()
# Add indexes
index_params.add_index(
field_name="vector",
index_type="AUTOINDEX",
metric_type="COSINE"
)
# Create collection
client.create_collection(
collection_name="demo_collection",
schema=schema,
index_params=index_params
)
# Insert data into collection
res = client.insert(
collection_name="demo_collection",
data=data
)
在上面的代码中,我们在名为 "milvus_demo "的 Milvus 数据库中创建了一个名为 "demo_collection "的集合。接下来,我们将所有数据索引到刚刚创建的 "demo_collection "中。
现在,我们的数据已经在数据库中,我们可以针对任何给定的查询对它们执行向量搜索。比方说,我们有一个查询:"谁是艾伦-图灵?我们可以通过以下步骤获得最合适的答案:
使用将数据库中的数据转化为嵌入式数据时所使用的相同嵌入模型,将我们的查询转化为向量嵌入。
使用余弦相似度或欧几里得距离等指标计算我们的查询嵌入和数据库中每个条目的嵌入之间的相似度。
获取最相似的条目作为我们查询的合适答案。
下面是使用 Milvus 实现上述步骤的过程:
query = ["Who is Alan Turing"]
query_embedding = sentence_transformer_ef.encode_queries(query)
# Load collection
client.load_collection(
collection_name="demo_collection"
)
# Vector search
res = client.search(
collection_name="demo_collection",
data=query_embedding,
limit=1,
output_fields=["text"],
)
print(res)
"""
Output:
data: ["[{'id': 1, 'distance': 0.7199002504348755, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.'}}]"]
"""
就是这样!你还可以在Milvus 文档中进一步了解 Milvus 提供的其他功能,如管理数据库、插入和删除 Collections、选择合适的索引方法,以及使用元数据过滤和混合搜索执行更高级的向量搜索。
开始使用 Milvus Standalone
Milvus Standalone 是一种部署选项,其中的所有内容都打包在一个 Docker 容器中。因此,我们需要在 Docker 中安装 Milvus,然后启动 Docker 容器,才能开始使用 Milvus Standalone。
在安装 Milvus Standalone 之前,请确保你的硬件和软件都满足本页描述的要求。此外,确保已安装 Docker。要安装 Docker,请参阅本页。
一旦系统满足要求并安装了 Docker,我们就可以使用以下命令在 Docker 中继续安装 Milvus:
# Download the installation script
$ curl -sfL <https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh> -o standalone_embed.sh
# Start the Docker container
$ bash standalone_embed.sh start
在上面的代码中,我们还启动了 Docker 容器,一旦它启动,就会得到类似下面的输出:
图成功启动 Docker 容器后的信息。
运行上面的安装脚本 "standalone_embed.sh "后,一个名为 "milvus "的 Docker 容器就在 19530 端口启动了。因此,我们可以创建一个新数据库,也可以在创建连接时指向这个端口,访问与 Milvus 数据库相关的所有内容。
比方说,我们想创建一个名为 "milvus_demo "的数据库,类似于上文 Milvus Lite 中的做法。我们可以按如下步骤创建:
conn = connections.connect(host="127.0.0.1", port=19530)
database = db.create_database("milvus_demo")
client = MilvusClient(
uri="<http://localhost:19530>",
token="root:Milvus",
db_name="milvus_demo"
)
接下来,你可以通过访问 MilvusWeb UI 来验证新创建的名为 "milvus_demo "的数据库是否真正存在于你的 Milvus 实例中。顾名思义,Milvus Web UI 是 Milvus 提供的图形用户界面,用于观察组件的统计和指标,检查数据库、Collection 和配置的列表和细节。启动上述 Docker 容器后,你就可以访问 Milvus Web UI,网址是 http://127.0.0.1:9091/webui/。
访问上述链接后,你会看到这样一个登陆页面:
在 "Collections "标签下,你会看到我们的 "milvus_demo "数据库已经成功创建。正如你所看到的,你还可以通过这个 Web UI 查看其他内容,如 Collections 列表、配置、执行过的查询等。
现在,我们可以完全按照上面 Milvus Lite 部分中的方法执行一切操作。让我们在 "milvus_demo "数据库中创建一个名为 "demo_collection "的 Collections,它由三个字段组成,与之前在 Milvus Lite 部分中的字段相同。然后,我们将把数据插入 Collections 中。
index_params = client.prepare_index_params()
# Add indexes
index_params.add_index(
field_name="vector",
index_type="AUTOINDEX",
metric_type="COSINE"
)
# Create collection
client.create_collection(
collection_name="demo_collection",
schema=schema,
index_params=index_params
)
# Insert data into collection
res = client.insert(
collection_name="demo_collection",
data=data
)
执行向量搜索操作的代码也与 Milvus Lite 相同,你可以从下面的代码中看到:
query = ["Who is Alan Turing"]
query_embedding = sentence_transformer_ef.encode_queries(query)
# Load collection
client.load_collection(
collection_name="demo_collection"
)
# Vector search
res = client.search(
collection_name="demo_collection",
data=query_embedding,
limit=1,
output_fields=["text"],
)
print(res)
"""
Output:
data: ["[{'id': 1, 'distance': 0.7199004292488098, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.'}}]"]
"""
除了使用 Docker,你还可以通过Docker Compose(适用于 Linux)和Docker Desktop(适用于 Windows)来使用 Milvus Standalone。
当我们不再使用 Milvus 实例时,可以用下面的命令停止 Milvus Standalone:
$ bash standalone_embed.sh stop
完全托管 Milvus
开始使用 Milvus 的另一种方法是通过Zilliz Cloud 中基于云的原生基础架构,在这里你可以获得无忧无虑、速度快 10 倍的体验。
Zilliz Cloud 提供具有专用环境和资源的专用集群,以支持您的人工智能应用。由于是基于 Milvus 构建的云数据库,我们无需设置和管理本地基础设施。Zilliz Cloud 还提供更多高级功能,例如向量存储与计算分离、将数据备份到 S3 等常用对象存储系统以及数据缓存以加快向量搜索和检索操作。
不过,在考虑基于云的服务时,需要考虑的一点是操作成本。在大多数情况下,即使集群闲置,没有数据摄取或向量搜索活动,我们仍然需要付费。如果想进一步优化应用程序的操作成本和性能,Zilliz Cloud Serverless 将是一个很好的选择。
图使用 Zilliz Cloud Serverless 的主要优势。
Zilliz Cloud Serverless 可在 AWS、Azure 和 GCP 等主要云提供商上使用。它提供现收现付定价等功能,这意味着您只需在使用集群时支付费用。
Zilliz Cloud Serverless 还实现了逻辑集群、自动缩放、分层存储、流数据和历史数据分解以及冷热数据分离等先进技术。与内存中的 Milvus Operator 相比,这些功能使 Zilliz Cloud Serverless 能够实现高达 50 倍的成本节约和约 10 倍的向量搜索操作速度。
图分层存储和冷热数据分离示意图。
如果您想开始使用 Zilliz Cloud Serverless,请查看此页面了解更多信息。
结论
Milvus 作为一款多功能、功能强大的向量数据库脱颖而出,旨在应对现代人工智能应用中管理非结构化数据和执行快速、高效向量搜索操作的挑战。它提供了多种部署选项,如用于快速原型开发的 Milvus Lite、用于中小型应用的 Milvus Standalone 以及用于企业级可扩展性的 Milvus Distributed,可灵活匹配任何项目的规模和复杂性。
此外,Zilliz Cloud Serverless 将 Milvus 的功能扩展到云中,并提供了一种经济高效的现收现付模型,无需本地基础设施。凭借分层存储和自动扩展等先进功能,Zilliz Cloud Serverless 在优化成本的同时,确保了更快的向量搜索操作符。
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word