IVF_FLAT
Indeks IVF_FLAT adalah algoritme pengindeksan yang dapat meningkatkan kinerja pencarian untuk vektor floating-point.
Jenis indeks ini ideal untuk set data berskala besar yang memerlukan respons kueri cepat dan akurasi tinggi, terutama ketika pengelompokan set data Anda dapat mengurangi ruang pencarian dan memori yang cukup tersedia untuk menyimpan data klaster.
Gambaran Umum
Istilah IVF_FLAT adalah singkatan dari Inverted File Flat, yang merangkum pendekatan berlapis ganda untuk mengindeks dan mencari vektor floating-point:
- File Terbalik (Inverted File (IVF)): Mengacu pada pengelompokan ruang vektor ke dalam wilayah yang dapat dikelola menggunakan pengelompokan k-means. Setiap klaster diwakili oleh sebuah pusat, yang berfungsi sebagai titik referensi untuk vektor-vektor di dalamnya.
- Flat: Menunjukkan bahwa di dalam setiap klaster, vektor disimpan dalam bentuk aslinya (struktur datar), tanpa kompresi atau kuantisasi apa pun, untuk perhitungan jarak yang tepat.
Gambar berikut ini menunjukkan cara kerjanya:
ivf-flat-1.png
Metode pengindeksan ini mempercepat proses pencarian, tetapi memiliki kelemahan potensial: kandidat yang ditemukan sebagai yang terdekat dengan penyematan kueri mungkin bukan yang terdekat. Hal ini dapat terjadi jika embedding terdekat dengan embedding kueri berada di klaster yang berbeda dengan klaster yang dipilih berdasarkan centroid terdekat (lihat visualisasi di bawah).
Untuk mengatasi masalah ini, IVF_FLAT menyediakan dua hiperparameter yang dapat kita setel:
nlist
: Menentukan jumlah partisi yang akan dibuat menggunakan algoritma k-means.nprobe
: Menentukan jumlah partisi yang akan dipertimbangkan selama pencarian kandidat.
Sekarang jika kita mengatur nprobe
menjadi 3 dan bukan 1, kita mendapatkan hasil sebagai berikut:
ivf-flat-2.png
Dengan meningkatkan nilai nprobe
, Anda dapat menyertakan lebih banyak partisi dalam pencarian, yang dapat membantu memastikan bahwa penyematan terdekat dengan kueri tidak terlewatkan, meskipun berada di partisi yang berbeda. Namun, hal ini akan meningkatkan waktu pencarian, karena lebih banyak kandidat yang perlu dievaluasi. Untuk informasi lebih lanjut tentang penyetelan parameter indeks, lihat Parameter indeks.
Membangun indeks
Untuk membangun indeks IVF_FLAT
pada bidang vektor di Milvus, gunakan metode add_index()
, tentukan index_type
, metric_type
, dan parameter tambahan untuk indeks.
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
)
Dalam konfigurasi ini:
index_type
: Jenis indeks yang akan dibangun. Dalam contoh ini, tetapkan nilainya keIVF_FLAT
.metric_type
: Metode yang digunakan untuk menghitung jarak antara vektor. Nilai yang didukung termasukCOSINE
,L2
, danIP
. Untuk detailnya, lihat Jenis Metrik.params
: Opsi konfigurasi tambahan untuk membangun indeks.nlist
: Jumlah kluster untuk membagi set data.
Untuk mempelajari lebih lanjut parameter pembuatan yang tersedia untuk indeks
IVF_FLAT
, lihat Parameter pembuatan indeks.
Setelah parameter indeks dikonfigurasi, Anda dapat membuat indeks dengan menggunakan metode create_index()
secara langsung atau mengoper parameter indeks dalam metode create_collection
. Untuk detailnya, lihat Membuat Koleksi.
Mencari di indeks
Setelah indeks dibuat dan entitas dimasukkan, Anda dapat melakukan pencarian kemiripan pada indeks.
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
)
Dalam konfigurasi ini:
params
: Opsi konfigurasi tambahan untuk pencarian pada indeks.nprobe
: Jumlah kluster yang akan dicari.
Untuk mempelajari lebih lanjut parameter pencarian yang tersedia untuk indeks
IVF_FLAT
, lihat Parameter pencarian khusus indeks.
Parameter indeks
Bagian ini memberikan gambaran umum tentang parameter yang digunakan untuk membangun indeks dan melakukan pencarian pada indeks.
Parameter pembangunan indeks
Tabel berikut mencantumkan parameter yang dapat dikonfigurasi di params
saat membangun indeks.
Parameter | Deskripsi | Rentang Nilai | Saran Penyetelan |
---|---|---|---|
nlist | Jumlah cluster yang akan dibuat menggunakan algoritma k-means selama pembuatan indeks Setiap cluster, yang diwakili oleh centroid, menyimpan daftar vektor. Meningkatkan parameter ini akan mengurangi jumlah vektor di setiap klaster, menciptakan partisi yang lebih kecil dan lebih terfokus. | Jenis Bilangan bulat Rentang: [1, 65536] Nilai default: 128 | Nilai nlist yang lebih besar meningkatkan daya ingat dengan membuat klaster yang lebih halus, tetapi meningkatkan waktu pembuatan indeks. Optimalkan berdasarkan ukuran set data dan sumber daya yang tersedia, dalam kebanyakan kasus, kami menyarankan Anda menetapkan nilai dalam kisaran ini: [32, 4096]. |
Parameter pencarian khusus indeks
Tabel berikut mencantumkan parameter yang dapat dikonfigurasi di search_params.params
saat melakukan pencarian di indeks.
Parameter | Deskripsi | Rentang Nilai | Saran Penyetelan |
---|---|---|---|
nprobe | Jumlah klaster untuk mencari kandidat Nilai yang lebih tinggi memungkinkan lebih banyak klaster untuk dicari, meningkatkan daya ingat dengan memperluas cakupan pencarian, tetapi dengan biaya peningkatan latensi kueri. | Jenis: Bilangan bulat Rentang: [1, nlist] Nilai default: 8 | Menambah nilai ini akan meningkatkan daya ingat namun dapat memperlambat pencarian Tetapkan nprobe secara proporsional dengan nlist untuk menyeimbangkan kecepatan dan akurasi.Pada kebanyakan kasus, kami sarankan Anda menetapkan nilai dalam kisaran ini: [1, nlist]. |