文档

向量索引最佳实践

更新时间:

本文将介绍如何在已有的向量检索版实例中配置向量索引,并简单演示使用SDK方式通过向量查询检索版实例数据。

前置条件

  1. 成功注册阿里云账号并通过实名认证

  2. 开通阿里云账号并登录控制台时,会提示先创建access key才能继续使用。

    1. 创建及使用应用依赖access key参数,主账号下access key参数不能为空。

    2. 在为主账号创建access key参数后,还可以再创建RAM子账号access key通过RAM子账号进行访问,RAM子账号赋予对应访问权限,请参考授权访问鉴权规则。(ps:子账号需要赋予AliyunSearchEngineFullAccess、AliyunSearchEngineReadOnlyAccess访问向量检索版实例的权限)。

3.需要用户拥有VPC环境,详情可点击此处进行查看。

说明
  • 如果需要使用子账号操作向量检索版实例,请使用主账号为子账号授予AliyunSearchEngineFullAccess和AliyunSearchEngineReadOnlyAccess 权限

购买实例

  1. 进入OpenSearch控制台,在左上角切换到OpenSearch-向量检索版

image

  1. 进入向量检索版控制台后,在实例管理界面,点击创建实例

image

  1. 商品版本选择向量检索版,选择地区,配置“查询节点个数”、“查询节点规格”、“数据节点数量”、“数据节点规格”、“单数据节点总存储空间”,设置“专有网络”和“虚拟交换机”,最后按提示要求设置用户名和用户密码(用于查询时校验权限,非阿里云账号密码),点击“立即购买”:

image

说明
  • 购买的查询节点和数据节点的个数及规格,需根据自身业务进行规划,确定规格后实际费用可在售卖页自动生成。

  • 专有网络和虚拟交换的配置一定要和访问召回引擎版实例的ECS机器保持一致。否则在访问召回引擎版实例时会报错{'errors':{'code':'403','message':'Forbidden'}}

  • 单数据节点存储空间有免费额度,用户也可申请额外额度,按额外额度部分收费(步长50GB)

  1. 确认订单界面,查看服务协议,确认无误后,点击立即开通

image

  1. 购买成功后,点击管理控制台,即可在实例管理界面查看已购买的向量检索版实例:

image

  1. 新购的实例会设置一个默认实例名称,可在操作栏下点击管理按钮,进入详情页进行修改:

image

点击修改图标,按提示框要求修改实例名称最后点击确认

image

配置集群

新购买的实例,在其详情页中,实例状态为“待配置”,并且会自动部署一个与购买的查询节点和数据节点的个数及规格一致的空集群,之后需要为该集群配置数据源--->配置索引--->索引重建,之后才可正常搜索。

image

  1. 配置数据源(目前支持的数据源有MaxCompute数据源API推送数据源),这里以MaxCompute数据源为例:点击“添加数据源”,数据源类型选择“MaxCompute”,设置project、accesskeyID、accesskeyId、accesskeySecret、Table、分组键partition,可按需选择是否开启“MaxCompute数据源”:

image

校验成功之后,点击“确定”,完成数据源的添加:

image

  1. 数据源配置成功后,需点击下一步配置索引结构

image

2.1. 添加索引表:

image

2.2. 配置索引表,模板选择通用模板:

image

  • 索引表:可自定义

  • 数据源:选择 1 中配置的数据源

  • 数据分片:根据用户购买的数据节点个数进行配置

2.3. 设置字段,至少需要定义2个字段主键字段向量字段(向量字段需要设置为多值float类型):

image

如果需要带有类目的向量,可以在主键和向量字段中间加一个类目字段,类型要求单值或多值的整数类型:

image

属性和字段内容压缩

  • 属性字段可以选择是否压缩,默认为不压缩,选择file_compressor表示开启压缩

  • 字段内容可以选择是否压缩,默认为不压缩,默认多值和STRING类型选择uniq,单值数值类型是equal

说明
  • 使用向量检索,在定义字段时有位置要求,需要按照主键字段、标签字段(非必要)、向量字段的顺序创建。(如上图所示)

  • 如果开启了属性压缩,建议前往「部署管理-数据节点-在线表配置」编辑索引加载方式,以此降低对性能的影响。

  • 支持复制字段操作,复制出的新字段(DUP字段)与原字段内容保持一致(推送不一致内容时,将采用原字段内容覆盖),如期望字段内容不一致,请手动删除DUP字段高级配置中的copy from配置

  1. 设置索引,主键字段索引类型设置为PRIMARYKEY64,向量索引类型选择CUSTOMIZED

image

索引字段设置压缩

  • 索引字段可以选择是否压缩,默认为不压缩,选择file_compressor表示开启压缩

说明
  • 主键索引不支持压缩

  • 如果开启了索引压缩,建议前往「部署管理-数据节点-在线表配置」编辑索引加载方式,以此降低对性能的影响

3.1. 为向量字段添加包含字段:

image

重要
  • 主键字段、向量字段必须填写,标签字段非必填,可以为空。

  • 仅支持选择固定的三个字段,不支持新增。

3.2. 高级配置,向量索引需要单独配置参数,可以参考如下配置,详情可参考向量索引

image

更多参数:

image.png

其中build_index_params的配置如下:

{
  "proxima.qc.builder.quantizer_class": "Int8QuantizerConverter",
  "proxima.qc.builder.quantize_by_centroid": true,
  "proxima.qc.builder.optimizer_class": "BruteForceBuilder",
  "proxima.qc.builder.thread_count": 10,
  "proxima.qc.builder.optimizer_params": {
    "proxima.linear.builder.column_major_order": true
  },
  "proxima.qc.builder.store_original_features": false,
  "proxima.qc.builder.train_sample_count": 3000000,
  "proxima.qc.builder.train_sample_ratio": 0.5
}

search_index_params的配置如下:

{
  "proxima.qc.searcher.scan_ratio": 0.01
}
说明

系统自动填充向量索引的配置参数,如无特殊需求,可直接点击「确定」快速完成配置。

  1. 配置完成后,点击保存版本,并在弹框后填写备注(可选),点击发布

image

等待索引发布完成后,可点击“下一步”进行索引重建:

image

  1. 索引重建,选择索引重建需要配置的参数项,点击“下一步”:

  • API推送数据源

image

  • MaxCompute数据源

image

  1. 可在运维中心>历史变更>数据源变更查看索引重建进度,进度完成后即可进行查询测试:

image

  1. 页面查询测试:

image

语法说明

  • 通用查询:

HA3语法

query=index_name:'0.1,0.2,0.98,0.6;0.3,0.4,0.98,0.6...'
注:index_name为向量索引名,后面是要查询的向量

SQL语法

query=select proxima_score('index_name') as score,id from table_name where MATCHINDEX('index_name', ?) order by score asc limit 5&&kvpair=timeout:1000,iquan.plan.cache.enable:true;urlencode_data:false;iquan.plan.prepare.level:jni.post.optimize;dynamic_params:[["0.892704,0.783731"]]
注:index_name为向量索引名,kvpair中的dynamic_params是要查询的向量

  • 指定topN查询:

HA3语法

query=index_name:'0.1,0.2,0.98,0.6;0.3,0.4,0.98,0.6&n=10'
注:index_name为向量索引名,后面是要查询的向量,n指定向量检索返回的top结果数。

SQL语法

query=select proxima_score('index_name') as score,id from table_name where MATCHINDEX('index_name', ?) order by score asc limit 5&&kvpair=timeout:1000,iquan.plan.cache.enable:true;urlencode_data:false;iquan.plan.prepare.level:jni.post.optimize;dynamic_params:[["0.892704,0.783731&n=10"]]
注:index_name为向量索引名,kvpair中的dynamic_params是要查询的向量,n指定向量检索返回的top结果数。

  • 设定最低分阈值:

HA3语法

query=index_name:'0.1,0.2,0.98,0.6;0.3,0.4,0.98,0.6&n=10&sf=0.8'
注:index_name为向量索引名,后面是要查询的向量,sf指定要过滤分数的阈值。

SQL语法

