Topik ini menjelaskan cara menggunakan ekstensi pencarian ANN PostgreSQL (PASE) untuk mencari vektor di ApsaraDB RDS for PostgreSQL. PASE bekerja berdasarkan algoritma IVFFlat atau Hierarchical Navigable Small World (HNSW).
Ekstensi PASE tidak lagi dipelihara. Kami merekomendasikan Anda untuk menggunakan ekstensi pgvector. Untuk informasi lebih lanjut, lihat Gunakan ekstensi pgvector.
Prasyarat
Instans RDS Anda harus menjalankan PostgreSQL 11 atau versi lebih baru (kecuali PostgreSQL 17).
Informasi latar belakang
Pembelajaran representasi adalah teknologi kecerdasan buatan (AI) 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 menanyai data menggunakan pendekatan pencarian vektor.
PASE adalah ekstensi indeks pencarian vektor berperforma tinggi yang dikembangkan untuk PostgreSQL. PASE menggunakan dua algoritma pencarian tetangga terdekat perkiraan (ANN) yang sudah berkembang baik, stabil, dan efisien, yaitu IVFFlat dan HNSW, untuk menanyai vektor dari database PostgreSQL dengan kecepatan tinggi. PASE tidak mendukung ekstraksi atau output vektor fitur. Anda harus mengambil vektor fitur entitas yang ingin Anda tanyai. PASE hanya melakukan pencarian kesamaan di antara sejumlah besar vektor yang diidentifikasi berdasarkan vektor fitur yang diambil.
Audiens yang dituju
Topik ini tidak menjelaskan secara rinci istilah-istilah terkait pembelajaran mesin. Sebelum membaca topik ini, Anda harus memahami dasar-dasar pembelajaran mesin dan teknologi pencarian.
Catatan penggunaan
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 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.
Untuk membuat indeks IVFFlat pada tabel menggunakan centroid internal, Anda harus menetapkan parameter clustering_type ke 1 dan menyisipkan beberapa data ke dalam tabel.
Anda harus menggunakan akun dengan hak istimewa untuk mengeksekusi pernyataan SQL yang dijelaskan dalam topik ini.
Algoritma yang digunakan oleh PASE
IVFFlat
IVFFlat adalah versi sederhana dari algoritma IVFADC. IVFFlat cocok untuk skenario bisnis yang memerlukan presisi tinggi tetapi dapat mentolerir hingga 100 milidetik waktu kueri. IVFFlat memiliki keunggulan berikut dibandingkan algoritma lain:
Jika vektor yang akan ditanyai merupakan salah satu dataset kandidat, IVFFlat memberikan recall 100%.
IVFFlat menggunakan struktur sederhana untuk membuat indeks dengan kecepatan tinggi, dan indeks yang dibuat menempati ruang penyimpanan yang lebih sedikit.
Anda dapat menentukan centroid untuk pengelompokan dan mengontrol presisi dengan mengonfigurasi ulang parameter.
Anda dapat mengontrol akurasi IVFFlat dengan mengonfigurasi ulang parameter yang dapat diinterpretasikan.
Gambar berikut menunjukkan cara kerja IVFFlat.

