Ikhtisar Pencarian Vektor - Amazon ElastiCache

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Ikhtisar Pencarian Vektor

ElastiCache untuk Valkey menyediakan kemampuan untuk mengindeks, mencari, dan memperbarui miliaran penyematan vektor dimensi tinggi. Pencarian vektor memungkinkan Anda membuat, memelihara, dan menggunakan indeks sekunder untuk pencarian yang efisien dan terukur. Setiap operasi pencarian vektor berlaku untuk indeks tunggal. Operasi indeks hanya berlaku untuk indeks yang ditentukan. Sejumlah operasi dapat dikeluarkan terhadap indeks apa pun kapan saja dengan pengecualian operasi pembuatan dan penghapusan indeks. Pada tingkat cluster, beberapa operasi terhadap beberapa indeks mungkin sedang berlangsung secara bersamaan.

Dalam dokumen ini istilah kunci, baris, dan catatan identik dan digunakan secara bergantian. Demikian pula, istilah kolom, bidang, jalur dan anggota juga digunakan secara bergantian.

FT.CREATEPerintah ini dapat digunakan untuk membuat indeks untuk subset kunci dengan jenis indeks yang ditentukan. FT.SEARCHmelakukan kueri pada indeks yang dibuat, dan FT.DROPINDEX menghapus indeks yang ada dan semua data terkait. Tidak ada perintah khusus untuk menambah, menghapus, atau memodifikasi data yang diindeks. JSONPerintah yang ada HASH atau yang memodifikasi kunci yang ada dalam indeks secara otomatis memperbarui indeks.

Indeks dan ruang kunci Valkey OSS

Indeks dibangun dan dipelihara di atas subset dari keyspace Valkey OSS. Ruang kunci untuk setiap indeks ditentukan oleh daftar awalan kunci yang disediakan saat indeks dibuat. Daftar awalan adalah opsional dan jika dihilangkan, seluruh ruang kunci akan menjadi bagian dari indeks itu. Beberapa indeks dapat memilih subset ruang kunci yang terputus atau tumpang tindih tanpa batasan.

Indeks juga diketik karena hanya mencakup kunci yang memiliki tipe yang cocok. Saat ini, indeks hanya didukung pada JSON dan HASH jenis. HASHIndeks hanya mengindeks HASH kunci yang dicakup oleh daftar awalannya dan juga JSON indeks hanya mengindeks JSON kunci yang dicakup oleh daftar awalannya. Kunci dalam daftar awalan ruang kunci indeks yang tidak memiliki tipe yang ditentukan diabaikan dan tidak memengaruhi operasi pencarian.

Indeks diperbarui ketika perintah memodifikasi kunci apa pun yang ada di dalam ruang kunci indeks. Valkey secara otomatis mengekstrak bidang yang dideklarasikan untuk setiap indeks dan memperbarui indeks dengan nilai baru. Proses pembaruan memiliki tiga langkah. Pada langkah pertama, kunci HASH atau JSON dimodifikasi dan klien yang meminta diblokir. Langkah kedua dilakukan di latar belakang dan memperbarui setiap indeks yang berisi kunci yang dimodifikasi. Pada langkah ketiga, klien tidak diblokir. Jadi untuk operasi kueri yang dilakukan pada koneksi yang sama dengan mutasi, perubahan itu segera terlihat di hasil pencarian.

Pembuatan indeks adalah proses multi-langkah. Langkah pertama adalah menjalankan perintah FT.CREATE yang mendefinisikan indeks. Eksekusi yang berhasil membuat secara otomatis memulai langkah kedua - penimbunan ulang. Proses pengisian ulang berjalan di thread latar belakang dan memindai ruang kunci untuk kunci yang berada dalam daftar awalan indeks baru. Setiap kunci yang ditemukan ditambahkan ke indeks. Akhirnya seluruh keyspace dipindai, menyelesaikan proses pembuatan indeks. Perhatikan bahwa saat proses pengisian ulang berjalan, mutasi kunci yang diindeks diizinkan, tidak ada batasan, dan proses pengisian ulang indeks tidak akan selesai sampai semua kunci diindeks dengan benar. Operasi kueri yang dicoba saat indeks sedang menjalani pengisian ulang tidak diizinkan dan diakhiri dengan kesalahan. Perintah FT.INFO mengembalikan status proses backfill di bidang 'backfill_status'.

Jenis bidang indeks

Setiap indeks memiliki jenis tertentu yang dideklarasikan ketika indeks dibuat bersama dengan lokasi bidang (kolom) yang akan diindeks. Untuk HASH kunci lokasi adalah nama bidang di dalamHASH. Untuk JSON kunci lokasi adalah deskripsi jalur JSON. Ketika kunci dimodifikasi, data yang terkait dengan bidang yang dideklarasikan diekstraksi, dikonversi ke tipe yang dideklarasikan dan disimpan dalam indeks. Jika data hilang atau tidak berhasil dikonversi ke tipe yang dideklarasikan, maka bidang tersebut dihilangkan dari indeks. Ada tiga jenis bidang, seperti yang dijelaskan sebagai berikut:

  • Bidang vektor berisi vektor angka yang juga dikenal sebagai embedding vektor. Bidang vektor dapat digunakan untuk menyaring vektor berdasarkan metrik jarak tertentu yang mengukur kesamaan. Untuk HASH indeks, bidang harus berisi seluruh vektor yang dikodekan dalam format biner (IEEE 754 endian kecil). Untuk JSON kunci, jalur harus mereferensikan array dengan ukuran yang benar yang diisi dengan angka. Perhatikan bahwa ketika array JSON digunakan sebagai bidang vektor, representasi internal array dalam kunci JSON diubah menjadi format yang diperlukan oleh algoritma yang dipilih, mengurangi konsumsi memori dan presisi. Operasi baca selanjutnya menggunakan perintah JSON akan menghasilkan nilai presisi yang berkurang.

  • Bidang angka berisi satu nomor. Bidang angka dapat digunakan dengan operator pencarian rentang. UntukHASH, bidang ini diharapkan berisi teks ASCII dari angka yang ditulis dalam format standar angka tetap atau floating-point. Untuk JSON bidang, aturan numerik nomor JSON harus diikuti. Terlepas dari representasi dalam kunci, bidang ini dikonversi ke nomor floating point 64-bit untuk penyimpanan dalam indeks. Karena angka yang mendasarinya disimpan di floating point dengan keterbatasan presisi, aturan umum tentang perbandingan numerik untuk nomor floating point berlaku.

  • Bidang tag berisi nol atau lebih nilai tag yang dikodekan sebagai string UTF-8 tunggal. Bidang tag dapat digunakan untuk memfilter kueri untuk kesetaraan nilai tag dengan perbandingan case-sensitive atau case-insensitive. String diuraikan menjadi nilai tag menggunakan karakter pemisah (default adalah koma tetapi dapat diganti) dengan spasi putih depan dan belakang dihapus. Sejumlah nilai tag dapat terkandung dalam satu bidang tag.

Algoritma indeks vektor

Dua algoritma indeks vektor didukung di Valkey:

  • Flat — Algoritma Flat adalah pemrosesan linier brute force dari setiap vektor dalam indeks, menghasilkan jawaban yang tepat dalam batas-batas ketepatan perhitungan jarak. Karena pemrosesan linier indeks, waktu berjalan untuk algoritma ini bisa sangat tinggi untuk indeks besar. Indeks datar mendukung kecepatan konsumsi yang lebih tinggi.

  • Hierarchical Navigable Small Worlds (HNSW) — Algoritma HNSW adalah alternatif yang menyediakan perkiraan kecocokan vektor terdekat dengan imbalan waktu eksekusi yang jauh lebih rendah. Algoritma dikendalikan oleh tiga parameterM, EF_CONSTRUCTION danEF_RUNTIME. Dua parameter pertama ditentukan pada waktu pembuatan indeks dan tidak dapat diubah. EF_RUNTIMEParameter memiliki nilai default yang ditentukan pada pembuatan indeks tetapi dapat diganti pada setiap operasi kueri individu sesudahnya. Ketiga parameter ini berinteraksi untuk menyeimbangkan memori dan konsumsi CPU selama operasi konsumsi dan kueri serta mengontrol kualitas perkiraan pencarian KNN yang tepat (dikenal sebagai rasio recall).

Di HNSW, parameter M mengontrol jumlah maksimum tetangga yang dapat dihubungkan oleh setiap node, membentuk kepadatan indeks. M yang lebih tinggi, seperti 32 ke atas, menghasilkan grafik yang lebih terhubung, meningkatkan kecepatan penarikan dan kueri karena ada lebih banyak jalur untuk menjangkau tetangga yang relevan. Namun, ini meningkatkan ukuran indeks, penggunaan memori, dan memperlambat pengindeksan. M yang lebih rendah, seperti 8 dan di bawahnya, menghasilkan faster-to-build indeks yang lebih kecil dengan penggunaan memori yang lebih rendah, tetapi ingatan menurun dan kueri mungkin memakan waktu lebih lama karena koneksi yang lebih sedikit.

Parameter EF_Construction menentukan berapa banyak koneksi kandidat yang dievaluasi saat membangun indeks. EF_Construction yang lebih tinggi, seperti 400 ke atas, berarti pengindeks mempertimbangkan lebih banyak jalur sebelum memilih tetangga, yang mengarah ke grafik yang meningkatkan efisiensi penarikan dan kueri nanti, tetapi dengan biaya pengindeksan yang lebih lambat dan penggunaan CPU dan memori yang lebih tinggi selama konstruksi. EF_Construction rendah, seperti 64-120, mempercepat pengindeksan dan mengurangi penggunaan sumber daya, tetapi grafik yang dihasilkan dapat mengurangi penarikan dan memperlambat kueri meskipun EF_Runtime disetel tinggi.

Terakhir, EF_Runtime mengatur luasnya pencarian selama kueri, mengontrol berapa banyak calon tetangga yang dieksplorasi saat runtime. Mengaturnya tinggi meningkatkan daya ingat dan akurasi, tetapi dengan biaya latensi kueri dan penggunaan CPU. EF_Runtime yang rendah membuat kueri lebih cepat dan lebih ringan, tetapi dengan penarikan yang berkurang. Tidak seperti M atau EF_Construction, parameter ini tidak memengaruhi ukuran indeks atau waktu pembuatan, menjadikannya parameter untuk menyetel penarikan versus pertukaran latensi setelah indeks dibuat.

Kedua algoritma pencarian vektor (Flat dan HNSW) mendukung parameter opsional. INITIAL_CAP Ketika ditentukan, parameter ini mengalokasikan memori untuk indeks, sehingga mengurangi overhead manajemen memori dan peningkatan tingkat konsumsi vektor. Indeks datar mendukung kecepatan konsumsi yang lebih baik daripada HNSW.

Algoritma pencarian vektor seperti HNSW mungkin tidak efisien menangani penghapusan atau penimpaan vektor yang dimasukkan sebelumnya. Penggunaan operasi ini dapat mengakibatkan konsumsi memori indeks berlebih and/or menurunkan kualitas penarikan. Pengindeksan ulang adalah salah satu metode untuk memulihkan ingatan penggunaan memori yang optimal. and/or

Keamanan pencarian vektor

Mekanisme keamanan Valkey ACL (Access Control Lists) untuk kedua perintah dan akses data diperluas untuk mengontrol fasilitas pencarian. Kontrol ACL dari perintah pencarian individual didukung sepenuhnya. Kategori ACL baru,@search, disediakan dan banyak kategori yang ada (@fast,,, @read@write, dll.) Diperbarui untuk menyertakan perintah baru. Perintah pencarian tidak memodifikasi data kunci, artinya mesin ACL yang ada untuk akses tulis dipertahankan. Aturan akses untuk HASH dan JSON operasi tidak dimodifikasi oleh kehadiran indeks; kontrol akses tingkat kunci normal masih diterapkan pada perintah tersebut.

Perintah pencarian dengan indeks juga memiliki akses mereka dikontrol melalui ACL. Pemeriksaan akses dilakukan pada tingkat seluruh indeks, bukan pada tingkat per-kunci. Ini berarti bahwa akses ke indeks diberikan kepada pengguna hanya jika pengguna tersebut memiliki izin untuk mengakses semua kunci yang mungkin dalam daftar awalan keyspace indeks tersebut. Dengan kata lain, konten sebenarnya dari indeks tidak mengontrol akses. Sebaliknya, itu adalah isi teoritis dari indeks seperti yang didefinisikan oleh daftar awalan yang digunakan untuk pemeriksaan keamanan. Situasi di mana pengguna telah membaca akses and/or tulis ke kunci tetapi tidak dapat mengakses indeks yang berisi kunci itu dimungkinkan. Perhatikan bahwa hanya akses baca ke ruang kunci yang diperlukan untuk membuat atau menggunakan indeks - ada atau tidak adanya akses tulis tidak dipertimbangkan