Ikhtisar pencarian vektor - Amazon MemoryDB

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

Ikhtisar pencarian vektor

Pencarian vektor dibangun di atas pembuatan, pemeliharaan, dan penggunaan indeks. Setiap operasi pencarian vektor menentukan indeks tunggal dan operasinya terbatas pada indeks itu, yaitu, operasi pada satu indeks tidak terpengaruh oleh operasi pada indeks lainnya. Kecuali untuk operasi untuk membuat dan menghancurkan indeks, sejumlah operasi dapat dikeluarkan terhadap indeks apa pun kapan saja, yang berarti bahwa pada tingkat cluster, beberapa operasi terhadap beberapa indeks dapat berlangsung secara bersamaan.

Indeks individu diberi nama objek yang ada di namespace unik, yang terpisah dari ruang nama Redis OSS lainnya: kunci, fungsi, dll. Setiap indeks secara konseptual mirip dengan tabel database konvensional karena terstruktur dalam dua dimensi: kolom dan baris. Setiap baris dalam tabel sesuai dengan Redis OSS Key. Setiap kolom dalam indeks sesuai dengan anggota atau bagian dari kunci itu. Dalam dokumen ini, kunci istilah, baris dan catatan identik dan digunakan secara bergantian. Demikian pula istilah kolom, bidang, jalur dan anggota pada dasarnya identik dan juga digunakan secara bergantian.

Tidak ada perintah khusus untuk menambah, menghapus, atau memodifikasi data yang diindeks. Sebaliknya yang ada HASH atau JSON perintah yang memodifikasi kunci yang ada dalam indeks juga secara otomatis memperbarui indeks.

Indeks dan ruang kunci Redis OSS

Indeks dibangun dan dipelihara di atas subset dari keyspace Redis OSS. Beberapa indeks dapat memilih subset yang terpisah atau tumpang tindih dari ruang kunci Redis OSS tanpa batasan. 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 Redis OSS akan menjadi bagian dari indeks itu. Indeks juga diketik karena hanya mencakup kunci yang memiliki tipe yang cocok. Saat ini, hanya indeks JSON dan HASH yang didukung. Indeks HASH hanya mengindeks kunci HASH yang dicakup oleh daftar awalannya dan juga indeks JSON hanya mengindeks kunci JSON yang dicakup oleh daftar awalannya. Kunci dalam daftar awalan ruang kunci indeks yang tidak memiliki tipe yang ditentukan diabaikan dan tidak memengaruhi operasi pencarian.

Ketika perintah HASH atau JSON memodifikasi kunci yang berada dalam ruang kunci indeks indeks yang diperbarui. Proses ini melibatkan penggalian bidang yang dideklarasikan untuk setiap indeks dan memperbarui indeks dengan nilai baru. Proses pembaruan dilakukan di utas latar belakang, yang berarti bahwa indeks pada akhirnya hanya konsisten dengan konten keyspace mereka. Dengan demikian sisipan atau pembaruan kunci tidak akan terlihat di hasil pencarian untuk waktu yang singkat. Selama periode beban sistem yang berat dan/atau mutasi data yang berat, penundaan visibilitas bisa menjadi lebih lama.

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 Redis OSS mencari 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. Penyelesaian proses backfilling dapat ditentukan dari output FT.INFO perintah untuk indeks tersebut ('backfill_status').

Jenis bidang indeks

