PGVector adalah ekstensi database vektor yang efisien, mendukung berbagai algoritma komputasi vektor dan tipe data. Ekstensi ini juga menyediakan penyimpanan dan kueri yang efisien untuk AI embeddings yang direpresentasikan sebagai vektor. Topik ini menjelaskan latar belakang, prinsip, dan penggunaan PGVector.
Latar belakang
Seiring pesatnya perkembangan ilmu data dan pembelajaran mesin, komputasi vektor telah menjadi tugas umum dalam aplikasi data besar. PolarDB for PostgreSQL (Compatible with Oracle) merupakan database relasional yang banyak digunakan. Ketika dikombinasikan dengan ekstensi PGVector, database ini memanfaatkan tipe data dan metode penyimpanan kustom untuk mempercepat komputasi vektor berdimensi tinggi.
Ekstensi PGVector mendukung vektor hingga 16.000 dimensi, sehingga sangat ideal untuk skenario yang menggunakan penyimpanan berdimensi tinggi untuk input dan output, seperti model text embedding arus utama.
Penerapan
Versi PolarDB for PostgreSQL (Compatible with Oracle) berikut didukung:
Oracle syntax compatibility 2.0 (versi mesin minor 2.0.14.7.9.0 atau lebih baru)
Oracle syntax compatibility 1.0 (versi mesin minor 2.0.11.9.35.0 atau lebih baru)
Anda dapat melihat nomor versi mesin minor di Konsol atau dengan menjalankan pernyataan SHOW polardb_version;. Jika versi mesin minor Anda tidak memenuhi persyaratan, upgrade versi mesin minor.
Perhatian
Fitur eksekusi paralel lintas node (PX) mendukung traversal vektor berdimensi tinggi dengan `sort`.
PX tidak mendukung kueri indeks.
Cara kerja
PGVector menggunakan algoritma indeks IVFFlat, yaitu algoritma vektor yang sama dengan yang digunakan oleh ekstensi PASE. IVFFlat adalah algoritma pencarian tetangga terdekat aproksimasi (ANN) berbasis indeks terbalik yang secara efisien melakukan kueri kesamaan vektor. Algoritma ini membagi ruang vektor ke dalam partisi, dan setiap partisi berisi sejumlah vektor. Selanjutnya, indeks terbalik dibuat untuk menemukan vektor yang mirip dengan vektor kueri tertentu secara cepat.
IVFFlat merupakan versi sederhana dari algoritma Inverted File System with Asymmetric Distance Computation (IVFADC). Algoritma ini cocok untuk skenario yang membutuhkan tingkat recall tinggi dan dapat mentolerir waktu respons kueri dalam kisaran 100 ms. Dibandingkan algoritma lain, IVFFlat menawarkan keunggulan berupa tingkat recall tinggi, presisi tinggi, algoritma dan parameter yang sederhana, serta penggunaan penyimpanan rendah.
Ekstensi PGVector dibangun di atas mekanisme ekstensi PolarDB for PostgreSQL (Compatible with Oracle). Ekstensi ini ditulis dalam bahasa C dan mengimplementasikan berbagai algoritma komputasi vektor serta tipe data. Alur algoritmanya adalah sebagai berikut:
Algoritma pengelompokan, seperti K-Means, mengelompokkan vektor dalam ruang berdimensi tinggi ke dalam kluster. Pusat (centroid) kemudian dihitung untuk setiap kluster.
Untuk mengambil vektor, algoritma pertama-tama melakukan traversal semua centroid kluster untuk menemukan `n` centroid yang paling dekat dengan vektor target.
Algoritma kemudian melakukan traversal semua elemen dalam kluster yang sesuai dengan `n` centroid tersebut. Sortir global dilakukan untuk menemukan `k` vektor terdekat.
Panduan penggunaan
Ekstensi PGVector dapat mengambil vektor berdimensi tinggi secara sekuensial atau menggunakan indeks. Bagian Contoh menyediakan kasus penggunaan sederhana.
Versi ekstensi yang didukung sedikit berbeda tergantung pada versi mesin database. Untuk informasi selengkapnya, lihat Ekstensi yang didukung.
Tingkat recall dan performa
Versi PGVector sebelum 0.5.0 menggunakan indeks IVFFlat. Indeks IVFFlat dapat dibuat dengan cepat dan meningkatkan performa kueri dibandingkan pencarian tanpa indeks. Namun, tingkat recall-nya moderat dan mengonsumsi sejumlah memori. Indeks HNSW yang lebih baru menawarkan tingkat recall lebih baik dan performa lebih tinggi, tetapi memerlukan waktu lebih lama untuk membangun dan menggunakan lebih banyak memori. Saat menggunakan indeks vektor untuk mengkueri data vektor, Anda sering kali perlu menyeimbangkan antara performa dan tingkat recall. Bagian ini menjelaskan cara mengonfigurasi parameter indeks untuk kedua metode guna meningkatkan tingkat recall.
HNSW
m: Jumlah tautan dua arah (atau jalur) antara setiap elemen indeks. Nilai default adalah 16. Rentang nilai yang valid adalah 2 hingga 100. Nilai yang lebih tinggi meningkatkan tingkat recall tetapi juga secara signifikan memperpanjang waktu pembuatan indeks dan dapat berdampak negatif pada performa kueri.ef_construction: Jumlah tetangga terdekat yang diperiksa saat menambahkan elemen ke indeks. Nilai default adalah 64. Rentang nilai yang valid adalah 4 hingga 100. Meningkatkan nilai ini meningkatkan tingkat recall tetapi memperpanjang waktu pembuatan indeks. Nilai ini harus setidaknya dua kali lipat dari nilaim.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);Tentukan kelas operator untuk indeks HNSW. Misalnya, untuk menggunakan kesamaan kosinus pada indeks HNSW, jalankan perintah berikut:
CREATE INDEX ON vecs USING hnsw(embedding vector_cosine_ops);Untuk mengoptimalkan waktu pembuatan, mulailah dengan item konfigurasi pembuatan indeks default. Jika tingkat recall untuk set data Anda tidak memenuhi ekspektasi, pertama-tama tingkatkan nilai
ef_construction, lalu sesuaikan nilaim. Anda dapat meningkatkan tingkat recall kueri dengan mengatur nilaihnsw.ef_searchyang lebih besar. Misalnya, Anda dapat mengaturnya ke100. Nilai yang lebih besar biasanya menghasilkan tingkat recall yang lebih tinggi.IVFFlat
lists: Jumlah centroid kluster untuk vektor dalam tabel sampling PGVector.CREATE INDEX ON vecs USING ivfflat(embedding) WITH (lists=100);
Untuk informasi selengkapnya tentang indeks dan parameter lainnya, lihat file README di repositori kode sumber terbuka.
Contoh
Buat ekstensi.
CREATE EXTENSION vector;Buat tabel.
CREATE TABLE t (val vector(3));Masukkan data.
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);Hitung vektor aproksimasi.
SELECT * FROM t ORDER BY val <#> '[3,3,3]';Hasil berikut dikembalikan:
val --------- [1,2,3] [1,1,1] [0,0,0] (3 rows)Catatanval vector_ip_opsmenunjukkan bahwa indeks dibuat pada kolom `val`. Operator vektorvector_ip_opsdari PolarDB for PostgreSQL (Compatible with Oracle) menghitung kesamaan antar vektor. Operator ini mendukung perhitungan seperti dot product, cosine similarity, dan Jarak Euclidean.WITH (lists = 1)menentukan bahwa jumlah partisi adalah 1. Artinya, semua vektor ditempatkan dalam partisi yang sama. Dalam aplikasi dunia nyata, Anda harus menyesuaikan jumlah partisi berdasarkan volume data dan kebutuhan performa kueri Anda.
Referensi
Untuk mendapatkan penyematan vektor, Anda dapat menggunakan model text embedding yang tersedia untuk wilayah Tiongkok daratan dan internasional.