文本向量化检索最佳实践

更新时间:2025-03-31 07:19:56

购买OpenSearch召回引擎版实例

购买实例可参考购买OpenSearch召回引擎版实例

配置表

实例列表页面,找到新购买的实例,其状态为“待配置”,需要完成表的配置后,才可正常搜索。

image

1. 表基础信息

image.png

配置说明:

  • 表名称:可自定义

  • 数据分片数:分片数设置时,请填写不超过256的正整数, 用于提升全量构建速度、单次查询性能。

  • 数据更新资源数:实时数据更新资源数,调整资源可以扩大消费实时数据的并发数,从而提高TPS。

说明
  • 数据更新资源数默认有2个免费资源,数据量超过2,按n-2 计费,n是单表的数据更新资源总数

2. 数据同步

目前支持的数据源有“MaxCompute + API 数据源”、“API 数据源”、“OSS + API 数据源”、“数据湖构建(DLF)”,本次演示的全量数据来源以MaxCompute+API的方式为例,依次完成参数配置后,还需要再通过数据来源校验,才能进行下一步的操作。

image

配置参数说明:

  • AccessKey:阿里云账号或RAM用户的AccessKey ID。

  • AccessKey Secret:AccessKey ID对应的AccessKey Secret。

  • 项目名 (Project):访问的目标MaxCompute项目名称。

  • 表名 (Table):访问的目标MaxCompute表名。

  • 表数据分区 (Partition):MaxCompute数据源必须设置分区键; 示例:ds=20170626。

  • 自动索引重建:是否开启自动索引重建任务,如果开启,则将在识别到当前数据源的变更时,自动对引用该数据源的索引表进行索引重建。

3.索引结构

由于选择了MaxCompute+API的数据源方式,所以会自动映射数据源字段,我们还需要对字段和索引进行设置。

image

配置说明:

  1. 字段配置:文本向量化是通过系统将文本转换成向量,然后通过向量进行检索数据,因此此处需要配置3个必须字段,如上图(名称均可以自定义):

    • id(主键字段):类型可以为 STRING 或者整数类型,需要勾选主键。image

    • vector_source_text(存储文本内容):image

    • vector字段,该字段的配置保持为空即可,平台转化向量的设置需要在高级配置去配置中进行。imageimage

      • 字段说明:

        • vector_model:向量模型,目前支持中英文多种模型(维度固定为768),以下为可选的模型。

          • ops-text-embedding-000,短文本转向量模型

          • ops-text-embedding-en-000:英文短文本转向量模

          • ops-text-embedding-1024-000-20231001:增强版中文转向量 1024

          • ops-text-embedding-512-000-20231001:增强版中文转向量 512

          • ops-text-embedding-128-000-20231001:增强版中文转向量 128

          • ops-text-embedding-512-en-000-20231001:增强版英文转向量 512

          • ops-text-embedding-128-en-000-20231001:增强版英文转向量 128

        • vector_modal:向量类型,文本向量,本文中为text。

        • vector_source_field:需要文本向量化的字段,本文中为vector_source_text。

          重要

          属性和字段内容压缩:

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

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

          • 如果是MaxCompute数据源或OSS数据源,从数据源同步字段后,展示在预置字段下方。

          • 主键字段不支持压缩。

          • 字段压缩、属性压缩开启后将节省存储空间,但查询性能可能有所下降。

  2. 索引设置,必要设置的索引为主键索引向量索引image.png

    • 主键索引:名称自定义,索引类型选择PRIMARYKEY64,包含字段选择字段设置中设置为主键的字段,此处为id。

    • 向量索引:名称自定义,索引类型选择CUSTOMIZED,包含字段可选择3个,如果没有标签可以不填,但是主键字段和向量字段必选。

    • 在向量索引的高级配置查看/修改中需要将dimension改成768维,固定768维不可修改为其他维度,其他参数建议保持默认。image

schema示例:

{
  "file_compress": [
    {
      "name": "file_compressor",
      "type": "zstd"
    },
    {
      "name": "no_compressor",
      "type": ""
    }
  ],
  "table_name": "xiaoming001",
  "summarys": {
    "summary_fields": [
      "id",
      "vector_source_text",
      "cate_id",
      "vector"
    ],
    "parameter": {
      "file_compressor": "zstd"
    }
  },
  "indexs": [
    {
      "index_name": "id",
      "index_type": "PRIMARYKEY64",
      "index_fields": "id",
      "has_primary_key_attribute": true,
      "is_primary_key_sorted": false
    },
    {
      "index_name": "vector",
      "index_type": "CUSTOMIZED",
      "index_fields": [
        {
          "boost": 1,
          "field_name": "id"
        },
        {
          "boost": 1,
          "field_name": "vector"
        }
      ],
      "indexer": "aitheta2_indexer",
      "parameters": {
        "enable_rt_build": "true",
        "min_scan_doc_cnt": "20000",
        "vector_index_type": "Qc",
        "major_order": "col",
        "builder_name": "QcBuilder",
        "distance_type": "SquaredEuclidean",
        "embedding_delimiter": ",",
        "enable_recall_report": "true",
        "ignore_invalid_doc": "true",
        "is_embedding_saved": "false",
        "linear_build_threshold": "5000",
        "dimension": "768",
        "rt_index_params": "{\"proxima.oswg.streamer.segment_size\":2048}",
        "search_index_params": "{\"proxima.qc.searcher.scan_ratio\":0.01}",
        "searcher_name": "QcSearcher",
        "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}"
      }
    }
  ],
  "attributes": [
    {
      "field_name": "id",
      "file_compress": "no_compressor"
    },
    {
      "field_name": "vector_source_text",
      "file_compress": "no_compressor"
    },
    {
      "field_name": "cate_id",
      "file_compress": "no_compressor"
    },
    {
      "field_name": "vector",
      "file_compress": "no_compressor"
    }
  ],
  "fields": [
    {
      "user_defined_param": {},
      "field_name": "id",
      "field_type": "INT64",
      "compress_type": "equal"
    },
    {
      "field_name": "vector_source_text",
      "field_type": "STRING",
      "compress_type": "uniq"
    },
    {
      "field_name": "cate_id",
      "field_type": "STRING",
      "compress_type": "uniq"
    },
    {
      "user_defined_param": {
        "vector_model": "ops-text-embedding-000",
        "vector_modal": "text",
        "vector_source_field": "vector_source_text"
      },
      "field_name": "vector",
      "field_type": "FLOAT",
      "compress_type": "uniq",
      "multi_value": true
    }
  ]
}

4.确认创建

点击确认创建,完成创建表。image.png

返回到实例详情页,功能扩展 > 变更历史中可以查看创建进度,进度完成后,即可进行查询测试。

image.png

效果测试

语法介绍

vector:'水壶&modal=text&n=10&search_params={}'&&config=start:0,hit:10,format:json&&kvpairs=formula:proxima_score(vector)&&sort=+RANK
  • modal表示模态类型,modal设置为text

  • n表示指定向量检索返回的top结果数

  • 文本内容若有特殊不可见字符需要经过base64编码

通过控制台进行查询测试:

image.png

SDK中检索数据

添加依赖:

pip install alibabacloud-ha3engine

搜索 demo:

# -*- coding: utf-8 -*-


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="参考实例详情页>API入口下的API域名",
        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:
        # 示例1: 直接使用 ha 查询串进行搜索.
        # =====================================================
        query_str = "config=hit:4,format:json,fetch_summary_type:pk,qrs_chain:search&&query=text_index:'文本内容&modal=text&n=10&search_params={}'&&cluster=general"
        haSearchQuery = models.SearchQuery(query=query_str)
        haSearchRequestModel = models.SearchRequestModel(optionsHeaders, haSearchQuery)
        hastrSearchResponseModel = ha3EngineClient.search(haSearchRequestModel)
        print(hastrSearchResponseModel)
    except TeaException as e:
        print(f"send request with TeaException : {e}")
    except RetryError as e:
        print(f"send request with Connection Exception  : {e}")
说明

其他SDK demo可参考开发指南

注意事项

  • 如果对向量检索耗时有较严格的要求,建议mmap策略示例

  • 存储文本字段需要设置为STRING。

  • 向量索引需要设置为CUSTOMIZED类型。

  • 该场景支持HA语法、RESTFUL API,不支持SQL。

  • 本页导读 (1)
  • 购买OpenSearch召回引擎版实例
  • 配置表
  • 1. 表基础信息
  • 2. 数据同步
  • 3.索引结构
  • 4.确认创建
  • 效果测试
  • 语法介绍
  • SDK中检索数据
  • 注意事项