Setiap bidang (kolom) indeks memiliki jenis tertentu yang dideklarasikan saat indeks dibuat dan lokasi di dalam kunci. Untuk kunci HASH lokasi adalah nama bidang dalam HASH. Untuk kunci JSON 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 empat jenis bidang, seperti yang dijelaskan sebagai berikut:

  • Bidang angka berisi satu nomor. Untuk bidang JSON, aturan numerik nomor JSON harus diikuti. Untuk HASH, bidang ini diharapkan berisi teks ASCII dari angka yang ditulis dalam format standar untuk nomor tetap atau floating point. Terlepas dari representasi dalam kunci, bidang ini dikonversi ke nomor floating point 64-bit untuk penyimpanan dalam indeks. Bidang angka dapat digunakan dengan operator pencarian rentang. Karena angka yang mendasarinya disimpan di floating point dengan batasan 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. 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. Bidang tag dapat digunakan untuk memfilter kueri untuk kesetaraan nilai tag dengan perbandingan case-sensitive atau case-insensitive.

  • Bidang teks berisi gumpalan byte yang tidak perlu sesuai dengan UTF-8. Bidang teks dapat digunakan untuk menghias hasil kueri dengan nilai-nilai yang bermakna aplikasi. Misalnya URL atau isi dokumen, dll.

  • Bidang vektor berisi vektor angka yang juga dikenal sebagai embedding. Bidang vektor mendukung K-pencarian tetangga terdekat (KNN) dari vektor berukuran tetap menggunakan algoritma dan metrik jarak tertentu. Untuk indeks HASH, bidang harus berisi seluruh vektor yang dikodekan dalam format biner (IEEE 754 endian kecil). Untuk kunci JSON, 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.

Algoritma indeks vektor

Dua algoritma indeks vektor disediakan:

  • 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.

  • HNSW (Hierarchical Navigable Small Worlds) — Algoritma HNSW adalah alternatif yang memberikan perkiraan jawaban yang benar 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).

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.

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 dan/atau penurunan kualitas penarikan. Pengindeksan ulang adalah salah satu metode untuk memulihkan penggunaan dan/atau ingatan memori yang optimal.

Ekspresi kueri pencarian vektor

Perintah FT.SEARCH dan FT.AGGREGATE memerlukan ekspresi kueri. Ekspresi ini adalah parameter string tunggal yang terdiri dari satu atau lebih operator. Setiap operator menggunakan satu bidang dalam indeks untuk mengidentifikasi subset kunci dalam indeks. Beberapa operator dapat digabungkan menggunakan penggabung boolean serta tanda kurung untuk lebih meningkatkan atau membatasi kumpulan kunci yang dikumpulkan (atau set hasil).

Wildcard

Operator wildcard, tanda bintang ('*'), cocok dengan semua kunci dalam indeks.

Rentang numerik

Operator rentang numerik memiliki sintaks berikut:

<range-search> ::= '@' <numeric-field-name> ':' '[' <bound> <bound> ']' <bound> ::= <number> | '(' <number> <number> ::= <integer> | <fixed-point> | <floating-point> | 'Inf' | '-Inf' | '+Inf'

< numeric-field-name > harus berupa bidang tipe yang dideklarasikanNUMERIC. Secara default terikat bersifat inklusif tetapi tanda kurung terbuka terkemuka ['('] dapat digunakan untuk membuat terikat eksklusif. Pencarian rentang dapat diubah menjadi perbandingan relasional tunggal (<, <=, >, >=) dengan menggunakanInf, +Inf atau -Inf sebagai salah satu batas. Terlepas dari format numerik yang ditentukan (integer, fixed-point, floating-point, infinity) jumlahnya diubah menjadi floating point 64-bit untuk melakukan perbandingan, mengurangi presisi yang sesuai.

contoh Contoh
@numeric-field:[0 10] // 0 <= <value> <= 10 @numeric-field:[(0 10] // 0 < <value> <= 10 @numeric-field:[0 (10] // 0 <= <value> < 10 @numeric-field:[(0 (10] // 0 < <value> < 10 @numeric-field:[1.5 (Inf] // 1.5 <= value

Bandingkan tag

Operator perbandingan tag memiliki sintaks berikut:

<tag-search> ::= '@' <tag-field-name> ':' '{' <tag> [ '|' <tag> ]* '}'

