FAISSCompatible with Milvus 3.0.0+
FAISS インデックス型は、Milvus 3.0.0 以降で利用可能なエキスパートレベルのパススルー機能です。これにより、固定の Milvus インデックス型を選択する代わりに、Faiss インデックスファクトリ文字列を指定することができます。
FAISS を使用するのは、すでにテスト済みの Faiss レシピがあり、その構成を直接制御する必要がある場合です。専用の Milvus インデックス型が用意されている一般的なレシピについては、安定しており、ドキュメント化されたパラメータ契約が定義されているため、専用の型を使用することを推奨します。
アップストリームのFaissで受け入れられるファクトリ文字列が、Milvusで自動的にサポートされるわけではありません。互換性は、ベクトルフィールドの型、メトリック、次元、MilvusイメージにコンパイルされたFaissモジュール、および生成されたインデックスがMilvusで必要な操作をサポートしているかどうかに依存します。
制限事項
FAISSFLOAT_VECTORおよび フィールドをサポートしています。 、 、 、 フィールドはサポートしていません。BINARY_VECTORFLOAT16_VECTORBFLOAT16_VECTORINT8_VECTORSPARSE_FLOAT_VECTOR汎用
FAISSアダプターはCPU上で実行されます。これはFaissのGPUインデックス型ではありません。faiss_index_nameビルドパラメータは必須です。Milvus は、レシピを Milvus 専用のインデックス型に変換することなく、その値を Faiss に渡します。ビルドおよび検索パラメータはファクトリごとに異なります。あるファクトリでサポートされているパラメータでも、別のファクトリでは拒否される場合があります。
スカラーフィルタリングを行うには、基盤となる Faiss インデックスが ID セレクタをサポートしている必要があります。Milvus 3.0.0 のテストでは、浮動小数点ファクトリである
Flat、IVF64,Flat、およびHNSW16,Flatを使用したフィルタリング検索がカバーされています。すべてのファクトリがフィルタをサポートしている、あるいはバイナリFAISSインデックスがスカラーフィルタリングをサポートしていると想定しないでください。検索イテレータはサポートされていません。
このアダプタは、生ベクトルの取得機能を提供しません。
範囲検索のサポートはファクトリによって異なります。Float
Flatにはリリースカバレッジがあります。バイナリFAISSインデックスでは範囲検索を使用しないでください。ファクトリは正常に構築されても、一部の Milvus 検索操作を拒否する場合があります。たとえば、スタンドアロンの
PQ8x4は、スカラーフィルタリング検索で使用されるセレクタを拒否します。フィルタリングされていない使用については、別途検証を行ってください。Milvus 3.0.0 では、インデックスのリロード後に
COSINEのスコアおよび範囲検索のしきい値を検証してください。Knowhere v3.0.6 では、逆シリアル化時にFAISSアダプターのコサイン正規化状態が復元されません。
仕組み
FAISSインデックスのパススルーワークフロー
インデックス構築において、Milvusはfaiss_index_name 、ベクトルフィールド型、メトリック、およびその他の構築パラメータをKnowhere FAISSアダプタに転送します。アダプタは、FLOAT_VECTOR フィールドの場合はfaiss::index_factory() を、BINARY_VECTOR フィールドの場合はfaiss::index_binary_factory() を呼び出します。その結果生成されるオブジェクトは、通常のMilvusインデックスライフサイクルを通じて管理されるネイティブのFaissインデックスです。
検索時には、アダプターが指定されたファクトリー固有のパラメータを、対応する Faiss の `SearchParameters ` オブジェクトに変換します。サポートされている浮動小数点ファクトリーについては、Milvus のフィルタービットセットを Faiss のセレクターとして渡します。 セレクタのサポートはファクトリごとに異なり、公開されているテストでは、バイナリFAISS インデックスに対するスカラーフィルタリングは確立されていません。これが、スタンドアロンのFaissでは有効なレシピであっても、Milvusの検索パスで要求される操作を拒否してしまう理由です。
前提条件
- Milvus 3.0.0 以降
- PyMilvus 3.0.0 以降
- Faiss インデックス・ファクトリの構文および選択したファクトリのトレーニング要件に関する知識
インストール手順については、「PyMilvusのインストール」を参照してください。
ファクトリ文字列の選択
ファクトリ文字列は、Faissインデックスをコンポーネントのシーケンスとして記述します。以下の例は、Milvus 3.0.0のリリーステストで検証済みです。このリストは網羅的なものではありません。
| ファクトリ文字列 | フィールド型 | リリーステストで検証されたメトリクス | 検索パラメータ | 備考 |
|---|---|---|---|---|
Flat | FLOAT_VECTOR | L2,IP,COSINE | なし | 完全一致検索。 |
IVF64,Flat | FLOAT_VECTOR | L2、IP 、COSINE | nprobe | 64個の反転リストと非圧縮ベクトルを用いたIVF。 |
HNSW16,Flat | FLOAT_VECTOR | L2,IP,COSINE | efSearch | フラットなベクトル格納を用いたHNSWグラフ。 |
OPQ16,IVF64,PQ16x4 | FLOAT_VECTOR | L2 | ファクトリ固有 | OPQ、IVF、PQを組み合わせたもの。ご自身のデータで学習サイズとリコール率を検証してください。 |
IVF64,PQ8x4,RFlat | FLOAT_VECTOR | L2 | nprobe,k_factor | PQ候補の抽出後にフラットリファイナーを使用します。 |
PQ8x4 | FLOAT_VECTOR | L2 | なし | リリーステストが組み込まれています。インデックスがセレクタを拒否するため、スカラーフィルタリングされた検索は失敗します。フィルタリングなしでの使用については別途検証してください。 |
BFlat | BINARY_VECTOR | HAMMING | なし | バイナリベクトルの完全一致検索。 |
COSINE のエントリは、ビルドおよび検索のスモークテストのカバレッジを示しています。Milvus 3.0.0 では、インデックスの再読み込み後のスコアや範囲検索の正確性は保証されません。「制限事項」を参照してください。
浮動小数点インデックスの構築と検索
次の例では、128次元のベクトルを3,000個生成します。これにより、この例で使用されるIVF64,Flat レシピに十分なトレーニングデータが提供されます。インデックスの構築および検索を行う前に、セットアップブロックを展開して実行してください。
import random
from pymilvus import DataType, MilvusClient
client = MilvusClient(uri="http://localhost:19530")
collection_name = "faiss_float_example"
if client.has_collection(collection_name):
client.drop_collection(collection_name)
rng = random.Random(42)
vectors = [[rng.random() for _ in range(128)] for _ in range(3000)]
schema = client.create_schema(auto_id=False, enable_dynamic_field=False)
schema.add_field("id", DataType.INT64, is_primary=True)
schema.add_field("category", DataType.VARCHAR, max_length=32)
schema.add_field("vector", DataType.FLOAT_VECTOR, dim=128)
client.create_collection(collection_name=collection_name, schema=schema)
rows = [
{
"id": i,
"category": "reference" if i % 2 == 0 else "query",
"vector": vector,
}
for i, vector in enumerate(vectors)
]
client.insert(collection_name=collection_name, data=rows)
client.flush(collection_name=collection_name)
インデックスの構築
index_type をFAISS に設定し、faiss_index_name を使用してネイティブのFaissファクトリレシピを選択します。
index_params = client.prepare_index_params()
index_params.add_index(
field_name="vector",
index_name="faiss_ivf_flat",
index_type="FAISS",
metric_type="L2",
params={"faiss_index_name": "IVF64,Flat"},
)
client.create_index(collection_name=collection_name, index_params=index_params)
client.load_collection(collection_name=collection_name)
ファクトリ文字列IVF64,Flat は、64 個の反転リストを持つ IVF インデックスを作成し、各リストに非圧縮のベクトルを格納します。
インデックスの検索
search_params.params 内で、ファクトリ固有の検索パラメータを設定します。IVF ファクトリの場合、nprobe によって、Faiss が検索する逆引きリストの数が制御されます。
search_params = {
"params": {"nprobe": 8},
}
results = client.search(
collection_name=collection_name,
data=[vectors[0]],
anns_field="vector",
filter='category == "reference"',
search_params=search_params,
limit=5,
output_fields=["category"],
)
for hits in results:
for hit in hits:
print(hit)
クエリでは `nprobe=8` が使用されるため、Faiss は 64 個の反転リストのうち 8 個を検索します。このフィルタにより、category の値が `reference` であるエンティティに結果が制限されます。
バイナリインデックスの構築と検索
BINARY_VECTOR フィールドの場合は、BFlat などのバイナリファクトリ文字列と、互換性のあるバイナリメトリックを使用します。インデックスの構築および検索を行う前に、セットアップブロックを展開して実行してください。
import random
from pymilvus import DataType, MilvusClient
client = MilvusClient(uri="http://localhost:19530")
collection_name = "faiss_binary_example"
if client.has_collection(collection_name):
client.drop_collection(collection_name)
rng = random.Random(7)
vectors = [bytes(rng.getrandbits(8) for _ in range(16)) for _ in range(300)]
schema = client.create_schema(auto_id=False, enable_dynamic_field=False)
schema.add_field("id", DataType.INT64, is_primary=True)
schema.add_field("binary_vector", DataType.BINARY_VECTOR, dim=128)
client.create_collection(collection_name=collection_name, schema=schema)
client.insert(
collection_name=collection_name,
data=[{"id": i, "binary_vector": vector} for i, vector in enumerate(vectors)],
)
client.flush(collection_name=collection_name)
インデックスの構築
このバイナリベクトルの例では、ファクトリ文字列として `BFlat ` を、メトリックとして `HAMMING ` を使用します。
index_params = client.prepare_index_params()
index_params.add_index(
field_name="binary_vector",
index_name="faiss_binary_flat",
index_type="FAISS",
metric_type="HAMMING",
params={"faiss_index_name": "BFlat"},
)
client.create_index(collection_name=collection_name, index_params=index_params)
client.load_collection(collection_name=collection_name)
インデックスの検索
BFlat には、ファミリー固有の検索パラメータはありません。検索リクエストを構築する際は、空の `params ` マッピングを渡してください。
search_params = {"params": {}}
results = client.search(
collection_name=collection_name,
data=[vectors[0]],
anns_field="binary_vector",
search_params=search_params,
limit=5,
)
for hits in results:
for hit in hits:
print(hit)
各 128 次元のバイナリベクトルは 16 バイトで表現されます。詳細については、「バイナリベクトル」を参照してください。
ビルドおよび検索パラメータの設定
FAISS インデックス・タイプには、1 つの必須のパススルー・ビルド・パラメータがあります。
| パラメータ | 場所 | 説明 |
|---|---|---|
faiss_index_name | params inadd_index() | Faiss インデックスファクトリの文字列。例:IVF64,Flat 。 |
search_params.params 内で、ファクトリ固有の検索パラメータを設定します。以下の表は一般的な例を挙げたものであり、すべてを網羅しているわけではありません。
| パラメータ | ファクトリの例 | 説明 |
|---|---|---|
nprobe | IVF64,Flat | 検索対象の反転リストの数。 |
efSearch | HNSW16,Flat | HNSW 検索候補リストのサイズ。 |
k_factor | IVF64,PQ8x4,RFlat | 要求されたトップKに対して、リファイナーに供給される候補の数。 |
Milvus は、アダプタが認識する追加パラメータのみを転送します。具体的なファクトリファミリーがサポートしていない未知のビルドキーや検索キーは拒否されます。Milvus は、考えられるすべてのファクトリに対する汎用的なパラメータスキーマを管理していません。 選択したファクトリに関する Faiss のドキュメントを確認し、展開を予定している Milvus の正確なバージョンおよびイメージに対して、ビルドおよび検索フロー全体を検証してください。
エラーおよびサポートされていない操作への対処
ファクトリ文字列が無効であるか、Milvus ビルドで利用できない場合、インデックスの構築は失敗します。コレクションを読み込む前に、インデックスの状態と失敗理由を確認してください。
パラメータの型が間違っている場合、検索は失敗します。たとえば、
nprobe="invalid"は、nprobeが数値でなければならないため、拒否されます。パラメータが構築済みのファクトリに適用されない場合、アダプタはそれを「未サポート」として拒否します。
ファクトリがMilvusセレクタをサポートしていない場合、同じファクトリがスタンドアロンのFaissでは検索できる場合でも、フィルタリング検索が失敗する可能性があります。
「
search_iterator()」を「FAISS」インデックスと併用しないでください。
次のステップ
- 「インデックスの解説」で、Milvus インデックスの構成について学びましょう。
- 専用のIVF_FLATおよびHNSWインデックスタイプを比較してください。
- ファクトリ用のメトリックを選択する前に、「Metric Types」を確認してください。