ApsaraDB RDS for PostgreSQL mendukung ekstensi pgvector, yang menyediakan tipe data baru untuk menyimpan vektor dan memungkinkan pencarian kemiripan yang efisien pada vektor berdimensi tinggi.
Latar Belakang
ApsaraDB RDS for PostgreSQL mendukung ekstensi pgvector untuk menyimpan data vektor dan melakukan pencarian kemiripan vektor, sehingga menyediakan fondasi data bagi aplikasi berbasis AI.
Ekstensi pgvector menyediakan fitur-fitur utama berikut:
-
Menyediakan tipe data
vectoruntuk menyimpan dan mengkueri data vektor. -
Mendukung pencarian tetangga terdekat (nearest neighbor/NN) eksak dan perkiraan (approximate nearest neighbor/ANN). Anda dapat menghitung kemiripan menggunakan Jarak Euclidean (L2), cosine similarity, atau inner product. Untuk mempercepat kueri, Anda dapat membuat indeks HNSW atau IVFFlat. Ekstensi ini juga mendukung perkalian elemen per elemen antar vektor, fungsi jarak L1, dan agregasi sum.
-
Mendukung vektor hingga 16.000 dimensi dan memungkinkan pembuatan indeks untuk vektor hingga 2.000 dimensi.
Konsep utama dan cara kerjanya
Penyematan (Embedding)
Penyematan adalah proses pemetaan data berdimensi tinggi ke representasi berdimensi rendah. Dalam pembelajaran mesin dan pemrosesan bahasa alami (NLP), penyematan sering digunakan untuk merepresentasikan simbol atau objek diskret sebagai titik dalam ruang vektor kontinu.
Proses ini mencerminkan hubungan semantik dan sintaksis antar kata dalam ruang vektor.
Cara kerja
-
Penyematan mengonversi informasi seperti teks, gambar, dan audio menjadi data vektor dengan merepresentasikan fitur-fiturnya dalam beberapa dimensi.
-
Ekstensi pgvector menyediakan tipe data
vectoruntuk menyimpan data vektor di ApsaraDB RDS for PostgreSQL. -
pgvector dapat melakukan pencarian tetangga terdekat eksak dan perkiraan pada data vektor yang tersimpan.
Sebagai contoh, untuk menyimpan tiga objek (apel, pisang, kucing) dalam database dan menghitung kemiripannya menggunakan pgvector, ikuti langkah-langkah berikut:
-
Gunakan model penyematan untuk mengonversi objek-objek tersebut menjadi vektor. Untuk penyematan dua dimensi, hasilnya mungkin tampak seperti berikut:
Apple: embedding[1,1] Banana: embedding[1.2,0.8] Cat: embedding[6,0.4] -
Simpan vektor hasil tersebut dalam database. Untuk detail cara menyimpan data vektor, lihat bagian Contoh.
Dalam bidang dua dimensi, distribusi objek-objek tersebut adalah sebagai berikut:

Karena apel dan pisang sama-sama buah, vektornya lebih berdekatan dalam sistem koordinat 2D. Kucing, sebagai jenis objek yang berbeda, berada lebih jauh.
Anda dapat memperbaiki atribut suatu objek lebih lanjut, seperti warna, asal, dan rasa untuk buah. Setiap atribut menambahkan satu dimensi. Dimensi yang lebih banyak memungkinkan klasifikasi yang lebih rinci, yang dapat menghasilkan hasil pencarian lebih akurat.
Kasus penggunaan
-
Menyimpan data vektor.
-
Menjalankan pencarian kemiripan vektor.
Prasyarat
Instans ApsaraDB RDS for PostgreSQL Anda harus memenuhi persyaratan berikut:
-
Instans menjalankan PostgreSQL versi 14 atau yang lebih baru.
-
Versi mesin minor instans adalah 20230430 atau yang lebih baru. Untuk instans yang menjalankan PostgreSQL 17, versi mesin minor harus 20241030 atau yang lebih baru.
CatatanUntuk meningkatkan versi mesin utama atau memperbarui versi mesin minor, lihat Upgrade the major engine version atau Update the minor engine version.
-
Anda memiliki Akun istimewa untuk instans ApsaraDB RDS for PostgreSQL Anda. Untuk informasi selengkapnya, lihat Create an account.
Manajemen ekstensi
Konsol RDS
-
Instal ekstensi
-
Masuk ke Konsol ApsaraDB RDS dan buka halaman Instances. Di bilah navigasi atas, pilih Wilayah tempat instans Anda berada, lalu klik ID instans tersebut.
-
Di panel navigasi sebelah kiri, klik Plug-ins.
-
Di tab Extension Marketplace, temukan ekstensi vector dan klik Install.
Anda juga dapat mencari plugin vector di halaman Extension Management, lalu klik Install di kolom Actions.
-
Pada kotak dialog yang muncul, pilih database dan Akun istimewa yang dituju, lalu klik Install.
Ekstensi berhasil diinstal ketika status instans berubah dari Maintaining Instance menjadi Running.
-
-
Perbarui atau uninstal ekstensi
-
Di halaman Extension Management, klik tab Installed Extensions. Temukan ekstensi yang dituju dan klik Upgrade Version di kolom Actions untuk meningkatkan ekstensi ke versi terbaru.
CatatanJika tombol Upgrade Version tidak ditampilkan di kolom Actions, berarti ekstensi tersebut sudah berada pada versi terbaru.
-
Di halaman Extension Management, klik tab Installed Extensions. Temukan ekstensi yang dituju dan klik Uninstall di kolom Actions.
-
Perintah SQL
Hanya Akun istimewa yang dapat menjalankan perintah berikut. Untuk informasi selengkapnya tentang cara membuat Akun istimewa, lihat Create an account.
-
Buat ekstensi
CREATE EXTENSION IF NOT EXISTS vector; -
Hapus ekstensi
DROP EXTENSION vector; -
Perbarui ekstensi
ALTER EXTENSION vector UPDATE [ TO new_version ]Catatannew_version menentukan versi pgvector. Untuk informasi tentang versi terbaru dan fitur-fiturnya, lihat dokumentasi resmi pgvector.
Contoh
Contoh berikut menunjukkan cara menggunakan ekstensi pgvector. Untuk penggunaan lanjutan, lihat dokumentasi resmi pgvector.
-
Gunakan akun dengan izin pembuatan tabel untuk membuat tabel bernama
itemsguna menyimpan penyematan.CREATE TABLE items ( id bigserial PRIMARY KEY, item text, embedding vector(2) );CatatanDalam contoh ini, digunakan vektor 2 dimensi. pgvector mendukung vektor hingga 16.000 dimensi.
-
Masukkan data vektor ke dalam tabel.
INSERT INTO items (item, embedding) VALUES ('Apple', '[1, 1]'), ('Banana', '[1.2, 0.8]'), ('Cat', '[6, 0.4]'); -
Gunakan operator cosine similarity
<=>untuk menghitung kemiripan pisang terhadap apel dan kucing.SELECT item, embedding <=> '[1.2, 0.8]' AS cosine_distance FROM items ORDER BY cosine_distance;Catatan-
Pada contoh di atas, operator
<=>digunakan untuk menghitung jarak cosine. Semakin kecil jaraknya, semakin tinggi kemiripannya. -
Anda juga dapat menggunakan operator jarak Euclidean
<->atau operator inner product<#>untuk menghitung kemiripan.
Hasil contoh:
item | cosine_distance --------+---------------------- Banana | 0 Apple | 0.019419362524530137 Cat | 0.13289443670962842Pada hasil di atas:
-
Hasil untuk Banana adalah 0, yang menunjukkan kecocokan sempurna (jarak nol).
-
Hasil untuk Apple adalah 0,019, yang menunjukkan bahwa Apple sangat mirip dengan Banana.
-
Hasil untuk Cat adalah 0,133, yang menunjukkan bahwa Cat tidak terlalu mirip dengan Banana.
CatatanDalam aplikasi dunia nyata, Anda dapat menetapkan ambang batas kemiripan untuk menyaring hasil dengan kemiripan rendah.
-
-
Untuk meningkatkan performa pencarian kemiripan, buat indeks pada data vektor Anda. Contoh berikut menunjukkan cara membuat indeks untuk kolom
embedding.Indeks HNSW
CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64);Parameter:
Parameter
Deskripsi
m
Jumlah maksimum koneksi untuk setiap node pada setiap lapisan graf HNSW.
Nilai yang lebih besar membuat graf lebih padat, yang biasanya meningkatkan tingkat recall tetapi memperpanjang waktu pengindeksan dan kueri.
ef_construction
Ukuran daftar kandidat dinamis selama pembuatan indeks. Parameter ini menentukan berapa banyak node kandidat yang dipertahankan untuk memilih koneksi optimal.
Nilai yang lebih besar dapat meningkatkan tingkat recall tetapi memperpanjang waktu pengindeksan.
Indeks IVF
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);Parameter:
Parameter/Nilai
Deskripsi
items
Tabel yang berisi kolom yang akan diindeks.
embedding
Kolom vektor yang akan diindeks.
vector_cosine_ops
Kelas operator yang ditentukan untuk indeks vektor.
-
Pencarian kemiripan cosine menggunakan
vector_cosine_ops. -
Jarak Euclidean menggunakan
vector_l2_ops. -
Untuk kemiripan inner product, gunakan
vector_ip_ops.
lists = 100
Parameter lists menentukan jumlah daftar untuk mempartisi dataset. Nilai yang lebih besar berarti dataset dibagi lebih banyak, sehingga setiap subset menjadi lebih kecil dan kueri indeks lebih cepat. Namun, seiring peningkatan nilai lists, tingkat recall kueri mungkin menurun.
Catatan-
Tingkat recall adalah metrik dalam tugas pengambilan informasi dan klasifikasi. Ini adalah rasio sampel yang berhasil diambil atau diklasifikasikan terhadap total jumlah sampel relevan. Tingkat recall mengukur kemampuan sistem untuk menemukan semua sampel relevan.
-
Membangun indeks memerlukan memori dalam jumlah besar. Jika nilai parameter lists melebihi 2000, terjadi error:
ERROR: memory required is xxx MB, maintenance_work_mem is xxx MB. Anda perlu menetapkan nilai maintenance_work_mem yang lebih besar untuk membangun indeks data vektor. Namun, menetapkan nilai ini terlalu tinggi berisiko menyebabkan OOM pada instans. Untuk informasi selengkapnya, lihat Set instance parameters. -
Anda harus menyesuaikan parameter lists untuk menyeimbangkan kecepatan kueri dan tingkat recall sesuai kebutuhan aplikasi Anda.
Anda dapat menggunakan salah satu metode berikut untuk menetapkan parameter ivfflat.probes. Parameter ini menentukan jumlah daftar yang akan dicari dalam indeks. Dengan meningkatkan nilai ivfflat.probes, Anda mencari lebih banyak daftar, yang dapat meningkatkan tingkat recall hasil kueri Anda.
-
Tingkat sesi
SET ivfflat.probes = 10; -
Tingkat transaksi
BEGIN; SET LOCAL ivfflat.probes = 10; SELECT ... COMMIT;
Nilai ivfflat.probes yang lebih besar menghasilkan tingkat recall kueri lebih tinggi tetapi kecepatan kueri lebih lambat. Sesuaikan nilai lists dan ivfflat.probes berdasarkan kebutuhan aplikasi dan karakteristik dataset Anda untuk mencapai keseimbangan terbaik antara performa kueri dan tingkat recall.
CatatanJika nilai ivfflat.probes sama dengan nilai lists yang ditentukan saat pembuatan indeks, kueri akan mengabaikan indeks vektor dan melakukan pemindaian tabel penuh.
-
Data performa
Saat membuat indeks untuk data vektor, Anda harus menyeimbangkan kecepatan kueri dan tingkat recall berdasarkan volume data dan skenario aplikasi Anda. Untuk pengujian performa terkait, lihat topik-topik berikut: