FAISSCompatible with Milvus 3.0.0+
Tipe indeks ` FAISS ` adalah fitur tingkat ahli yang tersedia di Milvus 3.0.0 dan versi selanjutnya. Fitur ini memungkinkan Anda untuk menyediakan string pembuat indeks Faiss sebagai pengganti pemilihan tipe indeks Milvus yang tetap.
Gunakan " FAISS " jika Anda sudah memiliki resep Faiss yang teruji dan memerlukan kendali langsung atas komposisinya. Untuk resep umum yang memiliki tipe indeks Milvus khusus, disarankan untuk menggunakan tipe khusus tersebut karena memiliki kontrak parameter yang stabil dan terdokumentasi.
String pabrik yang diterima oleh Faiss hulu tidak secara otomatis didukung oleh Milvus. Kompatibilitas bergantung pada tipe bidang vektor, metrik, dimensi, modul Faiss yang dikompilasi ke dalam gambar Milvus, dan apakah indeks yang dihasilkan mendukung operasi yang dibutuhkan Milvus.
Batasan
FAISSmendukung bidangFLOAT_VECTORdanBINARY_VECTOR. Milvus tidak mendukung bidangFLOAT16_VECTOR,BFLOAT16_VECTOR,INT8_VECTOR, atauSPARSE_FLOAT_VECTOR.Adaptor generik
FAISSberjalan di CPU. Ini bukan jenis indeks Faiss GPU.Parameter build `
faiss_index_name` wajib diisi. Milvus meneruskan nilainya ke Faiss tanpa mengubah resep menjadi tipe indeks Milvus khusus.Parameter build dan pencarian bersifat spesifik per pabrik. Parameter yang didukung oleh satu pabrik dapat ditolak oleh pabrik lainnya.
Penyaringan skalar memerlukan indeks Faiss yang mendasarinya untuk mendukung pemilih ID. Pengujian Milvus 3.0.0 mencakup pencarian yang disaring dengan pabrik float
Flat,IVF64,Flat, danHNSW16,Flat. Jangan berasumsi bahwa setiap pabrik mendukung filter atau bahwa indeks binerFAISSmendukung penyaringan skalar.Iterator pencarian tidak didukung.
Adaptor ini tidak menyediakan pengambilan vektor mentah.
Dukungan pencarian rentang bergantung pada pabrik. Float
Flatmemiliki cakupan rilis. Jangan gunakan pencarian rentang dengan indeks binerFAISS.Sebuah factory dapat dibangun dengan sukses tetapi tetap menolak beberapa operasi pencarian Milvus. Misalnya, standalone
PQ8x4menolak selektor yang digunakan oleh pencarian yang difilter skalar. Validasi penggunaan tanpa filter secara terpisah.Di Milvus 3.0.0, validasi skor
COSINEdan ambang batas pencarian rentang setelah pemuatan ulang indeks. Knowhere v3.0.6 tidak memulihkan status normalisasi kosinus adaptorFAISSselama deserialisasi.
Cara kerjanya
Alur kerja passthrough indeks FAISS
Untuk pembuatan indeks, Milvus meneruskan ` faiss_index_name`, tipe bidang vektor, metrik, dan parameter pembuatan lainnya ke adaptor Knowhere FAISS. Adaptor tersebut memanggil ` faiss::index_factory() ` untuk bidang ` FLOAT_VECTOR ` atau ` faiss::index_binary_factory() ` untuk bidang ` BINARY_VECTOR `. Objek yang dihasilkan adalah indeks Faiss asli yang dikelola melalui siklus hidup indeks Milvus yang normal.
Untuk pencarian, adaptor mengonversi parameter khusus pabrik yang disediakan menjadi objek Faiss SearchParameters yang sesuai. Untuk pabrik float yang didukung, adaptor juga meneruskan bit set filter Milvus sebagai selektor Faiss. Dukungan selektor bergantung pada pabrik, dan tes yang dirilis tidak menetapkan penyaringan skalar untuk indeks biner FAISS. Inilah sebabnya mengapa suatu resep dapat valid di Faiss mandiri tetapi menolak operasi yang diperlukan oleh jalur pencarian Milvus.
Prasyarat
- Milvus 3.0.0 atau yang lebih baru
- PyMilvus 3.0.0 atau yang lebih baru
- Memahami sintaks pabrik indeks Faiss dan persyaratan pelatihan dari pabrik yang dipilih
Untuk petunjuk instalasi, lihat Instal PyMilvus.
Pilih string pabrik
String pabrik mendeskripsikan indeks Faiss sebagai urutan komponen. Contoh-contoh berikut telah diuji pada rilis uji coba Milvus 3.0.0. Daftar ini tidak lengkap.
| String pabrik | Jenis bidang | Metrik yang diuji dalam pengujian rilis | Parameter pencarian | Catatan |
|---|---|---|---|---|
Flat | FLOAT_VECTOR | L2, IP, COSINE | Tidak ada | Pencarian tepat. |
IVF64,Flat | FLOAT_VECTOR | L2, IP, COSINE | nprobe | IVF dengan 64 daftar terbalik dan vektor yang tidak terkompresi. |
HNSW16,Flat | FLOAT_VECTOR | L2, IP, COSINE | efSearch | Grafik HNSW dengan penyimpanan vektor datar. |
OPQ16,IVF64,PQ16x4 | FLOAT_VECTOR | L2 | Khusus pabrik | Menggabungkan OPQ, IVF, dan PQ. Validasi ukuran pelatihan dan recall dengan data Anda. |
IVF64,PQ8x4,RFlat | FLOAT_VECTOR | L2 | nprobe, k_factor | Menggunakan penyaring datar setelah pengambilan kandidat PQ. |
PQ8x4 | FLOAT_VECTOR | L2 | Tidak ada | Menyertakan tes rilis. Pencarian yang difilter skalar gagal karena indeks menolak selektor; validasi penggunaan tanpa filter secara terpisah. |
BFlat | BINARY_VECTOR | HAMMING | Tidak ada | Pencarian tepat untuk vektor biner. |
Entri " COSINE " menunjukkan cakupan pengujian awal (build dan pencarian). Untuk Milvus 3.0.0, entri ini tidak menjamin keakuratan skor atau pencarian rentang setelah pemuatan ulang indeks. Lihat Batasan.
Membuat dan melakukan pencarian pada indeks float
Contoh berikut membuat 3.000 vektor berdimensi 128. Ini menyediakan data pelatihan yang cukup untuk resep " IVF64,Flat " yang digunakan dalam contoh ini. Perluas blok pengaturan dan jalankan sebelum membangun dan melakukan pencarian pada indeks.
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)
Buat indeks
Atur ` index_type ` ke ` FAISS`, dan gunakan ` faiss_index_name ` untuk memilih resep pabrik Faiss asli.
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)
String pabrik IVF64,Flat membuat indeks IVF dengan 64 daftar terbalik dan menyimpan vektor yang tidak terkompresi di setiap daftar.
Cari di indeks
Tentukan parameter pencarian khusus pabrik di dalam search_params.params. Untuk pabrik IVF, nprobe mengontrol berapa banyak daftar terbalik yang dicari oleh 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)
Kueri menggunakan ` nprobe=8`, sehingga Faiss mencari 8 dari 64 daftar terbalik. Filter membatasi hasil pada entitas yang nilai ` category `-nya adalah ` reference`.
Membuat dan mencari indeks biner
Untuk bidang ` BINARY_VECTOR `, gunakan string pabrik biner seperti ` BFlat ` dan metrik biner yang kompatibel. Perluas blok pengaturan dan jalankan sebelum membuat dan mencari indeks.
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)
Buat indeks
Gunakan BFlat sebagai string pabrik dan HAMMING sebagai metrik untuk contoh vektor biner ini.
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)
Cari indeks
BFlat tidak memiliki parameter pencarian khusus keluarga. Berikan pemetaan ` params ` yang kosong saat membuat permintaan pencarian.
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)
Setiap vektor biner berdimensi 128 direpresentasikan oleh 16 byte. Untuk informasi lebih lanjut, lihat Vektor Biner.
Konfigurasikan parameter build dan pencarian
Tipe indeks FAISS memiliki satu parameter build passthrough yang wajib.
| Parameter | Lokasi | Deskripsi |
|---|---|---|
faiss_index_name | params in add_index() | String pembuat indeks Faiss. Contohnya, IVF64,Flat. |
Tentukan parameter pencarian khusus pabrik di dalam search_params.params. Tabel berikut mencantumkan contoh-contoh umum dan tidak mencakup semuanya.
| Parameter | Contoh pabrik | Deskripsi |
|---|---|---|
nprobe | IVF64,Flat | Jumlah daftar terbalik yang akan dicari. |
efSearch | HNSW16,Flat | Ukuran daftar kandidat pencarian HNSW. |
k_factor | IVF64,PQ8x4,RFlat | Jumlah kandidat yang disediakan ke refiner terkait dengan top-K yang diminta. |
Milvus hanya meneruskan parameter tambahan yang dikenali oleh adaptor. Kunci build dan kunci pencarian yang tidak dikenal, yang tidak didukung oleh keluarga pabrik konkret, akan ditolak. Milvus tidak memelihara skema parameter universal untuk setiap pabrik yang mungkin. Periksa dokumentasi Faiss untuk pabrik yang dipilih, lalu validasi alur pembangunan dan pencarian secara menyeluruh terhadap versi dan gambar Milvus yang tepat yang akan Anda terapkan.
Tangani kesalahan dan operasi yang tidak didukung
Jika string pabrik tidak valid atau tidak tersedia dalam build Milvus, pembuatan indeks akan gagal. Periksa status indeks dan alasan kegagalan sebelum memuat koleksi.
Jika tipe parameter salah, pencarian akan gagal. Misalnya, `
nprobe="invalid"` ditolak karena `nprobe` harus berupa angka.Jika suatu parameter tidak berlaku untuk factory yang dibangun, adaptor akan menolaknya karena tidak didukung.
Jika sebuah factory tidak mendukung selektor Milvus, pencarian yang difilter dapat gagal meskipun factory yang sama dapat melakukan pencarian di Faiss standalone.
Jangan gunakan
search_iterator()dengan indeksFAISS.
Langkah Selanjutnya
- Pelajari bagaimana indeks Milvus diorganisasikan di Penjelasan Indeks.
- Bandingkan jenis indeks khusus IVF_FLAT dan HNSW.
- Tinjau " Jenis Metrik " sebelum memilih metrik untuk pabrik.