pgvecto.rs é uma extensão do Postgres que fornece funções de pesquisa de similaridade vetorial. Está escrito em Rust e baseado em pgrx.
Confira pgvecto.rs vs pgvector para mais detalhes.
Recurso | pgvecto.rs | vetor pg |
---|---|---|
Filtragem | Introduz o método VBASE para pesquisa vetorial e consulta relacional (por exemplo, Single-Vector TopK + Filter + Join). | Quando os filtros são aplicados, os resultados podem ficar incompletos. Por exemplo, se originalmente você pretendia limitar os resultados a 10, poderá acabar com apenas 5 resultados com filtros. |
Dimensões vetoriais | Suporta até 65.535 dimensões. | Suporta até 2.000 dimensões. |
SIMD | As instruções SIMD são despachadas dinamicamente em tempo de execução para maximizar o desempenho com base nas capacidades da máquina específica. | Adicionado despacho de CPU para funções de distância no Linux x86-64" na versão 0.7.0. |
Tipos de dados | Introduz tipos de dados adicionais: vetores binários, FP16 (ponto flutuante de 16 bits) e INT8 (número inteiro de 8 bits). | - |
Indexação | Lida com o armazenamento e a memória de índices separadamente do PostgreSQL | Depende do mecanismo de armazenamento nativo do PostgreSQL |
Suporte WAL | Fornece suporte Write-Ahead Logging (WAL) para dados, o suporte ao índice está em andamento. | Fornece suporte Write-Ahead Logging (WAL) para índice e dados. |
Para novos usuários, recomendamos usar a imagem Docker para começar rapidamente.
docker run
--name pgvecto-rs-demo
-e POSTGRES_PASSWORD=mysecretpassword
-p 5432:5432
-d tensorchord/pgvecto-rs:pg16-v0.2.1
Então você pode se conectar ao banco de dados usando a ferramenta de linha de comando psql
. O nome de usuário padrão é postgres
e a senha padrão é mysecretpassword
.
psql -h localhost -p 5432 -U postgres
Execute o SQL a seguir para garantir que a extensão esteja habilitada.
DROP EXTENSION IF EXISTS vectors;
CREATE EXTENSION vectors;
pgvecto.rs introduz um novo tipo de dados vector(n)
denotando um vetor n-dimensional. O n
entre colchetes significa as dimensões do vetor.
Você poderia criar uma tabela com o seguinte SQL.
-- create table with a vector column
CREATE TABLE items (
id bigserial PRIMARY KEY ,
embedding vector( 3 ) NOT NULL -- 3 dimensions
);
Dica
vector(n)
é um tipo de dados válido somente se vector(3)
de vector
também são tipos de dados válidos. No entanto, você ainda não pode colocar vector
para uma coluna ou se houver alguns valores incompatíveis com a dimensão indicada pela coluna, você não poderá criar um índice nela.
Você pode então preencher a tabela com dados vetoriais da seguinte maneira.
-- 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 []);
Apoiamos três operadores para calcular a distância entre dois vetores.
<->
: distância euclidiana quadrada, definida como <#>
: produto escalar negativo, definido como <=>
: distância do cosseno, 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;
Você pode procurar um vetor simplesmente assim.
-- query the similar embeddings
SELECT * FROM items ORDER BY embedding < - > ' [3,2,1] ' LIMIT 5 ;
Confira o tutorial do aplicativo de resposta a perguntas.
O tipo vecf16
é o mesmo que vector
em qualquer coisa, exceto no tipo escalar. Ele armazena números de ponto flutuante de 16 bits. Se quiser reduzir o uso de memória para obter melhor desempenho, você pode tentar substituir o tipo vector
pelo tipo vecf16
.
Confira o ROADMAP. Quer entrar? Discussões e contribuições bem-vindas!
good first issue ?
problemas! Aceitamos todos os tipos de contribuições da comunidade de código aberto, de indivíduos e de parceiros.
Os agradecimentos vão para essas pessoas maravilhosas (chave emoji):
Adicione suas contribuições |
Este projeto segue a especificação de todos os contribuidores. Contribuições de qualquer tipo são bem-vindas!
Graças aos seguintes projetos: