IVF_FLAT
IVF_FLATインデックスは、浮動小数点ベクトルの検索性能を向上させるインデックス・アルゴリズムです。
このインデックス・タイプは、高速なクエリ応答と高い精度を必要とする大規模なデータセット、特にデータセットをクラスタリングすることで検索空間を縮小でき、クラスタ・データを格納するのに十分なメモリを利用できる場合に最適です。
概要
IVF_FLATは Inverted File Flatの略で、浮動小数点ベクトルのインデックス作成と検索に対する二重構造のアプローチを表しています:
- 反転ファイル(IVF):Inverted File (IVF):k-meansクラスタリングを使用して、ベクトル空間を管理しやすい領域にクラスタリングすることを指します。各クラスタは重心で表され、その中のベクトルの参照点として機能する。
- フラット:各クラスタ内で、正確な距離計算を行うために、圧縮や量子化を行わず、ベクトルを元の形(フラット構造)で保存することを示す。
次の図はその仕組みを示しています:
ivf-flat-1.png
このインデックス作成法は、検索処理を高速化しますが、潜在的な欠点を伴います:それは、クエリの埋め込みに最も近いものとして見つかった候補が、正確な最も近いものとは限らないということです。これは、クエリ埋め込みに最も近い埋め込みが、最も近い重心に基づいて選択されたクラスタとは異なるクラスタに存在する場合に起こり得ます(以下の可視化を参照)。
この問題に対処するため、IVF_FLATは2つのハイパーパラメータを提供します:
nlist
:k-meansアルゴリズムを使用して作成するパーティションの数を指定します。nprobe
:候補の探索中に考慮するパーティションの数を指定する。
ここで、nprobe
を1ではなく3に設定すると、次のような結果が得られる:
ivf-flat-2.png
nprobe
の値を大きくすることで、より多くのパーティションを検索に含めることができます。これにより、クエリに最も近い埋め込みが、たとえ異なるパーティションに存在したとしても、見逃されないようにすることができます。しかし、これは、より多くの候補を評価する必要があるため、検索時間の増加という代償を伴います。インデックスパラメータのチューニングの詳細については、Index params を参照してください。
インデックスの構築
MilvusでベクトルフィールドにIVF_FLAT
インデックスを構築するには、add_index()
メソッドを使用し、index_type
、metric_type
、インデックス用の追加パラメータを指定します。
from pymilvus import MilvusClient
# Prepare index building params
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="your_vector_field_name", # Name of the vector field to be indexed
index_type="IVF_FLAT", # Type of the index to create
index_name="vector_index", # Name of the index to create
metric_type="L2", # Metric type used to measure similarity
params={
"nlist": 64, # Number of clusters for the index
} # Index building params
)
この設定では
index_type
:構築するインデックスのタイプ。この例ではIVF_FLAT
とします。metric_type
:ベクトル間の距離の計算方法。サポートされている値には、COSINE
、L2
、IP
があります。詳細については、メトリック・タイプを参照してください。params
:インデックスを構築するための追加設定オプション。nlist
:データセットを分割するクラスタ数。
IVF_FLAT
インデックスで使用可能な構築パラメータについては、インデックス構築パラメータ を参照。
インデックス・パラメータを構成したら、create_index()
メソッドを直接使用するか、create_collection
メソッドでインデックス・パラメータを渡してインデックスを作成できます。詳細は、コレクションの作成 を参照してください。
インデックスでの検索
インデックスが構築され、エンティティが挿入されると、インデックスで類似検索を実行できます。
search_params = {
"params": {
"nprobe": 10, # Number of clusters to search
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=3, # TopK results to return
search_params=search_params
)
この構成では
params
:インデックスで検索するための追加構成オプション。nprobe
:検索するクラスタの数。
IVF_FLAT
インデックスで利用可能な検索パラメータについては、インデックス固有の検索パラメータを参照してください。
インデックスパラメータ
このセクションでは、インデックスを構築し、インデックス上で検索を実行する際に使用するパラメータの概要を説明します。
インデックス構築パラメータ
以下の表は、params
でインデックスを構築する際に設定できるパラメータの一覧です。
パラメータ | 説明 | 値の範囲 | チューニングの提案 |
---|---|---|---|
nlist | インデックス構築時に k-means アルゴリズムを使用して作成するクラスタの数。セントロイドで表される各クラスタには、ベクトルのリストが格納されます。このパラメータを増やすと、各クラスタ内のベクトル数が減り、より小さく、より集中したパーティションが作成されます。 | タイプ整数 範囲: [1, 65536[1, 65536] デフォルト値: 128 | nlist の値を大きくすると、より洗練されたクラスターを作成することでリコールが向上するが、インデックス構築時間が長くなる。ほとんどの場合、この範囲内の値を設定することを推奨する:[32, 4096]. |
インデックス固有の検索パラメータ
次の表は、search_params.params
でインデックス検索時に設定できるパラメータの一覧です。
パラメータ | 説明 | 値の範囲 | チューニングの提案 |
---|---|---|---|
nprobe | 値を大きくすると、より多くのクラスタを検索できるようになり、検索範囲が広がることでリコールが向上しますが、その代償としてクエリの待ち時間が長くなります。 | タイプ整数 範囲[1,nlist] デフォルト値: 8 | この値を大きくすると想起は向上するが、検索が遅くなる可能性がある。速度と精度のバランスをとるために、nlist に比例してnprobe を設定する。ほとんどの場合、この範囲内の値を設定することを推奨する:[1, nlist]。 |