目录

一、Milvus 是什么

(一)定义

(二)核心优势

(三)应用场景

二、为什么选择 Milvus

(一)与传统数据库对比

(二)在 AI 领域的重要性

三、安装 Milvus

(一)环境准备

(二)安装步骤

(三)安装常见问题及解决方法

四、基本操作实战

(一)连接到 Milvus

(二)创建集合(Collection)

(三)插入数据

(四)构建索引

(五)执行查询

五、进阶技巧

(一)优化检索性能

(二)数据管理与维护

(三)与其他工具集成

六、案例分析

(一)具体应用案例讲解

(二)经验总结与启示

七、总结与展望

(一)回顾重点内容

(二)未来发展趋势


一、Milvus 是什么

(一)定义

在当今数字化时代,数据的规模和复杂性呈爆炸式增长,非结构化数据如文本、图像、音频和视频等占据了数据总量的绝大部分。传统的关系型数据库在处理这些非结构化数据时显得力不从心,难以满足快速高效的搜索和管理需求。在这样的背景下,向量数据库应运而生,Milvus 就是其中的杰出代表。

Milvus 是一款开源的向量数据库,专门为存储和检索高维向量而设计。它的核心基于向量的近似最近邻(ANN,Approximate Nearest Neighbor)搜索技术,通过高效的索引机制,让在高维空间中检索相似数据成为可能 。简单来说,我们可以将 Milvus 看作是一个智能的 “数据仓库”,它能够将各种非结构化数据转化为向量形式进行存储,并能快速准确地找到与查询向量最相似的数据。

(二)核心优势

  1. 高性能:在大多数情况下,Milvus 比其他向量数据库的性能高 2-5 倍。这主要得益于其针对多种硬件架构和平台进行的硬件感知优化,如 AVX512、SIMD、GPU 和 NVMe SSD 等。它还支持广泛的内存和磁盘索引 / 搜索算法,如 IVF、HNSW、DiskANN 等,这些算法均经过深度优化。其核心搜索引擎使用 C++ 编写,集成了从汇编级矢量化到多线程并行化和调度的硬件感知代码优化,并且采用列式存储架构,大大减少了查询时的数据访问量,从而提高了性能。
  1. 兼容性好:能与多种主流的深度学习框架和工具无缝对接,如 PyTorch、TensorFlow 等,方便开发者在现有的工作流程中集成使用。无论是在 Windows、Linux 还是 macOS 等操作系统上,Milvus 都能稳定运行,为不同环境下的用户提供了便利。
  1. 丰富的生态:拥有庞大且活跃的社区,开发者可以在社区中获取到丰富的资源、教程以及技术支持。同时,Milvus 提供了多种编程语言的 SDK,包括 Python、Java、Go、C++ 等,还支持 RESTful API,使得开发者可以根据自己的需求选择最适合的开发方式 。
  1. 高扩展性:采用云原生和高度解耦的系统架构,确保了系统可以随数据增长持续扩展。它具有完全无状态设计,易于通过 Kubernetes 或公有云进行扩展。其组件高度解耦,搜索、数据插入和索引 / 压缩等关键任务设计为易并行化的进程,查询节点、数据节点和索引节点可以独立进行横向和纵向扩展。

(三)应用场景

  1. 图像识别与检索:在图像领域,Milvus 可以存储图像的特征向量。例如,一个拥有海量商品图片的电商平台,当用户上传一张图片或者用相机拍摄商品图片进行搜索时,Milvus 能够快速找到与之相似的商品图片,帮助用户更精准地找到所需商品。又比如在安防监控中,通过对监控视频中的人脸图像进行特征提取并存储到 Milvus 中,当需要查找特定人员时,能够迅速从大量的监控数据中检索出相关的图像。
  1. 自然语言处理:在文本处理方面,Milvus 可用于语义搜索、智能问答系统和文本分类等。以智能客服为例,当用户提出问题时,Milvus 可以通过计算用户问题与知识库中已有问题向量的相似度,快速找到最相关的答案,提高客服的响应效率和准确性 。在信息检索领域,对于新闻媒体、图书馆等拥有大量文本资料的机构,Milvus 能够帮助用户快速找到语义相近的文章、书籍等。
  1. 语音识别:在语音领域,Milvus 可以助力语音搜索和语音助手等应用。比如语音搜索引擎,当用户说出语音指令后,系统将语音转化为向量,Milvus 通过搜索相似向量,返回相关的语音内容或文字结果。在智能语音助手场景中,它能快速理解用户的语音需求,提供准确的服务。
  1. 推荐系统:电商平台利用 Milvus 可以根据用户的行为数据(如浏览历史、购买记录等)生成用户向量,以及商品的属性和特征生成商品向量,通过计算向量之间的相似度,为用户推荐他们可能感兴趣的商品。在线音乐平台和视频平台也可以采用类似的方式,根据用户的音乐、视频偏好向量,为用户推荐符合口味的音乐和视频内容 。

