HNSW_PQ
HNSW_PQ memanfaatkan grafik Hierarchical Navigable Small World (HNSW) dengan Product Quantization (PQ), menciptakan metode pengindeksan vektor tingkat lanjut yang menawarkan pertukaran ukuran versus akurasi yang dapat dikontrol. Dibandingkan dengan HNSW_SQ, jenis indeks ini memberikan tingkat penarikan yang lebih tinggi pada tingkat kompresi yang sama, meskipun dengan kecepatan pemrosesan kueri yang lebih rendah dan waktu konstruksi indeks yang lebih lama.
Gambaran Umum
HNSW_PQ menggabungkan dua teknik pengindeksan: HNSW untuk navigasi berbasis grafik yang cepat dan PQ untuk kompresi vektor yang efisien.
HNSW
HNSW membangun grafik multi-layer di mana setiap node berhubungan dengan vektor dalam kumpulan data. Dalam grafik ini, node terhubung berdasarkan kesamaan mereka, memungkinkan penjelajahan yang cepat melalui ruang data. Struktur hirarkis memungkinkan algoritme pencarian untuk mempersempit kandidat tetangga, sehingga secara signifikan mempercepat proses pencarian dalam ruang dimensi tinggi.
Untuk informasi lebih lanjut, lihat HNSW.
PQ
PQ adalah teknik kompresi vektor yang memecah vektor berdimensi tinggi menjadi sub-vektor yang lebih kecil, yang kemudian dikuantisasi dan dikompresi. Kompresi ini secara dramatis mengurangi kebutuhan memori dan mempercepat perhitungan jarak.
Untuk informasi lebih lanjut, lihat IVF_PQ.
HNSW + PQ
HNSW_PQ menggabungkan kekuatan HNSW dan PQ untuk memungkinkan pencarian tetangga terdekat yang efisien. Algoritma ini menggunakan PQ untuk mengompresi data (sehingga mengurangi penggunaan memori), dan kemudian membuat grafik HNSW pada vektor-vektor yang telah dikompresi untuk memungkinkan pengambilan kandidat dengan cepat. Selama pencarian, algoritme ini secara opsional dapat menyempurnakan hasil kandidat menggunakan data dengan presisi lebih tinggi untuk meningkatkan akurasi. Berikut cara kerja prosesnya:
Kompresi Data: PQ membagi setiap vektor menjadi beberapa sub-vektor dan mengkuantisasi mereka menggunakan buku kode centroid, yang dikontrol oleh parameter seperti
m(jumlah sub-vektor) dannbits(bit per sub-vektor).Konstruksi Grafik: Vektor-vektor yang telah dikompresi kemudian digunakan untuk membangun grafik HNSW. Karena vektor-vektor disimpan dalam bentuk terkompresi, grafik yang dihasilkan biasanya lebih kecil, membutuhkan lebih sedikit memori, dan dapat dilalui dengan lebih cepat-secara signifikan mempercepat langkah pengambilan kandidat.
Pengambilan Kandidat: Ketika sebuah kueri dijalankan, algoritme menggunakan data terkompresi dalam grafik HNSW untuk mengidentifikasi kumpulan kandidat tetangga secara efisien. Pencarian berbasis grafik ini secara drastis mengurangi jumlah vektor yang harus dipertimbangkan, sehingga meningkatkan latensi kueri dibandingkan dengan pencarian brute force.
(Opsional) Penyempurnaan Hasil: Hasil kandidat awal dapat disempurnakan untuk akurasi yang lebih baik, berdasarkan parameter berikut:
refine: Mengontrol apakah langkah penyempurnaan ini diaktifkan. Jika diatur ketrue, sistem menghitung ulang jarak menggunakan representasi yang lebih presisi atau tidak terkompresi.refine_type: Menentukan tingkat presisi data yang digunakan selama penghalusan (misalnya, SQ6, SQ8, BF16). Pilihan presisi yang lebih tinggi sepertiFP32dapat memberikan hasil yang lebih akurat tetapi membutuhkan lebih banyak memori. Ini harus melebihi ketepatan data terkompresi asli yang ditetapkan olehsq_type.refine_k: Bertindak sebagai faktor pembesaran. Misalnya, jika k teratas Anda adalah 100 danrefine_kadalah 2, sistem akan mengurutkan ulang 200 kandidat teratas dan mengembalikan 100 terbaik, sehingga meningkatkan akurasi secara keseluruhan.
Untuk daftar lengkap parameter dan nilai yang valid, lihat Parameter indeks.
Membangun indeks
Untuk membangun indeks HNSW_PQ 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="HNSW_PQ", # 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={
"M": 30, # Maximum number of neighbors each node can connect to in the graph
"efConstruction": 360, # Number of candidate neighbors considered for connection during index construction
"m": 384,
"nbits": 8,
"refine": true, # Whether to enable the refinement step
"refine_type": "SQ8" # Precision level of data used for refinement
} # Index building params
)
Dalam konfigurasi ini:
index_type: Jenis indeks yang akan dibangun. Dalam contoh ini, tetapkan nilainya keHNSW_PQ.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. Untuk detailnya, 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": {
"ef": 10, # Parameter controlling query time/accuracy trade-off
"refine_k": 1 # The magnification factor
}
}
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=3, # TopK results to return
search_params=search_params
)
Dalam konfigurasi ini:
params: Opsi konfigurasi tambahan untuk pencarian pada indeks. Untuk detailnya, 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 pembuatan indeks
Tabel berikut mencantumkan parameter yang dapat dikonfigurasi di params saat membangun indeks.
Parameter |
Deskripsi |
Rentang Nilai |
Saran Penyetelan |
|
|---|---|---|---|---|
HNSW |
|
Jumlah maksimum koneksi (atau sisi) yang dapat dimiliki setiap simpul dalam graf, termasuk sisi keluar dan masuk. Parameter ini secara langsung memengaruhi konstruksi indeks dan pencarian. |
Tipe: Bilangan bulat Rentang: [2, 2048] Nilai default: |
Pertimbangkan untuk mengurangi Dalam kebanyakan kasus, kami sarankan Anda menetapkan nilai dalam kisaran ini: [5, 100]. |
|
Jumlah kandidat tetangga yang dipertimbangkan untuk koneksi selama konstruksi indeks. Kumpulan kandidat yang lebih besar dievaluasi untuk setiap elemen baru, tetapi jumlah maksimum koneksi yang benar-benar dibuat masih dibatasi oleh |
Tipe: Bilangan bulat Rentang: [1, int_max] Nilai default: |
Nilai Pertimbangkan untuk mengurangi Dalam kebanyakan kasus, kami menyarankan Anda menetapkan nilai dalam kisaran ini: [50, 500]. |
|
PQ |
|
Jumlah sub-vektor (digunakan untuk kuantisasi) untuk membagi setiap vektor dimensi tinggi selama proses kuantisasi. |
Jenis: Bilangan bulat Rentang: [1, 65536] Nilai default: Tidak ada |
Nilai Dalam kebanyakan kasus, kami sarankan Anda menetapkan nilai dalam kisaran ini: [D/8, D]. |
|
Jumlah bit yang digunakan untuk merepresentasikan indeks centroid setiap sub-vektor dalam bentuk terkompresi. Ini secara langsung menentukan ukuran setiap codebook. Setiap codebook akan berisi centroid 2nbit. Sebagai contoh, jika |
Jenis: Rentang Bilangan Bulat: [1, 24] Nilai default: |
Nilai |
|
|
Bendera boolean yang mengontrol apakah langkah perbaikan diterapkan selama pencarian. Refinement melibatkan pemeringkatan ulang hasil awal dengan menghitung jarak yang tepat antara vektor kueri dan kandidat. |
Jenis: Rentang Boolean: [ Nilai default: |
Setel ke |
|
|
Menentukan ketepatan data yang digunakan selama proses penghalusan. Ketepatan ini harus lebih tinggi daripada vektor yang dikompresi (seperti yang ditetapkan oleh parameter |
Jenis: Rentang String:[ Nilai default: Tidak ada |
Gunakan |
Parameter pencarian khusus indeks
Tabel berikut mencantumkan parameter yang dapat dikonfigurasi di search_params.params saat mencari di indeks.
Parameter |
Deskripsi |
Rentang Nilai |
Saran Penyetelan |
|
|---|---|---|---|---|
HNSW |
|
Mengontrol luasnya pencarian selama pencarian tetangga terdekat. Parameter ini menentukan berapa banyak node yang dikunjungi dan dievaluasi sebagai tetangga terdekat yang potensial. Parameter ini hanya memengaruhi proses pencarian dan berlaku secara eksklusif pada lapisan bawah grafik. |
Tipe: Bilangan bulat Rentang: [1, int_max] Nilai default: batas (tetangga terdekat TopK yang akan dikembalikan) |
Pertimbangkan untuk mengurangi Dalam kebanyakan kasus, kami sarankan Anda menetapkan nilai dalam kisaran ini: [K, 10K]. |
PQ |
|
Faktor pembesaran yang mengontrol berapa banyak kandidat tambahan yang diperiksa selama tahap penyempurnaan (pemeringkatan ulang), relatif terhadap hasil K teratas yang diminta. |
Tipe Rentang Float: [1, float_max) Nilai default: 1 |
Nilai yang lebih tinggi dari |