← Kembali

FLAT vs IVF: Bagaimana Indeks File Terbalik Bekerja

Data yang sama, kueri yang sama — tetapi strategi pencarian yang berbeda. Seret titik kueri, sesuaikan nprobe, lalu tekan "Run Search " untuk melihat bagaimana " IVF " melewati sebagian besar data.

nprobe2
2 pencarian dari 8 clusters
Kecepatan20ms
Semakin rendah = animasi semakin cepat

FLAT — Pencarian menyeluruh

memindai setiap titik
Perbandingan
200 / 200
Status
✓ Selesai
Recall
100%

IVF — Berkas terbalik

pencarian nprobe kluster
Perbandingan
33 / 33
Status
✓ Selesai
Recall@5
100%

Apa yang sedang terjadi?

  1. Fase pembangunan (sudah selesai): K-means membagi titik-titik 200 menjadi 8 klaster. Setiap klaster memiliki pusat (ditandai dengan tanda ×).
  2. Langkah 1 — mengevaluasi pusat-pusat (centroids): " IVF " terlebih dahulu menghitung jarak dari kueri ke setiap pusat. Itu hanya 8 perbandingan, terlepas dari ukuran dataset.
  3. Langkah 2 — pilih kluster " nprobe " yang paling dekat: kluster-kluster ini akan menyala. Semua kluster lainnya dilewati sepenuhnya.
  4. Langkah 3 — pindai titik-titik di dalam kluster yang dipilih: hanya sekitar50 dari 200 titik.

Kompromi: semakin banyak nprobe → lebih banyak kluster yang dipindai → recall lebih tinggi tetapi lebih lambat. Lebih kecil nprobe → lebih cepat tetapi Anda mungkin melewatkan tetangga sejati yang berada di kluster yang belum dipindai. Cobalah mengatur nprobe = 1 dan menyeret kueri ke dekat batas klaster untuk melihat penurunan recall.

Apa itu indeks " IVF "?

IVF (Inverted File) adalah indeks tetangga terdekat aproksimatif berbasis pengelompokan. Pada saat pembuatan, k-means membagi semua vektor menjadi nlist kluster, masing-masing diwakili oleh sentroidnya. Saat pencarian, sistem pertama-tama membandingkan kueri hanya dengan sentroid-sentroid tersebut, memilih nprobe , dan memindai hanya vektor-vektor di dalamnya — melewatkan yang lainnya.

Milvus menyediakan beberapa varian " IVF " yang menukar memori dengan akurasi: IVF_FLAT menyimpan vektor mentah (paling akurat), IVF_SQ8 mengompres setiap dimensi menjadi satu byte (menggunakan memori ~4× lebih sedikit, dengan sedikit pengorbanan recall), dan IVF_PQ menerapkan kuantisasi produk untuk kompresi yang jauh lebih tinggi dengan biaya recall yang lebih besar.

Penyesuaian nlist dan nprobe

  • nlist (waktu pembangunan): jumlah klaster k-means. Titik awal yang umum adalah 4 × sqrt(N) untuk N vektor. Semakin banyak klaster, berarti masing-masing klaster semakin kecil — pemindaian lebih cepat, tetapi penyapuan pusat massa (centroid sweep) membutuhkan biaya lebih besar dan efek batas semakin meningkat.
  • nprobe (waktu kueri): berapa banyak kluster yang akan dipindai per kueri. Ini adalah pengatur utama antara recall dan latensi — persis apa yang dikendalikan oleh penggeser di atas. Mulailah dari angka sekitar nlist / 16 dan tingkatkan hingga recall mencapai target Anda.
  • Pilihan varian: mulailah dengan IVF_FLAT. Beralihlah ke IVF_SQ8 saat memori terbatas, dan ke IVF_PQ hanya jika dataset terlalu besar untuk SQ8 — dan verifikasi recall pada data Anda sendiri setelah setiap langkah penurunan.

IVF vs HNSW vs DiskANN

IVF dapat dibangun dengan cepat, memiliki beban memori yang kecil di atas vektor-vektor tersebut, dan mudah dipahami — tetapi pada target recall yang sama, HNSW biasanya menjawab kueri lebih cepat di memori. Pilih IVF saat Anda sering membangun ulang indeks (kecepatan pembangunan penting), saat memori terbatas (IVF_SQ8/IVF_PQ), atau saat Anda menginginkan perilaku pemindaian yang dapat diprediksi dan dapat disesuaikan. Pilih HNSW untuk latensi kueri dalam memori terendah, dan DiskANN ketika vektor sama sekali tidak muat di RAM.

Pertanyaan yang Sering Diajukan

Apa perbedaan antara IVF_FLAT, IVF_SQ8, dan IVF_PQ?

Ketiga vektor tersebut mengelompokkan dengan cara yang sama; perbedaannya terletak pada cara vektor disimpan di dalam kelompok. " IVF_FLAT " menyimpan vektor float mentah (akurasi pengambilan tertinggi). " IVF_SQ8 " mengkuantisasi setiap dimensi menjadi 8 bit, mengurangi penggunaan memori sekitar 4 kali lipat dengan sedikit penurunan akurasi pengambilan. " IVF_PQ " mengganti vektor dengan kode kuantisasi produk pendek untuk kompresi tertinggi dan penurunan akurasi pengambilan terbesar.

Bagaimana cara memilih antara " nlist " dan " nprobe"?

Aturan praktis yang umum adalah ` nlist ` = 4 × `sqrt(N)` untuk `N` vektor, kemudian sesuaikan ` nprobe ` pada saat kueri. ` nprobe ` yang lebih besar memindai lebih banyak kluster: recall lebih tinggi, latensi lebih tinggi. Mulailah sekitar ` nlist/16` dan tingkatkan hingga recall pada kumpulan kueri yang disisihkan memenuhi target Anda.

Mengapa " IVF " melewatkan beberapa tetangga terdekat yang sebenarnya?

Hal ini disebabkan oleh batas-batas kluster. Jika kueri berada di dekat tepi suatu kluster, beberapa tetangga sebenarnya mungkin berada di kluster yang berdekatan yang tidak termasuk di antara kluster-kluster yang dipindai ( nprobe ). Anda dapat melihat hal ini dalam visualisasi dengan menyeret titik kueri ke dekat batas dengan nilai " nprobe " = 1.

Haruskah saya menggunakan IVF atau HNSW?

Pada tingkat recall yang sama, " HNSW " biasanya lebih cepat untuk pencarian dalam memori tetapi menggunakan lebih banyak memori dan dibangun lebih lambat. " IVF " dibangun dengan cepat dan cocok dipadukan dengan kuantisasi (SQ8/PQ) saat memori terbatas. Untuk dataset yang sepenuhnya melebihi RAM, pertimbangkan DiskANN sebagai gantinya.

Pelajari lebih lanjut: baca dokumentasi "IVF_FLAT " untuk parameter indeks, atau lihat "Index Explained " untuk panduan pengambilan keputusan lengkap.

Terus jelajahi