二、为什么选择 Milvus

(一)与传统数据库对比

  1. 数据类型:传统数据库,如 MySQL、Oracle 等,主要用于存储和管理结构化数据,这些数据有着明确的结构和模式,像常见的二维表格形式,每列的数据类型固定,例如数字、字符串、日期等 。它们在处理银行交易记录、用户信息管理等场景时,能够很好地保证数据的完整性和一致性 。而 Milvus 则专注于存储高维向量数据,这类数据通常来源于非结构化数据的特征提取,比如从图像中提取的特征向量可以是 128 维、256 维甚至更高维度,从文本中生成的词向量也具有较高维度。这些向量数据无法简单地用传统数据库的表结构来存储和管理 。
  1. 检索方式:传统数据库依赖 B + 树、哈希索引等数据结构来实现基于条件的精确匹配查询。例如在一个用户信息表中,通过用户 ID 查询用户的详细信息,这种方式对于低维数据的精确查询非常高效 。然而,当面对高维向量数据时,传统索引结构的查询性能会急剧下降,因为高维空间中数据的分布变得稀疏且复杂,难以通过简单的索引来定位相似数据 。Milvus 采用近似最近邻搜索(ANN)算法,通过计算向量之间的相似度,如欧几里得距离、余弦相似度等,来找到与查询向量最相似的向量。在一个包含海量图片向量的数据库中,当输入一张图片的向量进行查询时,Milvus 能够快速返回与之相似的图片向量,这种检索方式对于需要进行相似性搜索的应用场景至关重要 。
  1. 性能:在处理大规模数据时,传统数据库如果要进行全表扫描来查找相似数据,其时间复杂度较高,性能会受到严重影响 。而且,随着数据量的不断增加,传统数据库在存储和查询高维向量数据时的效率会越来越低 。Milvus 经过专门的优化,能够支持分布式部署和 GPU 加速,可处理十亿级甚至更多向量的毫秒级检索。它采用内存 + 持久化存储的方式,将最新数据存储在内存中以加快查询速度,旧数据存储在持久化存储中确保数据安全性,这种存储架构使得 Milvus 在大规模向量数据检索方面具有明显的性能优势 。

(二)在 AI 领域的重要性

  1. 非结构化数据处理:在 AI 时代,非结构化数据如文本、图像、音频和视频等占据了数据总量的绝大部分 。这些非结构化数据蕴含着丰富的信息,但传统的处理方式难以充分挖掘其中的价值 。通过深度学习模型,我们可以将这些非结构化数据转化为向量形式,而 Milvus 能够高效地存储和管理这些向量数据 。在图像识别任务中,我们可以使用卷积神经网络提取图像的特征向量,然后将这些向量存储到 Milvus 中。当需要进行图像检索时,只需将待检索图像的向量输入到 Milvus 中,就能快速找到与之相似的图像,大大提高了图像搜索的效率和准确性 。
  1. 模型训练:在机器学习和深度学习模型的训练过程中,往往需要大量的数据来进行训练和验证 。Milvus 可以作为数据存储和管理的工具,为模型训练提供支持 。在自然语言处理中的文本分类任务中,我们可以将训练文本的向量存储在 Milvus 中,模型在训练时可以快速从 Milvus 中获取相关数据,加快训练速度 。此外,在模型的评估和优化阶段,也可以利用 Milvus 来进行数据的检索和分析,帮助我们更好地了解模型的性能和效果 。

三、安装 Milvus

(一)环境准备

在安装 Milvus 之前,需要确保你的系统满足以下要求:

  • 操作系统:支持 Linux(推荐 Ubuntu 20.04 或 CentOS 7+)、macOS 以及 Windows(需要 WSL2 支持)。
  • 硬件配置:单机模式(Docker 或 Docker Compose)下,至少需要 8GB 内存、4 核 CPU 以及 50GB 磁盘空间;分布式模式(Kubernetes)则需根据规模调整,建议每个节点至少 16GB 内存、8 核 CPU 。磁盘方面,由于磁盘 IO 性能会决定检索速度,应避免使用机械硬盘,尽量选择 SSD。
  • 工具要求:需安装 Docker,版本要求 19.03 或更高;若使用 Docker Compose 部署,Docker Compose 版本需为 1.28 或更高;采用 Kubernetes 部署时,需要 kubectl 和 Kubernetes 集群,Kubernetes 版本要求 1.16 或更高,同时还需要 Helm,版本为 3.6 或更高 。在 Linux 系统中,可以使用以下命令检查工具版本:

