次の方法で共有


スカラー量子化またはバイナリ量子化を使用してベクトルを圧縮する

Azure AI 検索では、検索インデックス内のベクトルのサイズを小さくするため、スカラーとバイナリの量子化がサポートされています。 量子化を行うと、float16 と float32 の埋め込みのメモリとディスク ストレージの両方の使用量が減るので、それを使ってベクトル サイズを小さくすることをお勧めします。 損失圧縮の影響を軽減するには、圧縮されていないベクトルに対してオーバーサンプリングと再スコアリングを追加できます。

組み込みの量子化を使用するには、次の手順に従います。

  • インデックスに対するベクトル フィールドと vectorSearch 構成から始める
  • vectorSearch.compressions を追加します
  • scalarQuantization または binaryQuantization 構成を追加して名前を付ける
  • オプションのプロパティを設定して、損失のあるインデックス作成の影響を軽減する
  • 名前付き構成を使用する新しいベクトル プロファイルを作成する
  • 新しいベクトル プロファイルを持つ新しいベクトル フィールドを作成する
  • 定義した構成でインデックス作成中に量子化された float32 または float16 データを含むインデックスを読み込む
  • 必要に応じて、既定値をオーバーライドする場合は、オーバーサンプリング パラメーターを使用して量子化されたデータに対してクエリを実行します

前提条件

サポートされている量子化手法

量子化は、float 型のベクトルを受け取るベクトル フィールドに適用されます。 この記事の例では、受信 float32 埋め込みのフィールドのデータ型は Collection(Edm.Single) ですが、float16 もサポートされています。 圧縮が構成されたフィールドでベクトルを受信すると、エンジンは自動的に量子化を実行して、メモリおよびディスク上のベクトル データのフットプリントを削減します。

2 種類の量子化がサポートされています。

  • スカラー量子化では、浮動小数点値をより少ないビット数のデータ型に圧縮します。 AI 検索は現在、8 ビットの int8 をサポートしており、ベクトル インデックスのサイズが 4 分の 1 に削減されます。

  • バイナリ量子化は、浮動小数点数を、1 ビットを占有するバイナリ ビットに変換します。 これにより、ベクトル インデックスのサイズが最大 28 分の 1 に削減されます。

検索インデックスに "compressions" を追加する

次の例は、ベクトル フィールドと vectorSearch.compressions セクションを含む fields コレクションを持つ部分インデックス定義を示しています。

これには、scalarQuantizationbinaryQuantization の両方が含まれています. 必要な数の圧縮構成を指定し、必要なものをベクトル プロファイルに割り当てることができます。

vectorSearch.Compressions の構文は、安定版とプレビュー版の REST API で異なります。プレビュー版では、ストレージの最適化のための新しいオプションと、既存の構文に対する変更が追加されています。 下位互換性は内部 API マッピングによって維持されますが、2024-11-01-preview 以降のバージョンを対象とするコードでは新しい構文を採用する必要があります。

インデックスの作成またはインデックスの作成または更新 REST API を使って、圧縮の設定を構成します。

POST https://[servicename].search.windows.net/indexes?api-version=2024-07-01

{
  "name": "my-index",
  "fields": [
    { "name": "Id", "type": "Edm.String", "key": true, "retrievable": true, "searchable": true, "filterable": true },
    { "name": "content", "type": "Edm.String", "retrievable": true, "searchable": true },
    { "name": "vectorContent", "type": "Collection(Edm.Single)", "retrievable": false, "searchable": true, "dimensions": 1536,"vectorSearchProfile": "vector-profile-1"},
  ],
  "vectorSearch": {
        "profiles": [ ],
        "algorithms": [ ],
        "compressions": [
          {
            "name": "use-scalar",
            "kind": "scalarQuantization",
            "scalarQuantizationParameters": {
              "quantizedDataType": "int8"
            },
            "rerankWithOriginalVectors": true,
            "defaultOversampling": 10
          },
          {
            "name": "use-binary",
            "kind": "binaryQuantization",
            "rerankWithOriginalVectors": true,
            "defaultOversampling": 10
          }
        ]
    }
}

重要なポイント:

  • kindscalarQuantization または binaryQuantization に設定する必要があります。

  • rerankWithOriginalVectors は元の非圧縮ベクトルを使用して類似性を再計算し、最初の検索クエリによって返される上位の結果を再ランク付けします。 stored が false の場合でも、非圧縮ベクトルが検索インデックスに存在します。 このプロパティは省略可能です。 既定値は True です。

  • 量子化による情報の減少を緩和するために、defaultOversampling は潜在的な結果のより広範なセットを考慮します。 潜在的な結果の数式は、クエリ内の k とオーバーサンプリング乗数で構成されます。 たとえば、クエリが k を 5 に指定し、オーバーサンプリングが 20 の場合、クエリはその目的のために元の非圧縮ベクトルを使用して、再ランク付けに使用する 100 個のドキュメントを効果的に要求します。 上位の k 個の再ランク付けの結果のみが返されます。 このプロパティは省略可能です。 既定値は 4 です。

  • quantizedDataType は省略可能であり、スカラー量子化にのみ適用されます。 追加する場合は、int8 に設定する必要があります。 これは現時点でスカラー量子化でサポートされている唯一のプリミティブ データ型です。 既定値は int8 です。

ベクトル検索アルゴリズムを追加する

2024-11-01-preview REST API では、HNSW アルゴリズムまたは網羅的 KNN を使用できます。 安定バージョンの場合は、HNSW のみを使います。

