PGVector adalah ekstensi database berperforma tinggi untuk pencarian kesamaan vektor yang mendukung berbagai algoritma dan tipe data. Ekstensi ini memungkinkan Anda menyimpan, mengquery, dan mengindeks embedding yang dihasilkan oleh pembelajaran mesin di PostgreSQL bersama dengan data lainnya. Topik ini menjelaskan latar belakang, prinsip implementasi, penggunaan, serta referensi terkait PGVector.
Informasi Latar Belakang
Seiring dengan pesatnya perkembangan ilmu data dan pembelajaran mesin, komputasi vektor telah menjadi salah satu tugas komputasi yang paling umum di bidang data besar. PolarDB for PostgreSQL (Kompatibel dengan Oracle) dapat diintegrasikan dengan ekstensi PGVector serta menggunakan tipe data dan metode penyimpanan kustom untuk meningkatkan performa komputasi vektor berdimensi tinggi.
Penyimpanan berdimensi tinggi, termasuk model text embedding utama, digunakan untuk input dan output data. PGVector memungkinkan Anda membuat vektor hingga 16.000 dimensi.
Prasyarat
Ekstensi ini didukung pada kluster PolarDB for PostgreSQL (Kompatibel dengan Oracle) yang menjalankan mesin berikut:
PolarDB for PostgreSQL (Kompatibel dengan Oracle) 2.0 (versi revisi 2.0.14.7.9.0 atau lebih baru)
PolarDB for PostgreSQL (Kompatibel dengan Oracle) 1.0 (versi revisi 2.0.11.9.35.0 atau lebih baru)
Anda dapat memeriksa versi revisi kluster Anda di konsol PolarDB atau dengan mengeksekusi pernyataan SHOW polardb_version;. Jika versi revisi tidak memenuhi persyaratan, perbarui versi revisi.
Peringatan
Fitur eksekusi paralel lintas node memungkinkan Anda menggunakan klausa sortir untuk menangani vektor berdimensi tinggi.
Fitur eksekusi paralel lintas node tidak mendukung query indeks.
Cara Kerjanya
Seperti ekstensi PASE, PGVector menggunakan indeks Hierarchical Navigable Small World (HNSW). Algoritma Inverted File with Flat Compression (IVFFlat) berbasis indeks terbalik dan mengimplementasikan pencarian tetangga terdekat perkiraan untuk pencarian kesamaan vektor. IVFFlat membagi ruang vektor menjadi wilayah yang masing-masing mewakili kluster vektor serta membuat indeks terbalik guna mendukung pencarian kesamaan vektor.
IVFFlat merupakan versi sederhana dari algoritma Inverted File System with Asymmetric Distance Computation (IVFADC). Algoritma ini cocok untuk skenario bisnis yang memerlukan presisi tinggi namun dapat mentoleransi waktu query hingga 100 milidetik. IVFFlat memiliki beberapa keunggulan dibandingkan algoritma lainnya, seperti laju recall yang tinggi, presisi yang baik, algoritma dan parameter yang sederhana, serta penggunaan penyimpanan yang rendah.
Ekstensi PGVector diimplementasikan berdasarkan mekanisme ekstensi dari PolarDB for PostgreSQL (Kompatibel dengan Oracle). Ekstensi ini ditulis dalam bahasa pemrograman C dan mendukung berbagai algoritma komputasi vektor serta tipe data. Berikut ini dijelaskan proses kerja algoritma tersebut:
IVFFlat menggunakan algoritma pengklusteran seperti k-means untuk membagi vektor dalam ruang berdimensi tinggi menjadi kluster berdasarkan properti pengklusteran implisit, di mana setiap kluster memiliki pusat.
IVFFlat melintasi pusat semua kluster untuk mengidentifikasi n pusat terdekat dengan vektor yang akan di-query.
IVFFlat melintasi dan mengurutkan semua vektor dalam kluster tempat n pusat teridentifikasi berada, lalu mendapatkan k vektor terdekat.
Catatan Penggunaan
Anda dapat menggunakan ekstensi PGVector untuk melakukan pencarian sekuensial atau indeks untuk vektor berdimensi tinggi. Untuk informasi lebih lanjut, lihat Contoh.
Versi ekstensi yang berbeda mungkin didukung di versi mesin database yang berbeda. Untuk informasi lebih lanjut, lihat Ekstensi.
Tingkat recall dan performa query
Pada versi sebelum 0.5.0, ekstensi PGVector menggunakan metode pengindeksan IVFFlat yang dikenal karena kecepatan pembuatan indeksnya yang tinggi. Metode ini meningkatkan performa query, namun memiliki laju recall moderat dan membutuhkan jumlah memori yang signifikan. Metode pengindeksan HNSW yang baru menawarkan laju recall lebih baik serta performa query yang lebih tinggi, tetapi kecepatan pembuatan indeks lebih lambat dan penggunaan memori lebih besar. Untuk menanyakan data vektor secara efektif berdasarkan indeks vektor, Anda perlu menyeimbangkan kelebihan dan kekurangan terkait performa query dan laju recall. Bagian berikut menjelaskan cara mengonfigurasi parameter untuk metode pengindeksan di atas guna meningkatkan laju recall.
HNSW
m: jumlah tautan dua arah (atau jalur) yang terhubung ke setiap elemen indeks. Nilainya berada dalam rentang 2 hingga 100. Nilai default adalah 16. Untuk meningkatkan laju recall, Anda dapat menentukan angka besar untuk parameter ini. Namun, banyak tautan dua arah secara signifikan memperpanjang waktu pembuatan indeks dan dapat memengaruhi performa query secara negatif.ef_construction: jumlah tetangga yang ingin Anda periksa saat elemen ditambahkan ke indeks. Nilainya berada dalam rentang 4 hingga 100. Nilai default adalah 64. Anda dapat meningkatkan laju recall dengan meningkatkan nilai parameter ini. Namun, waktu pembuatan indeks mungkin diperpanjang. Nilai parameter ini harus minimal dua kali nilai parameterm.CREATE TABLE vecs (id int PRIMARY KEY, embedding vector(1536)); CREATE INDEX ON vecs USING hnsw(embedding vector_l2_ops) WITH (m=16, ef_construction=64);Jika Anda menggunakan metode pengindeksan HNSW, Anda harus menentukan kelas operator. Misalnya, jika Anda ingin menggunakan kemiripan kosinus sebagai metrik untuk indeks HNSW, jalankan pernyataan berikut:
CREATE INDEX ON vecs USING hnsw(embedding vector_cosine_ops);Anda dapat menggunakan item konfigurasi pembuatan indeks default untuk mengoptimalkan waktu pembuatan indeks. Jika laju recall yang diharapkan tidak tercapai pada dataset Anda, tingkatkan nilai parameter
ef_construction. Kemudian, sesuaikan nilai parameterm. Untuk meningkatkan laju recall, Anda dapat menentukan nilai lebih besar untuk parameterhnsw.ef_search. Misalnya, Anda dapat menyetel nilainya menjadi100. Nilai lebih besar menentukan laju recall yang lebih tinggi.IVFFlat
lists: Jumlah pusat kluster untuk semua vektor dalam tabel sampling PGVector.CREATE INDEX ON vecs USING ivfflat(embedding) WITH (lists=100);
Untuk informasi lebih lanjut tentang indeks dan parameter, lihat modul README dalam kode sumber terbuka.
Contoh
Tambahkan ekstensi PGVector ke database.
CatatanJika kluster Anda menjalankan dan pesan kesalahan
ERROR: must be superuserdikembalikan, hubungi kami untuk pemecahan masalah.CREATE EXTENSION vector;Buat tabel.
CREATE TABLE t (val vector(3));Masukkan data ke dalam tabel.
INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL);Buat indeks vektor.
CREATE INDEX ON t USING ivfflat (val vector_ip_ops) WITH (lists = 1);Temukan vektor serupa.
SELECT * FROM t ORDER BY val <#> '[3,3,3]';Hasil berikut dikembalikan:
val --------- [1,2,3] [1,1,1] [0,0,0] (3 rows)CatatanDalam
val vector_ip_ops, val merupakan kolom tempat indeks akan dibuat.vector_ip_opsadalah operator vektor yang disediakan oleh PolarDB for PostgreSQL (Kompatibel dengan Oracle), digunakan untuk menghitung kesamaan antar vektor. Operator ini mendukung perhitungan jarak produk titik, kemiripan kosinus, dan jarak Euclidean antar vektor.WITH (lists = 1)menunjukkan bahwa hanya satu wilayah yang dibuat, sehingga semua vektor dialokasikan ke wilayah yang sama. Dalam skenario query vektor aktual, tentukan jumlah wilayah berdasarkan volume data dan performa query.
Referensi
Untuk informasi lebih lanjut tentang proses embedding vektor, lihat output model text embedding Tiongkok daratan dan internasional.