# 检查Docker版本

docker --version

# 检查Docker Compose版本

docker-compose --version

# 检查kubectl版本

kubectl version --client

# 检查Helm版本

helm version

  • 网络要求:确保安装环境可以访问 Docker Hub 或 Milvus 的镜像源,以便顺利拉取所需镜像 。

(二)安装步骤

这里以 Docker 方式在 Linux 系统(Ubuntu 20.04)上安装 Milvus 为例,具体步骤如下:

  1. 安装 Docker

# 更新apt包索引

sudo apt update

# 安装Docker

sudo apt install -y docker.io

# 启动Docker服务

sudo systemctl start docker

# 设置Docker开机自启

sudo systemctl enable docker

  1. 拉取 Milvus 镜像

docker pull milvusdb/milvus:latest

  1. 创建数据持久化目录:Milvus 需要持久化数据、日志和配置,因此创建以下目录:

mkdir -p ~/milvus/data ~/milvus/logs ~/milvus/configs

  1. 运行 Milvus 容器:使用以下命令启动 Milvus 单机模式:

docker run -d --name milvus_standalone \

-p 19530:19530 \

-p 9091:9091 \

-v ~/milvus/data:/var/lib/milvus \

-v ~/milvus/logs:/var/lib/milvus/logs \

-v ~/milvus/configs:/var/lib/milvus/configs \

milvusdb/milvus:latest

其中,-p 19530:19530将 Milvus 的 gRPC 服务端口(用于客户端连接)映射到主机的 19530 端口;-p 9091:9091将 Milvus 的 RESTful API 和 Web 界面端口映射到主机的 9091 端口;-v参数用于挂载目录,将容器内的/var/lib/milvus(存储数据)、/var/lib/milvus/logs(存储日志)、/var/lib/milvus/configs(存储配置文件)分别挂载到主机的~/milvus/data、~/milvus/logs、~/milvus/configs目录,以实现数据的持久化存储 。

(三)安装常见问题及解决方法

  1. Docker 未正确安装:如果 Docker 未正确安装或未启动,Milvus 将无法运行。可以通过运行docker --version和docker ps命令检查 Docker 是否正常运行。若未安装,在 Ubuntu 系统中可使用以下命令安装:

sudo apt update

sudo apt install -y docker.io

sudo systemctl enable --now docker

如果 Docker 未启动,可运行sudo systemctl start docker启动。

  1. Docker Compose 未正确安装:在使用docker-compose启动 Milvus 时,若遇到 “command not found” 错误,说明 Docker Compose 未正确安装。可通过docker-compose --version检查安装情况。若未安装,在 Linux 系统中可使用以下命令安装:

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

安装完成后重新验证,运行docker-compose --version。

  1. 端口冲突:默认情况下,Milvus 使用 19530 端口进行通信。如果该端口已被占用,Milvus 可能无法启动。可以运行netstat -tulnp|grep 19530命令检查端口是否被占用。如果端口被占用,有两种解决方法:一是修改docker-compose.yml配置文件,在command选项中指定一个新的端口,例如:command: ["milvus", "run", "standalone", "--grpc-port=19600"];二是使用lsof命令查找占用该端口的进程,并终止它,命令如下:

sudo lsof -i :19530

sudo kill -9 <PID>

  1. 数据库服务未正确启动:Milvus 依赖 etcd 进行元数据存储,如果 etcd 服务未正常启动,Milvus 可能无法运行。可以运行docker logs milvus-etcd命令检查 etcd 是否正常运行。若 etcd 未运行,可以手动启动它,命令为docker-compose up -d etcd 。
  1. CUDA 版本不兼容(GPU 版 Milvus):如果安装了 GPU 版本的 Milvus,但 CUDA 版本不匹配,则可能导致 Milvus 启动失败。可以运行nvcc --version命令检查本机的 CUDA 版本,确保其符合 Milvus 官方文档中列出的支持版本。若 CUDA 版本不匹配,可以卸载旧版本并重新安装合适的版本。例如,安装 CUDA 11.7 的命令为:sudo apt install -y cuda-11-7 ,同时要确保 NVIDIA 驱动和 Docker 也支持 GPU,可通过nvidia - smi命令检查 。
  1. Python 依赖安装失败:在 Python 环境中使用pymilvus连接 Milvus 时,若安装失败,可能是 pip 版本过低或 Python 版本不兼容。首先确保 Python 版本为 3.7 及以上,可通过python --version命令查看。然后升级 pip 后重试安装pymilvus,命令如下:

