SCANN

Didukung oleh pustaka ScaNN dari Google, indeks SCANN di Milvus dirancang untuk mengatasi tantangan penskalaan pencarian kemiripan vektor, dengan menyeimbangkan antara kecepatan dan akurasi, bahkan pada dataset besar yang secara tradisional akan menjadi tantangan bagi sebagian besar algoritme pencarian.

Gambaran Umum

ScaNN dibangun untuk memecahkan salah satu tantangan terbesar dalam pencarian vektor: secara efisien menemukan vektor yang paling relevan dalam ruang dimensi tinggi, bahkan ketika set data tumbuh lebih besar dan lebih kompleks. Arsitekturnya memecah proses pencarian vektor menjadi beberapa tahap yang berbeda:

Scann Memindai

  1. Pemilahan: Membagi set data menjadi beberapa kelompok. Metode ini mempersempit ruang pencarian dengan hanya berfokus pada subset data yang relevan daripada memindai seluruh dataset, sehingga menghemat waktu dan sumber daya pemrosesan. ScaNN sering menggunakan algoritme pengelompokan, seperti k-means, untuk mengidentifikasi klaster, yang memungkinkannya melakukan pencarian kemiripan dengan lebih efisien.

  2. Kuantisasi: ScaNN menerapkan proses kuantisasi yang dikenal sebagai kuantisasi vektor anisotropik setelah melakukan partisi. Kuantisasi tradisional berfokus pada meminimalkan jarak keseluruhan antara vektor asli dan vektor yang dikompresi, yang tidak ideal untuk tugas-tugas seperti Maximum Inner Product Search (MIPS), di mana kemiripan ditentukan oleh hasil kali dalam vektor, bukan jarak langsung. Sebaliknya, kuantisasi anisotropik memprioritaskan pemeliharaan komponen paralel di antara vektor, atau bagian yang paling penting untuk menghitung inner product yang akurat. Pendekatan ini memungkinkan ScaNN untuk mempertahankan akurasi MIPS yang tinggi dengan menyelaraskan vektor yang dikompresi dengan kueri secara hati-hati, sehingga memungkinkan pencarian kemiripan yang lebih cepat dan lebih tepat.

  3. Pemeringkatan ulang: Fase pemeringkatan ulang adalah langkah terakhir, di mana ScaNN menyempurnakan hasil pencarian dari tahap partisi dan kuantisasi. Pemeringkatan ulang ini menerapkan perhitungan inner product yang tepat pada vektor kandidat teratas, untuk memastikan hasil akhir yang sangat akurat. Pemeringkatan ulang sangat penting dalam mesin rekomendasi berkecepatan tinggi atau aplikasi pencarian gambar di mana pemfilteran dan pengelompokan awal berfungsi sebagai lapisan kasar, dan tahap akhir memastikan bahwa hanya hasil yang paling relevan yang dikembalikan kepada pengguna.

Kinerja SCANN dikendalikan oleh dua parameter utama yang memungkinkan Anda menyempurnakan keseimbangan antara kecepatan dan akurasi:

  • with_raw_data: Mengontrol apakah data vektor asli disimpan bersama dengan representasi yang dikuantisasi. Mengaktifkan parameter ini akan meningkatkan akurasi selama pemeringkatan ulang, tetapi meningkatkan kebutuhan penyimpanan.

  • reorder_k: Menentukan berapa banyak kandidat yang disempurnakan selama fase pemeringkatan ulang akhir. Nilai yang lebih tinggi meningkatkan akurasi tetapi meningkatkan latensi pencarian.

Untuk panduan terperinci tentang cara mengoptimalkan parameter ini untuk kasus penggunaan spesifik Anda, lihat Parameter indeks.

Membangun indeks

Untuk membangun indeks SCANN 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="SCANN", # 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={
        "with_raw_data": True, # Whether to hold raw data
    } # Index building params
)

Dalam konfigurasi ini:

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

  • 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.

    • with_raw_data: Apakah akan menyimpan data vektor asli di samping representasi yang dikuantisasi.

    Untuk mempelajari lebih lanjut parameter pembuatan yang tersedia untuk indeks SCANN, 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": {
        "reorder_k": 10, # Number of candidates to refine
        "nprobe": 8 # Number of clusters to search
    }
}

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.

    • reorder_k: Jumlah kandidat yang akan disaring selama fase pemeringkatan ulang.
    • nprobe: Jumlah kluster yang akan dicari.

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

[1, 65536]

Nlist yang lebih tinggi meningkatkan efisiensi pemangkasan dan biasanya mempercepat pencarian kasar, tetapi partisi dapat menjadi terlalu kecil, yang dapat mengurangi penarikan; nlist yang lebih rendah memindai cluster yang lebih besar, meningkatkan penarikan tetapi memperlambat pencarian.

with_raw_data

Apakah akan menyimpan data vektor asli bersama dengan representasi terkuantisasi. Jika diaktifkan, ini memungkinkan penghitungan kemiripan yang lebih akurat selama fase pemeringkatan ulang dengan menggunakan vektor asli, bukan perkiraan terkuantisasi.

Jenis: Boolean

Rentang true, false

Nilai default: true

Setel ke true untuk akurasi pencarian yang lebih tinggi dan ketika ruang penyimpanan tidak menjadi perhatian utama. Data vektor asli memungkinkan penghitungan kemiripan yang lebih tepat selama pemeringkatan ulang.

Atur ke false untuk mengurangi biaya penyimpanan dan penggunaan memori, terutama untuk set data yang besar. Namun, hal ini dapat menghasilkan akurasi pencarian yang sedikit lebih rendah karena fase pemeringkatan ulang akan menggunakan vektor yang dikuantisasi.

Direkomendasikan: Gunakan true untuk aplikasi produksi yang memerlukan akurasi tinggi.

Parameter pencarian khusus indeks

Tabel berikut mencantumkan parameter yang dapat dikonfigurasi di search_params.params saat melakukan pencarian pada indeks.

Parameter

Deskripsi

Rentang Nilai

Saran Penyetelan

reorder_k

Mengontrol jumlah vektor kandidat yang disempurnakan selama tahap pemeringkatan ulang. Parameter ini menentukan berapa banyak kandidat teratas dari tahap pemartisian dan kuantisasi awal yang dievaluasi ulang menggunakan perhitungan kemiripan yang lebih tepat.

Tipe Bilangan bulat

Rentang: [1, int_max]

Nilai default: Tidak ada

reorder_k yang lebih besar umumnya menghasilkan akurasi pencarian yang lebih tinggi karena lebih banyak kandidat yang dipertimbangkan selama fase penyempurnaan akhir. Namun, hal ini juga meningkatkan waktu pencarian karena adanya komputasi tambahan.

Pertimbangkan untuk meningkatkan reorder_k ketika mencapai recall yang tinggi sangat penting dan kecepatan pencarian tidak terlalu menjadi perhatian. Titik awal yang baik adalah 2-5x dari limit yang Anda inginkan (hasil TopK yang akan dikembalikan).

Pertimbangkan untuk mengurangi reorder_k untuk memprioritaskan pencarian yang lebih cepat, terutama dalam skenario di mana sedikit penurunan akurasi dapat diterima.

Dalam kebanyakan kasus, kami sarankan Anda menetapkan nilai dalam kisaran ini:[batas, batas * 5].

nprobe

Jumlah cluster untuk mencari kandidat.

Jenis 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, tetapi 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?