本文将介绍如何在已有的召回引擎版实例中配置向量索引,并简单演示使用SDK方式通过向量查询检索召回引擎版实例数据。
购买OpenSearch召回引擎版实例
购买实例可参考购买OpenSearch召回引擎版实例。
配置集群
新购买的实例,在其详情页中,实例状态为“待配置”,并且会自动部署一个与购买的查询节点和数据节点的个数及规格一致的空集群,之后需要为该集群配置数据源--->配置索引--->索引重建,之后才可正常搜索。
配置数据源(目前支持的数据源有MaxCompute数据源和API推送数据源)这里以MaxCompute数据源为例:点击“添加数据源”,数据源类型选择“MaxCompute”,设置project、AccessKey ID、AccessKey Secret、Table、分组键partition,可按需选择是否开启“自动索引重建”:
校验成功之后,点击“确定”,完成数据源的添加:
数据源配置成功后,需点击下一步配置索引结构:
2.1. 添加索引表:
2.2. 配置索引表:
索引表:可自定义
数据源:选择 1 中配置的数据源
数据分片:根据用户购买的数据节点个数进行配置
2.3. 设置字段,至少需要定义2个字段主键字段和向量字段(向量字段需要设置为多值float类型):
如果需要带有类目的向量,可以在主键和向量字段中间加一个类目字段,类型要求单值或多值的整数类型:
属性和字段内容压缩:
属性字段可以选择是否压缩,默认为不压缩,选择file_compressor表示开启压缩
字段内容可以选择是否压缩,默认为不压缩,默认多值和STRING类型选择uniq,单值数值类型是equal
使用向量检索,在定义字段时有位置要求,需要按照主键字段、标签字段(非必要)、向量字段的顺序创建。(如上图所示)
如果开启了属性压缩,建议前往「部署管理-数据节点-在线表配置」编辑索引加载方式,以此降低对性能的影响
支持复制字段操作,复制出的新字段(DUP字段)与原字段内容保持一致(推送不一致内容时,将采用原字段内容覆盖),如期望字段内容不一致,请手动删除DUP字段高级配置中的copy from配置
3. 设置索引,主键字段索引类型设置为PRIMARYKEY64,向量索引类型选择CUSTOMIZED:
索引字段设置压缩:
索引字段可以选择是否压缩,默认为不压缩,选择file_compressor表示开启压缩
主键索引不支持压缩
如果开启了索引压缩,建议前往「部署管理-数据节点-在线表配置」编辑索引加载方式,以此降低对性能的影响
3.1. 为向量字段添加包含字段:
主键字段、向量字段必须填写,标签字段非必填,可以为空。
仅支持选择固定的三个字段,不支持新增。
3.2. 高级配置,向量索引需要单独配置参数,可以参考如下配置,详情可参考向量索引:
更多参数:
其中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
}
配置完成后,点击保存版本,并在弹框后填写备注(可选),点击发布:
等待索引发布完成后,可点击“下一步”进行索引重建:
索引重建,选择索引重建需要配置的参数项,点击“下一步”:
API推送数据源:
MaxCompute数据源:
可在运维中心>历史变更>数据源变更查看索引重建进度,进度完成后即可进行查询测试:
页面查询测试:
语法说明
可参考文档向量检索语法。
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()
注意事项
如果对向量检索耗时有较严格的要求,建议向量索引的lock策略。