python -m pip install --upgrade pip

pip install pymilvus

若仍然失败,可以尝试使用 Conda 创建一个新环境:


conda create -n milvus_env python=3.8

conda activate milvus_env

pip install pymilvus

四、基本操作实战

(一)连接到 Milvus

在 Python 中,使用pymilvus库连接到 Milvus 实例,以下是连接代码示例:


from pymilvus import connections

# 连接到本地Milvus实例,默认端口为19530

connections.connect(alias="default", host="localhost", port="19530")

上述代码中,alias是连接的别名,可用于在后续操作中引用该连接;host是 Milvus 实例的地址;port是 Milvus 实例的端口号 。通过connections.connect()方法建立连接,如果连接成功,就可以进行后续的数据库操作 。

(二)创建集合(Collection)

在 Milvus 中,集合(Collection)是存储向量数据的基本单元,类似于关系型数据库中的表 。每个集合都有一个唯一的名称和一个模式(Schema),用于定义集合中的字段 。下面是创建集合的代码示例:


from pymilvus import Collection, FieldSchema, CollectionSchema, DataType

# 定义字段

fields = [

FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True), # 主键字段,自动生成ID

FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128) # 向量字段,维度为128

]

# 创建集合模式

schema = CollectionSchema(fields, "Example collection")

# 创建集合

collection = Collection(name="example_collection", schema=schema)

在这段代码中,首先定义了两个字段:id作为主键字段,数据类型为 64 位整数,is_primary=True表示它是主键,auto_id=True表示 ID 由 Milvus 自动生成;embedding是向量字段,数据类型为浮点型向量,维度为 128 。然后,使用这些字段创建了集合模式schema,并通过Collection()方法创建了名为example_collection的集合 。

(三)插入数据

数据插入是将向量数据存储到集合中的过程。在插入数据前,需要准备好要插入的向量数据。以下是插入数据的代码示例:


import random

# 生成随机向量数据

data = [

[i for i in range(10)], # 主键(可选,这里与序号相同)

[[random.random() for _ in range(128)] for _ in range(10)] # 10个128维向量

]

# 插入数据

insert_result = collection.insert(data)

print(f"插入成功,插入的实体ID: {insert_result.primary_keys}")

上述代码中,首先使用random库生成了 10 个 128 维的随机向量数据 。其中,第一部分[i for i in range(10)]是可选的主键数据,这里简单地使用了序号;第二部分是随机生成的向量数据 。然后,通过集合的insert()方法将数据插入到集合中 。插入成功后,insert_result.primary_keys会返回插入数据的主键,用于确认插入的数据 。

(四)构建索引

为了加速向量相似性搜索,需要为集合中的向量字段构建索引 。Milvus 支持多种索引类型,如 IVF_FLAT、HNSW、PQ 等,不同的索引类型适用于不同的数据规模和查询需求 。下面以 IVF_FLAT 索引为例,展示构建索引的代码:


# 定义索引参数

index_params = {

"metric_type": "L2", # 距离度量方式,这里使用欧几里得距离

"index_type": "IVF_FLAT",

"params": {"nlist": 128} # nlist表示聚类的数量,影响索引的精度和查询速度

}

# 构建索引

collection.create_index(field_name="embedding", index_params=index_params)

print("索引已创建")

在这段代码中,index_params定义了索引的参数 。metric_type指定了距离度量方式,用于计算向量之间的相似度,这里使用欧几里得距离(L2);index_type指定了索引类型为 IVF_FLAT;params中的nlist参数表示将数据聚成 128 个簇,nlist值越大,查询精度越高,但索引构建时间和存储开销也会增加 。通过collection.create_index()方法,为embedding字段构建索引 。

(五)执行查询

在 Milvus 中,可以通过向量相似性搜索来查找与查询向量最相似的向量 。以下是执行查询的代码示例,包括简单查询和带过滤条件的复杂查询:


import numpy as np

# 生成查询向量

query_vector = [np.random.rand(128).tolist()]

# 定义搜索参数

search_params = {

"metric_type": "L2",

"params": {"nprobe": 10} # nprobe表示查询时参与比较的簇的数量,影响查询速度和精度

}

# 简单查询

results = collection.search(

data=query_vector,

anns_field="embedding",

param=search_params,

limit=5 # 返回前5个最相似的结果

)

print("简单查询结果:")

for hits in results:

for hit in hits:

print(f"ID: {hit.id}, 距离: {hit.distance}")

# 复杂过滤查询,假设集合中有一个名为"category"的字段

expr = "category == 'electronics'" # 过滤条件,筛选出category为electronics的数据

filtered_results = collection.search(

data=query_vector,

anns_field="embedding",

param=search_params,

limit=5,

expr=expr

)

print("\n复杂过滤查询结果:")

for hits in filtered_results:

for hit in hits:

print(f"ID: {hit.id}, 距离: {hit.distance}")

在上述代码中,首先生成了一个随机的查询向量query_vector 。search_params定义了搜索参数,nprobe表示查询时参与比较的簇的数量,值越大,查询结果越准确,但查询时间也会增加 。通过collection.search()方法进行简单查询,返回与查询向量最相似的前 5 个结果 。在复杂过滤查询中,定义了过滤表达式expr,筛选出category字段为electronics的数据,然后在满足过滤条件的数据中进行向量相似性搜索 。

五、进阶技巧

(一)优化检索性能

  1. 索引选择:根据数据规模和查询需求选择合适的索引类型至关重要。若数据量小于 100 万且需要精准查询,可选择 FLAT 索引;数据量在 100 万 - 5000 万时,IVF_FLAT 索引能提供适中的速度与精度;当数据量大于 5000 万,IVF_PQ 或 SCANN 索引可降低存储占用;对于低延迟场景,如推荐系统或 AI 搜索,HNSW 索引更适合高并发查询 。同时,不同索引类型有特定的查询优化参数,例如 IVF 索引的 nlist 参数(一般建议nlist = 4*sqrt(N) ,N 为数据集中向量的数量)和 nprobe 参数(nprobe 越大,召回率越高,但性能越差,可从nprobe =16开始尝试),HNSW 索引的 M 参数(表示在建表期间每个向量的边数目,通常建议设置在 8 - 32 之间 ,M 越大,内存消耗越高,在高维度的数据集下查询性能会越好)和 ef_construction 参数(控制索引时间和索引准确度,常见值为 128 ,ef_construction 越大构建索引越长,但查询精度越高),合理调整这些参数可以优化搜索精度和速度 。
  1. 数据分区:如果数据可以按时间、类别、地域等进行分类,使用 Partition(分区)能有效提高查询速度 。例如,在一个新闻检索系统中,可按新闻发布时间进行分区,将每天的新闻数据存储在不同分区。插入数据时指定分区名称,查询时也指定相应分区,避免全表扫描,从而大大提高查询效率 。
  1. 缓存设置:利用collection.load()方法预加载索引到内存,减少查询时的磁盘访问,提高首次响应速度 。对于频繁查询的数据,可以考虑在应用层设置缓存,如使用 Redis 作为缓存中间件。当有查询请求时,先检查缓存中是否有结果,若有则直接返回,减少对 Milvus 的查询压力 。此外,在 Milvus 的配置文件中,也可以适当调整缓存相关参数,如缓存大小等,以适应不同的数据量和查询频率 。

(二)数据管理与维护

  1. 数据备份:使用 Milvus-backup 工具进行数据备份,该工具支持命令行和 Restful API 等多种交互方式,还支持热备份,对 Milvus 集群运行几乎没有影响 。以命令行方式为例,首先要获取 Milvus-backup 工具,可从官方发布页面下载编译后的二进制文件 。下载示例配置文件backup.yaml ,并根据实际情况调整,如 Minio 的设置(默认 Minio 文件桶的名称随安装 Milvus 的方式而不同,Docker Compose 安装时 bucketName 为a-bucket ,Helm/Milvus 操作符安装时为milvus-bucket ) 。准备好工具和配置文件后,运行命令./milvus-backup create -n <backup_name>进行备份,执行命令后,可在 Minio 设置中指定的存储桶中检查备份文件 。
  1. 数据恢复:当需要恢复数据时,同样使用 Milvus-backup 工具 。若希望恢复数据时创建新的集合,可运行带有-s标志的 restore 命令,如./milvus-backup restore -n my_backup -s _recover ,这将在 Milvus 实例中创建一个名为hello_milvus_recover(假设原集合名为hello_milvus)的新集合 。若要在不更改名称的情况下恢复已备份的集合,需在恢复前放弃该集合,然后运行./milvus-backup restore -n my_backup命令 。恢复完成后,可以通过对已还原的集合编制索引来验证已还原的数据 。
  1. 数据清理:对于不再需要的数据,可以使用collection.drop()方法删除整个集合;若只是想删除部分数据,可结合过滤条件使用collection.delete()方法 。例如,在一个商品推荐系统中,若某些商品已下架不再销售,可使用collection.delete(expr="product_status =='off_shelf'")删除这些商品的数据 。此外,定期清理无用的日志文件,防止其占用过多磁盘资源,可通过设置日志文件的保留时间和清理策略来实现 。在 Milvus 的配置文件中,找到日志相关的配置项,如log_file_size(单个日志文件大小)、log_file_num(日志文件数量)等,合理调整这些参数,当日志文件达到设定的大小或数量时,自动进行清理或归档 。

