阿里云向量检索服务Milvus版是由阿里云与Zilliz联合打造的一款全托管向量检索引擎,集成Zilliz商业版内核,并确保与开源Milvus的完全兼容性,支持无缝迁移。它在开源版本的基础上增强了可扩展性,能提供大规模AI向量数据的相似性检索服务。凭借其开箱即用的特性、灵活的扩展能力和全链路监控告警,Milvus云服务成为多样化AI应用场景的理想选择,包括多模态搜索、检索增强生成(RAG)、搜索推荐、内容风险识别等。您还可以利用开源的Attu工具进行可视化操作,进一步促进应用的快速开发和部署。
向量检索是实现高效相似性搜索的关键技术。本文通过详细示例为您介绍如何快速实现向量检索。
前提条件
-
已在本地客户端成功安装了PyMilvus库,并将其更新至当前最新版本。
如果您尚未在本地客户端安装PyMilvus库,或者需要将其更新至当前最新版本,您可以执行以下命令。
pip install --upgrade pymilvus
-
已创建Milvus实例,请参见详情快速创建Milvus实例。
注意事项
阿里云Milvus支持通过内网和公网的方式连接,在连接Milvus实例之前,需确保您的客户端具备适当的网络访问权限,详情请参见网络访问与安全设置。
操作流程
步骤一:连接Milvus实例
您可以使用以下代码连接Milvus实例。
from pymilvus import MilvusClient
# 创建Milvus Client。
client = MilvusClient(
uri="http://c-xxxx.milvus.aliyuncs.com:19530", # Milvus实例的公网地址。
token="<yourUsername>:<yourPassword>", # 登录Milvus实例的用户名和密码。
db_name="default" # 待连接的数据库名称,本文示例为默认的default。
)
步骤二:创建Collection
您可以通过以下代码简便地创建一个Collection。更多自定义参数选项,请参见管理Collections。
client.create_collection(
collection_name="demo", #集合的名称。
dimension=5 #向量维度。
)
这段代码除了设置Collection名称和向量维度,还自动应用了以下配置:
-
使用默认命名的主键字段“id”和向量字段“vector”。
-
“metric_type”属性采用默认的COSINE度量类型。
-
主键字段“id”设定为整型,其值不会自动递增。
-
引入了额外的“$meta”字段,以键值对形式存储那些在Schema中未定义的字段数据。
步骤三:插入数据
Collection创建完毕后,系统会自动将其及其对应的索引加载至内存中,您可以使用如下代码向该集合中插入测试数据。
插入少量数据
插入更多数据
这段代码插入了预定义的10个Entity,每个Entity具有固定的向量和颜色标签。
data=[{'id': 0, 'vector': [-0.493313706583155, -0.172001225836391, 0.16825615330139554, -0.0198911518739604, -0.9756816265213708], 'color': 'green_5760'}, {'id': 1, 'vector': [0.6695699219225086, 0.49952523907354496, -0.49870548178008534, 0.8824655547230731, -0.7182693622931615], 'color': 'blue_2330'}, {'id': 2, 'vector': [-0.6057771959702387, 0.9141473782193543, 0.32053983678483466, -0.32126010092015655, 0.725222856037071], 'color': 'grey_9673'}, {'id': 3, 'vector': [0.14082089434165868, 0.9924029949938447, 0.7943279666144052, -0.7898608705081103, -0.9941425813199956], 'color': 'white_2829'}, {'id': 4, 'vector': [-0.46180540826224026, 0.33216876051895783, 0.5786699695956004, 0.8891120357625131, 0.04872530176990697], 'color': 'pink_9061'}, {'id': 5, 'vector': [-0.6097452740606673, 0.35648319550551144, -0.5699789153006387, 0.15085357921088316, -0.8817226997144627], 'color': 'pink_8525'}, {'id': 6, 'vector': [0.7843522543512762, -0.7663837586858071, -0.8681839054724569, 0.6880645348647785, -0.5151293183261791], 'color': 'green_5016'}, {'id': 7, 'vector': [-0.9967116931989293, 0.5741923070732655, -0.019126124261334976, -0.34163875885482753, -0.8189843931354175], 'color': 'brown_7434'}, {'id': 8, 'vector': [0.7347243385915765, -0.7358853080124825, -0.23737428377511716, 0.06980552357261627, -0.30613964550461437], 'color': 'blue_5059'}, {'id': 9, 'vector': [-0.21187155428455862, -0.3288541717216129, -0.32564136453418824, -0.14054963599686743, 0.5491320339870627], 'color': 'yellow_9887'}]
res = client.insert(
collection_name="demo",
data=data
)
步骤四:向量检索
重要
数据插入过程采用异步机制,这意味着在您完成数据插入操作后,系统并不会立即更新相应的搜索索引。为确保查询到最新插入的数据,建议您在数据插入后耐心等待数秒,待索引更新完成后再进行搜索操作
单一向量检索
批量向量检索
通过提供一个查询向量列表,您可以进行单一向量的相似性检索。
query_vectors = [
[-0.8832567462711804, -0.2999882617491647, 0.9921295273224382, -0.272575369985379, -0.688914679645338]
]
res = client.search(
collection_name="demo", # 查询collection
data=query_vectors, # 查询vectors。
limit=3, # 返回entities数量。
)
print(res)
步骤五:Filter检索
利用Schema中定义的字段,您可以设置过滤条件来精确限定检索范围,提高搜索效率。
基于数值字段过滤
基于元数据字段($meta)过滤
以下示例展示了如何根据id
字段的数值范围进行过滤。
query_vectors = [
[-0.30932351869632435, -0.7132856078639205, 0.6006201320181415, 0.40140510356426784, -0.21223937444001328]
]
res = client.search(
collection_name="demo",
data=query_vectors,
filter="3 < id < 5", # 数值字段范围过滤条件。
limit=3
)
print(res)