• Tentang Milvus
  • Mulailah
  • Konsep
  • Panduan Pengguna
    • Koleksi
    • Skema & Bidang Data
    • Sisipkan & Hapus
    • Indeks
    • Cari
    • Inferensi Fungsi dan Model
    • Optimalisasi Penyimpanan
    • Cuplikan
  • Impor Data
  • Alat AI
  • Panduan Administrasi
  • Alat
  • Integrasi
  • Tutorial
  • Pertanyaan yang Sering Diajukan
  • API Reference

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

  • FAISS mendukung bidang FLOAT_VECTOR dan BINARY_VECTOR. Milvus tidak mendukung bidang FLOAT16_VECTOR, BFLOAT16_VECTOR, INT8_VECTOR, atau SPARSE_FLOAT_VECTOR.

  • Adaptor generik FAISS berjalan 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, dan HNSW16,Flat. Jangan berasumsi bahwa setiap pabrik mendukung filter atau bahwa indeks biner FAISS mendukung penyaringan skalar.

  • Iterator pencarian tidak didukung.

  • Adaptor ini tidak menyediakan pengambilan vektor mentah.

  • Dukungan pencarian rentang bergantung pada pabrik. Float Flat memiliki cakupan rilis. Jangan gunakan pencarian rentang dengan indeks biner FAISS.

  • Sebuah factory dapat dibangun dengan sukses tetapi tetap menolak beberapa operasi pencarian Milvus. Misalnya, standalone PQ8x4 menolak selektor yang digunakan oleh pencarian yang difilter skalar. Validasi penggunaan tanpa filter secara terpisah.

  • Di Milvus 3.0.0, validasi skor COSINE dan ambang batas pencarian rentang setelah pemuatan ulang indeks. Knowhere v3.0.6 tidak memulihkan status normalisasi kosinus adaptor FAISS selama deserialisasi.

Cara kerjanya

FAISS index passthrough workflow 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 pabrikJenis bidangMetrik yang diuji dalam pengujian rilisParameter pencarianCatatan
FlatFLOAT_VECTORL2, IP, COSINETidak adaPencarian tepat.
IVF64,FlatFLOAT_VECTORL2, IP, COSINEnprobeIVF dengan 64 daftar terbalik dan vektor yang tidak terkompresi.
HNSW16,FlatFLOAT_VECTORL2, IP, COSINEefSearchGrafik HNSW dengan penyimpanan vektor datar.
OPQ16,IVF64,PQ16x4FLOAT_VECTORL2Khusus pabrikMenggabungkan OPQ, IVF, dan PQ. Validasi ukuran pelatihan dan recall dengan data Anda.
IVF64,PQ8x4,RFlatFLOAT_VECTORL2nprobe, k_factorMenggunakan penyaring datar setelah pengambilan kandidat PQ.
PQ8x4FLOAT_VECTORL2Tidak adaMenyertakan tes rilis. Pencarian yang difilter skalar gagal karena indeks menolak selektor; validasi penggunaan tanpa filter secara terpisah.
BFlatBINARY_VECTORHAMMINGTidak adaPencarian 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.

Siapkan kumpulan vektor float

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.

Siapkan koleksi vektor biner

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.

ParameterLokasiDeskripsi
faiss_index_nameparams 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.

ParameterContoh pabrikDeskripsi
nprobeIVF64,FlatJumlah daftar terbalik yang akan dicari.
efSearchHNSW16,FlatUkuran daftar kandidat pencarian HNSW.
k_factorIVF64,PQ8x4,RFlatJumlah 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 indeks FAISS.

Langkah Selanjutnya