(三)与其他工具集成

  1. 与 AI 框架集成
    • 与 PyTorch 集成:在图像识别项目中,使用 PyTorch 训练图像分类模型,如 ResNet。训练完成后,提取图像的特征向量,然后将这些向量存储到 Milvus 中 。以下是简单的代码示例:

import torch

import torchvision.models as models

import torchvision.transforms as transforms

from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection

# 加载预训练的ResNet模型

model = models.resnet50(pretrained=True)

model = torch.nn.Sequential(*list(model.children())[:-1]) # 去掉最后的分类层

model.eval()

# 图像预处理

transform = transforms.Compose([

transforms.Resize((224, 224)),

transforms.ToTensor(),

transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])

])

# 连接到Milvus

connections.connect("default", host="localhost", port="19530")

# 定义集合schema

fields = [

FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),

FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=2048)

]

schema = CollectionSchema(fields, description="Image feature vectors")

# 创建集合

collection = Collection("image_features", schema)

# 假设已经有一批图像路径

image_paths = ["image1.jpg", "image2.jpg",...]

for image_path in image_paths:

image = Image.open(image_path).convert('RGB')

image = transform(image).unsqueeze(0)

with torch.no_grad():

vector = model(image).flatten().numpy()

collection.insert([vector])

# 创建索引

index_params = {

"index_type": "HNSW",

"metric_type": "L2",

"params": {"M": 16, "efConstruction": 200}

}

collection.create_index("vector", index_params)

  • 与 TensorFlow 集成:在自然语言处理任务中,使用 TensorFlow 训练词向量模型,如 Word2Vec 。将训练得到的词向量存储到 Milvus 中,实现语义搜索功能 。示例代码如下:

import tensorflow as tf

from gensim.models import Word2Vec

from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection

# 假设已经有文本数据

sentences = [["this", "is", "a", "sentence"], ["another", "sentence", "here"]]

# 使用Gensim训练Word2Vec模型

model = Word2Vec(sentences, min_count=1)

# 连接到Milvus

connections.connect("default", host="localhost", port="19530")

# 定义集合schema

fields = [

FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),

FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=100) # 假设词向量维度为100

]

schema = CollectionSchema(fields, description="Word vectors")

# 创建集合

collection = Collection("word_vectors", schema)

# 将词向量插入到Milvus中

for word in model.wv.index_to_key:

vector = model.wv[word]

collection.insert([vector])

# 创建索引

index_params = {

"index_type": "IVF_FLAT",

"metric_type": "L2",

"params": {"nlist": 128}

}

collection.create_index("vector", index_params)

  1. 与数据库集成:Milvus 可以与传统数据库(如 MySQL)结合使用 。例如,在一个电商系统中,商品的基本信息(如商品 ID、名称、价格等)存储在 MySQL 中,而商品的图像特征向量或文本描述特征向量存储在 Milvus 中 。在进行商品搜索时,先通过 Milvus 根据用户输入的图像或文本找到相似的商品向量,获取对应的商品 ID,再根据商品 ID 从 MySQL 中查询商品的详细信息,返回给用户 。这种集成方式充分发挥了 Milvus 在向量检索方面的优势和传统数据库在结构化数据管理方面的优势 。

六、案例分析

(一)具体应用案例讲解

