Dokumen ini menjelaskan penggunaan lanjutan FalconSeek untuk pengambilan vektor, termasuk pemilihan algoritma seperti HNSW dan RabitQGraph guna mempercepat kueri sesuai kebutuhan spesifik—mulai dari penyimpanan hemat biaya untuk data skala besar hingga optimasi performa ekstrem. Panduan ini mencakup pemilihan algoritma, pengaturan parameter, manajemen indeks, teknik penyetelan dinamis, serta contoh kode lengkap untuk membantu Anda mengimplementasikan pengambilan vektor yang efisien.
Informasi latar belakang
FalconSeek meningkatkan struktur indeks asli Alibaba Cloud ES dengan menambahkan indeks mesin vektor berbasis C++. Indeks vektor FalconSeek dikembangkan oleh Alibaba dan mendukung layanan utama dalam Alibaba Group, seperti Taobao, Tmall Search, Recommendation, dan Pailitao (search by image). Anda dapat memanfaatkan indeks vektor berkinerja tinggi yang terintegrasi dalam kernel FalconSeek untuk membangun aplikasi AI yang efisien, seperti pencarian berdasarkan gambar dan pencarian semantik.
Indeks vektor FalconSeek sepenuhnya kompatibel dengan fitur mesin vektor open source ES, seperti pencarian k-Nearest Neighbors (k-NN). Untuk menggunakan FalconSeek dalam indeks Alibaba Cloud ES, atur index_options.type menjadi havenask_native dalam konfigurasi indeks. Informasi lebih lanjut tentang pengaturan parameter lanjutan tersedia dalam penjelasan detail berikut.
Contoh penggunaan
Contoh dasar
Contoh berikut menunjukkan cara membuat indeks untuk menyimpan dan mengambil data vektor. Indeks tersebut diberi nama my_falcon_seek_index dan berisi bidang vektor bernama product_vector dengan dimensi 128 serta menggunakan algoritma HNSW.
Buat indeks.
PUT /my_falcon_seek_index { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "properties": { "product_vector": { "type": "dense_vector", "dims": 128, "index": true, "similarity": "l2_norm", "index_options": { "type": "havenask_native", "knn_type": "HNSW", "m": 32, "ef_construction": 400 } }, "category": { "type": "keyword" } } } }Parameter Inti
Tipe bidang
dense_vectordigunakan untuk menyimpan data vektor padat. Saat mendefinisikan bidang bertipe ini dalammappings, Anda harus menentukan properti inti berikut:dims: Dimensi vektor.similarity: Fungsi untuk menghitung kesamaan antara vektor.index_options: Konfigurasi detail untuk indeks vektor, termasuk tipe algoritma dan parameter terkait.
Fungsi
similaritydigunakan untuk mengukur tingkat kesamaan antara dua vektor. Pemilihan fungsi yang tepat sangat penting bagi performa recall.Fungsi
Deskripsi
Skenario
l2_norm
Jarak Euclidean. Fungsi ini menghitung jarak garis lurus antara dua vektor dalam ruang multidimensi. Jarak yang lebih kecil menunjukkan kesamaan yang lebih besar.
Skema umum, seperti pengenalan gambar dan pengenalan wajah.
cosine
Kesamaan cosinus. Fungsi ini menghitung cosinus sudut antara arah dua vektor. Nilai yang lebih mendekati 1 menunjukkan kesamaan yang lebih besar.
Analisis kesamaan semantik teks. Fungsi ini tidak dipengaruhi oleh panjang vektor.
dot_product
Produk dalam. Fungsi ini menghitung hasil kali titik dua vektor. Nilai yang lebih besar menunjukkan kesamaan yang lebih besar.
Cocok untuk skenario yang perlu mempertimbangkan besarnya vektor, seperti sistem rekomendasi.
max_inner_productSama seperti dot_product, tetapi tidak memerlukan normalisasi vektor.
Cocok untuk skenario yang perlu mempertimbangkan besarnya vektor, seperti sistem rekomendasi.
Tulis data. Anda dapat menulis dokumen yang berisi vektor dan metadata, seperti kategori produk, ke dalam indeks. Panjang array
product_vectorharus sama dengan dimensi yang ditentukan olehdims(128).POST /my_falcon_seek_index/_doc/1 { "product_vector": [0.12, -0.05, 0.08, 0.24, -0.17, 0.31, 0.02, -0.19, 0.11, 0.28, -0.03, 0.15, 0.22, -0.11, 0.09, 0.33, -0.07, 0.14, 0.26, -0.21, 0.18, 0.29, -0.13, 0.06, 0.35, -0.08, 0.16, 0.23, -0.15, 0.12, 0.27, -0.22, 0.19, 0.32, -0.14, 0.07, 0.25, -0.18, 0.13, 0.30, -0.09, 0.17, 0.24, -0.16, 0.10, 0.34, -0.10, 0.20, 0.31, -0.23, 0.15, 0.28, -0.12, 0.11, 0.26, -0.19, 0.14, 0.29, -0.17, 0.08, 0.22, -0.20, 0.16, 0.27, -0.15, 0.09, 0.25, -0.21, 0.18, 0.30, -0.13, 0.07, 0.24, -0.22, 0.19, 0.32, -0.16, 0.10, 0.26, -0.18, 0.12, 0.28, -0.14, 0.06, 0.23, -0.19, 0.15, 0.29, -0.11, 0.05, 0.21, -0.17, 0.13, 0.27, -0.10, 0.04, 0.20, -0.15, 0.11, 0.25, -0.09, 0.03, 0.19, -0.13, 0.10, 0.24, -0.08, 0.02, 0.18, -0.12, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22, 0.05, -0.06, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22], "category": "clothes" } POST /my_falcon_seek_index/_doc/2 {"product_vector":[0.12, -0.05, 0.08, 0.24, -0.17, 0.31, 0.02, -0.19, 0.11, 0.28, -0.03, 0.15, 0.22, -0.11, 0.09, 0.33, -0.07, 0.14, 0.26, -0.21, 0.18, 0.29, -0.13, 0.06, 0.35, -0.08, 0.16, 0.23, -0.15, 0.12, 0.27, -0.22, 0.19, 0.32, -0.14, 0.07, 0.25, -0.18, 0.13, 0.30, -0.09, 0.17, 0.24, -0.16, 0.10, 0.34, -0.10, 0.20, 0.31, -0.23, 0.15, 0.28, -0.12, 0.11, 0.26, -0.19, 0.14, 0.29, -0.17, 0.08, 0.22, -0.20, 0.16, 0.27, -0.15, 0.09, 0.25, -0.21, 0.18, 0.30, -0.13, 0.07, 0.24, -0.22, 0.19, 0.32, -0.16, 0.10, 0.26, -0.18, 0.12, 0.28, -0.14, 0.06, 0.23, -0.19, 0.15, 0.29, -0.11, 0.05, 0.21, -0.17, 0.13, 0.27, -0.10, 0.04, 0.20, -0.15, 0.11, 0.25, -0.09, 0.03, 0.19, -0.13, 0.10, 0.24, -0.08, 0.02, 0.18, -0.12, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22, 0.05, -0.06, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22],"category": "clothes"}Pengambilan vektor (k-NN). Anda dapat menemukan 5 dokumen paling mirip berdasarkan vektor kueri tertentu.
GET /my_falcon_seek_index/_search { "knn": { "field": "product_vector", "query_vector": [0.12, -0.05, 0.01, 0.24, -0.17, 0.31, 0.02, -0.19, 0.11, 0.28, -0.03, 0.15, 0.22, -0.11, 0.09, 0.23, -0.07, 0.14, 0.26, -0.21, 0.18, 0.29, -0.13, 0.06, 0.35, -0.18, 0.16, 0.23, -0.15, 0.12, 0.27, -0.22, 0.19, 0.32, -0.14, 0.87, 0.25, -0.18, 0.13, 0.30, -0.09, 0.17, 0.24, -0.16, 0.10, 0.64, -0.10, 0.20, 0.31, -0.23, 0.15, 0.28, -0.12, 0.11, 0.26, -0.19, 0.14, 0.29, -0.17, 0.08, 0.22, -0.20, 0.16, 0.27, -0.15, 0.09, 0.25, -0.21, 0.18, 0.30, -0.13, 0.07, 0.24, -0.22, 0.19, 0.52, -0.16, 0.10, 0.26, -0.18, 0.12, 0.28, -0.14, 0.06, 0.23, -0.19, 0.14, 0.29, -0.11, 0.05, 0.21, -0.17, 0.13, 0.27, -0.10, 0.04, 0.20, -0.15, 0.11, 0.25, -0.09, 0.03, 0.19, -0.13, 0.10, 0.24, -0.08, 0.02, 0.18, -0.12, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22, 0.05, -0.06, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.12], "k": 5, "num_candidates": 100 } }Parameter Inti
Kueri
knndigunakan untuk melakukan pencarian k-NN.field: Nama bidangdense_vectoryang akan dikueri.query_vector: Vektor yang digunakan untuk kueri. Dimensinya harus sesuai dengan definisi bidang.k: Jumlah hasil paling mirip yang akan dikembalikan.num_candidates: Ukuran set kandidat yang dicari secara internal oleh algoritma pada setiap shard. Nilai ini harus lebih besar darikdan biasanya merupakan kelipatan darik. Nilai yang lebih besar meningkatkan tingkat recall tetapi juga meningkatkan latensi kueri.
Pengambilan terfilter. Anda dapat memfilter hasil selama pengambilan vektor untuk memenuhi kebutuhan bisnis yang lebih kompleks. Contoh berikut menemukan 5 dokumen paling mirip dalam kategori
category"shoes".GET /my_falcon_seek_index/_search { "knn": { "field": "product_vector", "query_vector": [ 0.12, -0.05, 0.01, 0.24, -0.17, 0.31, 0.02, -0.19, 0.11, 0.28, -0.03, 0.15, 0.22, -0.11, 0.09, 0.23, -0.07, 0.14, 0.26, -0.21, 0.18, 0.29, -0.13, 0.06, 0.35, -0.18, 0.16, 0.23, -0.15, 0.12, 0.27, -0.22, 0.19, 0.32, -0.14, 0.87, 0.25, -0.18, 0.13, 0.30, -0.09, 0.17, 0.24, -0.16, 0.10, 0.64, -0.10, 0.20, 0.31, -0.23, 0.15, 0.28, -0.12, 0.11, 0.26, -0.19, 0.14, 0.29, -0.17, 0.08, 0.22, -0.20, 0.16, 0.27, -0.15, 0.09, 0.25, -0.21, 0.18, 0.30, -0.13, 0.07, 0.24, -0.22, 0.19, 0.52, -0.16, 0.10, 0.26, -0.18, 0.12, 0.28, -0.14, 0.06, 0.23, -0.19, 0.14, 0.29, -0.11, 0.05, 0.21, -0.17, 0.13, 0.27, -0.10, 0.04, 0.20, -0.15, 0.11, 0.25, -0.09, 0.03, 0.19, -0.13, 0.10, 0.24, -0.08, 0.02, 0.18, -0.12, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22, 0.05, -0.06, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.12 ], "k": 5, "num_candidates": 100, "filter": { "term": { "category": "shoes" } } } }
Fitur lanjutan: Pengambilan terfilter dengan tags_filter
Parameter tags_filter menyediakan mekanisme pra-filtering yang dioptimalkan untuk algoritma HNSW dan QGraph. Fitur ini menawarkan performa lebih tinggi dibandingkan filter standar bool filter karena mengecualikan node yang tidak cocok sejak awal proses traversal graf.
Skema: Anda dapat menggunakan fitur ini ketika bidang filter memiliki jumlah nilai unik yang terbatas, seperti ID kategori atau merek, dan Anda memerlukan performa kueri tinggi.
Cara mengaktifkan fitur ini:
Dalam
index_optionsdimappings, deklarasikan bidang bertipekeywordyang akan digunakan untuk filtering dengan parametertags.PUT /my_vector_index_with_tags { "mappings": { "properties": { "product_vector": { "type": "dense_vector", "dims": 128, "index_options": { "type": "havenask_native", "knn_type": "HNSW", "tags": ["category"] // Deklarasikan bidang category untuk tags_filter } }, "category": { "type": "keyword" // Harus bertipe keyword } } } }Dalam kueri
knn, gunakan parametertags_filterdengan sintaks"field_name = value". Parameter ini mendukung logika|(OR) dan&(AND).GET /my_vector_index_with_tags/_search { "knn": { "field": "product_vector", "query_vector": [...], "k": 5, "tags_filter": "category = shoes | category = socks" } }
Pemilihan algoritma dan panduan performa
Pemilihan algoritma knn_type yang tepat sangat penting untuk mencapai keseimbangan optimal antara performa, biaya, dan presisi.
Perbandingan dan rekomendasi algoritma
Algoritma | Tingkat recall | Kecepatan kueri | Penggunaan memori | Skenario dan Rekomendasi | Batasan utama |
HNSW | Tinggi | Cepat | Sedang | Pilihan pertama untuk tujuan umum. Cocok untuk sebagian besar skenario, memberikan keseimbangan terbaik antara tingkat recall, performa, dan konsumsi resource. Berkinerja baik dengan dataset berukuran 100.000 hingga 10 juta dokumen. | Tidak ada batasan khusus. |
RabitQGraph | Tinggi | Tercepat | Terendah | Untuk skenario performa ekstrem dan sensitif biaya. Cocok untuk dataset yang memerlukan latensi kueri tingkat milidetik atau sangat sensitif terhadap biaya memori, terutama untuk dataset sangat besar (lebih dari 10 juta dokumen). | Hanya mendukung kesamaan |
QGraph | Tinggi | Cepat | Rendah | Untuk skenario skala besar yang sensitif biaya penyimpanan. Mengurangi penggunaan memori dan penyimpanan secara signifikan melalui kuantisasi vektor. Cocok untuk dataset dengan lebih dari 5 juta dokumen. | Tidak ada batasan khusus. |
QC | Sedang | Sedang | Rendah | Untuk skenario skala besar dengan keterbatasan memori. Pertimbangkan opsi ini ketika waktu build tidak sensitif, tetapi resource memori runtime sangat terbatas. Cocok untuk dataset dengan lebih dari 1 juta dokumen. | Waktu build lebih lama. |
Linear | Tertinggi (100%) | Lambat | Rendah | Untuk dataset kecil atau skenario yang memerlukan presisi absolut. Cocok untuk skenario di mana jumlah total dokumen kurang dari | Hanya cocok untuk dataset kecil. |
Jalur pemilihan berdasarkan skenario
Jika Anda baru memulai atau tidak yakin algoritma mana yang harus digunakan, pilih
HNSW.Jika volume data meningkat dan performa menurun:
Jika Anda memiliki memori yang cukup dan ingin mencapai Queries Per Second (QPS) lebih tinggi, migrasi dari
HNSWkeRabitQGraphjika persyaratan untuk `RabitQGraph` terpenuhi.Jika biaya memori atau penyimpanan menjadi perhatian, migrasi dari
HNSWkeQGraphdan konfigurasikanquantizer.
Untuk dataset sangat besar dengan lebih dari 10 juta dokumen:
Jika Anda memiliki persyaratan latensi yang sangat tinggi, pilih
RabitQGraph.Jika Anda sensitif terhadap biaya dan memiliki persyaratan latensi yang sedikit lebih rendah, pilih
QGraph.
Manajemen indeks (Mappings)
Saat membuat indeks, semua konfigurasi terkait vektor diatur dalam blok index_options di mappings.
PUT /<your_index_name>
{
"mappings": {
"properties": {
"<your_vector_field>": {
"type": "dense_vector",
"dims": 768,
"similarity": "l2_norm",
"index_options": {
// --- Parameter umum ---
"type": "havenask_native",
"knn_type": "HNSW",
// --- Parameter pembangunan algoritma ---
"m": 32,
"ef_construction": 400,
// --- Parameter lanjutan ---
"thread_count": 8
}
}
}
}
}Parameter umum
Parameter | Deskripsi | Tipe | Wajib | Default |
| Menentukan mesin indeks vektor FalconSeek. Harus diatur ke | String | Ya | Tidak ada |
| Menentukan algoritma indeks vektor. Opsi yang tersedia adalah | String | Tidak |
|
Parameter pembangunan algoritma
Parameter berikut berlaku selama pembangunan indeks dan menentukan struktur serta kualitas indeks.
Parameter umum untuk HNSW dan QGraph
Parameter | Deskripsi | Tipe | Default | Nilai yang direkomendasikan dan dampaknya |
| Jumlah maksimum tetangga untuk setiap node dalam graf. | Integer |
| Dampak: Mempengaruhi langsung tingkat recall dan penggunaan memori. |
| Lebar pencarian set kandidat selama pembangunan graf. | Integer |
| Dampak: Menentukan kualitas dan waktu pembangunan indeks. |
Parameter khusus QGraph
Parameter | Deskripsi | Tipe | Default | Nilai yang direkomendasikan dan dampaknya |
| Metode kuantisasi vektor, digunakan untuk mengompresi vektor guna mengurangi penggunaan memori dan penyimpanan. | String | Tidak ada | Dampak: Mengurangi penggunaan resource secara signifikan, tetapi mungkin menyebabkan sedikit kehilangan presisi. |
Parameter lanjutan
Parameter | Deskripsi | Tipe | Default | Nilai yang direkomendasikan dan dampaknya |
| Jumlah thread paralel yang digunakan selama pembangunan indeks. | Integer |
| Dampak: Mempercepat proses build. |
| Mendeklarasikan daftar bidang untuk filtering berperforma-tinggi dengan | Array |
| Dampak: Mengaktifkan pra-filtering berperforma-tinggi. |
| Jika jumlah total dokumen dalam indeks berada di bawah ambang batas ini, sistem secara otomatis beralih ke pencarian | Integer |
| Dampak: Menghindari pembangunan struktur indeks kompleks untuk dataset kecil. |
| Antarmuka konfigurasi untuk parameter mesin dasar, digunakan untuk penyetelan lanjutan. | Object |
| Dampak: Memungkinkan kontrol detail halus atas setiap aspek proses build dan kueri. |
Parameter index_params menyediakan akses langsung ke parameter dasar proxima.* dan param.*. Sebagai contoh, parameter tingkat atas m berkorespondensi dengan parameter dasar proxima.hnsw.builder.max_neighbor_count. Gunakan konfigurasi ini hanya jika perlu menyesuaikan detail yang tidak tersedia melalui parameter tingkat atas.
json
"index_options": { "knn_type": "HNSW", "m": 32, // Akan ditimpa oleh index_params di bawah "index_params": { "proxima.hnsw.builder.max_neighbor_count": 48 // Nilai efektif akhir adalah 48 }}Body kueri knn
Parameter | Deskripsi | Tipe | Wajib |
| Nama bidang | String | Ya |
| Vektor yang digunakan untuk kueri. | Array | Ya |
| Jumlah hasil paling mirip yang akan dikembalikan. | Integer | Ya |
| Ukuran set kandidat pencarian pada setiap shard. Nilai yang lebih besar meningkatkan tingkat recall tetapi memperlambat kueri. | Integer | Tidak (Direkomendasikan) |
| (Opsional) Pra-filtering berperforma-tinggi untuk | String | Tidak |
| (Opsional) Menyesuaikan beberapa parameter pencarian secara dinamis saat kueri untuk penyetelan sementara. | Object | Tidak |
Deskripsi parameter
HNSW
Parameter untuk algoritma Hierarchical Navigable Small Worlds (HNSW) menggunakan namespace proxima.hnsw. dan dapat diatur menggunakan index_params.
HNSW Builder
Nama parameter | Tipe | Default | Deskripsi |
proxima.hnsw.builder.max_neighbor_count | uint32 | 100 | Jumlah tetangga dalam graf. Nilai yang lebih besar membuat graf lebih akurat tetapi meningkatkan overhead komputasi dan penyimpanan. Umumnya tidak boleh melebihi dimensi fitur. Maksimum adalah 65535. |
proxima.hnsw.builder.efconstruction | uint32 | 500 | Mengontrol presisi pembangunan graf. Nilai yang lebih besar menghasilkan graf yang lebih akurat tetapi memerlukan waktu build lebih lama. |
proxima.hnsw.builder.thread_count | uint32 | 0 | Jumlah thread yang digunakan selama pembangunan. Jika diatur ke 0, akan menggunakan jumlah core CPU. |
proxima.hnsw.builder.memory_quota | uint64 | 0 | Membatasi memori maksimum untuk pembangunan. Pembangunan berbasis disk saat ini tidak didukung. Jika nilai ini terlampaui, proses build akan gagal. |
proxima.hnsw.builder.scaling_factor | uint32 | 50 | Rasio node antar lapisan graf. Umumnya tidak perlu dimodifikasi. Rentang nilai: [5,1000]. |
proxima.hnsw.builder.neighbor_prune_ratio | float | 0.5 | Mengontrol jumlah tetangga tempat pemangkasan edge dimulai dalam tabel tetangga. Umumnya tidak perlu dimodifikasi. |
proxima.hnsw.builder.upper_neighbor_ratio | float | 0.5 | Rasio tetangga di lapisan atas graf relatif terhadap graf lapisan 0. Umumnya tidak perlu dimodifikasi. |
proxima.hnsw.builder.enable_adsampling | bool | false | Nonaktif secara default. Saat ini hanya mendukung perhitungan jarak Euclidean untuk dataset fp32. Tidak direkomendasikan untuk dimensi di bawah 256. |
proxima.hnsw.builder.slack_pruning_factor | float | 1.0 | Default adalah 1.0. Direkomendasikan antara [1.1, 1.2]. Untuk gist960 dan sift128, disarankan 1.1. |
HNSW Searcher
Nama parameter | Tipe | Default | Deskripsi |
proxima.hnsw.searcher.ef | uint32 | 500 | Digunakan untuk mengontrol presisi pengambilan. Nilai yang lebih besar memindai lebih banyak dokumen dan meningkatkan tingkat recall. |
proxima.hnsw.searcher.max_scan_ratio | float | 0.1 | Mengontrol proporsi maksimum dokumen yang dipindai selama pengambilan. Jika nilai ef konvergen lebih awal, rasio ini mungkin tidak tercapai. |
proxima.hnsw.searcher.neighbors_in_memory_enable | bool | false | Jika diaktifkan, menyimpan tabel tetangga dalam memori, yang meningkatkan performa tetapi mengonsumsi lebih banyak memori. |
proxima.hnsw.searcher.check_crc_enable | bool | false | Menentukan apakah akan melakukan pemeriksaan redundansi siklik (CRC) pada indeks. Mengaktifkan ini akan meningkatkan waktu pemuatan. |
proxima.hnsw.searcher.visit_bloomfilter_enable | bool | false | Menggunakan bloom filter sebagai kontainer untuk deduplikasi node graf yang telah dikunjungi. Pendekatan ini mengoptimalkan penggunaan memori, meskipun sedikit menurunkan performa. |
proxima.hnsw.searcher.visit_bloomfilter_negative_prob | float | 0.001 | Akurasi bloom filter. Nilai yang lebih kecil lebih akurat tetapi menggunakan lebih banyak memori. |
proxima.hnsw.searcher.brute_force_threshold | int | 1000 | Jika jumlah total dokumen kurang dari nilai ini, pencarian linear dilakukan. |
Contoh konfigurasi HNSW
// Konfigurasi HNSW dasar
PUT /hnsw_basic
{
"mappings": {
"properties": {
"vector": {
"type": "dense_vector",
"dims": 768,
"index": true,
"similarity": "cosine",
"index_options": {
"type": "havenask_native",
"knn_type": "HNSW"
}
}
}
}
}
// Konfigurasi HNSW berkinerja-tinggi
PUT /hnsw_performance
{
"mappings": {
"properties": {
"vector": {
"type": "dense_vector",
"dims": 1024,
"index": true,
"similarity": "dot_product",
"index_options": {
"type": "havenask_native",
"knn_type": "HNSW",
"m": 48,
"ef_construction": 500,
"thread_count": 8,
"linear_build_threshold": 1000,
"is_embedding_saved": true,
"embedding_load_strategy": "ANN_INDEX_FILE",
"index_load_strategy": "MEM"
}
}
}
}
}
RabitQGraph
RabitQGraph Builder
Nama parameter | Tipe | Default | Deskripsi |
param.rabitQGraph.builder.neighbor_cnt | uint32 | 128 | Jumlah tetangga untuk setiap node, memengaruhi konektivitas graf dan presisi pencarian. |
param.rabitQGraph.builder.ef_construction | uint32 | 512 | Parameter EF untuk pembangunan, yang mengontrol jumlah node kandidat selama konstruksi. |
param.rabitQGraph.builder.prune_ratio | float | 0.5 | Rasio pemangkasan tetangga, digunakan untuk mengoptimalkan struktur graf. |
param.rabitQGraph.builder.cluster_count | uint32 | 64 | Jumlah centroid kluster, digunakan untuk kuantisasi vektor. |
param.rabitQGraph.builder.quantized_bit_count | uint32 | 1 | Jumlah bit untuk kuantisasi. Hanya dapat diatur ke 1, 4, 5, 8, atau 9. |
param.rabitQGraph.builder.slack_prune_factor | float | 1.0 | Faktor pemangkasan slack, digunakan untuk mengontrol kebijakan pemangkasan. |
param.rabitQGraph.builder.repair_connectivity | bool | true | Menentukan apakah akan memperbaiki konektivitas graf. |
param.rabitQGraph.builder.thread_count | uint32 | 0 | Jumlah thread yang digunakan selama pembangunan. Jika diatur ke 0, akan menggunakan jumlah core CPU. |
param.rabitQGraph.builder.ckpt_count | uint32 | 0 | Jumlah checkpoint, digunakan untuk build bertahap. |
param.rabitQGraph.builder.ckpt_threshold | uint32 | 2000000 | Ambang batas checkpoint. |
RabitQGraph Searcher
Nama parameter | Tipe | Default | Deskripsi |
param.rabitQGraph.searcher.ef | uint32 | 250 | Parameter EF untuk pencarian, yang memengaruhi presisi dan performa pencarian. |
param.rabitQGraph.searcher.max_scan_ratio | double | 0.05 | Rasio pemindaian maksimum, yang membatasi persentase node yang dicari. |
param.rabitQGraph.searcher.check_crc_enable | bool | false | Menentukan apakah akan mengaktifkan pemeriksaan CRC. |
param.rabitQGraph.searcher.thread_count | uint32 | 1 | Jumlah thread yang digunakan untuk pencarian. |
param.rabitQGraph.searcher.thread_safe_filter | bool | false | Menentukan apakah akan mengaktifkan filtering aman-thread. |
Contoh konfigurasi RabitQGraph
// Konfigurasi berkinerja-tinggi
{
"index_params": {
"param.rabitQGraph.builder.neighbor_cnt": 256,
"param.rabitQGraph.builder.ef_construction": 512,
"param.rabitQGraph.builder.quantized_bit_count": 8,
"param.rabitQGraph.builder.cluster_count": 128,
"param.rabitQGraph.builder.thread_count": 8,
"param.rabitQGraph.searcher.ef": 300,
"param.rabitQGraph.searcher.max_scan_ratio": 0.1
}
}
// Konfigurasi hemat memori
{
"index_params": {
"param.rabitQGraph.builder.neighbor_cnt": 64,
"param.rabitQGraph.builder.ef_construction": 200,
"param.rabitQGraph.builder.quantized_bit_count": 1,
"param.rabitQGraph.builder.cluster_count": 32,
"param.rabitQGraph.searcher.ef": 150,
"param.rabitQGraph.searcher.max_scan_ratio": 0.03
}
}
// Konfigurasi seimbang
{
"index_params": {
"param.rabitQGraph.builder.neighbor_cnt": 128,
"param.rabitQGraph.builder.ef_construction": 400,
"param.rabitQGraph.builder.quantized_bit_count": 4,
"param.rabitQGraph.builder.cluster_count": 64,
"param.rabitQGraph.searcher.ef": 250
}
}
Linear
Algoritma Linear melakukan pencarian brute-force linear. Parameternya relatif sederhana dan menggunakan namespace proxima.linear..
Linear Builder/Searcher
Nama parameter | Tipe | Default | Deskripsi |
proxima.linear.builder.column_major_order | string | false | Menentukan apakah akan menggunakan urutan row-major (false) atau column-major (true) untuk fitur selama pembangunan. |
proxima.linear.searcher.read_block_size | uint32 | 1048576 | Ukuran blok yang dibaca ke memori sekaligus selama fase pencarian. Nilai yang direkomendasikan adalah 1 MB. |
Contoh konfigurasi Linear
// Konfigurasi dasar
{
"index_params": {
"proxima.linear.builder.column_major_order": "false",
"proxima.linear.searcher.read_block_size": 1048576
}
}
// Konfigurasi memori besar
{
"index_params": {
"proxima.linear.builder.column_major_order": "true",
"proxima.linear.searcher.read_block_size": 2097152
}
}
QC
Algoritma QC (Quantization Clustering) menggunakan indeks pengelompokan kuantisasi. Parameternya menggunakan namespace proxima.qc..
QC Builder
Nama parameter | Tipe | Default | Deskripsi |
proxima.qc.builder.train_sample_count | uint32 | 0 | Menentukan jumlah data pelatihan. Jika 0, semua data digunakan. |
proxima.qc.builder.thread_count | uint32 | 0 | Jumlah thread yang digunakan selama pembangunan. Jika diatur ke 0, akan menggunakan jumlah core CPU. |
proxima.qc.builder.centroid_count | string | - | Parameter centroid kluster. Mendukung pengelompokan hirarkis. Pisahkan lapisan dengan "*". |
proxima.qc.builder.cluster_class | string | OptKmeansCluster | Menentukan metode pengelompokan. |
proxima.qc.builder.cluster_auto_tuning | bool | false | Menentukan apakah akan mengaktifkan penyetelan otomatis jumlah centroid. |
proxima.qc.builder.optimizer_class | string | HcBuilder | Pengoptimal untuk bagian centroid, digunakan untuk meningkatkan presisi selama klasifikasi. |
proxima.qc.builder.optimizer_params | IndexParams | - | Parameter build dan pengambilan yang berkorespondensi dengan metode optimasi. |
proxima.qc.builder.converter_class | string | - | Jika Measure adalah InnerProduct, transformasi Mips dilakukan secara otomatis. |
proxima.qc.builder.converter_params | IndexParams | - | Parameter inisialisasi untuk converter_class. |
proxima.qc.builder.quantizer_class | string | - | Mengonfigurasi kuantisator. Opsi termasuk Int8QuantizerConverter, Int4QuantizerConverter, dll. |
proxima.qc.builder.quantizer_params | IndexParams | - | Parameter terkait kuantisator. |
proxima.qc.builder.quantize_by_centroid | bool | false | Saat menggunakan quantizer_class, menentukan apakah akan mengkuantisasi berdasarkan centroid. |
proxima.qc.builder.store_original_features | bool | false | Menentukan apakah akan menyimpan fitur asli. |
QC Searcher
Nama parameter | Tipe | Default | Deskripsi |
proxima.qc.searcher.scan_ratio | float | 0.01 | Digunakan untuk menghitung max_scan_num: jumlah total dokumen * scan_ratio. |
proxima.qc.searcher.optimizer_params | IndexParams | - | Menentukan parameter pengambilan online yang berkorespondensi dengan pengoptimal yang digunakan selama pembangunan. |
proxima.qc.searcher.brute_force_threshold | int | 1000 | Jika jumlah total dokumen kurang dari nilai ini, pencarian linear dilakukan. |
Contoh konfigurasi QC
// Konfigurasi dasar
{
"index_params": {
"proxima.qc.builder.thread_count": 4,
"proxima.qc.builder.centroid_count": "1000",
"proxima.qc.builder.cluster_class": "OptKmeansCluster",
"proxima.qc.searcher.scan_ratio": 0.02
}
}
// Konfigurasi pengelompokan hirarkis
{
"index_params": {
"proxima.qc.builder.thread_count": 8,
"proxima.qc.builder.centroid_count": "100*100",
"proxima.qc.builder.optimizer_class": "HnswBuilder",
"proxima.qc.builder.quantizer_class": "Int8QuantizerConverter",
"proxima.qc.searcher.scan_ratio": 0.01
}
}
// Konfigurasi presisi tinggi
{
"index_params": {
"proxima.qc.builder.thread_count": 12,
"proxima.qc.builder.centroid_count": "2000",
"proxima.qc.builder.train_sample_count": 100000,
"proxima.qc.builder.store_original_features": true,
"proxima.qc.searcher.scan_ratio": 0.05
}
}
QGraph
Algoritma QGraph (Quantized Graph) menggunakan indeks graf terkuantisasi. Algoritma ini mewarisi sebagian besar parameter dari HNSW dan menambahkan parameter terkait kuantisasi.
QGraph Builder
QGraph mewarisi semua parameter HNSW Builder dan menambahkan yang berikut:
Nama parameter | Tipe | Default | Deskripsi |
proxima.qgraph.builder.quantizer_class | string | - | Mengonfigurasi kuantisator. Opsi termasuk Int8QuantizerConverter, Int4QuantizerConverter, HalfFloatConverter, dan DoubleBitConverter. |
proxima.qgraph.builder.quantizer_params | IndexParams | - | Mengonfigurasi parameter terkait kuantisator. |
Semua parameter proxima.hnsw.builder.* juga berlaku untuk QGraph.
QGraph Searcher
QGraph mewarisi semua parameter HNSW Searcher.
Contoh konfigurasi QGraph
// Konfigurasi kuantisasi Int8
{
"index_params": {
"proxima.hnsw.builder.max_neighbor_count": 32,
"proxima.hnsw.builder.efconstruction": 400,
"proxima.hnsw.builder.thread_count": 4,
"proxima.qgraph.builder.quantizer_class": "Int8QuantizerConverter",
"proxima.qgraph.builder.quantizer_params": {},
"proxima.hnsw.searcher.ef": 300
}
}
// Konfigurasi kuantisasi Int4 (lebih hemat memori)
{
"index_params": {
"proxima.hnsw.builder.max_neighbor_count": 48,
"proxima.hnsw.builder.efconstruction": 500,
"proxima.hnsw.builder.thread_count": 6,
"proxima.qgraph.builder.quantizer_class": "Int4QuantizerConverter",
"proxima.qgraph.builder.quantizer_params": {},
"proxima.hnsw.searcher.ef": 400,
"proxima.hnsw.searcher.max_scan_ratio": 0.1
}
}
// Konfigurasi kuantisasi HalfFloat (presisi tinggi)
{
"index_params": {
"proxima.hnsw.builder.max_neighbor_count": 64,
"proxima.hnsw.builder.efconstruction": 600,
"proxima.hnsw.builder.thread_count": 8,
"proxima.qgraph.builder.quantizer_class": "HalfFloatConverter",
"proxima.qgraph.builder.quantizer_params": {},
"proxima.hnsw.searcher.ef": 500
}
}
Penyesuaian parameter dinamis dengan search_params
Anda dapat menyesuaikan sementara parameter pencarian tertentu tanpa membangun ulang indeks untuk menyeimbangkan tingkat recall dan latensi kueri dalam skenario berbeda.
Sebagai contoh, untuk kueri online normal, gunakan nilai ef default atau lebih rendah guna memastikan latensi rendah. Untuk analitik batch atau tugas yang memerlukan presisi tinggi, tingkatkan sementara nilai ef menggunakan search_params untuk mendapatkan tingkat recall lebih tinggi.
HNSW
{
"search_params": {
"proxima.hnsw.searcher.ef": "400",
"proxima.hnsw.searcher.max_scan_ratio": "0.15"
}
}
QGraph
{
"search_params": {
"proxima.hnsw.searcher.ef": "400",
"proxima.hnsw.searcher.max_scan_ratio": "0.15"
}
}
QC
{
"search_params": {
"proxima.qc.searcher.scan_ratio": "0.02"
}
}
RabitQGraph
{
"search_params": {
"param.rabitQGraph.searcher.ef": "300",
"param.rabitQGraph.searcher.max_scan_ratio": "0.08"
}
}
Contoh konfigurasi search_params
// Menyesuaikan dinamis presisi dan performa untuk HNSW
GET vector_index/_search
{
"knn": {
"field": "vector",
"query_vector": [0.1, 0.2, 0.3],
"k": 10,
"num_candidates": 100,
"search_params": {
"proxima.hnsw.searcher.ef": "500",
"proxima.hnsw.searcher.max_scan_ratio": "0.2"
}
}
}
// Menyesuaikan dinamis rasio pemindaian untuk QC
GET vector_index/_search
{
"knn": {
"field": "vector",
"query_vector": [0.1, 0.2, 0.3],
"k": 10,
"num_candidates": 100,
"search_params": {
"proxima.qc.searcher.scan_ratio": "0.05"
}
}
}
// Menyesuaikan dinamis presisi pencarian untuk RabitQGraph
GET vector_index/_search
{
"knn": {
"field": "vector",
"query_vector": [0.1, 0.2, 0.3],
"k": 10,
"num_candidates": 100,
"search_params": {
"param.rabitQGraph.searcher.ef": "400",
"param.rabitQGraph.searcher.max_scan_ratio": "0.1"
}
}
}
linear_build_threshold
Parameter ini adalah integer opsional dengan nilai default 0. Jika jumlah dokumen kurang dari ambang batas ini, pencarian linear dilakukan alih-alih membangun indeks kompleks.
// Nonaktifkan ambang batas linear
{
"linear_build_threshold": 0
}
// Gunakan pencarian linear untuk dataset kecil
{
"linear_build_threshold": 1000
}
// Ambang batas lebih besar, cocok untuk lingkungan staging
{
"linear_build_threshold": 5000
}
Lampiran: Contoh lengkap
HNSW
// Konfigurasi HNSW dasar
PUT /hnsw_basic
{
"mappings": {
"properties": {
"vector": {
"type": "dense_vector",
"dims": 768,
"index": true,
"similarity": "cosine",
"index_options": {
"type": "havenask_native",
"knn_type": "HNSW"
}
}
}
}
}
// Konfigurasi HNSW berkinerja-tinggi
PUT /hnsw_performance
{
"mappings": {
"properties": {
"vector": {
"type": "dense_vector",
"dims": 1024,
"index": true,
"similarity": "dot_product",
"index_options": {
"type": "havenask_native",
"knn_type": "HNSW",
"m": 48,
"ef_construction": 500,
"thread_count": 8,
"linear_build_threshold": 1000,
"is_embedding_saved": true,
"embedding_load_strategy": "ANN_INDEX_FILE",
"index_load_strategy": "MEM"
}
}
}
}
}
Linear
// Konfigurasi Linear dasar
PUT /linear_basic
{
"mappings": {
"properties": {
"vector": {
"type": "dense_vector",
"dims": 384,
"index": true,
"similarity": "l2_norm",
"index_options": {
"type": "havenask_native",
"knn_type": "Linear"
}
}
}
}
}
QC
// Konfigurasi QC dasar
PUT /qc_basic
{
"mappings": {
"properties": {
"vector": {
"type": "dense_vector",
"dims": 768,
"index": true,
"similarity": "cosine",
"index_options": {
"type": "havenask_native",
"knn_type": "QC"
}
}
}
}
}
// Konfigurasi QC kustom
PUT /qc_custom
{
"mappings": {
"properties": {
"vector": {
"type": "dense_vector",
"dims": 1024,
"index": true,
"similarity": "dot_product",
"index_options": {
"type": "havenask_native",
"knn_type": "QC",
"thread_count": 8,
"linear_build_threshold": 5000,
"index_params": "{\"proxima.qc.builder.thread_count\": 8, \"proxima.qc.builder.centroid_count\": \"2000\"}"
}
}
}
}
}
QGraph
// Konfigurasi QGraph dasar
PUT /qgraph_basic
{
"mappings": {
"properties": {
"vector": {
"type": "dense_vector",
"dims": 768,
"index": true,
"similarity": "cosine",
"index_options": {
"type": "havenask_native",
"knn_type": "QGraph",
"quantizer": "int8"
}
}
}
}
}
// Konfigurasi QGraph presisi tinggi
PUT /qgraph_high_precision
{
"mappings": {
"properties": {
"vector": {
"type": "dense_vector",
"dims": 1536,
"index": true,
"similarity": "cosine",
"index_options": {
"type": "havenask_native",
"knn_type": "QGraph",
"m": 40,
"ef_construction": 600,
"thread_count": 8,
"quantizer": "fp16",
"is_embedding_saved": true,
"index_load_strategy": "MEM"
}
}
}
}
}
// Konfigurasi QGraph hemat memori
PUT /qgraph_memory_optimized
{
"mappings": {
"properties": {
"vector": {
"type": "dense_vector",
"dims": 1024,
"index": true,
"similarity": "l2_norm",
"index_options": {
"type": "havenask_native",
"knn_type": "QGraph",
"m": 24,
"ef_construction": 300,
"thread_count": 6,
"quantizer": "int4",
"is_embedding_saved": false,
"index_load_strategy": "BUFFER"
}
}
}
}
}
RabitQGraph
// Konfigurasi RabitQGraph dasar (hanya mendukung kesamaan l2_norm)
PUT /rabitqgraph_basic
{
"mappings": {
"properties": {
"vector": {
"type": "dense_vector",
"dims": 64,
"index": true,
"similarity": "l2_norm",
"index_options": {
"type": "havenask_native",
"knn_type": "RabitQGraph"
}
}
}
}
}
// Konfigurasi RabitQGraph berkinerja-tinggi - menggunakan index_params dalam format Map
PUT /rabitqgraph_performance
{
"mappings": {
"properties": {
"vector": {
"type": "dense_vector",
"dims": 128,
"index": true,
"similarity": "l2_norm",
"index_options": {
"type": "havenask_native",
"knn_type": "RabitQGraph",
"thread_count": 8,
"index_params": {
"param.rabitQGraph.builder.neighbor_cnt": 256,
"param.rabitQGraph.builder.ef_construction": 512,
"param.rabitQGraph.builder.quantized_bit_count": 4,
"param.rabitQGraph.builder.cluster_count": 128,
"param.rabitQGraph.searcher.ef": 300
}
}
}
}
}
}
// Konfigurasi RabitQGraph hemat memori
PUT /rabitqgraph_memory_optimized
{
"mappings": {
"properties": {
"vector": {
"type": "dense_vector",
"dims": 192,
"index": true,
"similarity": "l2_norm",
"index_options": {
"type": "havenask_native",
"knn_type": "RabitQGraph",
"thread_count": 4,
"linear_build_threshold": 1000,
"index_params": {
"param.rabitQGraph.builder.neighbor_cnt": 64,
"param.rabitQGraph.builder.ef_construction": 200,
"param.rabitQGraph.builder.quantized_bit_count": 1,
"param.rabitQGraph.builder.cluster_count": 32,
"param.rabitQGraph.searcher.ef": 150,
"param.rabitQGraph.searcher.max_scan_ratio": 0.05
}
}
}
}
}
}
// Konfigurasi RabitQGraph dengan filtering tag
PUT /rabitqgraph_with_tags
{
"mappings": {
"properties": {
"vector": {
"type": "dense_vector",
"dims": 256,
"index": true,
"similarity": "l2_norm",
"index_options": {
"type": "havenask_native",
"knn_type": "RabitQGraph",
"tags": ["category", "region"],
"index_params": {
"param.rabitQGraph.builder.neighbor_cnt": 128,
"param.rabitQGraph.builder.ef_construction": 400,
"param.rabitQGraph.builder.quantized_bit_count": 8,
"param.rabitQGraph.searcher.ef": 250
}
}
},
"category": {
"type": "keyword"
},
"region": {
"type": "keyword"
}
}
}
}