Prosedur berikut menjelaskan cara kerja IVFFlat:
IVFFlat menggunakan algoritma pengelompokan seperti k-means untuk membagi vektor dalam ruang data berdimensi tinggi menjadi kluster berdasarkan properti pengelompokan implisit. Setiap kluster memiliki sebuah centroid.
IVFFlat melintasi centroid semua kluster untuk mengidentifikasi n centroid yang paling dekat dengan vektor yang ingin Anda tanyai.
IVFFlat melintasi dan mengurutkan semua vektor dalam kluster tempat n centroid yang diidentifikasi termasuk. Kemudian, IVFFlat mendapatkan k vektor terdekat.
CatatanKetika IVFFlat mencoba mengidentifikasi n centroid terdekat, ia melewati kluster yang terletak jauh dari vektor yang ingin Anda tanyai. Ini mempercepat kueri. Namun, IVFFlat tidak dapat memastikan bahwa semua vektor k yang mirip termasuk dalam kluster 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 yang lebih tinggi tetapi beban komputasi yang lebih banyak.
Pada fase pertama, IVFFlat bekerja dengan cara yang sama seperti IVFADC. Perbedaan utama antara IVFFlat dan IVFADC terletak pada fase kedua. Pada fase kedua, IVFADC menggunakan kuantisasi produk untuk menghilangkan kebutuhan beban komputasi traversal. Ini mempercepat kueri tetapi menurunkan presisi. IVFFlat menerapkan 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 grafik kedekatan. Jika volume data besar, HNSW secara signifikan meningkatkan kinerja dibandingkan algoritma lain. Namun, HNSW memerlukan penyimpanan tetangga grafik kedekatan, 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 lewati 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 dengan 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. Lalu, 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 grafik kedekatan memungkinkan HNSW memberikan percepatan kueri yang lebih tinggi dibandingkan algoritma pengelompokan.
IVFFlat dan HNSW masing-masing cocok untuk skenario bisnis tertentu. Misalnya, IVFFlat cocok untuk perbandingan gambar dengan presisi tinggi, dan HNSW cocok untuk pencarian dengan rekomendasi recall.
Penggunaan 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. Anda dapat membangun data tipe PASE berdasarkan pernyataan sebelumnya. 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 produk titik. Produk titik juga disebut produk 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 produk titik. Produk titik juga disebut produk 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 produk titik atau metode kosinus untuk menghitung kesamaan vektor, vektor asli harus dinormalisasi. Misalnya, jika vektor asli adalah
, maka harus sesuai dengan rumus berikut:
. Dalam contoh ini, produk titik sama dengan nilai kosinus.IVFFlat
CREATE INDEX ivfflat_idx ON table_name USING pase_ivfflat(column_name) 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. Algoritma pengelompokan k-means digunakan. Algoritma ini ditentukan oleh parameter clustering_params.
Jika Anda menggunakan PASE untuk pertama kalinya, kami merekomendasikan Anda memilih pengelompokan internal.
distance_type
Metode yang digunakan untuk menghitung kesamaan vektor. Nilai default: 0. Nilai valid:
0: jarak Euclidean.
1: produk titik. Metode ini memerlukan normalisasi vektor. Urutan produk titik berlawanan dengan urutan jarak Euclidean.
ApsaraDB RDS for PostgreSQL hanya mendukung metode jarak Euclidean. Produk 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 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 menetapkan bidang ini ke 1, sistem akan mengambil sampel data dari daftar dinamis berdasarkan rasio sampling 1:1000 sebelum melakukan pengelompokan k-means. Nilai yang lebih besar menunjukkan akurasi kueri yang lebih tinggi tetapi pembuatan indeks yang lebih lambat. Kami merekomendasikan agar jumlah total rekaman data yang diambil tidak melebihi 100.000.k: jumlah centroid. Nilai yang lebih besar menunjukkan akurasi kueri yang lebih tinggi tetapi pembuatan indeks yang lebih lambat. Kami merekomendasikan Anda menetapkan bidang ini ke nilai dalam rentang [100, 1000].
HNSW
CREATE INDEX hnsw_idx ON table_name USING pase_hnsw(column_name) 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 valid:
[8,512].base_nb_num
Jumlah tetangga yang ingin Anda identifikasi untuk elemen. Parameter ini diperlukan. Nilai yang lebih besar menunjukkan akurasi kueri yang lebih tinggi, tetapi pembuatan indeks yang lebih lambat dan lebih banyak penyimpanan yang ditempati. Kami merekomendasikan Anda menetapkan 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 yang lebih tinggi tetapi pembuatan indeks yang lebih lambat. Kami merekomendasikan Anda menetapkan 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 yang lebih tinggi tetapi kinerja kueri yang lebih buruk. Nilai valid:
[10,400].base64_encoded
Menentukan apakah 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 menanyai vektor:
Indeks IVFFlat
SELECT id, vector <#> '1,1,1'::pase as distance FROM table_name ORDER BY vector <#> '1,1,1:10:0'::pase ASC LIMIT 10;Catatan<#> adalah operator yang digunakan oleh indeks IVFFlat.
Anda harus mengeksekusi pernyataan 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 ditanyai. Parameter kedua menentukan efisiensi kueri IVFFlat dengan rentang nilai(0,1000], di mana nilai yang lebih besar menunjukkan akurasi kueri yang lebih tinggi tetapi kinerja kueri yang lebih buruk. Kami merekomendasikan Anda mengonfigurasi parameter ini berdasarkan kebutuhan bisnis Anda. Parameter ketiga menentukan metode perhitungan kesamaan vektor, di mana nilai 0 mewakili metode jarak Euclidean dan nilai 1 mewakili metode produk titik. Produk titik juga disebut produk dalam. Metode produk titik memerlukan normalisasi vektor. Urutan produk titik berlawanan dengan urutan jarak Euclidean.
HNSW
SELECT id, vector <?> '1,1,1'::pase as distance FROM table_name ORDER BY vector <?> '1,1,1:100:0'::pase ASC LIMIT 10;Catatan<?> adalah operator yang digunakan oleh indeks HNSW.
Anda harus mengeksekusi pernyataan 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:100:0mencakup tiga parameter. Parameter pertama menentukan vektor yang akan ditanyai. Parameter kedua menentukan efisiensi kueri HNSW dengan rentang nilai(0, ∞), di mana nilai yang lebih besar menunjukkan akurasi kueri yang lebih tinggi tetapi kinerja kueri yang lebih buruk. Kami merekomendasikan Anda menetapkan parameter kedua ke 40 dan kemudian menguji nilai tersebut 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 produk titik. Produk titik juga disebut produk dalam. Metode produk titik memerlukan normalisasi vektor. Urutan produk titik berlawanan dengan urutan jarak Euclidean.
Contoh
Gunakan indeks IVFFlat untuk menanyai vektor.
Eksekusi pernyataan berikut untuk membuat PASE:
CREATE EXTENSION pase;Buat tabel uji dan sisipkan data uji ke dalam tabel.
Eksekusi pernyataan berikut untuk membuat tabel uji:
CREATE TABLE vectors_table ( id SERIAL PRIMARY KEY, vector float4[] NOT NULL );Sisipkan data uji ke dalam tabel.
INSERT INTO vectors_table (vector) VALUES ('{1.0, 0.0, 0.0}'), ('{0.0, 1.0, 0.0}'), ('{0.0, 0.0, 1.0}'), ('{0.0, 0.5, 0.0}'), ('{0.0, 0.5, 0.0}'), ('{0.0, 0.6, 0.0}'), ('{0.0, 0.7, 0.0}'), ('{0.0, 0.8, 0.0}'), ('{0.0, 0.0, 0.0}');Gunakan algoritma IVFFlat untuk membuat indeks.
CREATE INDEX ivfflat_idx ON vectors_table USING pase_ivfflat(vector) WITH (clustering_type = 1, distance_type = 0, dimension = 3, base64_encoded = 0, clustering_params ="10,100");Gunakan indeks IVFFlat untuk menanyai vektor.
SELECT id, vector <#> '1,1,1'::pase as distance FROM vectors_table ORDER BY vector <#> '1,1,1:10:0'::pase ASC LIMIT 10;
Lampiran
Hitung produk titik dari sebuah 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;CatatanProduk titik dari vektor yang dinormalisasi sama dengan nilai kosinusnya. Oleh karena itu, Anda juga dapat mengikuti contoh ini untuk menghitung nilai kosinus dari sebuah vektor.
Buat indeks IVFFlat dari file centroid eksternal.
Ini adalah fitur lanjutan. Anda harus mengunggah file centroid eksternal ke direktori tertentu di server 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
Herv ́e J ́egou, Matthijs Douze, Cordelia Schmid. Kuantisasi produk untuk pencarian tetangga terdekat.
Yu.A.Malkov, D.A.Yashunin. Pencarian tetangga terdekat perkiraan yang efisien dan tangguh menggunakan graf Hierarkis Navigable Small World.