以某电商平台的智能客服系统为例,来深入了解 Milvus 在实际场景中的应用。

  1. 需求分析:该电商平台每天会收到大量用户咨询,问题涵盖商品信息、订单状态、售后服务等多个方面。传统基于关键词匹配的客服系统难以理解用户问题的语义,无法准确回答复杂问题,导致用户满意度较低。为了提升客服效率和用户体验,电商平台决定引入基于向量数据库的智能客服系统,实现语义理解和精准回答 。
  1. 架构设计
    • 数据层:使用 MySQL 存储商品信息、订单数据等结构化数据,而将用户问题、答案以及相关文本的向量表示存储在 Milvus 中 。
    • 服务层:利用自然语言处理(NLP)技术,如 BERT 模型,将用户输入的文本转化为向量 。当用户提出问题时,先通过 BERT 模型生成问题向量,然后在 Milvus 中进行相似度搜索,找到最相似的问题向量及其对应的答案 。为了提高响应速度,还引入了 Redis 作为缓存层,将常用问题和答案缓存起来 。
    • 应用层:与电商平台的在线客服界面集成,用户在客服界面输入问题,系统实时返回答案 。同时,系统还会记录用户问题和回答,用于后续的数据分析和优化 。
  1. 使用 Milvus 实现的全过程
    • 数据准备:收集历史用户问题和对应的答案,整理成数据集 。例如,整理出 “如何查询订单状态?”“我购买的商品什么时候发货?” 等常见问题及答案 。使用 BERT 模型对这些问题和答案进行向量化处理,生成对应的向量 。
    • Milvus 配置:在服务器上安装并启动 Milvus,创建一个名为 “customer_service” 的集合 。集合包含字段:id(主键,自动生成)、question(原始问题文本)、answer(答案文本)、vector(问题向量) 。字段数据类型分别为DataType.INT64、DataType.VARCHAR、DataType.VARCHAR、DataType.FLOAT_VECTOR ,其中vector字段维度根据 BERT 模型输出向量维度确定,如 768 维 。

from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection

# 连接到Milvus

connections.connect(host="localhost", port="19530")

# 定义集合schema

fields = [

FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),

FieldSchema(name="question", dtype=DataType.VARCHAR, max_length=512),

FieldSchema(name="answer", dtype=DataType.VARCHAR, max_length=1024),

FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=768)

]

schema = CollectionSchema(fields, description="Customer service Q&A")

# 创建集合

collection = Collection("customer_service", schema)

  • 数据插入:将生成的问题向量、原始问题和答案插入到 Milvus 集合中 。

from sentence_transformers import SentenceTransformer

# 加载Sentence-BERT模型

model = SentenceTransformer('all-MiniLM-L6-v2')

# 示例问答数据

qa_pairs = [

{"question": "如何查询订单状态?", "answer": "您可以在订单页面点击‘查看订单详情’来查询订单状态。"},

{"question": "商品如何退货?", "answer": "请在订单详情页面找到‘申请退货’按钮,按照提示操作即可。"}

]

# 生成向量并插入数据

vectors = [model.encode(q["question"]).tolist() for q in qa_pairs]

questions = [q["question"] for q in qa_pairs]

answers = [q["answer"] for q in qa_pairs]

collection.insert([list(range(len(qa_pairs))), questions, answers, vectors])

  • 构建索引:为了加快查询速度,对vector字段构建 HNSW 索引 。

index_params = {

"index_type": "HNSW",

"metric_type": "COSINE",

"params": {"M": 16, "efConstruction": 200}

}

collection.create_index(field_name="vector", index_params=index_params)

  • 查询实现:当用户输入问题时,首先使用 BERT 模型将问题转化为向量,然后在 Milvus 中进行搜索,找到最相似的问题向量及其对应的答案返回给用户 。

# 用户输入问题

user_question = "我想知道怎么查订单"

# 将用户问题转换为向量

query_vector = model.encode(user_question).tolist()

# 设置搜索参数

search_params = {"metric_type": "COSINE", "params": {"ef": 50}}

# 执行搜索

results = collection.search([query_vector], anns_field="vector", param=search_params, limit=1)

# 返回答案

if results[0]:

answer = results[0][0].entity.answer

print(f"回答:{answer}")

else:

print("未找到相关答案")

(二)经验总结与启示

  1. 技术选型的重要性:在构建智能客服系统时,选择合适的技术栈至关重要 。Milvus 在向量检索方面的高效性能,结合 NLP 模型(如 BERT)强大的语义理解能力,能够很好地满足智能客服对语义搜索的需求 。同时,与传统数据库(如 MySQL)和缓存(如 Redis)的结合,充分发挥了不同技术的优势,提高了系统的整体性能和稳定性 。
  1. 数据质量的影响:数据是智能客服系统的基础,高质量的数据能够提高系统的回答准确率和用户满意度 。在数据准备阶段,要对历史问题和答案进行仔细的整理和标注,确保数据的准确性和一致性 。此外,随着业务的发展和用户需求的变化,要不断更新和扩充数据,以提升系统的泛化能力 。
  1. 参数调优的必要性:Milvus 的索引参数(如 HNSW 索引的 M 和 efConstruction 参数)对查询性能有很大影响 。在实际应用中,需要根据数据规模、查询频率等因素进行参数调优,以达到最佳的性能表现 。可以通过实验和测试,不断尝试不同的参数值,找到最适合业务场景的参数配置 。
  1. 系统集成的复杂性:将 Milvus 集成到现有的电商平台客服系统中,涉及到多个系统和模块的协同工作,需要考虑数据传输、接口对接、系统兼容性等问题 。在项目实施过程中,要制定详细的技术方案和实施计划,确保各个环节的顺利进行 。同时,要建立完善的测试和验证机制,及时发现和解决集成过程中出现的问题 。

