Docker menarik untuk pgvecto.rs:
VectorChord (VCHORD) adalah ekstensi PostgreSQL yang dirancang untuk pencarian kesamaan vektor yang dapat diskalakan, berkinerja tinggi, dan hemat disk, dan berfungsi sebagai penerus PGVECTO.RS.
Dengan VectorChord, Anda dapat menyimpan 400.000 vektor hanya dengan $ 1, memungkinkan penghematan yang signifikan: 6x lebih banyak vektor dibandingkan dengan penyimpanan Pinecone yang dioptimalkan dan 26x lebih dari PGVector/pGVectO.RS untuk harga 1 yang sama. Untuk wawasan lebih lanjut, lihat posting blog peluncuran kami.
VectorChord memperkenalkan peningkatan luar biasa atas pgvecto.rs dan pgvector:
⚡ Kinerja yang Ditingkatkan : Memberikan operasi yang dioptimalkan dengan 5x kueri lebih cepat, 16x throughput insert yang lebih tinggi, dan bangunan indeks 2 yang lebih cepat dibandingkan dengan implementasi HNSW PGVector.
? Pencarian Vektor Terjangkau : Kueri 100m 768-dimensi vektor menggunakan hanya 32GB memori, mencapai latensi P50 35ms dengan Top10 Recall@95%, membantu Anda menjaga biaya infrastruktur tetap turun sambil mempertahankan kualitas pencarian yang tinggi.
? Integrasi yang mulus : sepenuhnya kompatibel dengan tipe data dan sintaks PGVector sambil memberikan default optimal di luar kotak - tidak diperlukan penyetelan parameter manual. Cukup turunkan VectorChord untuk peningkatan kinerja.
? Indeks Eksternal Build : Leverage IVF untuk membangun indeks secara eksternal (misalnya, pada GPU) untuk pengelompokan Kmeans yang lebih cepat, dikombinasikan dengan kompresi RabitQ 3 untuk secara efisien menyimpan vektor sambil mempertahankan kualitas pencarian melalui reranking otonom.
? Dukungan Vektor Panjang : Simpan dan pencarian vektor hingga 65.535 dimensi, memungkinkan penggunaan model dimensi tinggi terbaik seperti teks-embedding-3-besar dengan mudah.
Untuk pengguna baru, kami sarankan menggunakan gambar Docker untuk memulai dengan cepat.
docker run
--name vectorchord-demo
-e POSTGRES_PASSWORD=mysecretpassword
-p 5432:5432
-d tensorchord/vchord-postgres:pg17-v0.1.0 Kemudian Anda dapat terhubung ke database menggunakan alat baris perintah psql . Nama pengguna default adalah postgres , dan kata sandi default adalah mysecretpassword .
psql -h localhost -p 5432 -U postgresJalankan SQL berikut untuk memastikan ekstensi diaktifkan.
CREATE EXTENSION IF NOT EXISTS vchord CASCADE; Dan pastikan untuk menambahkan vchord.so ke shared_preload_libraries di postgresql.conf .
-- Add vchord and pgvector to shared_preload_libraries --
ALTER SYSTEM SET shared_preload_libraries = ' vchord.so ' ;Untuk membuat indeks VectorChord Rabitq (VChordRQ), Anda dapat menggunakan SQL berikut.
-- Set residual_quantization to true and spherical_centroids to false for L2 distance --
CREATE INDEX ON gist_train USING vchordrq (embedding vector_l2_ops) WITH (options = $$
residual_quantization = true
[ build . internal ]
lists = [ 4096 ]
spherical_centroids = false
$$);
-- Set residual_quantization to false and spherical_centroids to true for cos/dot distance --
CREATE INDEX ON laion USING vchordrq (embedding vector_cos_ops) WITH (options = $$
residual_quantization = false
[ build . internal ]
lists = [ 4096 ]
spherical_centroids = true
$$);Pernyataan kueri persis sama dengan pGVector. VectorChord mendukung operasi filter apa pun dan di mana/bergabung dengan klausa seperti pgvecto.rs dengan vBase.
SELECT * FROM items ORDER BY embedding < - > ' [3,1,2] ' LIMIT 5 ;Fungsi jarak yang didukung adalah:
Anda dapat menyempurnakan kinerja pencarian dengan menyesuaikan probes dan parameter epsilon :
-- Set probes to control the number of lists scanned.
-- Recommended range: 3%–10% of the total `lists` value.
SET vchordrq . probes = 100 ;
-- Set epsilon to control the reranking precision.
-- Larger value means more rerank for higher recall rate.
-- Don't change it unless you only have limited memory.
-- Recommended range: 1.0–1.9. Default value is 1.9.
SET vchordrq . epsilon = 1 . 9 ;
-- vchordrq relies on a projection matrix to optimize performance.
-- Add your vector dimensions to the `prewarm_dim` list to reduce latency.
-- If this is not configured, the first query will have higher latency as the matrix is generated on demand.
-- Default value: '64,128,256,384,512,768,1024,1536'
-- Note: This setting requires a database restart to take effect.
ALTER SYSTEM SET vchordrq . prewarm_dim = ' 64,128,256,384,512,768,1024,1536 ' ;Dan untuk pengaturan Postgres
-- If using SSDs, set `effective_io_concurrency` to 200 for faster disk I/O.
SET effective_io_concurrency = 200 ;
-- Disable JIT (Just-In-Time Compilation) as it offers minimal benefit (1–2%)
-- and adds overhead for single-query workloads.
SET jit = off;
-- Allocate at least 25% of total memory to `shared_buffers`.
-- For disk-heavy workloads, you can increase this to up to 90% of total memory. You may also want to disable swap with network storage to avoid io hang.
-- Note: A restart is required for this setting to take effect.
ALTER SYSTEM SET shared_buffers = ' 8GB ' ;Untuk sebelum indeks, Anda dapat menggunakan SQL berikut. Ini akan secara signifikan meningkatkan kinerja saat menggunakan memori terbatas.
-- vchordrq_prewarm(index_name::regclass) to prewarm the index into the shared buffer
SELECT vchordrq_prewarm( ' gist_train_embedding_idx ' ::regclass) "Bangunan indeks dapat diparalelkan, dan dengan prekomputasi centroid eksternal, total waktu terutama dibatasi oleh kecepatan disk. Mengoptimalkan paralelisme menggunakan pengaturan berikut:
-- Set this to the number of CPU cores available for parallel operations.
SET max_parallel_maintenance_workers = 8 ;
SET max_parallel_workers = 8 ;
-- Adjust the total number of worker processes.
-- Note: A restart is required for this setting to take effect.
ALTER SYSTEM SET max_worker_processes = 8 ; Anda dapat memeriksa kemajuan pengindeksan dengan menanyakan tampilan pg_stat_progress_create_index .
SELECT phase, round( 100 . 0 * blocks_done / nullif(blocks_total, 0 ), 1 ) AS " % " FROM pg_stat_progress_create_index;Tidak seperti SQL murni, prekomputasi indeks eksternal pertama -tama akan melakukan pengelompokan di luar dan memasukkan centroid ke tabel PostgreSQL. Meskipun mungkin lebih rumit, build eksternal jelas jauh lebih cepat pada dataset yang lebih besar (> 5m).
Untuk memulai, Anda perlu melakukan pengelompokan vektor menggunakan faiss , scikit-learn atau perpustakaan pengelompokan lainnya.
Centroid harus ditetapkan dalam tabel nama apa pun dengan 3 kolom:
pgvectorDan contohnya bisa seperti ini:
-- Create table of centroids
CREATE TABLE public .centroids (id integer NOT NULL UNIQUE, parent integer , vector vector( 768 ));
-- Insert centroids into it
INSERT INTO public . centroids (id, parent, vector) VALUES ( 1 , NULL , ' {0.1, 0.2, 0.3, ..., 0.768} ' );
INSERT INTO public . centroids (id, parent, vector) VALUES ( 2 , NULL , ' {0.4, 0.5, 0.6, ..., 0.768} ' );
INSERT INTO public . centroids (id, parent, vector) VALUES ( 3 , NULL , ' {0.7, 0.8, 0.9, ..., 0.768} ' );
-- ...
-- Create index using the centroid table
CREATE INDEX ON gist_train USING vchordrq (embedding vector_l2_ops) WITH (options = $$
[ build . external ]
table = ' public.centroids '
$$);Untuk menyederhanakan alur kerja, kami menyediakan skrip ujung ke ujung untuk pra-komputasi indeks eksternal, lihat skrip.
Instal PGRX sesuai dengan instruksi PGRX.
cargo install --locked cargo-pgrx
cargo pgrx init --pg17 $( which pg_config ) # To init with system postgres, with pg_config in PATH
cargo pgrx install --release --sudo # To install the extension into the system postgres with sudo Perangkat lunak ini dilisensikan di bawah model lisensi ganda:
GNU Affero Umum Lisensi Publik V3 (AGPLV3) : Anda dapat menggunakan, memodifikasi, dan mendistribusikan perangkat lunak ini berdasarkan ketentuan AGPLV3.
Lisensi Elastic V2 (ELV2) : Anda juga dapat menggunakan, memodifikasi, dan mendistribusikan perangkat lunak ini di bawah lisensi elastis V2, yang memiliki batasan khusus.
Anda dapat memilih lisensi berdasarkan kebutuhan Anda. Kami menyambut kolaborasi atau dukungan komersial apa pun, jadi silakan email kami [email protected] dengan pertanyaan atau permintaan mengenai lisensi.
Berdasarkan benchmark myscale dengan vektor 768 dimensi dan penarikan 95%. ↩
Berdasarkan Benchmark MyScale dengan vektor 768 dimensi. Silakan periksa posting blog kami untuk lebih jelasnya. ↩
Gao, Jianyang, dan Cheng Long. "Rabitq: Mengukur vektor dimensi tinggi dengan kesalahan teoretis terikat untuk mendekati pencarian tetangga terdekat." Prosiding ACM tentang Manajemen Data 2.3 (2024): 1-27. ↩