pgvecto.rs es una extensión de Postgres que proporciona funciones de búsqueda de similitud de vectores. Está escrito en Rust y basado en pgrx.
Consulte pgvecto.rs vs pgvector para obtener más detalles.
Característica | pgvector.rs | pgvector |
---|---|---|
Filtración | Introduce el método VBASE para búsqueda de vectores y consultas relacionales (por ejemplo, TopK de vector único + filtro + unión). | Cuando se aplican filtros, los resultados pueden estar incompletos. Por ejemplo, si originalmente pretendías limitar los resultados a 10, es posible que termines con solo 5 resultados con filtros. |
Dimensiones vectoriales | Admite hasta 65535 dimensiones. | Soporta hasta 2000 dimensiones. |
SIMD | Las instrucciones SIMD se envían dinámicamente en tiempo de ejecución para maximizar el rendimiento según las capacidades de la máquina específica. | Se agregó distribución de CPU para funciones a distancia en Linux x86-64" en 0.7.0. |
Tipos de datos | Introduce tipos de datos adicionales: vectores binarios, FP16 (coma flotante de 16 bits) e INT8 (entero de 8 bits). | - |
Indexación | Maneja el almacenamiento y la memoria de índices por separado de PostgreSQL | Se basa en el motor de almacenamiento nativo de PostgreSQL |
Soporte WAL | Proporciona soporte de registro de escritura anticipada (WAL) para datos, el soporte de índice está en progreso. | Proporciona soporte de registro de escritura anticipada (WAL) para índices y datos. |
Para los nuevos usuarios, recomendamos utilizar la imagen de Docker para comenzar rápidamente.
docker run
--name pgvecto-rs-demo
-e POSTGRES_PASSWORD=mysecretpassword
-p 5432:5432
-d tensorchord/pgvecto-rs:pg16-v0.2.1
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 postgres
Ejecute el siguiente SQL para asegurarse de que la extensión esté habilitada.
DROP EXTENSION IF EXISTS vectors;
CREATE EXTENSION vectors;
pgvecto.rs introduce un nuevo tipo de datos vector(n)
que denota un vector de n dimensiones. La n
entre paréntesis significa las dimensiones del vector.
Podrías crear una tabla con el siguiente SQL.
-- create table with a vector column
CREATE TABLE items (
id bigserial PRIMARY KEY ,
embedding vector( 3 ) NOT NULL -- 3 dimensions
);
Consejo
vector(n)
es un tipo de datos válido sólo si vector(3)
de vector
también son tipos de datos válidos. Sin embargo, todavía no puedes poner vector
para una columna o hay algunos valores que no coinciden con la dimensión indicada por la columna, no podrá crear un índice en ella.
Luego puede completar la tabla con datos vectoriales de la siguiente manera.
-- insert values
INSERT INTO items (embedding)
VALUES ( ' [1,2,3] ' ), ( ' [4,5,6] ' );
-- or insert values using a casting from array to vector
INSERT INTO items (embedding)
VALUES (ARRAY[ 1 , 2 , 3 ]:: real []), (ARRAY[ 4 , 5 , 6 ]:: real []);
Admitimos tres operadores para calcular la distancia entre dos vectores.
<->
: distancia euclidiana al cuadrado, definida como <#>
: producto escalar negativo, definido como <=>
: distancia del coseno, definida como -- call the distance function through operators
-- squared Euclidean distance
SELECT ' [1, 2, 3] ' ::vector < - > ' [3, 2, 1] ' ::vector;
-- negative dot product
SELECT ' [1, 2, 3] ' ::vector < # > '[3, 2, 1]'::vector;
-- cosine distance
SELECT ' [1, 2, 3] ' ::vector <=> ' [3, 2, 1] ' ::vector;
Puedes buscar un vector simplemente como este.
-- query the similar embeddings
SELECT * FROM items ORDER BY embedding < - > ' [3,2,1] ' LIMIT 5 ;
Consulte el tutorial de la aplicación Preguntas y respuestas.
El tipo vecf16
es el mismo que vector
en cualquier cosa excepto en el tipo escalar. Almacena números de coma flotante de 16 bits. Si desea reducir el uso de memoria para obtener un mejor rendimiento, puede intentar reemplazar el tipo vector
con el tipo vecf16
.
Consulte la HOJA DE RUTA. ¿Quieres participar? ¡Bienvenidos debates y contribuciones!
good first issue ?
¡asuntos! Damos la bienvenida a todo tipo de contribuciones de la comunidad de código abierto, individuos y socios.
Gracias a estas maravillosas personas (tecla emoji):
Añade tus aportes |
Este proyecto sigue la especificación de todos los contribuyentes. ¡Se aceptan aportes de cualquier tipo!
Gracias a los siguientes proyectos: