Plug-in aliyun-knn adalah mesin pencarian vektor yang dikembangkan oleh tim Elasticsearch Alibaba Cloud. Plug-in ini menggunakan pustaka vektor Proxima, sebuah mesin pencarian vektor yang dirancang oleh Akademi DAMO Alibaba. Plug-in ini mendukung berbagai skenario seperti pencarian gambar, sidik jari video, pengenalan wajah dan suara, serta rekomendasi produk. Topik ini menjelaskan cara menggunakan plug-in aliyun-knn.
Topik ini hanya untuk referensi. Plug-in aliyun-knn digunakan oleh kluster Elasticsearch versi sebelumnya yang sudah ada.
Disarankan untuk membeli kluster Elasticsearch versi V8.15 atau lebih baru agar dapat langsung menggunakan kemampuan pencarian vektor asli yang disediakan oleh kernel mesin untuk mengimplementasikan bisnis pencarian vektor baru.
Informasi latar belakang
Skema Penggunaan
Mesin pencarian vektor Alibaba Cloud Elasticsearch digunakan dalam banyak skenario produksi di dalam Grup Alibaba, seperti Pailitao, Image Search, sidik jari video Youku, sidik jari video Qutoutiao, rekomendasi produk Taobao, pencarian kustom, dan pencarian Crossmedia.
Prinsip
Fitur pencarian vektor Alibaba Cloud Elasticsearch diimplementasikan berdasarkan plug-in aliyun-knn. Plug-in ini kompatibel dengan semua versi open source Elasticsearch, sehingga Anda dapat menggunakannya tanpa biaya pembelajaran tambahan. Selain sinkronisasi penambahan real-time dan pencarian near-real-time (NRT), indeks vektor mendukung fitur lain dari open source Elasticsearch dalam pencarian terdistribusi, seperti beberapa shard replika dan pemulihan.
nullPlug-in aliyun-knn tidak mendukung migrasi data yang dilakukan menggunakan snapshot di Object Storage Service (OSS) atau menggunakan DataWorks. Jika Anda ingin memigrasi data, disarankan menggunakan Logstash.
Algoritma
Plug-in aliyun-knn mendukung algoritma Hierarchical Navigable Small World (HNSW) dan Linear Search. Algoritma-algoritma ini cocok untuk memproses sejumlah kecil data dari penyimpanan in-memory. Deskripsi berikut memberikan perbandingan antara kinerja algoritma-algoritma tersebut.
Tabel 1. Perbandingan antara kinerja HNSW dan Linear Search
Tabel berikut mencantumkan metrik kinerja kedua algoritma pada kluster Alibaba Cloud Elasticsearch V6.7.0. Konfigurasi lingkungan pengujian:
Konfigurasi kluster: dua node data, masing-masing menawarkan 16 vCPU, 64 GiB memori, dan satu SSD standar 100-GiB.
Dataset: vektor float 128 dimensi SIFT.
Total catatan data: 20 juta.
Pengaturan indeks: pengaturan default.
Metrik Kinerja
HNSW
Linear Search
Rasio recall Top-10
98,6%
100%
Rasio recall Top-50
97,9%
100%
Rasio recall Top-100
97,4%
100%
Latensi (p99)
0,093 detik
0,934 detik
Latensi (p90)
0,018 detik
0,305 detik
nullp adalah singkatan dari persentase. Misalnya, latensi (p99) menunjukkan jumlah detik yang diperlukan untuk merespons 99% permintaan.
Prasyarat
Plug-in aliyun-knn telah diinstal. Apakah plug-in ini diinstal secara default ditentukan oleh versi kluster Elasticsearch Anda dan versi kernel kluster Elasticsearch Anda.
Versi Kluster
Versi Kernel
Deskripsi
V6.7.0
Lebih awal dari V1.2.0
Anda harus menginstal plug-in aliyun-knn secara manual di halaman Plug-in konsol Elasticsearch berdasarkan instruksi yang diberikan di Instal dan hapus plug-in bawaan.
Anda tidak dapat menggunakan fitur query script dan pemanasan indeks dari plug-in aliyun-knn. Jika Anda ingin menggunakan fitur-fitur ini, kami merekomendasikan Anda menggunakan kluster Elasticsearch dengan kernel AliES. Untuk informasi lebih lanjut, lihat Catatan rilis AliES.
Saat membuat indeks vektor, Anda hanya dapat mengatur parameter
distance_methodke nilai defaultnyaSquaredEuclidean.
V6.8
Tidak ada
V7.4
Tidak ada
V7.7
Tidak ada
V6.7.0
V1.2.0 atau lebih baru
Plug-in aliyun-knn terintegrasi ke dalam plug-in apack, yang diinstal secara default. Jika Anda ingin menghapus atau menginstal ulang plug-in aliyun-knn, Anda harus melakukan operasi pada plug-in apack. Untuk informasi lebih lanjut, lihat Gunakan fitur replikasi fisik dari plug-in apack.
Anda dapat menggunakan fitur query script dan pemanasan indeks serta fungsi ekstensi dari plug-in aliyun-knn. Sebelum menggunakan fitur dan fungsi tersebut, pastikan bahwa versi kernel kluster Anda adalah V1.3.0 atau lebih baru. Untuk informasi lebih lanjut, lihat Tingkatkan versi kluster.
Jika kesalahan parsing mapping dilaporkan saat Anda membuat indeks vektor, tingkatkan versi kernel kluster Anda ke V1.3.0 atau lebih baru dan coba lagi.
V7.10.0
V1.4.0 atau lebih baru
Plug-in aliyun-knn terintegrasi ke dalam plug-in apack, yang diinstal secara default. Jika Anda ingin menghapus atau menginstal ulang plug-in aliyun-knn, Anda harus melakukan operasi pada plug-in apack. Untuk informasi lebih lanjut, lihat Gunakan fitur replikasi fisik dari plug-in apack.
Jika versi kernel kluster Anda adalah V1.4.0 atau lebih baru, versi plug-in apack adalah yang terbaru. Anda dapat menjalankan perintah GET _cat/plugins?v untuk mendapatkan versi plug-in apack.
Versi lainnya
Tidak ada
Fitur pencarian vektor tidak didukung.
nullVersi kernel berbeda dari versi plug-in apack. Anda dapat menjalankan perintah GET _cat/plugins?v untuk mendapatkan versi plug-in apack.
Indeks direncanakan untuk kluster Anda.
Algoritma
Skema Penggunaan
Penyimpanan In-Memory
Catatan
HNSW
Setiap node hanya menyimpan volume data kecil.
Latensi respons rendah diperlukan.
Rasio recall tinggi diperlukan.
Ya
HNSW didasarkan pada algoritma pencarian serakah dan mematuhi ketidaksamaan segitiga. Ketidaksamaan segitiga menyatakan bahwa total biaya dari A ke B dan biaya dari B ke C harus lebih besar daripada biaya dari A ke C. Ruang produk dalam tidak mematuhi ketidaksamaan segitiga. Dalam kasus ini, Anda harus mengubahnya menjadi ruang Euklides atau ruang bola sebelum menggunakan algoritma HNSW.
Setelah Anda menulis data ke kluster Elasticsearch Alibaba Cloud Anda, kami merekomendasikan Anda memanggil API force merge secara berkala selama jam-jam sepi untuk menggabungkan segmen dalam shard. Ini mengurangi latensi respons.
Linear Search
Pencarian brute-force perlu dilakukan.
Rasio recall 100% diperlukan.
Latensi meningkat dengan volume data yang perlu diproses.
Perbandingan efek diperlukan.
Ya
Tidak ada.
Kluster Anda telah direncanakan.
Item
Deskripsi
Spesifikasi node data (diperlukan)
Spesifikasi node data harus 16 vCPU dan 64 GiB memori atau lebih tinggi.
nullSaat Anda menggunakan plug-in aliyun-knn untuk membuat indeks, sumber daya komputasi yang banyak diperlukan. Jika spesifikasi node data kluster Anda kecil, bottleneck mungkin mudah terjadi. Dalam kasus parah, stabilitas kluster mungkin terpengaruh. Oleh karena itu, kami merekomendasikan Anda menggunakan kluster yang spesifikasi node datanya 16 vCPU dan 64 GiB memori atau lebih tinggi.
Jenis node
Kluster Anda harus berisi node master khusus independen.
Ukuran memori off-heap
Ukuran memori off-heap kluster Anda harus lebih besar dari dua kali total ukuran data vektor di kluster Anda.
Sebagai contoh, indeks hanya berisi satu bidang bertipe float 960-dimensi. Indeks berisi 400 dokumen, dan data bertipe float menempati 4 byte memori. Dalam kasus ini, data vektor dalam indeks menempati 1,5 MB memori, yang dihitung menggunakan rumus berikut: 960 × 400 × 4. Oleh karena itu, Anda harus memastikan bahwa ukuran memori off-heap kluster lebih besar dari 3 MB, yang dihitung menggunakan rumus berikut: 1,5 × 2.
nullSelama forced merging, baik data lama maupun data baru menempati memori. Jika Anda perlu melakukan forced merging, Anda harus memastikan bahwa ukuran memori off-heap kluster lebih besar dari empat kali total ukuran data vektor dalam kluster.
Untuk kluster yang spesifikasi memorinya 64 GiB atau lebih, ukuran memori off-heap kluster kira-kira sama dengan nilai rumus berikut: Total ukuran memori - 32 (GiB).
Pembatasan penulisan
Pembuatan indeks vektor adalah pekerjaan intensif CPU. Kami merekomendasikan Anda untuk tidak mempertahankan throughput penulisan tinggi. Throughput penulisan puncak kurang dari 5.000 transaksi per detik (TPS) direkomendasikan untuk node data dengan 16 vCPU dan 64 GiB memori.
Saat sistem memproses kueri pada indeks vektor, ia memuat semua indeks ke memori node. Jika node kehabisan memori, sistem akan mengalokasikan ulang shard. Oleh karena itu, kami merekomendasikan Anda untuk tidak menulis sejumlah besar data ke kluster Anda saat sistem sedang memproses kueri.
nullTabel di atas hanya mencantumkan item estimasi. Anda perlu merencanakan kluster Anda berdasarkan kebutuhan bisnis Anda. Disarankan merencanakan memori yang cukup untuk kluster Anda dan melakukan uji stres sebelum menggunakan kluster Anda.
Batasan
Sebelum menginstal plug-in aliyun-knn, pastikan bahwa spesifikasi node data dalam kluster Anda adalah 16 vCPU dan 64 GiB memori atau lebih tinggi. Jika spesifikasi node data dalam kluster Anda tidak memenuhi persyaratan, tingkatkan node data. Untuk informasi lebih lanjut, lihat Tingkatkan konfigurasi kluster.
Saat menggunakan plug-in aliyun-knn, beberapa fitur lanjutan yang disediakan oleh kernel AliES tidak dapat digunakan. Misalnya, jika Anda mengaktifkan fitur replikasi fisik, Anda harus menonaktifkan fitur ini sebelum menggunakan plug-in aliyun-knn. Untuk informasi lebih lanjut, lihat Gunakan fitur replikasi fisik dari plug-in apack.
Plug-in aliyun-knn tidak mendukung migrasi data yang dilakukan menggunakan snapshot di OSS atau menggunakan DataWorks. Jika Anda ingin memigrasi data, disarankan menggunakan Logstash.
Buat indeks vektor
Masuk ke konsol Kibana kluster Elasticsearch Anda dan buka halaman utama konsol Kibana sesuai petunjuk.
Untuk informasi lebih lanjut tentang cara masuk ke konsol Kibana, lihat Masuk ke konsol Kibana.
nullDalam contoh ini, kluster Elasticsearch V6.7.0 digunakan. Operasi pada kluster versi lain mungkin berbeda. Operasi aktual di konsol yang berlaku.
Di bilah navigasi kiri halaman yang muncul, klik Dev Tools.
Di tab Console halaman yang muncul, jalankan perintah berikut untuk membuat indeks vektor:
PUT test { "settings": { "index.codec": "proxima", "index.vector.algorithm": "hnsw" }, "mappings": { "_doc": { "properties": { "feature": { "type": "proxima_vector", "dim": 2, "vector_type": "float", "distance_method": "SquaredEuclidean" } } } } }nullAnda dapat menambahkan jenis bidang lain yang didukung oleh Elasticsearch ke indeks vektor.
Jika kesalahan parsing mapping berikut dilaporkan saat Anda membuat indeks vektor, tingkatkan versi kernel kluster Anda dan coba lagi:
"type": "mapper_parsing_exception", "reason": "Mapping definition for [feature] has unsupported parameters: [distance_method : SquaredEuclidean].
Bagian
Parameter
Nilai Default
Deskripsi
settings
index.codec
proxima
Menentukan apakah akan membuat indeks vektor proxima. Nilai valid:
proxima: Sistem membuat indeks vektor proxima. Indeks ini mendukung pencarian vektor. Kami merekomendasikan Anda mengatur parameter ini ke proxima.
null: Sistem tidak membuat indeks vektor proxima tetapi hanya membuat indeks maju. Dalam hal ini, bidang bertipe proxima_vector tidak mendukung kueri berbasis HNSW atau Linear Search. Bidang-bidang ini hanya mendukung kueri skrip.
nullJika kluster Anda menyimpan volume data yang besar dan Anda tidak memiliki persyaratan tinggi pada latensi kueri, Anda dapat menghapus parameter ini atau mengatur parameter ini ke null. Dalam hal ini, Anda dapat menggunakan fitur kueri skrip untuk mencari k tetangga terdekat (k-NN) dari vektor. Fitur ini hanya tersedia untuk kluster V6.7.0 yang plug-in apack-nya adalah V1.2.1 atau lebih baru dan kluster V7.10.0 yang plug-in apack-nya adalah V1.4.0 atau lebih baru.
index.vector.algorithm
hnsw
Algoritma yang digunakan untuk mencari vektor. Nilai valid:
hnsw: HNSW
linear: Linear Search
index.vector.general.builder.offline_mode
false
Menentukan apakah menggunakan mode optimasi offline untuk membuat indeks vektor. Nilai valid:
false: Mode optimasi offline tidak digunakan.
true: Mode optimasi offline digunakan. Dalam hal ini, jumlah segmen yang ditulis ke indeks vektor berkurang secara signifikan. Ini meningkatkan throughput penulisan.
nullMode optimasi offline hanya tersedia untuk kluster V6.7.0 yang plug-in apack-nya adalah V1.2.1 atau lebih baru dan kluster V7.10.0 yang plug-in apack-nya adalah V1.4.0 atau lebih baru. Anda tidak diizinkan melakukan kueri skrip pada indeks yang menggunakan mode optimasi offline.
Jika Anda ingin menulis semua data Anda ke kluster Anda sekaligus, kami merekomendasikan Anda menggunakan mode optimasi offline.
mappings
type
proxima_vector
Tipe bidang. Sebagai contoh, jika Anda mengatur parameter type ke proxima_vector untuk bidang feature, maka bidang feature adalah bidang bertipe vektor.
dim
2
Jumlah dimensi vektor. Parameter ini diperlukan. Nilai valid: 1 hingga 2048.
vector_type
float
Tipe data vektor. Nilai valid:
float
short
binary
Jika Anda mengatur parameter ini ke binary, data vektor yang ingin Anda tulis ke indeks vektor harus bertipe data uint32. Ini menunjukkan bahwa data vektor harus direpresentasikan oleh array desimal 32-bit tanpa tanda. Selain itu, nilai parameter dim harus merupakan kelipatan dari 32.
Sebagai contoh, jika Anda ingin menulis data biner bisnis 64-bit 1000100100100101111000001001111101000011010010011010011010000100 ke indeks vektor Anda, tulis vektor [-1994006369, 1128900228] ke indeks.
nullHanya kluster V6.7.0 yang plug-in apack-nya adalah V1.2.1 atau lebih baru dan kluster V7.10.0 yang plug-in apack-nya adalah V1.4.0 atau lebih baru yang mendukung ketiga tipe data di atas. Kluster lainnya hanya mendukung tipe data float.
distance_method
SquaredEuclidean
Fungsi yang digunakan untuk menghitung jarak antar vektor. Nilai valid:
SquaredEuclidean: Menghitung jarak Euklides tanpa ekstraksi akar kuadrat.
InnerProduct: Menghitung produk dalam.
Cosine: Menghitung kemiripan kosinus.
Hamming: Menghitung jarak Hamming. Fungsi ini hanya tersedia saat Anda mengatur parameter vector_type ke binary.
nullHanya kluster V6.7.0 yang plug-in apack-nya adalah V1.2.1 atau lebih baru dan kluster V7.10.0 yang plug-in apack-nya adalah V1.4.0 atau lebih baru yang mendukung keempat fungsi di atas. Untuk kluster V6.8, V7.4, dan V7.7, Anda hanya dapat mengatur parameter ini ke nilai defaultnya
SquaredEuclidean.Untuk informasi lebih lanjut tentang fungsi-fungsi di atas, lihat Fungsi pengukuran jarak.
Implementasi fungsi Hamming bersifat khusus. Jika algoritma HNSW atau Linear Search digunakan, indeks tidak mendukung pencarian k-NN standar. Hanya kueri skrip yang didukung, dan perintah untuk kueri skrip kompatibel dengan parameter script_score. Jika Anda ingin menggunakan parameter ini dalam perintah kueri skrip, Anda harus menguji ketersediaan perintah terlebih dahulu berdasarkan bisnis Anda.
nullAnda dapat menjalankan perintah GET /_cat/plugins?v untuk mendapatkan versi plug-in apack. Jika versi plug-in apack tidak memenuhi persyaratan, Anda dapat submit a ticket untuk meminta insinyur Alibaba Cloud memperbarui plug-in apack Anda.
Plug-in aliyun-knn juga mendukung beberapa parameter pencarian lanjutan. Untuk informasi lebih lanjut, lihat Parameter Lanjutan.
Jalankan perintah berikut untuk menambahkan dokumen:
POST test/_doc { "feature": [1.0, 2.0] }nullJika Anda mengatur parameter vector_type ke binary saat Anda membuat indeks vektor, data vektor yang ingin Anda tulis ke indeks vektor harus bertipe data uint32. Ini menunjukkan bahwa Anda harus mengonversi data Anda ke array desimal 32-bit tanpa tanda sebelum menambahkan dokumen. Selain itu, nilai parameter dim harus merupakan kelipatan dari 32. Jika Anda mengatur parameter vector_type ke nilai selain binary, panjang data vektor Anda harus sama dengan nilai yang ditentukan untuk parameter dim.
Cari vektor
Pencarian Standar
Jalankan perintah berikut untuk melakukan pencarian standar untuk vektor:
GET test/_search { "query": { "hnsw": { "feature": { "vector": [1.5, 2.5], "size": 10 } } } }Tabel berikut menjelaskan parameter dalam perintah di atas.
Parameter
Deskripsi
hnsw
Algoritma yang digunakan untuk mencari vektor. Nilainya harus sama dengan parameter algorithm yang ditentukan saat Anda membuat indeks.
vector
Vektor yang ingin Anda cari. Panjang array untuk vektor tersebut harus sama dengan nilai parameter dim yang ditentukan di bagian mappings.
size
Jumlah dokumen yang dipanggil kembali.
nullParameter size dalam perintah pencarian vektor berbeda dari parameter size yang disediakan oleh Elasticsearch. Yang pertama mengontrol jumlah dokumen yang dipanggil kembali oleh plug-in aliyun-knn, sedangkan yang terakhir mengontrol jumlah dokumen yang dipanggil kembali untuk pencarian. Saat Anda melakukan pencarian vektor, sistem memanggil kembali N dokumen teratas berdasarkan nilai parameter size dalam perintah pencarian vektor terkait dan memanggil kembali semua dokumen yang cocok berdasarkan nilai parameter size yang disediakan oleh Elasticsearch. Kemudian, sistem mengembalikan hasil berdasarkan N dokumen teratas dan semua dokumen yang cocok.
Kami merekomendasikan Anda mengatur kedua parameter size ke nilai yang sama. Nilai default parameter size yang disediakan oleh Elasticsearch adalah 10.
nullPlug-in aliyun-knn juga mendukung beberapa parameter pencarian lanjutan. Untuk informasi lebih lanjut, lihat Parameter Lanjutan.
Kueri Skrip
Anda hanya dapat melakukan kueri skrip menggunakan parameter script_score. Sebagai contoh, Anda dapat menggunakan parameter script_score untuk memberi skor setiap dokumen dalam respons kueri. Skor dihitung menggunakan rumus berikut:
1/(1+l2Squared(params.queryVector, doc['feature'])). Kode berikut memberikan contoh permintaan kueri skrip:GET test/_search { "query": { "match_all": {} }, "rescore": { "query": { "rescore_query": { "function_score": { "functions": [{ "script_score": { "script": { "source": "1/(1+l2Squared(params.queryVector, doc['feature'])) ", "params": { "queryVector": [2.0, 2.0] } } } }] } } } } }Kueri skrip di Alibaba Cloud Elasticsearch tidak mendukung fungsi yang disediakan oleh X-Pack. Hanya fungsi yang dijelaskan dalam tabel berikut yang didukung.
Fungsi
Deskripsi
l2Squared(float[] queryVector, DocValues docValues)Fungsi yang digunakan untuk mencari vektor berdasarkan jarak Euklides.
hamming(float[] queryVector, DocValues docValues)Fungsi yang digunakan untuk mencari vektor berdasarkan jarak Hamming.
cosineSimilarity(float[] queryVector, DocValues docValues)cosine(float[] queryVector, DocValues docValues)
Fungsi yang digunakan untuk mencari vektor berdasarkan kemiripan kosinus.
nullKami merekomendasikan Anda menggunakan fungsi
cosineSimilarity(float[] queryVector, DocValues docValues)untuk kluster V6.7 dan menggunakan fungsicosine(float[] queryVector, DocValues docValues)untuk kluster V7.10.nullAnda hanya dapat melakukan kueri skrip di kluster V6.7.0 yang plug-in apack-nya adalah V1.2.1 atau lebih baru dan kluster V7.10.0 yang plug-in apack-nya adalah V1.4.0 atau lebih baru. Anda dapat menjalankan perintah GET /_cat/plugins?v untuk mendapatkan versi plug-in apack. Jika versi plug-in apack tidak memenuhi persyaratan, Anda dapat submit a ticket untuk meminta insinyur Alibaba Cloud memperbarui plug-in apack Anda.
Parameter dalam fungsi di atas:
float[] queryVector: vektor kueri. Anda dapat mengatur parameter ini ke parameter formal atau aktual.
DocValues docValues: vektor dokumen.
Anda tidak dapat melakukan kueri skrip pada indeks yang dibuat menggunakan
mode optimasi offline.
Pemanasan Indeks
Pencarian dilakukan pada indeks vektor dalam penyimpanan in-memory. Setelah Anda menulis data ke indeks vektor, latensi pencarian pertama tinggi karena indeks masih dimuat ke memori. Untuk mengatasi masalah ini, plug-in aliyun-knn menyediakan fitur pemanasan indeks. Fitur ini memungkinkan Anda untuk memanaskan indeks vektor Anda dan memuatnya ke memori mesin lokal Anda sebelum plug-in aliyun-knn menyediakan layanan pencarian vektor. Ini secara signifikan mengurangi latensi pencarian vektor.
Jalankan perintah berikut untuk memanaskan semua indeks vektor:
POST _vector/warmupJalankan perintah berikut untuk memanaskan indeks vektor tertentu:
POST _vector/{indexName}/warmup
nullFitur pemanasan indeks hanya tersedia untuk kluster V6.7.0 yang plug-in apack-nya adalah V1.2.1 atau lebih baru dan kluster V7.10.0 yang plug-in apack-nya adalah V1.4.0 atau lebih baru. Anda dapat menjalankan perintah GET _cat/plugins?v untuk mendapatkan versi plug-in apack. Jika versi plug-in apack tidak memenuhi persyaratan, Anda dapat submit a ticket untuk meminta insinyur Alibaba Cloud memperbarui plug-in apack Anda.
Jika kluster Anda menyimpan sejumlah besar indeks vektor, indeks menyimpan volume data yang besar, dan pencarian vektor hanya diperlukan untuk indeks vektor tertentu, disarankan untuk hanya memanaskan indeks vektor tertentu untuk meningkatkan kinerja pencarian.
Penilaian vektor
Rumus penilaian terpadu disediakan untuk pencarian vektor. Rumus tersebut bergantung pada fungsi pengukuran jarak. Fungsi pengukuran jarak memengaruhi pengurutan hasil pencarian.
Rumus penilaian:
Skor = 1/(Jarak vektor + 1)
Secara default, mekanisme penilaian menggunakan jarak Euklides tanpa ekstraksi akar kuadrat untuk menghitung skor.
Dalam praktiknya, Anda dapat menghitung jarak berdasarkan skor. Kemudian, optimalkan vektor berdasarkan jarak untuk meningkatkan skor.
Fungsi pengukuran jarak
Mekanisme penilaian bervariasi berdasarkan fungsi pengukuran jarak. Tabel berikut menjelaskan fungsi pengukuran jarak yang didukung oleh plug-in aliyun-knn.
Fungsi Pengukuran Jarak | Deskripsi | Rumus Penilaian | Skema Penggunaan | Contoh |
SquaredEuclidean | Fungsi ini digunakan untuk menghitung jarak Euklides antara vektor. Jarak Euklides, juga disebut metrik Euklides, merujuk pada jarak aktual antara titik-titik atau panjang alami vektor dalam ruang m-dimensi. Jarak Euklides banyak digunakan. Jarak Euklides dalam ruang dua atau tiga dimensi adalah jarak aktual antara titik-titik. | Sebagai contoh, dua vektor n-dimensi [A1, A2, ..., An] dan [B1, B2, ..., Bn] ada.
null Secara default, mekanisme penilaian menggunakan jarak Euklides tanpa ekstraksi akar kuadrat untuk menghitung skor. | Jarak Euklides dapat mencerminkan perbedaan absolut antara karakteristik angka individu. Oleh karena itu, jarak Euklides banyak digunakan untuk menganalisis perbedaan antara angka dari berbagai dimensi. Sebagai contoh, Anda dapat menggunakan metrik perilaku pengguna untuk menganalisis perbedaan atau kesamaan antara nilai pengguna. | Jarak Euklides tanpa ekstraksi akar kuadrat antara vektor dua dimensi [0, 0] dan [1, 2] adalah 5, yang dihitung menggunakan rumus berikut: (1 - 0)² + (2 - 0)². |
Cosine | Fungsi ini digunakan untuk menghitung kemiripan kosinus antara vektor. Fungsi ini menghitung kosinus dari sudut antara vektor untuk mendapatkan kemiripan kosinus di antara mereka. | Sebagai contoh, dua vektor n-dimensi [A1, A2, ..., An] dan [B1, B2, ..., Bn] ada.
| Kemiripan kosinus mencerminkan perbedaan antara vektor dari orientasi. Kemiripan kosinus digunakan untuk memberi skor konten guna mendapatkan kesamaan atau perbedaan antara minat pengguna. Selain itu, kemiripan kosinus dipengaruhi oleh orientasi vektor daripada angka di dalamnya. Oleh karena itu, kemiripan kosinus dapat menangani masalah bahwa pengguna mungkin menggunakan standar pengukuran yang berbeda. | Kemiripan kosinus antara vektor dua dimensi [1, 1] dan [1, 0] adalah 0,707. |
InnerProduct | Fungsi ini digunakan untuk menghitung hasil kali dalam antara vektor. Hasil kali dalam juga disebut dot product. Dot product adalah operasi diadik yang mengambil dua vektor dari bilangan real R dan mengembalikan skalar untuk bilangan real. | Sebagai contoh, dua vektor n-dimensi [A1, A2, ..., An] dan [B1, B2, ..., Bn] ada.
| Produk dalam mempertimbangkan baik sudut maupun panjang absolut antara vektor. Setelah vektor dinormalisasi, rumus untuk produk dalam setara dengan rumus untuk kemiripan kosinus. | Produk dalam antara vektor dua dimensi [1, 1] dan [1, 5] adalah 6. |
Hamming (hanya tersedia untuk vektor bertipe BINARY) | Dalam teori informasi, jarak Hamming antara string dengan panjang yang sama sama dengan jumlah posisi di mana simbol berbeda. d(x, y) digunakan untuk merepresentasikan jarak Hamming antara string x dan y. Dengan kata lain, jarak Hamming mengukur jumlah substitusi minimum yang diperlukan untuk mengubah string x menjadi string y. | Sebagai contoh, dua string biner n-bit x dan y ada.
| Jarak Hamming digunakan untuk mendeteksi atau memperbaiki kesalahan yang terjadi saat data ditransmisikan melalui jaringan komputer. Jarak Hamming juga dapat digunakan sebagai metode estimasi kesalahan untuk menentukan jumlah karakter berbeda antara string biner. | Jarak Hamming antara 1011101 dan 1001001 adalah 2. null Saat menggunakan plug-in aliyun-knn, data vektor yang ingin Anda tulis ke indeks vektor Anda harus bertipe data uint32. Ini menunjukkan bahwa data vektor harus direpresentasikan oleh array desimal 32-bit tanpa tanda. Selain itu, nilai parameter |
Hanya kluster V6.7.0 yang plug-in apack-nya adalah V1.2.1 atau lebih baru dan kluster V7.10.0 yang plug-in apack-nya adalah V1.4.0 atau lebih baru yang mendukung keempat fungsi di atas. Anda dapat menjalankan perintah GET _cat/plugins?v untuk mendapatkan versi plug-in apack untuk kluster Anda. Jika versi plug-in apack tidak memenuhi persyaratan, kluster Anda hanya mendukung fungsi SquaredEuclidean. Jika Anda ingin menggunakan fungsi lain, Anda dapat submit a ticket untuk meminta insinyur Alibaba Cloud memperbarui plug-in apack Anda.
Anda dapat mengonfigurasi parameter distance_method di bagian mappings untuk menentukan fungsi pengukuran jarak yang digunakan untuk indeks vektor Anda.
Parameter pemutus sirkuit
Parameter | Deskripsi | Nilai Default |
indices.breaker.vector.native.indexing.limit | Jika penggunaan memori off-heap melebihi nilai yang ditentukan oleh parameter ini, operasi penulisan akan ditangguhkan. Setelah sistem membuat indeks dan melepaskan memori, sistem akan melanjutkan operasi penulisan. Jika pemutus sirkuit dipicu, konsumsi memori sistem tinggi. Dalam hal ini, kami merekomendasikan Anda untuk membatasi throughput penulisan. | 70% |
indices.breaker.vector.native.total.limit | Proporsi maksimum memori off-heap yang digunakan untuk membuat indeks vektor. Jika penggunaan memori off-heap aktual melebihi nilai yang ditentukan oleh parameter ini, sistem mungkin mengalokasikan ulang shard. | 80% |
Parameter pemutus sirkuit di atas adalah parameter tingkat kluster. Anda dapat menjalankan perintah GET _cluster/settings untuk melihat nilai-nilai parameter tersebut. Disarankan untuk mempertahankan nilai default untuk parameter tersebut.
Parameter lanjutan
Tabel 2. Parameter Pembuatan Indeks untuk HNSW
Parameter | Deskripsi | Nilai Default |
index.vector.hnsw.builder.max_scan_num | Jumlah maksimum tetangga terdekat yang dapat dipindai saat graf dibuat dalam kasus terburuk. | 100000 |
index.vector.hnsw.builder.neighbor_cnt | Jumlah maksimum tetangga terdekat yang dapat dimiliki setiap node pada lapisan 0. Kami merekomendasikan Anda mengatur parameter ini ke 100. Kualitas graf meningkat dengan nilai parameter ini. Namun, indeks nonaktif mengonsumsi lebih banyak sumber daya penyimpanan. | 100 |
index.vector.hnsw.builder.upper_neighbor_cnt | Jumlah maksimum tetangga terdekat yang dapat dimiliki setiap node pada lapisan selain lapisan 0. Kami merekomendasikan Anda mengatur parameter ini ke 50% dari nilai yang ditentukan untuk parameter neighbor_cnt. Nilai maksimum: 255. | 50 |
index.vector.hnsw.builder.efconstruction | Jumlah tetangga terdekat yang dapat dipindai saat graf dibuat. Kualitas graf meningkat dengan nilai parameter ini. Namun, waktu yang lebih lama diperlukan untuk membuat indeks. Kami merekomendasikan Anda mengatur parameter ini ke 400. | 400 |
index.vector.hnsw.builder.max_level | Jumlah total lapisan, termasuk lapisan 0. Sebagai contoh, jika Anda memiliki 10 juta dokumen dan parameter scaling_factor diatur ke 30, gunakan 30 sebagai angka dasar dan bulatkan logaritma dari 10.000.000 ke bilangan bulat terdekat. Hasilnya adalah 5. Parameter ini tidak memiliki dampak signifikan pada pencarian vektor. Kami merekomendasikan Anda mengatur parameter ini ke 6. | 6 |
index.vector.hnsw.builder.scaling_factor | Faktor penskalaan. Volume data pada suatu lapisan sama dengan volume data pada lapisan atasnya dikalikan dengan faktor penskalaan. Nilai valid: 10 hingga 100. Jumlah lapisan berkurang dengan nilai scaling_factor. Kami merekomendasikan Anda mengatur parameter ini ke 50. | 50 |
Anda dapat mengatur parameter di atas di bagian settings hanya setelah Anda mengatur parameter index.vector.algorithm ke hnsw.
Tabel 3. Parameter Pencarian untuk HNSW
Parameter | Deskripsi | Nilai Default |
ef | Jumlah tetangga terdekat yang dipindai selama pencarian online. Nilai besar meningkatkan rasio recall tetapi memperlambat pencarian. Nilai valid: 100 hingga 1000. | 100 |
Kode berikut memberikan contoh permintaan pencarian:
GET test/_search
{
"query": {
"hnsw": {
"feature": {
"vector": [1.5, 2.5],
"size": 10,
"ef": 100
}
}
}
}Pertanyaan Umum
T: Bagaimana cara mengevaluasi rasio recall dokumen?
A: Anda dapat membuat dua indeks. Satu menggunakan algoritma HNSW dan yang lainnya menggunakan algoritma Linear Search. Pertahankan pengaturan indeks lainnya konsisten untuk kedua indeks. Gunakan klien untuk menambahkan data vektor yang sama ke indeks, dan segarkan indeks. Kemudian, gunakan vektor kueri yang sama untuk melakukan kueri pada indeks, bandingkan ID dokumen yang dikembalikan oleh indeks, dan temukan ID dokumen yang dikembalikan oleh kedua indeks.
nullBagilah jumlah ID dokumen yang dikembalikan oleh kedua indeks dengan jumlah total ID dokumen yang dikembalikan untuk menghitung rasio recall dokumen.
T: Saat saya menulis data ke kluster saya, sistem mengembalikan kesalahan
circuitBreakingException. Apa yang harus saya lakukan?A: Kesalahan ini menunjukkan bahwa penggunaan memori off-heap melebihi proporsi yang ditentukan oleh parameter indices.breaker.vector.native.indexing.limit dan bahwa operasi penulisan ditangguhkan. Proporsi default adalah 70%. Dalam sebagian besar kasus, operasi penulisan dilanjutkan secara otomatis setelah sistem membuat indeks dan melepaskan memori. Disarankan menambahkan mekanisme percobaan ulang ke skrip penulisan data di klien Anda.
T: Mengapa CPU masih bekerja setelah operasi penulisan ditangguhkan?
A: Sistem membuat indeks vektor selama proses refresh dan flush. Tugas pembuatan indeks mungkin masih berjalan meskipun operasi penulisan ditangguhkan. Sumber daya komputasi dilepaskan setelah refresh akhir selesai.
T: Saat saya menggunakan plug-in aliyun-knn, kesalahan berikut dilaporkan:
class_cast_exception: class org.apache.lucene.index.SoftDeletesDirectoryReaderWrapper$SoftDeletesFilterCodecReader cannot be cast to class org.apache.lucene.index.SegmentReader (org.apache.lucene.index.SoftDeletesDirectoryReaderWrapper$SoftDeletesFilterCodecReader and org.apache.lucene.index.SegmentReader are in unnamed module of loader 'app'). Apa yang harus saya lakukan?A: Nonaktifkan fitur replikasi fisik untuk indeks. Untuk informasi lebih lanjut, lihat Gunakan fitur replikasi fisik dari plug-in apack.
T: Saat saya menggunakan plug-in aliyun-knn untuk melakukan pencarian vektor, pencarian lambat, atau pencarian ditangguhkan karena penggunaan memori tinggi. Apa yang harus saya lakukan?
A: Saat plug-in aliyun-knn digunakan untuk pencarian vektor, vektor in-memory digunakan. Ini mengonsumsi sejumlah besar sumber daya memori. Selama pencarian vektor, sistem memuat data indeks ke memori node data. Jika node data menyimpan volume data indeks yang besar, pencarian mungkin lambat atau ditangguhkan. Untuk menghindari masalah ini, Anda harus memastikan bahwa volume data yang disimpan di setiap node data tidak lebih dari setengah dari total ukuran memori node data. Jika ukuran memori node data dalam kluster Anda terlalu kecil, disarankan meningkatkan node data. Untuk informasi lebih lanjut, lihat Tingkatkan konfigurasi kluster.
T: Apakah praktik terbaik untuk plug-in aliyun-knn disediakan?
A: Komunitas pengembang Alibaba Cloud menyediakan skenario bisnis dan praktik terbaik dari plug-in aliyun-knn.
T: Saya tidak dapat menggunakan
must_not existsuntuk menyaring dokumen di mana nilai bidang feature kosong. Apa yang harus saya lakukan?A: Data vektor disimpan dengan cara khusus dan mungkin tidak kompatibel dengan kueri DSL. Anda dapat menggunakan skrip berikut untuk menyaring dokumen:
GET jx-similar-product-v1/_search { "query": { "bool": { "must": { "script": { "script": { "source": "doc['feature'].empty", "lang": "painless" } } } } } }
