Docker Pull para pgvecto.rs:
VectorChord (VCHORD) es una extensión PostgreSQL diseñada para la búsqueda de similitud vectorial escalable, de alto rendimiento y de medidas de disco, y sirve como el sucesor de PGVECTO.RS.
Con VectorChord, puede almacenar 400,000 vectores por solo $ 1, lo que permite ahorros significativos: 6 veces más vectores en comparación con el almacenamiento optimizado de Pinecone y 26 veces más que PGVector/PGVECTO.RS por el mismo precio 1 . Para obtener más información, consulte nuestra publicación de blog de lanzamiento.
VectorChord presenta mejoras notables sobre PGVECTO.RS y PGVECTOR:
⚡ Rendimiento mejorado : entrega de operaciones optimizadas con hasta 5x consultas más rápidas, 16x rendimiento de inserción más alto y 16x edificio de índice más rápido en 2 en comparación con la implementación de HNSW de PGVector.
? Búsqueda de vectores asequibles : consulta 100m 768 vectores dimensionales utilizando solo 32 GB de memoria, logrando 35ms P50 Latency con Top10 retiro@95%, lo que le ayuda a mantener bajos los costos de infraestructura mientras mantiene una alta calidad de búsqueda.
? Integración perfecta : totalmente compatible con los tipos de datos PGVector y la sintaxis al tiempo que proporciona valores predeterminados óptimos de la caja, no se necesita sintonización de parámetros manuales. Simplemente suelte en VectorChord para un rendimiento mejorado.
? Construcción del índice externo : Aproveche la FIV para construir índices externamente (por ejemplo, en GPU) para la agrupación de kmeans más rápida, combinada con la compresión de Rabitq 3 para almacenar de manera eficiente los vectores mientras mantienen la calidad de búsqueda a través de la reorganización autónoma.
? Soporte de vector largo : almacene y busque vectores de hasta 65,535 dimensiones, lo que permite el uso de los mejores modelos de alta dimensión como el texto-3-larga con facilidad.
Para nuevos usuarios, recomendamos usar la imagen Docker para comenzar rápidamente.
docker run
--name vectorchord-demo
-e POSTGRES_PASSWORD=mysecretpassword
-p 5432:5432
-d tensorchord/vchord-postgres:pg17-v0.1.0 Luego puede conectarse a la base de datos utilizando la herramienta de línea de comandos psql . El nombre de usuario predeterminado es postgres , y la contraseña predeterminada es mysecretpassword .
psql -h localhost -p 5432 -U postgresEjecute el siguiente SQL para asegurarse de que la extensión esté habilitada.
CREATE EXTENSION IF NOT EXISTS vchord CASCADE; Y asegúrese shared_preload_libraries agregar vchord.so postgresql.conf
-- Add vchord and pgvector to shared_preload_libraries --
ALTER SYSTEM SET shared_preload_libraries = ' vchord.so ' ;Para crear el índice VectorChord Rabitq (VChordRQ), puede usar el siguiente SQL.
-- 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
$$);La declaración de consulta es exactamente la misma que PGVector. VectorChord admite cualquier operación de filtro y donde/unir cláusulas como PGVECTO.RS con VBase.
SELECT * FROM items ORDER BY embedding < - > ' [3,1,2] ' LIMIT 5 ;Las funciones de distancia compatibles son:
Puede ajustar el rendimiento de la búsqueda ajustando las probes y los parámetros 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 ' ;Y para la configuración de 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 ' ;Para prealtrar el índice, puede usar el siguiente SQL. Mejorará significativamente el rendimiento cuando se use memoria limitada.
-- vchordrq_prewarm(index_name::regclass) to prewarm the index into the shared buffer
SELECT vchordrq_prewarm( ' gist_train_embedding_idx ' ::regclass) "El edificio índice puede paralelizar, y con la precomputación del centroide externo, el tiempo total está limitado principalmente por la velocidad del disco. Optimizar el paralelismo utilizando la siguiente configuración:
-- 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 ; Puede verificar el progreso de la indexación consultando la vista pg_stat_progress_create_index .
SELECT phase, round( 100 . 0 * blocks_done / nullif(blocks_total, 0 ), 1 ) AS " % " FROM pg_stat_progress_create_index;A diferencia de Pure SQL, una precomputación de índice externo primero se agrupará afuera e insertará centroides en una tabla PostgreSQL. Aunque puede ser más complicado, la construcción externa es definitivamente mucho más rápida en el conjunto de datos más grande (> 5m).
Para comenzar, debe hacer una agrupación de vectores usando faiss , scikit-learn o cualquier otra biblioteca de agrupación.
Los centroides deben estar preestablecidos en una tabla de cualquier nombre con 3 columnas:
pgvectorY el ejemplo podría ser así:
-- 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 '
$$);Para simplificar el flujo de trabajo, proporcionamos scripts de extremo a extremo para la preocomputación del índice externo, consulte los scripts.
Instale PGRX de acuerdo con las instrucciones de 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 Este software tiene licencia bajo un modelo de doble licencia:
GNU Affero General Public License V3 (AGPLV3) : puede usar, modificar y distribuir este software bajo los términos del AGPLV3.
Licencia elástica V2 (ELV2) : también puede usar, modificar y distribuir este software bajo la Licencia Elástica V2, que tiene restricciones específicas.
Puede elegir cualquiera de las licencias según sus necesidades. Damos la bienvenida a cualquier colaboración o soporte comercial, así que envíenos un correo electrónico [email protected] con cualquier pregunta o solicitud con respecto a las licencias.
Basado en MyScale Benchmark con vectores de 768 dimensiones y 95% de recuerdo. ↩
Basado en MyScale Benchmark con vectores 768-dimensionales. Consulte nuestra publicación de blog para obtener más detalles. ↩
Gao, Jianyang y Cheng Long. "Rabitq: cuantificando vectores de alta dimensión con un error teórico vinculado a la búsqueda aproximada del vecino más cercano". Actas de la ACM sobre la gestión de los datos 2.3 (2024): 1-27. ↩