すべてのプロダクト
Search
ドキュメントセンター

:ベクトルインデックス

最終更新日:Dec 28, 2024

概要

ベクトルベースの検索メカニズムは、商品データとコンテンツデータをベクトルの形式で表現し、ベクトルインデックスライブラリを構築します。ベクトルインデックスライブラリ内の1つ以上のユーザーベクトルまたは商品ベクトルを指定して、ベクトル距離に基づいて商品またはコンテンツのトップkリストを取得できます。

ベクトルインデックスを設定するためのサンプルコード

カテゴリなしのベクトルインデックスを設定する

{
  "table_name": "test_vector",
  "summarys": {
    "summary_fields": [
      "id",
      "vector_field"
    ]
  },
  "indexs": [
    {
      "index_name": "pk",
      "index_type": "PRIMARYKEY64",
      "index_fields": "id",
      "has_primary_key_attribute": true,
      "is_primary_key_sorted": false
    },
    {
      "index_name": "embedding",
      "index_type": "CUSTOMIZED",
      "index_fields": [
        {
          "boost": 1,
          "field_name": "id"
        },
        {
          "boost": 1,
          "field_name": "vector_field"
        }
      ],
      "indexer": "aitheta2_indexer",
      "parameters": {
        "enable_rt_build": "false",
        "min_scan_doc_cnt": "20000",
        "vector_index_type": "Qc",
        "major_order": "col",
        "builder_name": "QcBuilder",
        "distance_type": "SquaredEuclidean",
        "embedding_delimiter": ",",
        "enable_recall_report": "false",
        "is_embedding_saved": "false",
        "linear_build_threshold": "5000",
        "dimension": "128",
        "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": [
    "id",
    "vector_field"
  ],
  "fields": [
    {
      "field_name": "id",
      "field_type": "INTEGER"
    },
    {
      "user_defined_param": {
        "multi_value_sep": ","
      },
      "field_name": "vector_field",
      "field_type": "FLOAT",
      "multi_value": true
    }
  ]
}

カテゴリ付きのベクトルインデックスを設定する

{
  "table_name": "test_vector",
  "summarys": {
    "summary_fields": [
      "id",
      "vector_field",
      "category_id"
    ]
  },
  "indexs": [
    {
      "index_name": "pk",
      "index_type": "PRIMARYKEY64",
      "index_fields": "id",
      "has_primary_key_attribute": true,
      "is_primary_key_sorted": false
    },
    {
      "index_name": "embedding",
      "index_type": "CUSTOMIZED",
      "index_fields": [
        {
          "boost": 1,
          "field_name": "id"
        },
        {
          "field_name": "category_id",
          "boost": 1
        },
        {
          "boost": 1,
          "field_name": "vector_field"
        }
      ],
      "indexer": "aitheta2_indexer",
      "parameters": {
        "enable_rt_build": "false",
        "min_scan_doc_cnt": "20000",
        "vector_index_type": "Qc",
        "major_order": "col",
        "builder_name": "QcBuilder",
        "distance_type": "SquaredEuclidean",
        "embedding_delimiter": ",",
        "enable_recall_report": "false",
        "is_embedding_saved": "false",
        "linear_build_threshold": "5000",
        "dimension": "128",
        "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": [
    "id",
    "vector_field",
    "category_id"
  ],
  "fields": [
    {
      "field_name": "id",
      "field_type": "INTEGER"
    },
    {
      "user_defined_param": {
        "multi_value_sep": ","
      },
      "field_name": "vector_field",
      "field_type": "FLOAT",
      "multi_value": true
    },
    {
      "field_name": "category_id",
      "field_type": "INTEGER"
    }
  ]
}
重要
  • カテゴリは、カテゴリに基づいてベクトルを検索できるようにするために導入されています。たとえば、画像は異なるカテゴリに属します。カテゴリ付きのベクトルインデックスを構築せずに、取得したベクトルのみをフィルタリングすると、結果が返されない場合があります。

  • 管理者としてベクトルインデックスを設定する場合、build_index_paramsパラメータとsearch_index_paramsパラメータの値のエスケープ文字を削除する必要があります。

パラメータの説明

  • field_name: ベクトルインデックスの構築に使用されるフィールド。フィールドはRAWデータ型である必要があります。このパラメータには少なくとも2つのフィールドを指定する必要があります。1つのフィールドはINTEGERデータ型の主キーまたは主キーのハッシュ値である必要があります。もう1つのフィールドにはベクトルが含まれている必要があります。カテゴリに基づいてベクトルインデックスを構築する必要がある場合は、カテゴリフィールドを追加できます。フィールドタイプはRAWで、フィールド値はINTEGERデータ型です。indexパラメータのフィールドの順序は、fieldsパラメータと同じ方法で設定する必要があります。カテゴリフィールドが存在する場合、順序は主キーフィールド、カテゴリフィールド、ベクトルフィールドである必要があります。

  • index_name: ベクトルインデックスの名前。

  • index_type: ベクトルインデックスのタイプ。値をCUSTOMIZEDに設定します。

  • indexer: ベクトルインデックスの構築に使用するプラグイン。値をaitheta2_indexerに設定します。

  • parameters: ベクトルインデックスのビルダーとサーチャーを設定するために使用されるパラメータ。

    • dimension: 次元数。

    • embedding_delimiter: ベクトルの区切り文字。デフォルトの区切り文字はカンマ(,)です。

    • distance_type: 距離のタイプ。有効な値:

      • InnerProduct: 内積を計算します。

      • SquaredEuclidean: ユークリッド距離の2乗を計算します。正規化されたデータにはSquaredEuclideanを指定します。

    • major_order: データの保存に使用するメソッド。有効な値:

      • col: データにカラムストアを使用します。major_orderパラメータをcolに設定する場合、dimensionパラメータを2のn乗に設定する必要があります。ここで、nは正の整数である必要があります。col値を使用すると、row値を使用する場合よりもシステムパフォーマンスが向上します。

      • row: データに行ストアを使用します。これはデフォルト値です。

    • builder_name: ベクトルインデックスに使用するビルダーのタイプ。パラメータを次のいずれかの値に設定することをお勧めします。その他のパラメータ値については、テクニカルサポートにお問い合わせください。

      • QcBuilder

      • LinearBuilder: インデックスを順番に構築します。ドキュメント数が10,000未満の場合は、builder_nameパラメータをLinearBuilderに設定することをお勧めします。

    • searcher_name: ベクトルインデックスに使用するサーチャーのタイプ。searcher_nameパラメータの値は、builder_nameパラメータの値と一致する必要があります。GPUリソースを使用する場合は、テクニカルサポートにお問い合わせください。

      • QcSearcher: CPUを使用して検索を実行します。builder_nameパラメータがQcBuilderに設定されている場合は、searcher_nameパラメータをQcSearcherに設定します。

      • LinearSearcher: CPUを使用して全文検索を実行します。builder_nameパラメータがLinearBuilderに設定されている場合は、searcher_nameパラメータをLinearSearcherに設定します。

    • build_index_params: builder_nameパラメータに指定したビルダータイプに設定するパラメータ。詳細については、Proxima Builderを参照してください。

    • search_index_params: searcher_nameパラメータに指定したサーチャータイプに設定するパラメータ。詳細については、Proxima Searcherを参照してください。

    • linear_build_threshold: LinearBuilderを使用しない操作のしきい値。ドキュメント数が指定されたしきい値未満の場合、システムはLinearBuilderとLinearSearcherを使用します。LinearBuilderはメモリ使用量を削減するのに役立ち、ロスレス検索結果を保証します。ドキュメント数が過剰に存在する場合、LinearBuilderのパフォーマンスは低下します。デフォルト値: 10000。

    • min_scan_doc_cnt: 取得する候補セットの最小数。min_scan_doc_cntパラメータとproxima.qc.searcher.scan_ratioパラメータは同様の概念です。デフォルト値: 10000。min_scan_doc_cntパラメータに値を指定し、proxima.qc.searcher.scan_ratioパラメータに値を指定した場合、大きい方の値が候補セットの最小数として使用されます。

      • min_scan_doc_cntパラメータまたはproxima.qc.searcher.scan_ratioパラメータに過剰な値を指定しないでください。過剰な値を指定すると、システムパフォーマンスが低下し、レイテンシが発生します。

      • ほとんどの場合、トップkベクトルを取得する場合、min_scan_doc_cntパラメータの値としてmax(10000, 100*topk)を使用し、proxima.qc.searcher.scan_ratioパラメータの値としてmax(10000, 100*topk)/total_doc_cntを使用することをお勧めします。さらに、パフォーマンス、検索率、ドキュメント数に基づいてパラメータを設定する必要があります。

      • これら2つの類似したパラメータは、リアルタイムおよびマルチカテゴリシナリオの要件を満たすために使用されます。通常のユーザーの場合は、proxima.qc.searcher.scan_ratioパラメータのみを設定できます。

    • enable_recall_report: 検索率を報告するかどうかを指定します。デフォルト値: false。

    • is_embedding_saved: 元のベクトルを保存するかどうかを指定します。デフォルト値: false。INT8量子化またはFP16量子化を有効にし、リアルタイム検索を有効にする場合は、is_embedding_savedパラメータをtrueに設定してください。そうしないと、増分ベクトルをバッチで構築できません。

クエリの構文

通常のクエリの構文

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パラメータは、クエリするベクトルを指定します。

上位n個のベクトルのクエリの構文

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パラメータは、返される上位n個のベクトルを指定します。

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パラメータは、返される上位n個のベクトルを指定します。

特定のしきい値を含むクエリの構文

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パラメータは、システムがドキュメントをフィルタリングする基準となるしきい値を指定します。schema.jsonファイルのsearch_typeパラメータをipに設定した場合、内積が4.0未満のドキュメントは除外されます。schema.jsonファイルのsearch_typeパラメータをl2に設定した場合、ユークリッド距離が2.0を超えるドキュメントは除外されます。OpenSearch Vector Search Editionは、パフォーマンスに基づいてユークリッド距離の2乗が計算されるため、しきい値として2.0を使用してドキュメントを除外します。

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=aitheta_index_name:'16#0.1,0.2,0.98,0.6;1512#0.3,0.4,0.98,0.6&n=200'
// クエリはURLエンコードする必要があります。
query=aitheta_index_name:'16%230.1%2c0.2%2c0.98%2c0.6%3b1512%230.3%2c0.4%2c0.98%2c0.6%26n%3d200'
// カテゴリに基づいてベクトルをクエリする場合、カテゴリIDとクエリするベクトルを指定する必要があります。カテゴリIDとベクトルはシャープ記号(#)で区切ります。クエリ内のシャープ記号はURLエンコードする必要があります。複数のカテゴリはカンマ(,)で区切り、複数のベクトルはセミコロン(;)で区切ります。

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:[["16%230.1%2c0.2%2c0.98%2c0.6%3b1512%230.3%2c0.4%2c0.98%2c0.6%26n%3d200"]]
// index_nameパラメータはベクトルインデックスの名前を指定します。kvpair句のdynamic_paramsパラメータは、クエリするベクトルを指定します。
// dynamic_paramsパラメータの値はURLエンコードする必要があります。
// カテゴリに基づいてベクトルをクエリする場合、カテゴリIDとクエリするベクトルを指定する必要があります。カテゴリIDとベクトルはシャープ記号(#)で区切ります。クエリ内のシャープ記号はURLエンコードする必要があります。複数のカテゴリはカンマ(,)で区切り、複数のベクトルはセミコロン(;)で区切ります。

検索パラメータを含むクエリの構文

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パラメータの順序は変更できません。

類似度で返された結果をソートするクエリの構文

HA3構文

query=index_name:'0.1,0.2,0.98,0.6;0.3,0.4,0.98,0.6...'&&kvpairs=first_formula:proxima_score(index_name)&&sort=+RANK
// index_nameパラメータはベクトルインデックスの名前を指定します。コロン(:)の後と最初のアンパサンド(&)の前にクエリするベクトルを指定します。kvpair句は、proxima_score(index_name)をおおまかなソート式として指定します。sort句は、類似度スコアに基づいてクエリ結果を昇順にソートします。

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パラメータは、クエリするベクトルを指定します。proxima_score('index_name')関数は、ベクトルのスコアを取得するために使用されます。order by句は、ベクトルがスコアに基づいてソートされることを指定します。ascは昇順を指定します。descは降順を指定します。