pgvector

Como instalar o pgvector no PostgreSQL

O pgvector é uma extensão open source que possibilita ao PostgreSQL atuar como uma Vector Store. Através dessa extensão temos acesso a tipos de dados específicos para armazenamento de vetores, como o tipo vector e halfvec, imeplementação de índices vetoriais IVFFlat e HNSW e operações de Similarity Search através de operadores de distância vetorial.

Neste post vou demontrar como instalar o pgvector no PostgreSQL na versão 15 no Ubuntu 22.04.4 LTS (Jammy Jellyfish).

Instalação do PostgreSQL via APT

Inicialmente vamos instalar alguns pacotes necessários para a instalação do Postgres:

sudo apt install dirmngr ca-certificates software-properties-common apt-transport-https lsb-release curl -y

Em seguida importamos a chave GPG do Postgres para verificar a autenticidade do pacote:

curl -fSsL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql.gpg > /dev/null

Na sequência adicionamos o repositório do Postgres ao APT repo:

echo deb [arch=amd64,arm64,ppc64el signed-by=/usr/share/keyrings/postgresql.gpg] http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main | sudo tee /etc/apt/sources.list.d/postgresql.list

Para refletir as alterações feitas no APT repo, rodamos um update:

sudo apt update

Por fim instalamos o PostgreSQL 15, usando os pacotes do server e client:

sudo apt install postgresql-15 postgresql-client-15 -y

Após a instalação podemos verificar que o PostgreSQL já está rodando:

$ systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Thu 2025-05-01 14:33:00 UTC; 44s ago
   Main PID: 5588 (code=exited, status=0/SUCCESS)
        CPU: 1ms

May 01 14:33:00 teste systemd[1]: Starting PostgreSQL RDBMS...
May 01 14:33:00 teste systemd[1]: Finished PostgreSQL RDBMS.

Preparando o PostgreSQL para conexões

Com o banco instalado, precisamos realizar algumas configurações para que ele esteja apto a receber conexões. O primeiro passo é liberar a porta 5432, a porta default do Postgres, no firewall. No caso do ufw, podemos liberar o acesso usando:

# para liberar a porta para qualquer origem:
sudo ufw allow 5423/tcp

# ou liberar a porta para uma subnet específica:
sudo ufw allow proto tcp from 192.168.1.0/24 to any port 5432

O próximo passo é ajustar o arquivo de configurações do Postgres. Uma forma fácil de encontrar o seu caminho é utilizando o comando ps:

ps aux | grep postgres
postgres    6453  0.0  1.5 219304 30732 ?        Ss   14:33   0:00 /usr/lib/postgresql/15/bin/postgres -D /var/lib/postgresql/15/main -c config_file=/etc/postgresql/15/main/postgresql.conf
postgres    6454  0.0  0.3 219304  7140 ?        Ss   14:33   0:00 postgres: 15/main: checkpointer
postgres    6455  0.0  0.3 219448  7140 ?        Ss   14:33   0:00 postgres: 15/main: background writer
postgres    6457  0.0  0.5 219304 11964 ?        Ss   14:33   0:00 postgres: 15/main: walwriter
postgres    6458  0.0  0.4 220892  9924 ?        Ss   14:33   0:00 postgres: 15/main: autovacuum launcher
postgres    6459  0.0  0.4 220872  9948 ?        Ss   14:33   0:00 postgres: 15/main: logical replication launcher
piontk      7724  0.0  0.1   6612  2232 pts/0    S+   14:35   0:00 grep --color=auto postgres

No arquivo, vamos editar o parâmetro listen_address, adicionando o IP do host que está rodando o PostgreSQL. No mesmo arquivo temos o parâmetro hba_file, que indica o caminho do arquivo pg_hba.conf, que iremos editar posteriormente:

$ sudo vi /etc/postgresql/15/main/postgresql.conf

...
hba_file = '/etc/postgresql/15/main/pg_hba.conf'
...
listen_addresses = '192.168.1.197,localhost'
...

No arquivo pg_hba.conf, vamos adicionar a regra permitindo conexões locais e conexões a partir da subnet 192.168.1.0/24 utilizando o método SCRAM-SHA-256:

$ sudo vi /etc/postgresql/15/main/pg_hba.conf

...
# "local" is for Unix domain socket connections only
local   all             all                                     scram-sha-256
# IPv4 local connections:
host    all             all             192.168.1.0/24          scram-sha-256
...

Após as alterações reiniciamos o Postgres para que reflita as alterações feitas no arquivo de parâmetros:

sudo systemctl restart postgresql

Instalação do pgvector

Para que possamos utilizar o pgvector, precisamos realizar a instalação do seu pacote no Linux:

sudo apt install postgresql-15-pgvector -y

Dentro do banco de dados, irei criar um database chamado vectors, e dentro dele, um schema também chamado vectors, onde ficará a extensão do pgvector. A extensão é adicionada ao schema através do comando CREATE EXTENSION:

postgres=# create database vectors;
CREATE DATABASE
postgres-# \c vectors
You are now connected to database "vectors" as user "postgres".
vectors=# create schema vectors;
CREATE SCHEMA
vectors=# create extension vector schema vectors;
CREATE EXTENSION

Nesse ponto a extensão já está adicionada ao banco, o que podemos verificar com o metacomando \dx:

vectors=> \dx
                             List of installed extensions
  Name   | Version |   Schema   |                     Description
---------+---------+------------+------------------------------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
 vector  | 0.8.0   | vectors    | vector data type and ivfflat and hnsw access methods
(2 rows)

O próximo passo é fornecer o acesso a ela para o nosso usuário de aplicação. Para meus futuros testes, vou criar um usuário chamado vectors (quanta criatividade) e adicionar o schema onde a estensão foi instalada ao seu search path:

vectors=# create user vectors with login encrypted password 'vectors' connection limit 20;
CREATE ROLE
vectors=# grant connect on database vectors to vectors;
GRANT
vectors=# alter user vectors set search_path to vectors, public;
ALTER ROLE
vectors=# alter schema vectors owner to vectors;
ALTER SCHEMA

Agora podemos validar a conexão do usuário com o database, e criar uma tabela que utilize uma coluna do tipo vector para verificar que o usuário possui o acesso ao pgvector:

vectors=# \c vectors vectors
Password for user vectors:
You are now connected to database "vectors" as user "vectors".
vectors=> CREATE TABLE teste (
    id SERIAL PRIMARY KEY,
    embedding vector(1536)
);
CREATE TABLE

Conclusão

Neste post demonstrei como instalar o pgvector em um banco PostgreSQL 15. Posteriormente estarei utilizando esse mesmo ambiente para testes envolvendo Vector Search e a indexação vetorial usando índices IVFFlat e HNSW.

Caso tenha interesse em saber mais sobre o pgvector, abaixo está a página da extensão, que contém diversas informações sobre as suas capacidades:

Até a próxima!

Publicar comentário