Jika salah satu tag di operator cocok dengan salah satu tag di bidang tag catatan, maka catatan tersebut disertakan dalam kumpulan hasil. Bidang yang dirancang oleh <tag-field-name> harus berupa bidang indeks yang dideklarasikan dengan tipeTAG. Contoh perbandingan tag adalah:

@tag-field:{ atag } @tag-field: { tag1 | tag2 }

Kombinasi Boolean

Set hasil dari operator numerik atau tag dapat digabungkan menggunakan logika boolean: dan/atau. Tanda kurung dapat digunakan untuk mengelompokkan operator dan/atau mengubah urutan evaluasi. Sintaks operator logika boolean adalah:

<expression> ::= <phrase> | <phrase> '|' <expression> | '(' <expression> ')' <phrase> ::= <term> | <term> <phrase> <term> ::= <range-search> | <tag-search> | '*'

Beberapa istilah yang digabungkan menjadi frasa adalah “dan” -ed. Beberapa frasa yang dikombinasikan dengan pipa ('|') adalah “atau” -ed.

Indeks vektor mendukung dua metode pencarian yang berbeda: tetangga terdekat dan jangkauan. Pencarian tetangga terdekat menemukan angka, K, dari vektor dalam indeks yang paling dekat dengan vektor (referensi) yang disediakan — ini dalam bahasa sehari-hari disebut KNN untuk tetangga terdekat 'K'. Sintaks untuk pencarian KNN adalah:

<vector-knn-search> ::= <expression> '=>[KNN' <k> '@' <vector-field-name> '$' <parameter-name> <modifiers> ']' <modifiers> ::= [ 'EF_RUNTIME' <integer> ] [ 'AS' <distance-field-name>]

Pencarian vektor KNN hanya diterapkan pada vektor yang memenuhi <expression> yang dapat berupa kombinasi dari operator yang didefinisikan di atas: wildcard, pencarian rentang, pencarian tag dan/atau kombinasi boolean daripadanya.

  • <k>adalah bilangan bulat yang menentukan jumlah vektor tetangga terdekat yang akan dikembalikan.

  • <vector-field-name>harus menentukan bidang tipe yang dideklarasikanVECTOR.

  • <parameter-name>bidang menentukan salah satu entri untuk PARAM tabel perintah FT.SEARCH atauFT.AGGREGATE. Parameter ini adalah nilai vektor referensi untuk perhitungan jarak. Nilai vektor dikodekan ke dalam PARAM nilai dalam format biner IEEE 754 endian kecil (sama dikodekan seperti untuk bidang vektor HASH)

  • Untuk indeks vektor tipe HNSW, EF_RUNTIME klausa opsional dapat digunakan untuk mengganti nilai default EF_RUNTIME parameter yang ditetapkan saat indeks dibuat.

  • Opsional <distance-field-name> memberikan nama bidang untuk kumpulan hasil yang berisi jarak yang dihitung antara vektor referensi dan kunci yang terletak.

Pencarian rentang menempatkan semua vektor dalam jarak tertentu (radius) dari vektor referensi. Sintaks untuk pencarian rentang adalah:

<vector-range-search> ::= ‘@’ <vector-field-name> ‘:’ ‘[’ ‘VECTOR_RANGE’ ( <radius> | ‘$’ <radius-parameter> ) $<reference-vector-parameter> ‘]’ [ ‘=’ ‘>’ ‘{’ <modifiers> ‘}’ ] <modifiers> ::= <modifier> | <modifiers>, <modifier> <modifer> ::= [ ‘$yield_distance_as’ ‘:’ <distance-field-name> ] [ ‘$epsilon’ ‘:’ <epsilon-value> ]