"vectorSearch": {
    "profiles": [ ],
    "algorithms": [
      {
          "name": "use-hnsw",
          "kind": "hnsw",
          "hnswParameters": {
              "m": 4,
              "efConstruction": 400,
              "efSearch": 500,
              "metric": "cosine"
          }
      }
    ],
     "compressions": [ <see previous section>] 
}

新しいベクトル プロファイルを作成して割り当てる

新しい量子化構成を使用するには、"新しい" ベクトル プロファイルを作成する必要があります。 メモリ内に圧縮インデックスを構築するには、新しいベクトル プロファイルを作成する必要があります。 新しいプロファイルでは HNSW を使用します。

  1. 同じインデックス定義で、新しいベクトル プロファイルを作成し、圧縮プロパティとアルゴリズムを追加します。 ここでは、量子化アプローチごとに 1 つずつ、2 つのプロファイルを示します。

    "vectorSearch": {
        "profiles": [
           {
              "name": "vector-profile-hnsw-scalar",
              "compression": "use-scalar", 
              "algorithm": "use-hnsw",
              "vectorizer": null
           },
           {
              "name": "vector-profile-hnsw-binary",
              "compression": "use-binary", 
              "algorithm": "use-hnsw",
              "vectorizer": null
           }
         ],
         "algorithms": [  <see previous section> ],
         "compressions": [ <see previous section> ] 
    }
    
  2. "新しい" ベクトル フィールドにベクトル プロファイルを割り当てます。 フィールドのデータ型は float32 または float16 です。

    Azure AI 検索では、float32 および float16 型のエンティティ データ モデル (EDM) に相当するものはそれぞれ Collection(Edm.Single)Collection(Edm.Half) になります。

    {
       "name": "vectorContent",
       "type": "Collection(Edm.Single)",
       "searchable": true,
       "retrievable": true,
       "dimensions": 1536,
       "vectorSearchProfile": "vector-profile-hnsw-scalar",
    }
    
  3. インデックスを読み込むには、プル モデルのインデックス作成の場合はインデクサーを使用し、プッシュ モデルのインデックス作成の場合は API を使用します。

スカラー量子化により、各ベクトル埋め込み内の各数値の解像度が低下します。 各数値を 16 ビットまたは 32 ビット浮動小数点数として記述する代わりに、8 ビット整数を使用します。 数値の範囲 (通常は 99 パーセンタイルの最小値と最大値) を識別し、それらを有限数のレベルまたはビンに分割することで、各ビンに識別子を割り当てます。 8 ビットスカラー量子化では、2^8 すなわち 256 のビンが存在する可能性があります。

実数を最も近い整数に四捨五入するのに似たプロセスで、ベクトルの各コンポーネントは量子化レベルのこのセット内で最も近い代表値にマッピングされます。 量子化された 8 ビット ベクトルでは、識別子番号が元の値の代わりに表示されます。 量子化後、各ベクトルはそのコンポーネントが属するビンの識別子の配列によって表されます。 これらの量子化されたベクトルでは、元のベクトルと比較して保存すべきビット数がはるかに小さいため、ストレージ要件とメモリ占有領域を削減できます。

バイナリ量子化は、各コンポーネントを 0 または 1 の単一ビットとして表すことによって、高次元ベクトルを圧縮します。 この方法により、メモリ占有領域が大幅に削減され、検索および取得タスクにとって重要なベクトル比較操作が高速化されます。 ベンチマーク テストでは、ベクトル インデックス サイズが最大 96% 削減されることが示されています。

これは、1024 を超える次元の埋め込みに特に効果的です。 より小さな次元の場合は、バイナリ量子化の品質をテストするか、代わりにスカラーを試すことをお勧めします。 さらに、埋め込みの中心がゼロの場合、BQ のパフォーマンスが非常に高いことがわかりました。 OpenAI、Cohere、Mistral などの最も一般的な埋め込みモデルはゼロを中心としています。

オーバーサンプリングを使用して量子化されたベクトル フィールドのクエリを実行する

圧縮または量子化されたベクトル フィールドのクエリ構文は、オーバーサンプリングまたは元のベクトルによる再スコアリングに関連付けられたパラメーターをオーバーライドしない限り、非圧縮ベクトル フィールドの場合と同じです。

インデックス内のベクトル圧縮定義には、損失圧縮の影響を軽減するための rerankWithOriginalVectorsdefaultOversampling の設定があることを思い出してください。 既定値をオーバーライドして、クエリ時の動作を変更できます。 たとえば、defaultOversampling が 10.0 の場合は、クエリ要求で別のものに変更できます。

インデックスに明示的に rerankWithOriginalVectors または defaultOversampling の定義がない場合でも、オーバーサンプリング パラメータを設定できます。 クエリ時に oversampling を指定すると、そのクエリのインデックス設定をオーバーライドし、有効な rerankWithOriginalVectors を true としてクエリを実行できます。

POST https://[service-name].search.windows.net/indexes/demo-index/docs/search?api-version=2024-07-01

{    
    "vectorQueries": [
        {    
            "kind": "vector",    
            "vector": [8, 2, 3, 4, 3, 5, 2, 1],    
            "fields": "myvector",
            "oversampling": 12.0,
            "k": 5   
        }
  ]    
}

重要なポイント:

  • ベクトル プロファイルの割り当てに従い、ベクトル圧縮の対象となるベクトル フィールドに適用されます。

  • インデックスの圧縮構成でオーバーサンプリングまたは再ランク付けオプションが指定されていない場合でも、defaultOversampling 値をオーバーライドするか、クエリ時にオーバーサンプリングを実施します。