Topik ini menjelaskan cara menggunakan ekstensi pencarian ANN PostgreSQL (PASE) plug-in di PolarDB for PostgreSQL (Kompatibel dengan Oracle) untuk mencari vektor. PASE bekerja berdasarkan algoritma IVFFlat atau Hierarchical Navigable Small World (HNSW).
Informasi latar belakang
Representation learning adalah teknologi kecerdasan buatan (AI) yang khas dalam disiplin pembelajaran mendalam. Teknologi ini telah berkembang pesat dalam beberapa tahun terakhir dan digunakan dalam berbagai skenario bisnis seperti periklanan, pembayaran pemindaian wajah, pengenalan gambar, dan pengenalan suara. Teknologi ini memungkinkan data disematkan ke dalam vektor berdimensi tinggi dan memungkinkan Anda menanyakan data menggunakan pendekatan pencarian vektor.
PASE adalah plug-in indeks pencarian vektor berperforma tinggi yang dikembangkan untuk PostgreSQL. PASE menggunakan dua algoritma pencarian tetangga terdekat (ANN) yang sudah berkembang dengan baik, stabil, dan efisien, yaitu IVFFlat dan Hierarchical Navigable Small World (HNSW), untuk menanyakan vektor dari database PostgreSQL dengan kecepatan tinggi. PASE tidak mendukung ekstraksi atau output vektor fitur. Anda harus mengambil vektor fitur entitas yang ingin Anda tanyakan. PASE hanya melaksanakan pencarian kesamaan di antara sejumlah besar vektor yang diidentifikasi berdasarkan vektor fitur yang diambil.
Audience yang dituju
Topik ini tidak menjelaskan secara rinci istilah-istilah yang terkait dengan pembelajaran mesin. Sebelum membaca topik ini, Anda harus memahami dasar-dasar pembelajaran mesin dan teknologi pencarian.
Tindakan pencegahan
Jika indeks pada tabel mengalami pembengkakan, Anda dapat memperoleh ukuran data yang diindeks dengan mengeksekusi pernyataan
select pg_relation_size('Nama indeks');. Kemudian, bandingkan ukuran indeks dengan ukuran data dalam tabel. Jika ukuran data yang diindeks lebih besar daripada ukuran data dalam tabel dan kueri data melambat, Anda harus membuat ulang indeks pada tabel.Indeks pada tabel mungkin tidak akurat setelah pembaruan data yang sering. Jika Anda memerlukan tingkat akurasi 100%, Anda harus membuat ulang indeks secara berkala.
Jika Anda ingin membuat indeks IVFFlat pada tabel dengan menggunakan centroid internal, Anda harus menetapkan parameter clustering_type ke 1 dan menyisipkan data ke dalam tabel.
Anda harus menggunakan akun dengan hak istimewa untuk mengeksekusi pernyataan SQL yang dijelaskan dalam topik ini.
Batasan
Hanya pencarian berurutan untuk vektor berdimensi tinggi yang didukung dalam kueri paralel elastis multi-node.
Algoritma yang digunakan oleh PASE
IVFFlat
IVFFlat adalah versi sederhana dari algoritma IVFADC. IVFFlat cocok untuk skenario bisnis yang memerlukan presisi tinggi tetapi dapat mentoleransi hingga 100 milidetik waktu kueri. IVFFlat memiliki keunggulan berikut dibandingkan algoritma lain:
Jika vektor yang akan dicari adalah salah satu dataset kandidat, IVFFlat memberikan recall 100%.
IVFFlat menggunakan struktur sederhana untuk membuat indeks dengan kecepatan tinggi, dan indeks yang dibuat menempati lebih sedikit penyimpanan.
Anda dapat menentukan centroid untuk pengelompokan dan mengonfigurasi ulang parameter untuk mengontrol presisi.
Parameter algoritma dapat diinterpretasikan, yang memungkinkan pengguna sepenuhnya mengontrol akurasi algoritma.
Gambar berikut menunjukkan cara kerja IVFFlat.

