RDS PostgreSQL menyediakan fitur indeks RabitQ melalui ekstensi pgvector. RabitQ adalah metode kuantisasi vektor yang menawarkan rasio kompresi tinggi. Dibandingkan dengan indeks pgvector native, indeks RabitQ secara signifikan mengurangi ukuran indeks dan meningkatkan throughput pencarian vektor sambil mempertahankan recall yang tinggi. Topik ini menjelaskan prinsip inti indeks RabitQ, cara menggunakannya, serta tolok ukur performanya terhadap indeks pgvector native.
Latar Belakang
RabitQ adalah metode kuantisasi vektor lanjutan yang didasarkan pada tiga prinsip inti:
Kuantisasi vektor berkompressi tinggi: RabitQ memproyeksikan titik-titik dalam ruang berdimensi-D ke permukaan bola satuan dan menggunakan simpul-simpul hiperkubus terinskrpsi sebagai codebook-nya. Setiap koordinat bernilai 1/√D atau -1/√D. Hal ini memungkinkan setiap vektor direpresentasikan sebagai string bit sepanjang D-bit. Dibandingkan dengan pgvector native yang menggunakan array float32 untuk setiap vektor, teknik ini mencapai rasio kompresi hingga 32x.
Akselerasi perhitungan jarak: RabitQ mengubah perhitungan jarak antara dua vektor menjadi operasi bitwise dan popcount yang efisien pada string biner mereka, sehingga secara dramatis meningkatkan kecepatan perhitungan.
Estimator tidak bias: Berbeda dengan metode kuantisasi lainnya, RabitQ memberikan batas teoretis terbukti atas error antara jarak perkiraan dan jarak eksak. Selama pencarian vektor, Anda dapat menyaring kandidat menggunakan jarak perkiraan, lalu menghitung jarak eksak untuk subset kecil vektor dan melakukan reranking untuk memastikan hasil dengan akurasi tinggi.
Prasyarat
Untuk menggunakan indeks RabitQ, instans RDS PostgreSQL Anda harus memenuhi persyaratan berikut:
Versi utamanya adalah RDS PostgreSQL 14 atau lebih baru.
Versi kernel minornya adalah 20260330 atau lebih baru.
Ekstensi pgvector telah terinstal, dan versinya adalah 0.8.0.2 atau lebih baru.
Penggunaan
Alibaba Cloud telah memperluas metode akses ivfflat native di pgvector dengan mengintegrasikannya bersama RabitQ. Saat pembuatan indeks, pengelompokan IVF dilakukan terlebih dahulu, lalu kuantisasi RabitQ diterapkan pada vektor-vektor di setiap kluster, sehingga menjamin kompatibilitas maju penuh dengan indeks ivfflat yang sudah ada.
Langkah 1: Periksa dan upgrade ekstensi pgvector
Setelah terhubung ke database target, jalankan perintah SQL berikut untuk memeriksa versi ekstensi pgvector. Jika versinya lebih lama dari 0.8.0.2, lakukan upgrade.
postgres=# \dx vector
List of installed extensions
Name | Version | Schema | Description
--------+---------+--------+------------------------------------------------------
vector | 0.8.0.2 | public | vector data type and ivfflat and hnsw access methods
(1 row)
postgres=# ALTER EXTENSION vector UPDATE TO "0.8.0.2";Langkah 2: Buat indeks ivf-RabitQ
Jalankan perintah SQL berikut untuk membuat indeks ivf-RabitQ:
CREATE INDEX ON items USING ivfflat (embedding rabitq_vector_cosine_ops) WITH (lists=1000);Dalam contoh ini, items adalah nama tabel target, embedding adalah nama kolom yang menyimpan data vektor, dan rabitq_vector_cosine_ops adalah operator RabitQ untuk kemiripan kosinus. lists adalah jumlah centroid untuk pengelompokan IVF. Kami menyarankan Anda memilih nilai yang sesuai berdasarkan ukuran data Anda.
Langkah 3: Sesuaikan parameter pencarian
Selain parameter pembuatan indeks dan kueri milik ivfflat, ivf-RabitQ memperkenalkan parameter pencarian yang tercantum dalam tabel berikut. Anda dapat menggunakan perintah SET untuk menyesuaikan parameter-parameter ini pada tingkat session.
Parameter | Default | Nilai | Deskripsi |
| 1.9 | [0.1, 4.0] | Koefisien untuk menghitung margin error dalam estimator tidak bias. Nilai yang lebih besar meningkatkan recall. |
| 10 | [1, 32768] | Jumlah vektor yang akan dihitung jarak eksaknya selama tahap rerank. Kami menyarankan mengatur nilai ini sama dengan jumlah vektor yang ingin Anda ambil. |
| 5000 | [1, INT_MAX] | Jumlah vektor yang dipindai untuk reranking. |
Tolok ukur performa
Lingkungan pengujian
Item | Deskripsi |
Instans RDS PostgreSQL |
|
Tool pengujian | ann-benchmarks |
Set data pengujian |
|
Parameter pengujian |
|
Perbandingan pembuatan indeks
Tabel berikut membandingkan waktu pembuatan dan ukuran indeks antara indeks ivf-RabitQ dan indeks ivfflat pgvector native, yang dibuat menggunakan set data dan parameter yang sama.
Jenis indeks | Waktu pembuatan | Ukuran indeks |
ivfflat (native) | 95,32 detik | 7820 MB |
ivf-RabitQ | 78,72 detik | 248 MB |
Hasil menunjukkan bahwa dibandingkan dengan indeks ivfflat pgvector native, indeks ivf-RabitQ mengurangi ukuran indeks dari 7.820 MB menjadi 248 MB, mencapai rasio kompresi lebih dari 31x. Pembuatan indeks juga lebih cepat.
Perbandingan performa kueri
Dibandingkan dengan indeks ivfflat pgvector native, indeks RabitQ dapat mencapai peningkatan performa pencarian beberapa kali lipat dengan kerugian recall kurang dari 1%. Hasil pengujian lengkapnya adalah sebagai berikut:
Parameter | Ivfflat QPS | Ivf-RabitQ QPS | Rasio percepatan | Recall Ivfflat | Recall Ivf-RabitQ |
nprobes = 1 | 566,36 | 1033,56 | 1,83x | 66,87% | 69,38% |
nprobes = 2 | 350,77 | 758,88 | 2,16x | 79,40% | 80,09% |
nprobes = 4 | 203,78 | 501,56 | 2,47x | 87,84% | 87,96% |
nprobes = 8 | 110,98 | 298,43 | 2,69x | 92,69% | 92,80% |
nprobes = 16 | 56,99 | 162,75 | 2,86x | 95,71% | 95,28% |
nprobes = 32 | 28,56 | 53,98 | 1,89x | 97,37% | 96,84% |
nprobes = 50 | 18,32 | 53,98 | 2,94x | 98,05% | 97,71% |
nprobes = 100 | 9,26 | 26,74 | 2,89x | 98,93% | 98,54% |
Gambar berikut menunjukkan kurva QPS-recall, membandingkan beberapa jenis indeks:
pgvector: Indeks HNSW native dari versi komunitas.pgvector_ivfflat: Indeks ivfflat native dari versi komunitas.pgvector_ivfrabitq: Indeks ivf-RabitQ.pgvector_hnsw_rabitq: Indeks HNSW-RabitQ, yang mencakup langkah rerank.pgvector_hnsw_rabitq_without_refine: Indeks HNSW-RabitQ yang menggunakan jarak terkuantisasi secara langsung, menghilangkan langkah rerank demi performa kueri yang lebih tinggi.
