RDS for PostgreSQL mendukung ekstensi pgvector yang memungkinkan pencarian kemiripan vektor yang andal. Ekstensi ini menyediakan tipe data baru untuk mengambil data vektor berdimensi tinggi secara cepat dan mudah.
Latar Belakang
RDS for PostgreSQL mendukung ekstensi pgvector yang memungkinkan Anda menyimpan data vektor, melakukan pencarian kemiripan vektor, serta menyediakan dukungan data untuk produk AI.
Ekstensi pgvector menyediakan fitur-fitur berikut:
Mendukung tipe data vector untuk menyimpan dan mengkueri data vektor.
Mendukung pencarian nearest neighbor (ANN) eksak dan aproksimasi dengan berbagai ukuran jarak, seperti jarak L2 (Euclidean), cosine similarity, dan inner product. Untuk pembuatan indeks, ekstensi ini mendukung indeks HNSW, indeks IVFFlat paralel, perkalian vektor elemen per elemen, fungsi jarak L1, dan agregasi sum.
Mendukung pembuatan vektor hingga 16.000 dimensi dan pembuatan indeks pada vektor hingga 2.000 dimensi.
Konsep dan prinsip implementasi
Penyematan (Embedding)
Penyematan adalah proses pemetaan data berdimensi tinggi ke representasi berdimensi rendah. Dalam pembelajaran mesin dan pemrosesan bahasa alami, penyematan sering digunakan untuk merepresentasikan simbol atau objek diskret sebagai titik dalam ruang vektor kontinu.
Dalam pemrosesan bahasa alami, word embedding merupakan teknik umum yang memetakan kata-kata ke vektor bilangan real sehingga komputer dapat lebih memahami dan memproses teks. Teknik ini merepresentasikan hubungan semantik dan gramatikal antar kata dalam ruang vektor.
Prinsip implementasi
Penyematan mengonversi informasi dari sumber seperti teks, citra, audio, dan video menjadi data vektor multidimensi.
Ekstensi pgvector menyediakan tipe data vector yang memungkinkan database RDS for PostgreSQL menyimpan data vektor.
Ekstensi pgvector dapat melakukan pencarian nearest neighbor eksak dan aproksimasi pada data vektor yang tersimpan.
Asumsikan Anda perlu menyimpan tiga objek (apel, pisang, kucing) dalam database dan menggunakan pgvector untuk menghitung kemiripannya. Ikuti langkah-langkah berikut:
Pertama, gunakan penyematan untuk mengonversi ketiga objek tersebut menjadi vektor. Contoh berikut menggunakan penyematan dua dimensi:
Apple: embedding[1,1] Banana: embedding[1.2,0.8] Cat: embedding[6,0.4]Simpan data vektor dalam database. Untuk informasi lebih lanjut tentang cara menyimpan data vektor dua dimensi dalam database, lihat Contoh penggunaan.
Dalam bidang dua dimensi, ketiga objek tersebut tersebar sebagai berikut:

Apel dan pisang sama-sama buah, sehingga posisinya lebih dekat dalam ruang vektor. Kucing merupakan jenis objek yang berbeda, sehingga jaraknya lebih jauh.
Anda dapat memperhalus atribut buah lebih lanjut, seperti warna, asal, dan rasa. Setiap atribut merepresentasikan satu dimensi. Penggunaan lebih banyak dimensi memungkinkan klasifikasi yang lebih halus dan menghasilkan hasil pencarian yang lebih akurat.
Skenario
Menyimpan data vektor.
Menjalankan pencarian kemiripan vektor.
Prasyarat
Instans RDS for PostgreSQL harus memenuhi persyaratan berikut:
Instans menjalankan PostgreSQL versi utama 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 informasi lebih lanjut tentang cara meningkatkan versi utama atau memperbarui versi mesin minor, lihat Peningkatan versi mesin utama atau Pembaruan versi mesin minor.
Akun istimewa telah dibuat untuk instans RDS for PostgreSQL. Untuk informasi lebih lanjut, lihat Buat akun.
Kelola ekstensi
Kelola ekstensi di Konsol
Instal ekstensi
Buka halaman instans RDS. Di bilah navigasi atas, pilih Wilayah tempat instans berada. Lalu, klik ID instans tersebut.
Di panel navigasi sebelah kiri, klik Plug-in Management.
Di tab Plug-in Marketplace, gulir ke bawah untuk menemukan ekstensi vector, lalu klik Install.

Atau, di tab Manage Plug-ins, cari ekstensi vector dan klik Install di kolom Actions.
Pada kotak dialog yang muncul, pilih database dan akun istimewa tujuan, lalu klik Install.
Saat status instans berubah dari Maintaining menjadi Running, ekstensi telah berhasil diinstal.
Perbarui dan uninstal ekstensi
Di tab Installed Plug-ins pada halaman Manage Plug-ins, temukan ekstensi target dan klik Upgrade Version di kolom Actions.
CatatanJika tombol Upgrade Version tidak ditampilkan di kolom Actions, berarti ekstensi sudah dalam versi terbaru.
Di tab Installed Plug-ins pada halaman Manage Plug-ins, temukan ekstensi target dan klik Uninstall di kolom Actions.
Kelola ekstensi menggunakan perintah SQL
Hanya akun istimewa yang dapat menjalankan perintah berikut. Untuk membuat akun istimewa, lihat Buat akun.
Buat ekstensi
CREATE EXTENSION IF NOT EXISTS vector;Hapus ekstensi
DROP EXTENSION vector;Perbarui ekstensi
ALTER EXTENSION vector UPDATE [ TO new_version ]CatatanTetapkan new_version ke versi target pgvector. Untuk informasi lebih lanjut tentang versi terbaru dan fitur pgvector, lihat dokumentasi resmi pgvector.
Contoh penggunaan
Bagian berikut memberikan contoh sederhana cara menggunakan pgvector. Untuk informasi lebih lanjut, lihat dokumentasi resmi pgvector.
Di database target, gunakan akun dengan izin pembuatan tabel untuk membuat tabel bernama `items` guna menyimpan penyematan.
CREATE TABLE items ( id bigserial PRIMARY KEY, item text, embedding vector(2) );CatatanContoh ini menggunakan vektor dua dimensi. Ekstensi pgvector mendukung pembuatan 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 jarak cosine
<=>untuk menghitung jarak antara pisang dan apel, serta antara pisang dan kucing.SELECT item, embedding <=> '[1.2, 0.8]' AS cosine_distance FROM items ORDER BY cosine_distance;CatatanPada contoh ini, operator
<=>secara langsung menghitung jarak cosine. Semakin kecil jaraknya, semakin tinggi kemiripannya.Anda juga dapat menggunakan operator jarak L2
<->atau operator inner product<#>untuk menghitung kemiripan.
Hasil contoh:
item | cosine_distance ------+---------------------- Banana | 0 Apple | 0.019419362524530137 Cat | 0.13289443670962842Pada hasil contoh:
Hasil untuk pisang adalah 0. Ini menunjukkan kecocokan sempurna (jarak = 0).
Hasil untuk apel adalah 0,019. Ini menunjukkan bahwa apel sangat dekat dengan pisang dan memiliki kemiripan tinggi.
Hasil untuk kucing adalah 0,133. Ini menunjukkan bahwa kucing jauh dari pisang dan memiliki kemiripan rendah.
CatatanAnda dapat menetapkan ambang batas kemiripan yang sesuai dalam aplikasi Anda untuk mengecualikan hasil dengan kemiripan rendah.
Untuk meningkatkan performa kueri kemiripan, pgvector mendukung pembuatan indeks pada data vektor. Jalankan pernyataan berikut untuk membuat indeks pada bidang embedding.
Buat indeks HNSW
CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64);Deskripsi parameter:
Parameter
Deskripsi
m
Jumlah maksimum tetangga untuk setiap node di tiap lapisan saat membangun indeks HNSW.
Nilai yang lebih besar meningkatkan kerapatan graf, yang biasanya menghasilkan tingkat recall lebih tinggi. Namun, hal ini juga meningkatkan waktu yang diperlukan untuk pembuatan indeks dan kueri.
ef_construction
Ukuran set kandidat saat membangun indeks HNSW. Ini adalah jumlah node kandidat yang dipertahankan selama proses pencarian untuk memilih koneksi optimal.
Nilai yang lebih besar biasanya menghasilkan tingkat recall lebih tinggi, tetapi juga meningkatkan waktu yang diperlukan untuk pembuatan indeks dan kueri.
Buat indeks IVF
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);Deskripsi parameter:
Parameter/Nilai
Deskripsi
items
Nama tabel tempat indeks ditambahkan.
embedding
Nama kolom tempat indeks ditambahkan.
vector_cosine_ops
Metode akses yang ditentukan dalam metode indeks vektor.
Untuk pencarian cosine similarity, gunakan
vector_cosine_ops.Untuk jarak L2, gunakan
vector_l2_ops.Untuk kemiripan inner product, gunakan
vector_ip_ops.
lists = 100
Parameter lists menentukan jumlah daftar yang digunakan untuk membagi dataset. Nilai yang lebih besar berarti dataset dibagi lebih banyak, ukuran tiap subset relatif kecil, dan kecepatan kueri indeks lebih cepat. Namun, seiring peningkatan nilai lists, tingkat recall kueri mungkin menurun.
CatatanTingkat recall adalah rasio jumlah sampel yang berhasil diambil atau diklasifikasikan terhadap total jumlah sampel relevan dalam tugas pengambilan informasi atau klasifikasi. Tingkat recall mengukur kemampuan sistem untuk menemukan semua sampel relevan dan merupakan metrik evaluasi penting.
Pembuatan 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 harus menetapkan nilai maintenance_work_mem yang lebih besar untuk membuat indeks pada data vektor. Jika nilai ini terlalu besar, instans berisiko tinggi mengalami error kehabisan memori (OOM). Untuk informasi tentang cara menyetel parameter, lihat Setel parameter instans.Anda harus menyesuaikan nilai parameter lists untuk menyeimbangkan kecepatan kueri dan tingkat recall sesuai kebutuhan aplikasi spesifik Anda.
Anda dapat menggunakan salah satu dari dua metode berikut untuk menyetel parameter ivfflat.probes. Parameter ini menentukan jumlah daftar yang akan dicari dalam indeks. Peningkatan nilai ivfflat.probes meningkatkan tingkat recall kueri dengan mencari lebih banyak daftar.
Tingkat sesi
SET ivfflat.probes = 10;Tingkat transaksi
BEGIN; SET LOCAL ivfflat.probes = 10; SELECT ... COMMIT;
Nilai ivfflat.probes yang lebih besar meningkatkan tingkat recall kueri tetapi mengurangi kecepatan kueri. Anda mungkin perlu menyesuaikan nilai lists dan ivfflat.probes untuk mencapai performa kueri dan tingkat recall optimal berdasarkan kebutuhan aplikasi dan karakteristik dataset Anda.
CatatanJika nilai ivfflat.probes sama dengan nilai lists yang ditentukan saat indeks dibuat, kueri akan mengabaikan indeks vektor dan melakukan pemindaian tabel penuh, yang dapat menurunkan performa kueri.
Data performa
Saat membuat indeks untuk data vektor, Anda harus menyeimbangkan kecepatan kueri dan tingkat recall berdasarkan volume data dan skenario aplikasi Anda. Untuk informasi lebih lanjut tentang pengujian performa terkait, lihat: