All Products
Search
Document Center

PolarDB:PGVector

Last Updated:Jul 02, 2025

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.

Catatan

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)

Catatan

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:

  1. 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.

  2. IVFFlat melintasi pusat semua kluster untuk mengidentifikasi n pusat terdekat dengan vektor yang akan di-query.

  3. 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 parameter 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);

      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 parameter m. Untuk meningkatkan laju recall, Anda dapat menentukan nilai lebih besar untuk parameter hnsw.ef_search. Misalnya, Anda dapat menyetel nilainya menjadi 100. 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

  1. Tambahkan ekstensi PGVector ke database.

    Catatan

    Jika kluster Anda menjalankan dan pesan kesalahan ERROR: must be superuser dikembalikan, hubungi kami untuk pemecahan masalah.

    CREATE EXTENSION vector;
  2. Buat tabel.

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

    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. 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)
    Catatan
    • Dalam val vector_ip_ops, val merupakan kolom tempat indeks akan dibuat. vector_ip_ops adalah 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.