Di mana:

  • <vector-field-name>adalah nama bidang vektor yang akan dicari.

  • <radius> or $<radius-parameter>adalah batas jarak numerik untuk pencarian.

  • $<reference-vector-parameter> adalah nama parameter yang berisi vektor referensi. Nilai vektor dikodekan ke dalam nilai PARAM dalam format biner IEEE 754 endian kecil (pengkodean yang sama seperti untuk bidang vektor HASH)

  • Opsional <distance-field-name> memberikan nama bidang untuk kumpulan hasil yang berisi jarak yang dihitung antara vektor referensi dan setiap tombol.

  • Opsional <epsilon-value> mengontrol batas operasi pencarian, vektor dalam jarak dilalui <radius> * (1.0 + <epsilon-value>) mencari hasil kandidat. Defaultnya adalah .01.

Perintah INFO

Pencarian vektor menambah perintah Redis OSS INFO dengan beberapa bagian statistik dan penghitung tambahan. Permintaan untuk mengambil bagian SEARCH akan mengambil semua bagian berikut:

Bagian search_memory

Nama Penjelasan
search_used_memory_bytes Jumlah byte memori yang dikonsumsi di semua struktur data pencarian
search_used_memory_human Versi yang dapat dibaca manusia di atas

Bagian search_index_stats

Nama Penjelasan
search_number_of_indexes Jumlah indeks yang dibuat
search_num_fulltext_indexes Jumlah bidang non-vektor di semua indeks
search_num_vector_indexes Jumlah bidang vektor di semua indeks
search_num_hash_indexes Jumlah indeks pada kunci tipe HASH
search_num_json_indexes Jumlah indeks pada kunci tipe JSON
search_total_indexed_keys Jumlah total kunci di semua indeks
search_total_indexed_vectors Jumlah total vektor di semua indeks
search_total_indexed_hash_keys Jumlah total kunci tipe HASH di semua indeks
search_total_indexed_json_keys Jumlah total kunci tipe JSON di semua indeks
search_total_index_size Byte yang digunakan oleh semua indeks
search_total_fulltext_index_size Byte yang digunakan oleh struktur indeks non-vektor
search_total_vector_index_size Byte yang digunakan oleh struktur indeks vektor
search_max_index_lag_ms Penundaan konsumsi selama pembaruan batch konsumsi terakhir

Bagian search_ingestion

Nama Penjelasan
search_background_indexing_status Status konsumsi. NO_ACTIVITYberarti menganggur. Nilai lain menunjukkan ada kunci dalam proses dicerna.
search_ingestion_dijeda Kecuali saat memulai ulang, ini harus selalu “tidak”.

Bagian search_backfill

catatan

Beberapa bidang yang didokumentasikan di bagian ini hanya terlihat saat pengisian ulang sedang berlangsung.

Nama Penjelasan
search_num_active_backfills Jumlah kegiatan pengurukan saat ini
search_backfills_dijeda Kecuali ketika kehabisan ingatan, ini harus selalu “tidak”.
search_current_backfill_progress_percentage % penyelesaian (0-100) dari isi ulang saat ini

Bagian search_query

Nama Penjelasan
search_num_active_queries Jumlah FT.SEARCH dan FT.AGGREGATE perintah yang sedang berlangsung

Keamanan pencarian vektor

Redis OSS ACL (Access Control Lists) mekanisme keamanan 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 operasi HASH dan JSON tidak dimodifikasi oleh kehadiran indeks; kontrol akses tingkat kunci normal masih diterapkan pada perintah tersebut.

Perintah pencarian dengan indeks juga memiliki akses mereka dikendalikan melalui Redis OSS 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. Hal ini dapat mudah untuk membuat situasi di mana pengguna telah membaca dan/atau menulis akses ke kunci tetapi tidak dapat mengakses indeks yang berisi kunci itu. Perhatikan bahwa hanya akses baca ke ruang kunci yang diperlukan untuk membuat atau menggunakan indeks - ada atau tidak adanya akses tulis tidak dipertimbangkan.

Untuk informasi selengkapnya tentang menggunakan ACL dengan MemoryDB, lihat Mengautentikasi pengguna dengan Daftar Kontrol Akses (ACL).