文档

使用AUTOINDEX

更新时间:
一键部署

阿里云Milvus提供了AUTOINDEX特性,使您能够便捷快速地创建索引,免去调节参数的烦恼,帮助您实现最佳搜索性能。本文为您介绍如何在Collection中使用AUTOINDEX。

背景信息

在近似近邻(ANN)算法的应用场景中,AUTOINDEX采用智能算法,通过在建立索引时分析用户数据的分布情况,利用机器学习模型自动选择检索参数,从而实现召回率和检索性能的平衡。这样一来,您无需手动设置检索参数,可以充分享受优化的搜索体验。

与开源的Milvus相比,阿里云Milvus的AUTOINDEX拥有显著的性能优势。根据一项基准测试显示,在特定数据集上,AUTOINDEX的(Query Per Second)是其他索引类型的三倍。AUTOINDEX在以下场景中能够提供卓越的性能:

  • 利用单指令流多数据流(SIMD)加速查询和数据存储,从而进一步提升服务器的整体性能。

  • 通过优化数据图和裁剪策略,显著减少检索过程中需访问的数据点。

  • 采用动态量化策略,有效降低距离计算的开销。

前提条件

  • 已在本地客户端成功安装了PyMilvus库,并将其更新至当前最新版本。

    如果您尚未在本地客户端安装PyMilvus库,或者需要将其更新至当前最新版本,您可以执行以下命令。

    pip install --upgrade pymilvus
  • 已创建Milvus实例,请参见详情快速创建Milvus实例

使用示例

创建Collection

以下代码片段并未声明index参数。它将会在Milvus中创建一个Collection,该Collection不会包含索引(index),也不会加载到内存中。

from pymilvus import MilvusClient, DataType

client = MilvusClient(
    uri="http://c-xxxx.milvus.aliyuncs.com:19530",
    token="your_user:your_password",
    db_name="default"
)

schema = MilvusClient.create_schema(
    auto_id=False,
    enable_dynamic_field=True,
)

schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)

client.create_collection(
    collection_name="demo", 
    schema=schema, 
)

涉及以下参数需要您进行替换。

参数

说明

uri

Milvus实例的访问地址和端口,格式为c-xxx.milvus.aliyuncs.com:19530,其中c-xxx为Milvus实例的ID。

token

登录数据库的账号和密码。默认账号为root。

db_name

数据库名称。默认为default。

collection_name

Collection名称,本文示例为demo。

创建AUTOINDEX

您可以通过配置 index 参数并调用 create_index 函数来创建自动索引(AUTOINDEX)。

from pymilvus import MilvusClient

index_params = MilvusClient.prepare_index_params()

# 开源Milvus索引参数。

# index_params.add_index(
#     field_name="vector",
#     index_type="IVF_FLAT",
#     metric_type="L2",
#     params={"nlist": 1024}
# )

index_params.add_index(
    field_name="vector",
    metric_type="L2",
    index_type="AUTOINDEX",
)

client.create_index(
    collection_name="demo",
    index_params=index_params
)

client.load_collection(
    collection_name="demo"
)

插入数据

您可以通过如下代码,插入测试数据。

client.insert(
    collection_name="demo",
    data=[
         {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},
         {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},
         {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},
         {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},
         {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},
         {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},
         {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},
         {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},
         {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},
         {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}
     ],
)

向量搜索

您可以根据不同的索引类型调整相应的参数。例如,在使用HNSW索引时,需调整 ef 参数;对于IVF型索引,则需调节 nprobe 参数。为了在召回率和检索效率之间找到最佳平衡,通常需要反复尝试不同的参数组合。在AutoIndex中,则引入了统一的检索精度控制参数 level,简化了参数调优过程。该参数的默认值为1,最大值为5。随着 level 值的增加,召回率会提高,但检索性能可能会有所下降。通常情况下,默认的 level 值可以满足约90%的召回率需求,适用于大多数场景。如果需要更高的召回率,可以尝试增加 level 参数的值。

# 开源Milvus检索参数。
# search_params = {
#     "params": {"nprobe": 10}
# }

search_params = {
    "params": {"level": 1}
}

res = client.search(
    collection_name="demo",
    data=[[0.05, 0.23, 0.07, 0.45, 0.13]],
    limit=3,
    search_params=search_params
)

(可选)查看Collection

您可以在Milvus实例的实例详情页,单击右上角的Attu Manager,然后输入Milvus实例的用户名和密码,可以查看写入的数据和向量等信息。关于Attu的相关操作,请参见Attu工具管理

image