Guia de Uso da Extensão pgvector do PostgreSQL no ServBay
pgvector
é uma poderosa extensão de terceiros para o banco de dados PostgreSQL que adiciona o tipo de dados vetor e métodos eficientes de indexação vetorial, como IVFFlat e HNSW. Isso permite que o PostgreSQL ofereça suporte nativo para armazenamento e pesquisa de similaridade de vetores, tornando-o ideal para aplicações de IA, sistemas de recomendação, reconhecimento de imagens e processamento de linguagem natural – todos que exigem o tratamento de dados de alta dimensão.
O ServBay, como um ambiente local integrado de desenvolvimento web, já vem com o PostgreSQL e a extensão pgvector
pré-instalados, o que simplifica bastante o processo de habilitação e uso de bancos de dados vetoriais no seu ambiente de desenvolvimento local. Este guia detalha como utilizar o pgvector
no ServBay.
O que é o pgvector? Por que ele é importante?
Em muitos cenários de aplicações modernas, os dados vão além de simples textos e números estruturados. Especialmente com o avanço da inteligência artificial e do machine learning, os dados frequentemente são representados como vetores de alta dimensão, também conhecidos como “embeddings”. Esses vetores capturam informações semânticas ou características dos dados, como traços visuais de uma imagem, significado de um texto ou preferências de um usuário.
A extensão pgvector
permite que o PostgreSQL armazene esses vetores diretamente e execute buscas eficientes de similaridade vetorial (também chamadas de “busca dos vizinhos mais próximos”). Isso significa que você pode utilizar SQL para encontrar itens mais parecidos com um vetor de referência, sem a necessidade de um banco de dados vetorial separado, simplificando o seu stack tecnológico.
Pré-requisitos
Antes de usar o pgvector
, certifique-se de que as seguintes condições estejam atendidas:
- O ServBay está instalado e em execução no macOS.
- O pacote do PostgreSQL está ativado na lista “Pacotes” do ServBay. Caso não esteja, localize o PostgreSQL na interface do aplicativo do ServBay e defina seu status como “Ativado”.
Habilitando a Extensão pgvector no PostgreSQL do ServBay
O ServBay já inclui os arquivos necessários da extensão pgvector
no diretório de instalação do PostgreSQL. Você não precisa baixar ou compilar manualmente. Basta habilitá-la no banco de dados desejado.
Veja como ativar o pgvector
em um banco de dados PostgreSQL no ServBay:
Conecte-se ao banco de dados PostgreSQL: Use a ferramenta de linha de comando
psql
para se conectar à instância PostgreSQL fornecida pelo ServBay. Normalmente, a configuração padrão permite conexões locais e o usuário padrão épostgres
ouservbay
. A porta padrão é5432
. Se suas configurações forem diferentes, confira a documentação de configuração de banco de dados do ServBay.Abra o Terminal e execute o seguinte comando (ajuste o nome do usuário e do banco de dados conforme sua configuração):
bashpsql -U servbay -d your_database_name -h localhost -p 5432
1-U servbay
: Define o usuário comoservbay
(oupostgres
).-d your_database_name
: Nome do banco de dados a ser conectado. Caso não exista, crie-o primeiro (por exemplo,CREATE DATABASE servbay_demo_db;
).-h localhost
: Indica conexão local.-p 5432
: Define a porta 5432 (padrão do PostgreSQL no ServBay).
Criando a extensão
vector
: Com a conexão estabelecida, execute o seguinte comando SQL no prompt dopsql
para habilitar opgvector
:sqlCREATE EXTENSION vector;
1Se a extensão já existir, o comando irá informar.
Verifique a instalação: Liste as extensões instaladas para confirmar se o
pgvector
está ativo:sql\dx
1Você deverá ver a extensão chamada
vector
com sua versão na lista de saída.List of installed extensions Name | Version | Schema | Description ----------+---------+------------+-------------------------------------------------------------- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language vector | 0.7.0 | public | vector data type and ivfflat and hnsw access methods (2 rows)
1
2
3
4
5
6(Obs.: O número da versão pode variar conforme a versão integrada no ServBay.)
Configurando e Usando o pgvector
Com a extensão pgvector
habilitada, você pode criar e gerenciar dados vetoriais no banco de dados.
Criando uma tabela com dados vetoriais
Primeiro, crie uma tabela para armazenar seus vetores. O pgvector
oferece um novo tipo de dados: VECTOR(dimensions)
, onde dimensions
é a dimensionalidade do vetor.
Exemplo de criação de uma tabela chamada embeddings
para armazenar vetores de 3 dimensões:
CREATE TABLE embeddings (
id SERIAL PRIMARY KEY,
-- Define uma coluna de vetor com 3 dimensões
vector VECTOR(3)
);
2
3
4
5
Agora, insira alguns vetores de exemplo:
INSERT INTO embeddings (vector) VALUES
('[0.1, 0.2, 0.3]'),
('[0.4, 0.5, 0.6]'),
('[0.7, 0.8, 0.9]'),
('[0.15, 0.25, 0.35]'),
('[0.6, 0.5, 0.4]'); -- Insira mais dados para melhores exemplos nas consultas
2
3
4
5
6
Observação: Os valores dos vetores devem usar colchetes []
e os elementos separados por vírgulas.
Criando índices vetoriais para melhorar a performance das consultas
Para tabelas com grande volume de vetores, criar índices é fundamental para acelerar buscas de similaridade. O pgvector
suporta dois tipos principais de índices: IVFFlat e HNSW. A escolha depende das necessidades do seu projeto (velocidade, tempo de construção do índice, uso de memória, taxa de recall etc.).
- IVFFlat (Inverted File Index com compressão Flat): Adequado para grandes conjuntos de dados com menor exigência de recall. Construção relativamente rápida.
- HNSW (Hierarchical Navigable Small World): Geralmente oferece maior recall e rapidez de busca, mas seu índice é mais lento de construir e consome mais memória.
Veja exemplos de como criar índices IVFFlat e HNSW para a coluna vector
da tabela embeddings
:
Criando índice IVFFlat:
sql-- Recomenda-se rodar o ANALYZE antes de criar o índice IVFFlat, para coletar estatísticas ANALYZE embeddings; -- Cria o índice IVFFlat -- WITH (lists = 100): Define o número de listas invertidas. Ajuste conforme o tamanho do conjunto de dados. -- Quanto maior o lists, mais lenta a construção e possível consulta, mas maior potencial de recall. -- A recomendação oficial é lists = sqrt(número de linhas). CREATE INDEX idx_ivfflat_vector ON embeddings USING ivfflat (vector) WITH (lists = 100);
1
2
3
4
5
6
7
8Criando índice HNSW:
sql-- Cria o índice HNSW -- WITH (m = 16, ef_construction = 200): Parâmetros do índice HNSW. -- m: Número máximo de conexões por nó. Afeta conectividade, performance e uso de memória. -- ef_construction: Largura de busca na construção. Afeta tempo/memória de construção e qualidade do índice (recall). -- Otimize esses parâmetros conforme seu dado e necessidade. CREATE INDEX idx_hnsw_vector ON embeddings USING hnsw (vector) WITH (m = 16, ef_construction = 200);
1
2
3
4
5
6Atenção: Os parâmetros do índice (
lists
,m
,ef_construction
) afetam desempenho e recall. Escolher os melhores valores depende do entendimento do seu dataset e padrão de queries, sendo importante realizar experimentação. Consulte a documentação oficial do pgvector para detalhes e recomendações.
Consultando Vetores com pgvector
O pgvector
fornece vários operadores para calcular distâncias entre vetores e realizar pesquisas de similaridade. Os mais comuns são:
<->
: Distância L2 (Euclidiana). Mede a distância linear entre vetores.<#>
: Produto interno (Inner Product). Relacionado à similaridade cosseno, avalia similaridade direcional.<=>
: Distância cosseno (Cosine Distance). Corresponde a1 - similaridade cosseno
. Mede apenas a direção, independente do comprimento do vetor.
Veja alguns exemplos de consultas vetoriais:
Busca do vizinho mais próximo (Nearest Neighbor Search)
Localize os vetores mais similares a um vetor de consulta, geralmente usando ORDER BY
com o operador de distância e LIMIT
.
- Buscando os 5 vetores mais próximos em distância L2 de
[0.2, 0.3, 0.4]
:sqlSELECT id, vector, -- Calcula a distância L2 em relação ao vetor de busca vector <-> '[0.2, 0.3, 0.4]' AS distance FROM embeddings ORDER BY distance -- Ordena em ordem crescente (menor distância = mais similar) LIMIT 5;
1
2
3
4
5
6
7
8
9
10
Busca por similaridade vetorial (Similarity Search)
Semelhante à busca do vizinho mais próximo, mas destaca o score de similaridade.
- Buscando os 5 vetores mais próximos em distância cosseno de
[0.2, 0.3, 0.4]
e exibindo a distância:sqlSELECT id, vector, -- Calcula a distância cosseno contra o vetor de consulta vector <=> '[0.2, 0.3, 0.4]' AS cosine_distance FROM embeddings ORDER BY cosine_distance -- Ordena em ordem crescente (menor distância = mais similar) LIMIT 5;
1
2
3
4
5
6
7
8
9
10
Visualizando Dados Vetoriais (Opcional)
Visualizar dados vetoriais de alta dimensão ajuda na compreensão da distribuição e agrupamento. Para vetores 2D ou 3D, basta usar gráficos de dispersão. Para vetores de maior dimensão, aplique técnicas de redução dimensional (PCA, t-SNE) antes de exibir.
Aqui vai um exemplo simples de visualização de vetores 3D usando Python e Matplotlib.
Prepare o ambiente Python: Tenha um ambiente Python configurado, seja dentro ou fora do ServBay. Se usar o pacote Python do ServBay, garanta que está ativado. Instale as bibliotecas necessárias,
psycopg2
(para PostgreSQL) ematplotlib
(para gráficos):bash# Se estiver usando o Python do sistema ou um instalado manualmente pip install psycopg2 matplotlib # Se usar o Python do ServBay, rode via linha de comando ServBay ou pip no diretório bin # /Applications/ServBay/softwares/python/bin/pip install psycopg2 matplotlib
1
2
3
4
5Ajuste o caminho do
pip
conforme o seu ambiente Python.Crie o script Python: Crie o arquivo (por exemplo,
visualize_vectors.py
) e copie o código abaixo. Altere os parâmetros de conexão (dbname
,user
,password
,host
,port
) conforme sua configuração do PostgreSQL do ServBay.pythonimport psycopg2 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # Módulo para gráfico 3D # Parâmetros de conexão - altere conforme seu ServBay db_params = { "dbname": "your_database_name", # Substitua pelo nome do seu banco "user": "servbay", # Substitua pelo usuário PostgreSQL do ServBay (servbay ou postgres) "password": "", # Senha do banco (pode ser vazia para localhost) "host": "localhost", # Geralmente localhost "port": "5432" # Porta padrão do PostgreSQL ServBay } conn = None cur = None try: # Conecta ao banco PostgreSQL conn = psycopg2.connect(**db_params) cur = conn.cursor() # Busca os vetores # Atenção: O psycopg2 pode ler os vetores como string '[x, y, z]'. # Parse manual ou use versão recente do pgvector/psycopg2 integrada. cur.execute("SELECT vector FROM embeddings") vectors_raw = cur.fetchall() # Parseia a string do vetor para uma lista de floats vectors = [] for row in vectors_raw: vec_str = row[0].strip('[]') coords = [float(c) for c in vec_str.split(',')] vectors.append(coords) if not vectors: print("Nenhum vetor encontrado.") exit() # Extrai coordenadas # Garante que todos têm 3 dimensões, senão aborta if any(len(v) != 3 for v in vectors): print("Aviso: vetores não têm 3 dimensões, impossível plotar gráfico 3D.") exit() x = [v[0] for v in vectors] y = [v[1] for v in vectors] z = [v[2] for v in vectors] # Cria gráfico 3D fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x, y, z) ax.set_xlabel('Dimensão 1') ax.set_ylabel('Dimensão 2') ax.set_zlabel('Dimensão 3') ax.set_title('Visualização 3D de Vetores') plt.show() except psycopg2.Error as e: print(f"Erro ao conectar ou consultar o banco: {e}") except Exception as e: print(f"Ocorreu um erro: {e}") finally: # Fecha a conexão com o banco if cur: cur.close() if conn: conn.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70Execute o script: Rode o script Python no Terminal:
bashpython visualize_vectors.py
1O script irá se conectar ao banco PostgreSQL, ler os vetores e exibir um gráfico 3D usando o Matplotlib.
Perguntas Frequentes (FAQ)
- Pergunta: O que fazer se não vejo a extensão
vector
no resultado do comando\dx
? Resposta: Confirme se executou corretamente o comandoCREATE EXTENSION vector;
e que não houve mensagens de erro. Se ainda assim não aparecer, confira se o pacote PostgreSQL do ServBay está instalado e habilitado. Os arquivos dopgvector
devem estar no subdiretórioshare/extension
do PostgreSQL. Se estiverem ausentes, tente reinstalar ou atualizar o pacote PostgreSQL do ServBay. - Pergunta: O que significa erro de autenticação ao conectar ao banco? Resposta: Verifique se os parâmetros de usuário, senha, host e porta utilizados no comando
psql
ou no script Python correspondem à configuração do PostgreSQL no ServBay. Para conexões locais, o usuário costuma serservbay
oupostgres
, e normalmente a senha pode ser vazia. - Pergunta: Como escolher os parâmetros do índice vetorial (
lists
,m
,ef_construction
)? Resposta: Esses parâmetros têm impacto direto no desempenho e recall e não há valores “mágicos” universais. Realize experimentações variando o tamanho do dataset, a dimensionalidade, a latência e seu objetivo de recall. A documentação oficial dopgvector
oferece mais orientações e dicas de ajuste fino.
Conclusão
O pgvector
traz poderosas capacidades de banco de dados vetorial para o sólido e confiável PostgreSQL, facilitando para desenvolvedores a criação local de aplicações de IA e projetos envolvendo vetores. O ServBay, ao trazer o pgvector
pré-instalado, reduz o tempo e a complexidade do setup.
Seguindo este guia, você pode ativar facilmente o pgvector
no PostgreSQL do ServBay, criar tabelas para armazenar vetores, usar índices eficientes para acelerar consultas e realizar buscas de similaridade vetorial. Combinado com outras ferramentas e ambientes que o ServBay oferece, sua produtividade no desenvolvimento web moderno e em projetos data-driven irá aumentar consideravelmente.