Prosedur berikut menjelaskan cara kerja IVFFlat:
IVFFlat menggunakan algoritma pengelompokan seperti k-means untuk membagi vektor dalam ruang berdimensi tinggi menjadi cluster berdasarkan properti pengelompokan implisit. Dengan cara ini, setiap cluster memiliki sebuah centroid.
IVFFlat melintasi centroid dari semua cluster untuk mengidentifikasi n centroid yang paling dekat dengan vektor yang ingin Anda cari.
IVFFlat melintasi dan mengurutkan semua vektor dalam cluster tempat n centroid yang diidentifikasi termasuk. Kemudian, IVFFlat memperoleh k vektor terdekat.
CatatanKetika IVFFlat mencoba mengidentifikasi n centroid terdekat, IVFFlat melewati cluster yang terletak jauh dari vektor yang ingin Anda cari. Ini mempercepat kueri. Namun, IVFFlat tidak dapat memastikan bahwa semua vektor k yang mirip termasuk dalam cluster tempat n centroid yang diidentifikasi termasuk. Akibatnya, presisi mungkin menurun. Anda dapat menggunakan variabel n untuk mengontrol presisi. Nilai n yang lebih besar menunjukkan presisi lebih tinggi tetapi lebih banyak beban komputasi.
Dalam fase pertama, IVFFlat bekerja dengan cara yang sama seperti IVFADC. Perbedaan utama antara IVFFlat dan IVFADC terletak pada fase kedua. Dalam fase kedua, IVFADC menggunakan kuantisasi produk untuk menghilangkan kebutuhan beban komputasi traversal. Ini mempercepat kueri tetapi menurunkan presisi. IVFFlat melaksanakan pencarian brute-force untuk memastikan presisi dan memungkinkan Anda mengontrol beban komputasi.
HNSW
HNSW adalah algoritma ANN berbasis graf yang cocok untuk kueri di antara puluhan juta atau lebih dataset vektor. Tanggapan terhadap kueri-kueri ini harus dikembalikan dalam waktu 10 milidetik atau kurang.
HNSW mencari vektor serupa di antara tetangga graf proximity. Jika volume data besar, HNSW secara signifikan meningkatkan performa dibandingkan algoritma lain. Namun, HNSW memerlukan penyimpanan tetangga graf proximity, yang menempati ruang penyimpanan. Selain itu, setelah presisi HNSW mencapai tingkat tertentu, Anda tidak dapat meningkatkan presisi HNSW dengan mengonfigurasi ulang parameter.
Gambar berikut menunjukkan cara kerja HNSW.

