IVF_SQ8

Indeks IVF_SQ8 adalah algoritme pengindeksan berbasis kuantisasi yang dirancang untuk mengatasi tantangan pencarian kemiripan berskala besar. Jenis indeks ini menghasilkan pencarian yang lebih cepat dengan jejak memori yang jauh lebih kecil dibandingkan dengan metode pencarian yang lengkap.

Gambaran Umum

Indeks IVF_SQ8 dibangun di atas dua komponen utama:

  • Inverted File (IVF): Mengatur data ke dalam kelompok-kelompok, memungkinkan algoritme pencarian hanya berfokus pada subset vektor yang paling relevan.

  • Kuantisasi Skalar (SQ8): Mengompresi vektor ke bentuk yang lebih ringkas, secara drastis mengurangi penggunaan memori sekaligus mempertahankan presisi yang cukup untuk perhitungan kemiripan yang cepat.

IVF

IVF seperti membuat indeks dalam sebuah buku. Alih-alih memindai setiap halaman (atau, dalam kasus kami, setiap vektor), Anda mencari kata kunci tertentu (kelompok) dalam indeks untuk menemukan halaman (vektor) yang relevan dengan cepat. Dalam skenario kami, vektor dikelompokkan ke dalam kluster, dan algoritme akan mencari dalam beberapa kluster yang dekat dengan vektor kueri.

Berikut cara kerjanya:

  1. Pengelompokan: Kumpulan data vektor Anda dibagi ke dalam sejumlah klaster tertentu, menggunakan algoritme pengelompokan seperti k-means. Setiap klaster memiliki centroid (vektor representatif untuk klaster).

  2. Penugasan: Setiap vektor ditugaskan ke klaster yang memiliki centroid yang paling dekat dengannya.

  3. Indeks Terbalik: Sebuah indeks dibuat, memetakan setiap centroid klaster ke daftar vektor yang ditugaskan ke klaster tersebut.

  4. Pencarian: Saat Anda mencari tetangga terdekat, algoritme pencarian membandingkan vektor kueri Anda dengan centroid klaster dan memilih klaster yang paling menjanjikan. Pencarian kemudian dipersempit menjadi vektor dalam klaster yang dipilih.

Untuk mempelajari lebih lanjut tentang detail teknisnya, lihat IVF_FLAT.

SQ8

Kuantisasi Skalar (SQ) adalah teknik yang digunakan untuk mengurangi ukuran vektor berdimensi tinggi dengan mengganti nilainya dengan representasi yang lebih kecil dan lebih ringkas. Varian SQ8 menggunakan bilangan bulat 8-bit, bukan bilangan floating point 32-bit yang biasa digunakan untuk menyimpan setiap nilai dimensi vektor. Hal ini sangat mengurangi jumlah memori yang diperlukan untuk menyimpan data.

Berikut cara kerja SQ8:

  1. Identifikasi Rentang: Pertama, identifikasi nilai minimum dan maksimum dalam vektor. Rentang ini mendefinisikan batas-batas untuk kuantisasi.

  2. Normalisasi: Menormalkan nilai vektor ke kisaran antara 0 dan 1 dengan menggunakan rumus:

    normalized_value=valueminmaxmin\text{normalized\_value} = \frac{\text{value} - \text{min}}{\text{max} - \text{min}}

    Hal ini memastikan semua nilai dipetakan secara proporsional dalam rentang standar, mempersiapkannya untuk kompresi.

  3. Kompresi 8-Bit: Kalikan nilai yang dinormalisasi dengan 255 (nilai maksimum untuk bilangan bulat 8-bit) dan bulatkan hasilnya ke bilangan bulat terdekat. Hal ini secara efektif memampatkan setiap nilai ke dalam representasi 8-bit.

Misalkan Anda memiliki nilai dimensi 1,2, dengan nilai minimum -1,7 dan nilai maksimum 2,3. Gambar berikut menunjukkan bagaimana SQ8 diterapkan untuk mengubah nilai float32 menjadi bilangan bulat int8.

Ivf Sq8 Ivf Sq8

IVF + SQ8

Indeks IVF_SQ8 menggabungkan IVF dan SQ8 untuk melakukan pencarian kemiripan secara efisien:

  1. IVF mempersempit cakupan pencarian: Kumpulan data dibagi menjadi beberapa kluster, dan ketika kueri dikeluarkan, IVF pertama-tama membandingkan kueri dengan pusat kluster, memilih kluster yang paling relevan.

  2. SQ8 mempercepat penghitungan jarak: Di dalam cluster yang dipilih, SQ8 memampatkan vektor menjadi bilangan bulat 8-bit, sehingga mengurangi penggunaan memori dan mempercepat perhitungan jarak.

Dengan menggunakan IVF untuk memfokuskan pencarian dan SQ8 untuk mempercepat komputasi, IVF_SQ8 mencapai waktu pencarian yang cepat dan efisiensi memori.

Membangun indeks

Untuk membangun indeks IVF_SQ8 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_SQ8", # 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 to create using the k-means algorithm during index building
    } # Index building params
)

Dalam konfigurasi ini:

  • index_type: Jenis indeks yang akan dibangun. Dalam contoh ini, tetapkan nilainya ke IVF_SQ8.

  • metric_type: Metode yang digunakan untuk menghitung jarak antara vektor. Nilai yang didukung termasuk COSINE, L2, dan IP. Untuk detailnya, lihat Jenis Metrik.

  • params: Opsi konfigurasi tambahan untuk membangun indeks.

    • nlist: Jumlah cluster yang akan dibuat menggunakan algoritme k-means selama pembuatan indeks.

    Untuk mempelajari lebih lanjut parameter pembuatan yang tersedia untuk indeks IVF_SQ8, 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": 8, # Number of clusters to search for candidates
    }
}

res = MilvusClient.search(
    collection_name="your_collection_name", # Collection name
    anns_field="vector_field", # Vector field name
    data=[[0.1, 0.2, 0.3, 0.4, 0.5]],  # Query vector
    limit=10,  # TopK results to return
    search_params=search_params
)

Dalam konfigurasi ini:

  • params: Opsi konfigurasi tambahan untuk pencarian pada indeks.

    • nprobe: Jumlah cluster untuk mencari kandidat.

    Untuk mempelajari lebih lanjut parameter pencarian yang tersedia untuk indeks IVF_SQ8, 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

IVF

nlist

Jumlah klaster yang akan dibuat menggunakan algoritme k-means selama pembuatan indeks.

Jenis: Rentang bilangan bulat: [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 sarankan 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

IVF

nprobe

Jumlah cluster untuk mencari kandidat.

Tipe Bilangan bulat Rentang: [1, nlist]

Nilai default: 8

Nilai yang lebih tinggi memungkinkan lebih banyak klaster untuk dicari, meningkatkan daya ingat dengan memperluas cakupan pencarian, namun dengan biaya peningkatan latensi kueri. Tetapkan nprobe secara proporsional dengan nlist untuk menyeimbangkan kecepatan dan akurasi.

Pada kebanyakan kasus, kami menyarankan Anda menetapkan nilai dalam kisaran ini: [1, nlist].

Coba Milvus yang Dikelola secara Gratis

Zilliz Cloud bebas masalah, didukung oleh Milvus dan 10x lebih cepat.

Mulai
Umpan balik

Apakah halaman ini bermanfaat?