MongoDB ベクトル検索 は、浮動ベクトル埋め込みの自動量子化をサポートしています(32 ビットと 64 ビットの両方)。また、特定の埋め込みモデルから事前に量子化されたスカラーとバイナリ ベクトルの取り込みとインデックス作成もサポートしています。
量子化について
量子化とは、完全忠実なベクトルをより小さなビットに縮小するプロセスです。代わりに削減された表現ベクトルをインデックス化することで、 MongoDB ベクトル検索インデックスに各ベクトルを保存するために必要なメインメモリの量を削減します。これにより、より多くのベクトルまたはより高い次元を持つベクトルをストレージできます。したがって、定量化によりリソースの消費が削減され、速度が向上します。100、000 より超えるなど、多数のベクトルを持つアプリケーションには量子化をお勧めします。
スカラー量化
スカラー量子化では、まずインデックスベクトルの各次元の最小値と最大値を識別して、次元の値の範囲を確立します。次に、範囲は同じサイズの間隔またはビンに分割されます。最後に、各浮動小数値はビンにマッピングされ、連続した浮動小数値を別個の整数に変換します。MongoDB ベクトル検索では、この量子化によりベクトル埋め込みのRAMコストが量子化前のコストの約 1 4 分の 1(1/3.75)に削減されます。
バイナリ量子化
バイナリ量化では、各次元に対して 0 の中間点を想定します。これは通常、OpenAI の text-embedding-3-large など、長さ 1 に正規化された埋め込みに適しています。次に、ベクトルの各値は中間点と比較され、中間点より大きい場合は 1 のバイナリ値が割り当てられ、中間点以下の場合は 0 のバイナリ値が割り当てられます。MongoDB ベクトル検索では、この量子化により、ベクトル埋め込みのRAMコストが24コストの 1(1/24)に削減されます。1/32でない理由は、ベクトル値とは別のHierarchical Navigable Small Worldsグラフ自体を含むデータ構造が圧縮されていないためです。
クエリを実行すると、 MongoDB ベクトル検索 は、クエリベクトルとインデックス付きバイナリベクトルを効率的に比較するために、クエリベクトル内の浮動小数値をバイナリベクトルに変換します。次に、バイナリインデックスの結果に関連付けられた元の浮動小数値を使用して、バイナリ比較で識別された候補を再評価し、結果をさらに絞り込むことで再スコアリングします。完全な忠実度ベクトルは、ディスク上の独自のデータ構造に保存され、バイナリ量子化を構成する場合、またはバイナリもしくはスカラー量子化ベクトルに対して完全検索を実行する場合にのみ参照されます。
Tip
要件
次の表は、量子化されたベクトルを自動的に量子化および取り込むための要件を示しています。
注意
Atlasはすべての浮動小数点値をdoubleデータ型として内部に保存します。そのため、 32ビットと64ビットの両方の埋め込みは、変換なしの自動量子化と互換性があります。
要件 | で int1 取り込み | で int8 取り込み | 自動スカラー量子化用 | 自動バイナリ量子化用 |
|---|---|---|---|---|
インデックス定義設定が必要です | No | No | はい | はい |
BSON | はい | はい | No | No |
mongodでのストレージ |
|
| binData(float32)array(double) | binData(float32)array(double) |
サポートされている類似性メソッド |
| cosineeuclideandotProduct | cosineeuclideandotProduct | cosineeuclideandotProduct |
サポートされている次元数 | 8 の倍数 | 1から8192 | 1から8192 | 1から8192 |
近似最近傍探索および厳密最近傍探索をサポート | はい | はい | はい | はい |
ベクトルの自動数量化を有効にする方法
MongoDB ベクトル検索を構成して、コレクション内の浮動ベクトル埋め込みをベクトルインデックス内の int8(スカラー)や binary などの削減された表現タイプに自動的に量子化できます。
量子化タイプを設定または変更するには、インデックス定義に scalar または binary のいずれかの quantization フィールド値を指定します。これにより、他のインデックス定義の変更と同様に、インデックスの再構築がトリガーされます。指定された量子化タイプは、クエリ時にすべてのインデックス付きベクトルとクエリベクトルに適用されます。クエリ ベクトルは自動的に量子化されるため、クエリを変更する必要はありません。
ほとんどの埋め込みモデルには、 再スコアリングを使用したバイナリ数量化 をお勧めします。 QAT ではない低次元モデルを使用する場合は、表現損失が少ないため、表現キャパシティーの損失が少なくなるようにスカラー量化を使用してください。
メリット
MongoDB ベクトル検索 は、スカラー量子化と、再スコアリング付きのバイナリ量子化のネイティブ機能を提供します。自動量化は、ベクトルを効率的に処理するために計算リソースを減らすことで、アプリケーションのスケーラビリティとコストを節約します。自動量化により、 のRAMmongot は、スカラーの場合は3.75 x 、バイナリの場合は24 x ずつ削減されます。ベクトル値はそれぞれ4 x と32 x によって縮小されますが、 Hierarchical Navigable Small Worldsグラフ自体は縮小されません。これにより、最大のボリュームと増やすにおいてでも、パフォーマンスが向上します。
ユースケース
多数の完全忠実度ベクトル(通常は 100,000 ベクトルを超える場合は、 自動数量化 をお勧めします。量子化後、ベクトル検索の際の精度を失うことなく、削減された表現ベクトルをインデックス。
手順
自動量子化を有効にするには:
MongoDB ベクトル検索インデックスで使用する量子化のタイプを指定します。
新規または既存のMongoDB ベクトル検索インデックスで、 インデックス定義のfields.quantization フィールドに次のいずれかの量子化タイプを指定します。
scalar: 浮動小数点ベクトルからバイトベクトルを生成します。binary: 浮動小数点の入力ベクトルからビットベクトルを生成します。
浮動小数点数の配列ではないデータに自動量子化を指定すると、 MongoDB ベクトル検索 はそのベクトルをインデックスするのではなく無視し、それらのベクトルはスキップされます。Atlas は浮動小数値(32 ビットと 64 ビットの両方)を double 型として内部的に保存するため、いずれの精度を出力するモデルからの埋め込みも自動量子化で機能します。
インデックスを 作成またはアップデートします。
インデックスの構築には約 1 分かかります。 構築中、インデックスは最初の同期状態になります。 構築が完了したら、コレクション内のデータのクエリを開始できます。
指定された量子化タイプは、クエリ時にすべてのインデックス付きベクトルとクエリベクトルに適用されます。
Considerations
Atlas UIで量子化されたインデックスを表示すると、インデックスのサイズが量子化されていないインデックスよりも大きくなる場合があります。これは、Size メトリクスが保存されたデータの合計を表すためです。これには、Hierarchical Navigable Small Worldsグラフ(メモリ内)、量子化ベクトル (メモリ内)、フル忠実度ベクトル (ディスク上)が含まれます。クエリ時にインデックスによって使用されるメモリの量を見積もるには、Required Memory メトリクスを参照してください。
事前量別ベクトルの取り込み方法
MongoDB ベクトル検索 は、特定の埋め込みモデルからのスカラーおよびバイナリ量子化されたベクトルの取り込みとインデックス作成もサポートしています。float32量子化されたベクトルがまだない場合は、 、int1 、または サブタイプを持つBSON BinDataint8 ベクトルに埋め込みを変換できます。
ユースケース
次のユースケースには、量子化された BSON binData ベクトルを取り込むことをお勧めします。
埋め込みモデルから量子化されたベクトル出力をインデックスする必要があります。
多数の浮動小数ベクトルがあり、
mongodのストレージと WiredTiger のフットプリント(ディスクやメモリ使用量など)を削減したい場合。
メリット
BinData はバイナリ データを保存する BSON データ型です。このデータ型ではベクトル埋め込みが圧縮されるため、標準的な float32 配列を使用する埋め込みと比較して、クラスター内の必要ディスク容量は約3分の1に削減します。詳細については、「ベクトル圧縮」を参照してください。
このサブタイプでは、int1 ベクトルや int8 ベクトルなどの代替タイプでベクトルをインデックスこともでき、コレクションのMongoDB ベクトル検索インデックスを構築するために必要なメモリを削減できます 。これにより、mongot のRAM は、スカラーの場合は 3.75x 、バイナリの場合は 24x ずつ削減されます。ベクトル値はそれぞれ 4x と 32x によって縮小されますが、Hierarchical Navigable Small Worldsグラフ自体は縮小されません。
binData ベクトルをまだ作成していない場合は、データをコレクションに書き込む前に、サポートされているドライバーを使用して埋め込みをこの形式に変換できます。以下では、float32、int8、int1 サブタイプを持つ BinData に埋め込みを変換する手順を順番に説明しています。
対応ドライバー
BSON BinData ベクトルは、float32、int1、int8 のサブタイプを持ち、次のドライバーでサポートされています。
C++ ドライバー v4.1.0 以降
C#/.NET ドライバー v3.2.0 以降
Go Driver v2.1.0 以降
Pymongo ドライバー v4.10 以降
Node.js ドライバー v6.11 以降
Java ドライバー v5.3.1 以降
前提条件
この手順の例では、新しいデータまたは既存のデータと、Voyage AI の voyage-3-large モデルを使用します。新しいデータの例では、サンプルのテキスト文字列を使用しており、これを独自のデータに置き換えることができます。既存データの例では、sample_airbnb データベース内の listingsAndReviews コレクションから埋め込みのないドキュメントのサブセットが使用されます。これは(埋め込みの有無にかかわらず)独自のデータベースとコレクションに置き換えることができます。
以下の Data Source ドロップダウン メニューを使用して、新しいデータ用に binData ベクトルを量子化するか、クラスター内にすでに存在するデータ用に量子化するかを選択します。ご希望のプログラミング言語も選択します。
クエリ結果を評価する
MongoDB ベクトル検索クエリの精度は、量子化されたベクトルに対する NN 検索の結果が ENN 検索の結果とどの程度一致しているかを評価することで測定できます。つまり、同じクエリ条件の ANN 検索の結果と ENN 検索の結果と比較し、ANN 検索結果が ENN 検索の結果に最近傍 を含む頻度を測定できます。
クエリ結果を評価する方法のデモについては、「 クエリ結果の精度を測定する方法 」を参照してください。