七、总结与展望

(一)回顾重点内容

通过前面的学习,我们对 Milvus 有了全面而深入的了解。Milvus 作为一款高性能的向量数据库,以其独特的优势在向量存储和检索领域脱颖而出 。它拥有高性能的向量检索能力,能够在海量数据中快速准确地找到相似向量 。其支持多种索引类型,如 HNSW、IVF_FLAT 等,开发者可以根据不同的数据规模和查询需求选择最合适的索引,从而优化搜索性能 。同时,Milvus 具备高扩展性,能够轻松应对数据量的增长,无论是单机部署还是分布式部署,都能稳定运行 。

在安装方面,我们详细介绍了通过 Docker 在 Linux 系统上安装 Milvus 的步骤,包括环境准备、镜像拉取、数据持久化目录创建以及容器运行等关键环节 。在实际操作中,虽然可能会遇到一些常见问题,如 Docker 未正确安装、端口冲突等,但我们也提供了相应的解决方法,确保安装过程的顺利进行 。

基本操作实战部分,我们学习了如何使用pymilvus库连接到 Milvus 实例,创建集合(Collection)来存储向量数据 。通过插入数据将向量存储到集合中,并为向量字段构建索引以加速检索 。在执行查询时,能够根据查询向量找到与之最相似的向量,还可以结合过滤条件进行复杂查询 。

进阶技巧中,我们探讨了优化检索性能的方法,如选择合适的索引、进行数据分区和合理设置缓存等 。在数据管理与维护方面,了解了数据备份、恢复和清理的操作,以确保数据的安全性和有效性 。此外,还学习了 Milvus 与其他工具的集成,包括与 AI 框架(如 PyTorch、TensorFlow)和传统数据库(如 MySQL)的集成,进一步拓展了 Milvus 的应用场景 。

通过电商平台智能客服系统的案例分析,我们看到了 Milvus 在实际应用中的价值 。从需求分析、架构设计到使用 Milvus 实现的全过程,我们深入了解了如何利用 Milvus 解决实际业务问题 。同时,从这个案例中我们也总结了技术选型、数据质量、参数调优等方面的经验和启示,这些对于我们在其他项目中应用 Milvus 具有重要的指导意义 。

(二)未来发展趋势

随着人工智能技术的不断发展,向量数据库的需求将持续增长,Milvus 在未来有望迎来更广阔的发展空间 。

在技术创新方面,Milvus 可能会进一步优化索引算法和搜索性能,以应对不断增长的数据规模和复杂的查询需求 。例如,随着数据量的不断增加,现有的索引算法可能需要不断改进,以提高搜索效率和准确性 。同时,Milvus 可能会加强对多模态数据的支持,如将文本、图像、音频等多种类型的数据融合在一起进行存储和检索,这将为智能安防、智能医疗等领域带来更多创新应用 。在智能安防中,可以将监控视频中的图像数据和对应的文本描述数据同时存储在 Milvus 中,通过多模态检索快速定位相关的监控信息 。

在生态建设方面,Milvus 的社区预计会更加活跃,吸引更多开发者和企业参与到项目中来 。这将促进 Milvus 与更多的开源项目和商业产品进行集成,形成更加完善的生态系统 。比如,与更多的深度学习框架、数据分析工具等进行深度集成,为用户提供一站式的解决方案 。同时,社区的壮大也将带来更多的技术交流和知识分享,推动 Milvus 技术的不断进步 。

在应用领域拓展方面,Milvus 将在更多行业中得到应用 。除了现有的图像识别、自然语言处理、推荐系统等领域,在金融领域,Milvus 可以用于风险评估、投资组合分析等;在教育领域,可用于智能学习系统、个性化教育推荐等 。随着各个行业数字化转型的加速,Milvus 将在这些领域发挥重要作用,帮助企业挖掘数据价值,提升业务效率 。

Milvus 作为向量数据库领域的佼佼者,凭借其强大的功能和广阔的发展前景,将在未来的人工智能和大数据领域中扮演越来越重要的角色 。希望大家通过本文的学习,能够掌握 Milvus 的基本技能,并在实际项目中灵活运用,共同探索向量数据库的无限可能 。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