query=select proxima_score('index_name') as score,id from table_name where MATCHINDEX('index_name', ?) order by score asc limit 5&&kvpair=timeout:1000,iquan.plan.cache.enable:true;urlencode_data:false;iquan.plan.prepare.level:jni.post.optimize;dynamic_params:[["0.892704,0.783731&n=10&sf=0.8"]]
注:index_name为向量索引名,kvpair中的dynamic_params是要查询的向量,sf指定要过滤分数的阈值。

  • 设置召回参数:

HA3语法

query=index_name:'0.1,0.2,0.98,0.6;0.3,0.4,0.98,0.6&n=10&sf=0.8&search_params={"proxima.qc.searcher.scan_ratio":0.001,"proxima.general.searcher.scan_count":10000}'
注:search_params指定向量召回参数,为json格式。proxima.qc.searcher.scan_ratio含有同上,proxima.general.searcher.scan_count意义同min_scan_doc_cnt
注:n,sf,search_params出现的顺序不能变

SQL语法

query=select proxima_score('index_name') as score,id from table_name where MATCHINDEX('index_name', ?) order by score asc limit 5&&kvpair=timeout:1000,iquan.plan.cache.enable:true;urlencode_data:false;iquan.plan.prepare.level:jni.post.optimize;dynamic_params:[["0.892704,0.783731&n=10&sf=0.8&search_params={"proxima.qc.searcher.scan_ratio":0.001,"proxima.general.searcher.scan_count":10000}"]]

注:index_name为向量索引名,kvpair中的dynamic_params是要查询的向量,search_params指定向量召回参数,为json格式。proxima.qc.searcher.scan_ratio含有同上,proxima.general.searcher.scan_count意义同min_scan_doc_cnt
注:n,sf,search_params出现的顺序不能变

说明

在使用向量检索时,如果向量索引中配置了类目字段,需要在检索时也带入类目字段进行检索,否则无法正常召回数据,举例:

query=select proxima_score('vector_index_name') as score, cate_id from table_name where MATCHINDEX('vector_index_name', ?) &&kvpair=timeout:1000,iquan.plan.cache.enable:true;urlencode_data:false;iquan.plan.prepare.level:jni.post.optimize;trace:INFO;formatType:json;dynamic_params:[["168#0.01747940666973591,-0.03125246614217758,-0.03254068270325661..."]]

其中dynamic_params中的168#,168就是类目字段值,以#分隔

SDK中使用向量检索

添加依赖:

pip install alibabacloud-ha3engine

搜索 demo:

from alibabacloud_ha3engine import models, client
from alibabacloud_tea_util import models as util_models
from Tea.exceptions import TeaException, RetryError

def search():
    Config = models.Config(
        endpoint="",
        instance_id="",
        protocol="http",
        access_user_name="",
        access_pass_word=""
    )

    # 如用户请求时间较长. 可通过此配置增加请求等待时间. 单位 ms
    # 此参数可在 search_with_options 方法中使用
    runtime = util_models.RuntimeOptions(
        connect_timeout=5000,
        read_timeout=10000,
        autoretry=False,
        ignore_ssl=False,
        max_idle_conns=50
    )
    # 初始化 Ha3Engine Client
    ha3EngineClient = client.Client(Config)
    optionsHeaders = {}
    try:
        # 示例3: 直接使用 ha - sql  查询串进行搜索.
        # =====================================================
        sql_str = '''query=select proxima_score('index_name') as score,id from table_name where MATCHINDEX('index_name', ?) order by score asc limit 5&&kvpair=timeout:1000,iquan.plan.cache.enable:true;urlencode_data:false;iquan.plan.prepare.level:jni.post.optimize;dynamic_params:[["0.892704,0.783731&n=10"]]'''
        sqlsearchQuery = models.SearchQuery(sql=sql_str)
        sqlSearchRequestModel = models.SearchRequestModel(optionsHeaders, sqlsearchQuery)
        sqlstrSearchResponseModel = ha3EngineClient.search(sqlSearchRequestModel)
        print(sqlstrSearchResponseModel)

    except TeaException as e:
        print(f"send request with TeaException : {e}")
    except RetryError as e:
        print(f"send request with Connection Exception  : {e}")


if(__name__  == "__main__"):
    search()

注意事项