All Products
Search
Document Center

PolarDB:PGVector (vector retrieval)

Last Updated:Jan 14, 2026

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.

Catatan

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)

Catatan

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:

  1. Algoritma pengelompokan, seperti K-Means, mengelompokkan vektor dalam ruang berdimensi tinggi ke dalam kluster. Pusat (centroid) kemudian dihitung untuk setiap kluster.

  2. Untuk mengambil vektor, algoritma pertama-tama melakukan traversal semua centroid kluster untuk menemukan `n` centroid yang paling dekat dengan vektor target.

  3. 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 nilai m.

      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 nilai m. Anda dapat meningkatkan tingkat recall kueri dengan mengatur nilai hnsw.ef_search yang lebih besar. Misalnya, Anda dapat mengaturnya ke 100. 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

  1. Buat ekstensi.

    CREATE EXTENSION vector;
  2. Buat tabel.

    CREATE TABLE t (val vector(3));
  3. Masukkan data.

    INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL);
  4. Buat indeks vektor.

    CREATE INDEX ON t USING ivfflat (val vector_ip_ops) WITH (lists = 1);
  5. 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)
    Catatan
    • val vector_ip_ops menunjukkan bahwa indeks dibuat pada kolom `val`. Operator vektor vector_ip_ops dari 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.