SCANN

GoogleのScaNNライブラリを搭載したMilvusのSCANN インデックスは、ベクトル類似検索のスケーリングの課題に対応するように設計されており、従来はほとんどの検索アルゴリズムにとって課題となるような大規模なデータセットであっても、速度と精度のバランスを取ることができます。

概要

ScaNNは、ベクトル検索における最大の課題の1つである、データセットが大きく複雑になっても、高次元空間で最も関連性の高いベクトルを効率的に見つけるという課題を解決するために構築されています。ScaNNのアーキテクチャは、ベクトル検索プロセスを明確な段階に分解します:

Scann スキャン

  1. パーティショニング:データセットをクラスタに分割する。この方法では、データセット全体をスキャンする代わりに、関連するデータのサブセットのみに焦点を当てることで検索空間を狭め、時間と処理リソースを節約する。ScaNN は多くの場合、k-means などのクラスタリング・アルゴリズムを使用してクラスターを特定するため、類似検索をより効率的に実行できる。

  2. 量子化:ScaNN はパーティショニング後に異方性ベクトル量子化として知られる量子化プロセスを適用する。従来の量子化は、元のベクトルと圧縮されたベクトル間の全体的な距離を最小化することに重点を置いているが、これは最大内積探索(MIPS)のような、類似性が直接的な距離ではなくベクトルの内積によって決定されるタスクには理想的ではない。異方的量子化では、代わりにベクトル間の平行成分、つまり正確な内積を計算するために最も重要な部分を保存することを優先します。このアプローチにより、ScaNNは圧縮されたベクトルをクエリに注意深く合わせることで高いMIPS精度を維持し、より高速で正確な類似性検索を可能にする。

  3. 再ランク付け:再順位付け段階は最終段階で、ScaNN は分割および量子化段階からの検索結果を微調整する。この再順位付けでは、上位の候補ベクトルに対して正確な内積計算が適用され、最終結果が高精度になるようにします。再順位付けは、最初のフィルタリングとクラスタリングが粗い層として機能し、最終段階で最も関連性の高い結果のみがユーザーに返されるようにする、高速推薦エンジンや画像検索アプリケーションにおいて極めて重要である。

SCANN の性能は、速度と精度のバランスを微調整できる2つの重要なパラメータによって制御されます:

  • with_raw_data:元のベクトル・データを量子化された表現と一緒に保存するかどうかを制御します。このパラメータを有効にすると、再ランキング時の精度が向上しますが、ストレージ要件が増加します。

  • reorder_k:最終的な再ランキング段階で、いくつの候補を絞り込むかを決定します。値を高くすると精度は向上しますが、検索待ち時間が長くなります。

これらのパラメータを特定のユースケースに最適化するための詳細なガイダンスについては、Index params を参照してください。

インデックスの構築

MilvusでベクトルフィールドにSCANN インデックスを構築するには、add_index() メソッドを使用し、index_typemetric_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="SCANN", # 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={
        "with_raw_data": True, # Whether to hold raw data
    } # Index building params
)

この設定では

  • index_type:構築するインデックスのタイプ。この例ではSCANN とします。

  • metric_type:ベクトル間の距離の計算方法。サポートされている値には、COSINEL2IP があります。詳細については、メトリック・タイプを参照してください。

  • params:インデックスを構築するための追加設定オプション。

    • with_raw_data:元のベクトルデータを、量子化された表現と一緒に保存するかどうか。

    SCANN インデックスで利用可能な構築パラメータの詳細については、インデックス構築パラメータを参照してください。

インデックス・パラメータを構成したら、create_index() メソッドを直接使用するか、create_collection メソッドでインデックス・パラメータを渡してインデックスを作成できます。詳細は、コレクションの作成 を参照してください。

インデックスでの検索

インデックスが構築され、エンティティが挿入されると、インデックス上で類似検索を実行できます。

search_params = {
    "params": {
        "reorder_k": 10, # Number of candidates to refine
        "nprobe": 8 # Number of clusters to search
    }
}

res = MilvusClient.search(
    collection_name="your_collection_name", # Collection name
    anns_field="vector_field", # Vector field name
    data=[[0.1, 0.2, 0.3, 0.4, 0.5]],  # Query vector
    limit=10,  # TopK results to return
    search_params=search_params
)

この構成では

  • params:インデックスで検索するための追加構成オプション。

    • reorder_k:再ランク付けの段階で絞り込む候補の数。
    • nprobe:検索するクラスタの数。

    SCANN インデックスで利用可能な検索パラメータについては、インデックス固有の検索パラメータ を参照。

インデックスパラメータ

この節では、インデックスの構築とインデックスに対する検索の実行に使用するパラメータの概要を説明します。

インデックス構築パラメータ

以下の表は、paramsインデックスを構築する際に設定できるパラメータの一覧です。

パラメータ

説明

値の範囲

チューニングの提案

nlist

クラスタ・ユニット数

[1, 65536]

nlistを大きくすると、枝刈りの効率が上がり、一般的に粗い探索が速くなりますが、パーティションが小さくなりすぎてリコールが低下する可能性があります;nlistを小さくすると、より大きなクラスタをスキャンし、リコールは向上しますが、探索が遅くなります。

with_raw_data

元のベクトルデータを量子化された表現と一緒に保存するかどうか。有効にすると、再順位付けの段階で、量子化された近似ベクトルではなく元のベクトルを使用することで、より正確な類似度計算が可能になる。

:ブール値

範囲true,false

デフォルト値true

より高い検索精度を得るため、またストレージ容量が重要でない場合は、true に設定する。オリジナルのベクトル・データにより、再ランキング時に、より正確な類似度計算が可能になる。

false に設定すると、特に大きなデータセットの場合、ストレージのオーバーヘッドとメモリ使用量が削減される。ただし、再ランキング段階では量子化されたベクトルを使用するため、検索精度が若干低下する可能性があります。

推奨:精度が重要なプロダクション・アプリケーションにはtrue を使用する。

インデックス固有の検索パラメータ

以下の表は、search_params.paramsインデックス検索時に設定できるパラメータの一覧です。

パラメータ

説明

値の範囲

調整候補

reorder_k

再順位付け段階で絞り込まれる候補ベクトルの数を制御する。このパラメータは、最初のパーティショニングと量子化段階からの上位候補が、より正確な類似度計算を使用して再評価される数を決定します。

タイプ整数

範囲: [1, int_max]:[1,int_max]

デフォルト値:なし

reorder_k を大きくすると、最終的な絞り込み段階でより多くの候補が考慮されるため、一般的に検索精度が高くなる。しかし、これはまた、追加の計算のために検索時間を増加させます

高い想起率を達成することが重要で、検索速度があまり気にならない場合は、reorder_k を増やすことを検討してください。limit (TopK results to return)の2-5倍から始めるのがよいでしょう。

特に、精度が多少低下しても構わないようなシナリオでは、より高速な検索を優先するため、reorder_k を減らすことを検討してください。

ほとんどの場合、この範囲内の値を設定することをお勧めします:[limit,limit* 5]。

nprobe

候補を検索するクラスタ数。

タイプ整数

範囲[1,nlist] とする。

デフォルト値8

より高い値は、より多くのクラスタを検索することを可能にし、検索範囲を拡大することでリコールを向上させるが、その代償としてクエリの待ち時間が増加する。

速度と精度のバランスをとるために、nlist に比例してnprobe を設定します。

ほとんどの場合、この範囲内の値を設定することをお勧めします:[1, nlist]。

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
フィードバック

このページは役に立ちましたか ?