HNSW
Indeks HNSW adalah algoritme pengindeksan berbasis grafik yang dapat meningkatkan performa saat mencari vektor mengambang berdimensi tinggi. Indeks ini menawarkan akurasi pencarian yang sangat baik dan latensi yang rendah, namun membutuhkan overhead memori yang tinggi untuk mempertahankan struktur graf hirarkinya.
Gambaran Umum
Algoritme Hierarchical Navigable Small World (HNSW) membuat grafik berlapis-lapis, seperti peta dengan tingkat pembesaran yang berbeda. Lapisan paling bawah berisi semua titik data, sedangkan lapisan atas terdiri dari subset titik data yang diambil sampelnya dari lapisan bawah.
Dalam hierarki ini, setiap lapisan berisi node yang mewakili titik data, yang dihubungkan oleh tepi yang menunjukkan kedekatannya. Lapisan yang lebih tinggi menyediakan lompatan jarak jauh untuk mendekati target dengan cepat, sedangkan lapisan yang lebih rendah memungkinkan pencarian yang lebih halus untuk mendapatkan hasil yang paling akurat.
Inilah cara kerjanya:
- Titik masuk: Pencarian dimulai dari titik masuk tetap di lapisan teratas, yang merupakan simpul yang telah ditentukan sebelumnya dalam grafik.
- Pencarian serakah: Algoritme dengan rakus bergerak ke tetangga terdekat pada lapisan saat ini hingga tidak dapat mendekati vektor kueri. Lapisan atas melayani tujuan navigasi, bertindak sebagai filter kasar untuk menemukan titik masuk potensial untuk pencarian yang lebih baik di tingkat yang lebih rendah.
- Lapisan turun: Setelah minimum lokal tercapai pada lapisan saat ini, algoritme akan turun ke lapisan yang lebih rendah, menggunakan koneksi yang telah dibuat sebelumnya, dan mengulangi pencarian yang serakah.
- Penyempurnaanakhir: Proses ini berlanjut hingga lapisan paling bawah tercapai, di mana langkah penyempurnaan akhir mengidentifikasi tetangga terdekat.
HNSW
Kinerja HNSW bergantung pada beberapa parameter kunci yang mengontrol struktur graf dan perilaku pencarian. Parameter-parameter tersebut antara lain:
M
: Jumlah maksimum sisi atau koneksi yang dapat dimiliki oleh setiap simpul dalam graf pada setiap tingkat hirarki.M
yang lebih tinggi menghasilkan graf yang lebih padat dan meningkatkan daya ingat dan akurasi karena pencarian memiliki lebih banyak jalur untuk dijelajahi, yang juga menghabiskan lebih banyak memori dan memperlambat waktu penyisipan karena adanya koneksi tambahan. Seperti yang ditunjukkan pada gambar di atas, M = 5 mengindikasikan bahwa setiap simpul pada graf HNSW terhubung langsung dengan maksimal 5 simpul lainnya. Hal ini menciptakan struktur graf yang cukup padat di mana setiap node memiliki banyak jalur untuk mencapai node lainnya.efConstruction
: Jumlah kandidat yang dipertimbangkan selama konstruksi indeks.efConstruction
yang lebih tinggi umumnya menghasilkan kualitas graf yang lebih baik tetapi membutuhkan lebih banyak waktu untuk membangunnya.ef
: Jumlah tetangga yang dievaluasi selama pencarian. Meningkatkanef
akan meningkatkan kemungkinan menemukan tetangga terdekat tetapi memperlambat proses pencarian.
Untuk detail tentang cara menyesuaikan pengaturan ini agar sesuai dengan kebutuhan Anda, lihat Parameter indeks.
Membangun indeks
Untuk membangun indeks HNSW
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", # 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": 64, # Maximum number of neighbors each node can connect to in the graph
"efConstruction": 100 # Number of candidate neighbors considered for connection during index construction
} # Index building params
)
Dalam konfigurasi ini:
index_type
: Jenis indeks yang akan dibangun. Dalam contoh ini, tetapkan nilainya keHNSW
.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.M
: Jumlah maksimum tetangga yang dapat dihubungkan oleh setiap node.efConstruction
: Jumlah kandidat tetangga yang dipertimbangkan untuk koneksi selama pembangunan indeks.
Untuk mempelajari lebih lanjut parameter pembangunan yang tersedia untuk indeks
HNSW
, lihat Parameter pembangunan 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, # Number of neighbors to consider during the 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=10, # TopK results to return
search_params=search_params
)
Dalam konfigurasi ini:
params
: Opsi konfigurasi tambahan untuk pencarian pada indeks.ef
: Jumlah tetangga yang perlu dipertimbangkan selama pencarian.
Untuk mempelajari lebih lanjut parameter pencarian yang tersedia untuk indeks
HNSW
, lihat Parameter pencarian khusus indeks.
Parameter indeks
Bagian ini memberikan ikhtisar 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 |
---|---|---|---|
M | Jumlah maksimum koneksi (atau sisi) yang dapat dimiliki oleh setiap simpul dalam graf, termasuk sisi keluar dan masuk. Parameter ini secara langsung mempengaruhi konstruksi indeks dan pencarian. | Tipe Bilangan bulat Rentang: [2, 2048] Nilai default: 30 (hingga 30 sisi keluar dan 30 sisi masuk per simpul) | M yang lebih besar umumnya menghasilkan akurasi yang lebih tinggi tetapi meningkatkan overhead memori dan memperlambat pembuatan indeks dan pencarian.Pertimbangkan untuk meningkatkan M untuk dataset dengan dimensi tinggi atau ketika pemanggilan yang tinggi sangat penting.Pertimbangkan untuk mengurangi M ketika penggunaan memori dan kecepatan pencarian menjadi perhatian utama.Dalam kebanyakan kasus, kami sarankan Anda menetapkan nilai dalam kisaran ini: [5, 100]. |
efConstruction | 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 M . | Tipe Bilangan bulat Rentang: [1, int_max] Nilai default: 360 | efConstruction yang lebih tinggi biasanya menghasilkan indeks yang lebih akurat, karena lebih banyak koneksi potensial yang dieksplorasi. Namun, hal ini juga menyebabkan waktu pengindeksan yang lebih lama dan penggunaan memori yang lebih besar selama konstruksi.Pertimbangkan untuk meningkatkan efConstruction untuk meningkatkan akurasi, terutama dalam skenario di mana waktu pengindeksan tidak terlalu penting.Pertimbangkan untuk mengurangi efConstruction untuk mempercepat konstruksi indeks ketika keterbatasan sumber daya menjadi perhatian.Dalam kebanyakan kasus, kami menyarankan Anda menetapkan nilai dalam kisaran ini: [50, 500]. |
Parameter pencarian khusus indeks
Tabel berikut mencantumkan parameter yang dapat dikonfigurasi di search_params.params
ketika melakukan pencarian di indeks.
Parameter | Deskripsi | Rentang Nilai | Saran Penyetelan |
---|---|---|---|
ef | Mengontrol luasnya pencarian selama pengambilan tetangga terdekat. 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) | ef yang lebih besar umumnya menghasilkan akurasi pencarian yang lebih tinggi karena lebih banyak tetangga potensial yang dipertimbangkan. Akan tetapi, hal ini juga meningkatkan waktu pencarian.Pertimbangkan untuk meningkatkan ef ketika mencapai recall yang tinggi sangat penting dan kecepatan pencarian tidak terlalu menjadi perhatian.Pertimbangkan untuk mengurangi ef 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: [K, 10K]. |