Prosedur berikut menjelaskan cara kerja HNSW:
HNSW membangun struktur hierarkis yang terdiri dari beberapa lapisan, yang juga disebut graf. Setiap lapisan adalah panorama dan daftar lompat dari lapisan bawahnya.
HNSW secara acak memilih elemen dari lapisan atas untuk memulai pencarian.
HNSW mengidentifikasi tetangga elemen yang dipilih dan menambahkan tetangga yang diidentifikasi ke daftar dinamis panjang tetap berdasarkan jarak tetangga yang diidentifikasi ke elemen yang dipilih. HNSW terus mengidentifikasi tetangga setiap tetangga yang termasuk dalam daftar dan menambahkan tetangga yang diidentifikasi ke daftar. Setiap kali HNSW menambahkan tetangga ke daftar, HNSW mengurutkan ulang tetangga dalam daftar dan hanya menyimpan k tetangga pertama. Jika daftar berubah, HNSW terus mencari sampai daftar mencapai keadaan akhir. Kemudian, HNSW menggunakan elemen pertama dalam daftar sebagai awal pencarian di lapisan bawah.
HNSW mengulangi langkah ketiga sampai pencarian selesai di lapisan bawah.
CatatanHNSW membangun struktur multi-lapisan dengan menggunakan algoritma Navigable Small World (NSW) yang dirancang untuk membangun struktur single-layer. Penggunaan pendekatan untuk memilih tetangga graf proximity memungkinkan HNSW memberikan percepatan kueri lebih tinggi dibandingkan algoritma pengelompokan.
IVFFlat dan HNSW cocok untuk skenario bisnis tertentu. Misalnya, IVFFlat cocok untuk perbandingan gambar dengan presisi tinggi, dan HNSW cocok untuk pencarian dengan recall yang direkomendasikan. Algoritma terkemuka industri lainnya akan diintegrasikan ke dalam PASE.
Prosedur
Eksekusi pernyataan berikut untuk membuat PASE:
CREATE EXTENSION pase;Gunakan salah satu metode konstruksi berikut untuk menghitung kesamaan vektor:
Konstruksi Berbasis Tipe PASE
Contoh
SELECT ARRAY[2, 1, 1]::float4[] <?> pase(ARRAY[3, 1, 1]::float4[]) AS distance; SELECT ARRAY[2, 1, 1]::float4[] <?> pase(ARRAY[3, 1, 1]::float4[], 0) AS distance; SELECT ARRAY[2, 1, 1]::float4[] <?> pase(ARRAY[3, 1, 1]::float4[], 0, 1) AS distance;Catatan<?> adalah operator tipe PASE, yang digunakan untuk menghitung kesamaan antara vektor di sebelah kiri dan kanan elemen tertentu. Vektor di sebelah kiri harus menggunakan tipe data float4[], dan vektor di sebelah kanan harus menggunakan tipe data PASE.
Tipe data PASE didefinisikan dalam PASE dan dapat berisi hingga tiga konstruktor. Ambil bagian
float4[], 0, 1dalam pernyataan ketiga sebelumnya sebagai contoh. Parameter pertama menentukan vektor di sebelah kanan dengan tipe data float4[]. Parameter kedua tidak memiliki tujuan khusus dan dapat diatur ke 0. Parameter ketiga menentukan metode perhitungan kesamaan, di mana nilai 0 mewakili metode jarak Euclidean dan nilai 1 mewakili metode perkalian titik. Perkalian titik juga disebut perkalian dalam.Vektor di sebelah kiri harus memiliki jumlah dimensi yang sama dengan vektor di sebelah kanan. Jika tidak, sistem melaporkan kesalahan perhitungan kesamaan.
Konstruksi Berbasis String
Contoh
SELECT ARRAY[2, 1, 1]::float4[] <?> '3,1,1'::pase AS distance; SELECT ARRAY[2, 1, 1]::float4[] <?> '3,1,1:0'::pase AS distance; SELECT ARRAY[2, 1, 1]::float4[] <?> '3,1,1:0:1'::pase AS distance;CatatanMetode konstruksi berbasis string berbeda dari konstruksi berbasis tipe PASE dalam aspek berikut: Metode konstruksi berbasis string menggunakan titik dua (:) untuk memisahkan parameter. Ambil bagian
3,1,1:0:1dalam pernyataan ketiga sebelumnya sebagai contoh: Parameter pertama menentukan vektor di sebelah kanan. Parameter kedua tidak memiliki tujuan khusus dan dapat diatur ke 0. Parameter ketiga menentukan metode perhitungan kesamaan, di mana nilai 0 mewakili metode jarak Euclidean dan nilai 1 mewakili metode perkalian titik. Perkalian titik juga disebut perkalian dalam.
Gunakan IVFFlat atau HNSW untuk membuat indeks.
CatatanJika Anda menggunakan metode jarak Euclidean untuk menghitung kesamaan vektor, vektor asli tidak perlu diproses. Jika Anda menggunakan perkalian titik atau metode kosinus untuk menghitung kesamaan vektor, vektor asli harus dinormalisasi. Misalnya, jika vektor asli adalah
, itu harus mematuhi rumus berikut:
. Dalam contoh ini, perkalian titik sama dengan nilai kosinus.IVFFlat
Contoh
CREATE INDEX ivfflat_idx ON vectors_table USING pase_ivfflat(vector) WITH (clustering_type = 1, distance_type = 0, dimension = 256, base64_encoded = 0, clustering_params = "10,100");Tabel berikut menjelaskan parameter dalam indeks IVFFlat.
Parameter
Deskripsi
clustering_type
Jenis operasi pengelompokan yang dilakukan IVFFlat pada vektor. Parameter ini diperlukan. Nilai valid:
0: pengelompokan eksternal. File centroid eksternal dimuat. File ini ditentukan oleh parameter clustering_params.
1: pengelompokan internal. Pengelompokan internal yang menggunakan algoritma pengelompokan k-means dilakukan. Algoritma ini ditentukan oleh parameter clustering_params.
Jika Anda menggunakan PASE untuk pertama kalinya, kami sarankan Anda memilih pengelompokan internal.
distance_type
Metode yang digunakan untuk menghitung kesamaan vektor. Nilai default: 0. Nilai valid:
0: jarak Euclidean.
1: perkalian titik. Metode ini memerlukan normalisasi vektor. Urutan perkalian titik berlawanan dengan urutan jarak Euclidean.
PolarDB hanya mendukung metode jarak Euclidean. Perkalian titik dapat dihitung dengan menggunakan metode yang dijelaskan dalam Lampiran hanya setelah vektor dinormalisasi.
dimension
Jumlah dimensi. Parameter ini diperlukan. Nilai maksimum parameter ini adalah 512.
base64_encoded
Menentukan apakah akan menggunakan pengkodean Base64. Nilai default: 0. Nilai valid:
0: menggunakan tipe data float4[] untuk merepresentasikan tipe vektor.
1: menggunakan tipe data float[] yang dikodekan Base64 untuk merepresentasikan tipe vektor.
clustering_params
Untuk pengelompokan eksternal, parameter ini menentukan direktori file centroid eksternal yang ingin Anda gunakan. Untuk pengelompokan internal, parameter ini menentukan algoritma pengelompokan yang ingin Anda gunakan. Nilai parameter ini dalam format berikut
clustering_sample_ratio,k. Parameter ini diperlukan.clustering_sample_ratio: fraksi sampling dengan 1000 sebagai penyebut. Nilai bidang ini adalah bilangan bulat dalam rentang (0,1000]. Misalnya, jika Anda mengatur bidang ini ke 1, sistem akan melakukan sampling data dari daftar dinamis berdasarkan rasio sampling 1/1000 sebelum melakukan pengelompokan k-means. Nilai yang lebih besar menunjukkan akurasi kueri lebih tinggi tetapi pembuatan indeks lebih lambat. Kami sarankan agar jumlah total catatan data yang disampling tidak melebihi 100.000.
k: jumlah centroid. Nilai yang lebih besar menunjukkan akurasi kueri lebih tinggi tetapi pembuatan indeks lebih lambat. Kami sarankan Anda mengatur bidang ini ke nilai dalam rentang [100,1000].
HNSW
Contoh
CREATE INDEX hnsw_idx ON vectors_table USING pase_hnsw(vector) WITH (dim = 256, base_nb_num = 16, ef_build = 40, ef_search = 200, base64_encoded = 0);Tabel berikut menjelaskan parameter dalam indeks HNSW.
Parameter
Deskripsi
dim
Jumlah dimensi. Parameter ini diperlukan. Nilai maksimum parameter ini adalah 512.
base_nb_num
Jumlah tetangga yang ingin Anda identifikasi untuk elemen. Parameter ini diperlukan. Nilai yang lebih besar menunjukkan akurasi kueri lebih tinggi, tetapi pembuatan indeks lebih lambat dan lebih banyak ruang penyimpanan yang ditempati. Kami sarankan Anda mengatur parameter ini ke nilai dalam rentang [16,128].
ef_build
Panjang heap yang ingin Anda gunakan selama pembuatan indeks. Parameter ini diperlukan. Panjang heap yang lebih panjang menunjukkan akurasi kueri lebih tinggi tetapi pembuatan indeks lebih lambat. Kami sarankan Anda mengatur parameter ini ke nilai dalam rentang [40,400].
ef_search
Panjang heap yang ingin Anda gunakan selama kueri. Parameter ini diperlukan. Panjang heap yang lebih panjang menunjukkan akurasi kueri lebih tinggi tetapi performa kueri lebih rendah. Anda dapat menentukan parameter ini saat Anda menginisiasi permintaan kueri. Nilai default: 200.
base64_encoded
Menentukan apakah akan menggunakan pengkodean Base64. Nilai default: 0. Nilai valid:
0: menggunakan tipe data float4[] untuk merepresentasikan tipe vektor.
1: menggunakan tipe data float[] yang dikodekan Base64 untuk merepresentasikan tipe vektor.
Gunakan salah satu indeks berikut untuk menanyakan vektor:
Indeks IVFFlat
Contoh
SELECT id, vector <#> '1,1,1'::pase as distance FROM vectors_ivfflat ORDER BY vector <#> '1,1,1:10:0'::pase ASC LIMIT 10;Catatan<#> adalah operator yang digunakan oleh indeks IVFFlat.
Anda harus mengeksekusi klausa ORDER BY untuk membuat indeks IVFFlat berfungsi. Indeks IVFFlat memungkinkan vektor diurutkan dalam urutan menaik.
Tipe data PASE memerlukan tiga parameter untuk menentukan vektor. Parameter ini dipisahkan oleh titik dua (:). Misalnya,
1,1,1:10:0mencakup tiga parameter: Parameter pertama menentukan vektor yang akan dicari. Parameter kedua menentukan efisiensi kueri IVFFlat dengan rentang nilai (0,1000]. Nilai parameter kedua yang lebih besar menunjukkan akurasi kueri lebih tinggi tetapi performa kueri lebih rendah. Parameter ketiga menentukan metode perhitungan kesamaan vektor, di mana nilai 0 mewakili metode jarak Euclidean dan nilai 1 mewakili metode perkalian titik. Perkalian titik juga disebut perkalian dalam. Metode perkalian titik memerlukan normalisasi vektor. Urutan perkalian titik berlawanan dengan urutan jarak Euclidean.
Indeks HNSW
Contoh
SELECT id, vector <?> '1,1,1'::pase as distance FROM vectors_ivfflat ORDER BY vector <?> '1,1,1:100:0'::pase ASC LIMIT 10;Catatan<?> adalah operator yang digunakan oleh indeks HNSW.
Anda harus mengeksekusi klausa ORDER BY untuk membuat indeks HNSW berfungsi. Indeks HNSW memungkinkan vektor diurutkan dalam urutan menaik.
Tipe data PASE memerlukan tiga parameter untuk menentukan vektor. Parameter ini dipisahkan oleh titik dua (:). Misalnya,
1,1,1:10:0mencakup tiga parameter: Parameter pertama menentukan vektor yang akan dicari. Parameter kedua menentukan efisiensi kueri HNSW dengan rentang nilai (0,∞). Nilai parameter kedua yang lebih besar menunjukkan akurasi kueri lebih tinggi tetapi performa kueri lebih rendah. Kami sarankan Anda mengatur parameter kedua ke 40 dan kemudian menguji nilainya dengan peningkatan kecil sampai Anda menemukan nilai yang paling sesuai untuk bisnis Anda. Parameter ketiga menentukan metode perhitungan kesamaan vektor, di mana nilai 0 mewakili metode jarak Euclidean dan nilai 1 mewakili metode perkalian titik. Perkalian titik juga disebut perkalian dalam. Metode perkalian titik memerlukan normalisasi vektor. Urutan perkalian titik berlawanan dengan urutan jarak Euclidean.
Lampiran
Hitung perkalian titik vektor.
Untuk contoh ini, gunakan indeks HNSW untuk membuat fungsi:
CREATE OR REPLACE FUNCTION inner_product_search(query_vector text, ef integer, k integer, table_name text) RETURNS TABLE (id integer, uid text, distance float4) AS $$ BEGIN RETURN QUERY EXECUTE format(' select a.id, a.vector <?> pase(ARRAY[%s], %s, 1) AS distance from (SELECT id, vector FROM %s ORDER BY vector <?> pase(ARRAY[%s], %s, 0) ASC LIMIT %s) a ORDER BY distance DESC;', query_vector, ef, table_name, query_vector, ef, k); END $$ LANGUAGE plpgsql;CatatanPerkalian titik vektor yang dinormalisasi sama dengan nilai kosinusnya. Oleh karena itu, Anda juga dapat mengikuti contoh ini untuk menghitung nilai kosinus vektor.
Buat indeks IVFFlat dari file centroid eksternal.
Ini adalah fitur lanjutan. Anda harus mengunggah file centroid eksternal ke direktori server yang ditentukan dan menggunakan file ini untuk membuat indeks IVFFlat. Untuk informasi lebih lanjut, lihat parameter indeks IVFFlat. File ini dalam format berikut:
Jumlah dimensi|Jumlah centroid|Dataset vektor centroidContoh
3|2|1,1,1,2,2,2
Referensi
Kuantisasi Produk untuk Pencarian Tetangga Terdekat
Herve J ́egou, Matthijs Douze, Cordelia Schmid. Kuantisasi produk untuk pencarian tetangga terdekat.
Yu.A.Malkov, D.A.Yashunin. Pencarian tetangga terdekat pendekatan efisien dan kuat menggunakan graf Hierarchical Navigable Small World.