全部产品
Search
文档中心

PolarDB:PGVector

更新时间: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 dan menanyakan embedding vektor secara efisien. Topik ini mencakup informasi latar belakang, prinsip implementasi, penggunaan, serta referensi terkait PGVector.

Informasi Latar Belakang

Seiring dengan perkembangan ilmu data dan pembelajaran mesin, komputasi vektor telah menjadi salah satu tugas komputasi yang paling umum di bidang data besar. PolarDB for PostgreSQL dapat digabungkan 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 yang menjalankan mesin berikut:

  • PostgreSQL 16 (versi revisi 2.0.16.3.1.1 atau lebih baru)

  • PostgreSQL 15 (versi revisi 2.0.15.12.4.0 atau lebih baru)

  • PostgreSQL 14 (versi revisi 2.0.14.7.9.0 atau lebih baru)

  • PostgreSQL 11 (versi revisi 2.0.11.9.35.0 atau lebih baru)

Catatan

Anda dapat memeriksa versi revisi kluster Anda di konsol PolarDB atau dengan menjalankan pernyataan SHOW polardb_version;. Jika versi revisi tidak memenuhi persyaratan, perbarui versi revisi.

Perhatian

  • Fitur eksekusi paralel lintas node memungkinkan Anda menggunakan klausa sortir untuk menangani vektor berdimensi tinggi.

  • Fitur eksekusi paralel lintas node tidak mendukung kueri 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-wilayah yang masing-masing mewakili kluster vektor serta membuat indeks terbalik guna mendukung pencarian kesamaan tersebut.

IVFFlat merupakan versi sederhana dari algoritma Inverted File System with Asymmetric Distance Computation (IVFADC). Algoritma ini cocok untuk skenario bisnis yang memerlukan presisi tinggi tetapi dapat mentoleransi waktu kueri hingga 100 milidetik. IVFFlat memiliki beberapa keunggulan dibandingkan algoritma lainnya, yaitu laju recall tinggi, presisi tinggi, algoritma dan parameter yang sederhana, serta penggunaan penyimpanan yang rendah.

Ekstensi PGVector diimplementasikan berdasarkan mekanisme ekstensi dari PolarDB for PostgreSQL. Ekstensi ini ditulis dalam bahasa pemrograman C dan mendukung berbagai algoritma komputasi vektor serta tipe data. Berikut ini dijelaskan proses kerja algoritma:

  1. IVFFlat menggunakan algoritma pengelompokan seperti k-means untuk membagi vektor dalam ruang berdimensi tinggi menjadi kluster berdasarkan properti pengelompokan implisit, di mana setiap kluster memiliki pusat.

  2. IVFFlat melintasi pusat semua kluster untuk mengidentifikasi n pusat terdekat dengan vektor yang akan dikueri.

  3. IVFFlat melintasi dan mengurutkan semua vektor dalam kluster tempat n pusat yang diidentifikasi berada, lalu mendapatkan k vektor terdekat.

Catatan Penggunaan

  • Anda dapat menggunakan ekstensi PGVector untuk melakukan pencarian sekuensial atau berbasis 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 kueri

    Pada versi sebelum 0.5.0, ekstensi PGVector menggunakan metode pengindeksan IVFFlat yang dikenal dengan kecepatan pembuatan indeks tinggi. Metode ini meningkatkan performa kueri, namun memiliki laju recall moderat dan membutuhkan jumlah memori yang signifikan. Metode pengindeksan HNSW yang baru menawarkan laju recall lebih baik serta performa kueri 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 kueri 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 defaultnya 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 kueri secara negatif.

      ef_construction: jumlah tetangga yang ingin Anda periksa saat elemen ditambahkan ke indeks. Nilainya berada dalam rentang 4 hingga 100. Nilai defaultnya adalah 64. Anda dapat meningkatkan laju recall dengan menaikkan 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 yang lebih besar untuk parameter hnsw.ef_search. Sebagai contoh, Anda dapat menyetel nilainya menjadi 100. Nilai yang 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 PostgreSQL 17 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 adalah kolom tempat indeks akan dibuat. vector_ip_ops adalah operator vektor yang disediakan oleh PolarDB for PostgreSQL dan 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 kueri vektor aktual, tentukan jumlah wilayah berdasarkan volume data dan performa kueri.

Referensi

Untuk informasi lebih lanjut tentang proses embedding vektor, lihat keluaran model text embedding Tiongkok daratan dan internasional.