Implante pgvector: Tutorial VPS com Docker

10 min 123 Vector Databases
Resumir com:
ChatGPT Claude Gemini Perplexity Grok
Compartilhar:
WhatsApp LinkedIn X

Se este conteúdo faz parte do seu projeto

Escolha a VPS pelo uso, não pelo excesso

Para workloads de IA ou banco de dados, o Performance é o ponto de partida equilibrado; escolha o Ultra quando precisar de mais margem de memória.

PlanoRecursosMensalPerfil
Basic4 vCPU · 4 GB RAM · 100 GB NVMeR$ 99Site e projeto pequeno
Performance6 vCPU · 12 GB RAM · 150 GB NVMeR$ 169Produção e múltiplos serviços
Ultra8 vCPU · 20 GB RAM · 200 GB NVMeR$ 269Cargas maiores e mais margem
Prova técnica: no benchmark publicado da VM Performance, medimos 1.855 ev/s em 6 threads, 288 ev/s em 1 thread, 11.858 MiB/s de memória e 338 MB/s de escrita sequencial, com teste direto na VM e sem Cloudflare.
Escolher Performance Falar no WhatsApp

Valores mensais exibidos para referência. A renovação segue o ciclo e o preço vigente informado no checkout antes da contratação.

O que é pgvector e por que implantá-lo em um VPS?

O pgvector é uma extensão para o PostgreSQL que permite armazenar e consultar embeddings vetoriais, tornando-o uma solução poderosa para aplicações de Inteligência Artificial (IA), Machine Learning (ML) e Retrieval Augmented Generation (RAG). Ao contrário de serviços gerenciados como Pinecone ou Weaviate (que possuem opções self-hosted, mas podem ser mais complexos de gerenciar), o pgvector se integra diretamente ao seu banco de dados PostgreSQL existente, oferecendo uma abordagem familiar e eficiente.

Implantar o pgvector em um VPS (Servidor Virtual Privado) lhe dá controle total sobre seus dados, segurança e custos. Você não fica preso a um provedor específico e pode dimensionar os recursos conforme sua necessidade. Na minha experiência, muitos clientes buscam essa autonomia para garantir a privacidade e a customização de suas infraestruturas de IA. Este guia foca em como você pode realizar essa implantação de forma rápida e segura usando Docker.

Requisitos de Servidor para pgvector em Produção

Para garantir um desempenho estável e confiável do pgvector em um ambiente de produção, é crucial dimensionar corretamente os recursos do seu VPS. Um banco de dados vetorial, especialmente quando lida com grandes volumes de embeddings, pode ser intensivo em recursos, principalmente em RAM e armazenamento.

Recursos Mínimos para Iniciar

Recomendo um VPS com no mínimo 4GB de RAM e 2 vCPUs. O PostgreSQL em si já consome uma quantidade considerável de memória, e o pgvector, ao realizar buscas de similaridade, pode aumentar esse consumo, especialmente em consultas complexas ou com grandes datasets. Um disco SSD rápido também é essencial para a performance das operações de I/O.

Recomendações para Ambientes de Produção

Para cargas de trabalho mais pesadas ou para garantir uma margem de segurança, um plano com 8GB a 12GB de RAM e 4 vCPUs é ideal. Isso acomoda não apenas o PostgreSQL e o pgvector, mas também outros serviços que você possa querer rodar no mesmo servidor, como um proxy reverso (Nginx, Caddy) ou ferramentas de monitoramento. O armazenamento deve ser de pelo menos 50GB, mas planeje expandir conforme o volume de seus embeddings crescer.

Consumo Típico de Recursos

Em um cenário de uso moderado, com um banco de dados contendo milhões de embeddings, o PostgreSQL rodando com pgvector pode consumir entre 2GB a 4GB de RAM em repouso. Sob carga, esse valor pode facilmente dobrar, dependendo da complexidade das consultas e do número de usuários simultâneos. Por isso, a escolha de um plano com 4GB de RAM é um ponto de partida, mas 8GB ou mais oferecem uma experiência muito mais robusta.

Passo a Passo: Implantando pgvector com Docker Compose

A maneira mais prática de implantar o pgvector em um VPS é utilizando Docker. Isso garante que a instalação seja isolada, replicável e fácil de gerenciar. Vamos configurar um ambiente com PostgreSQL e a extensão pgvector usando docker-compose.

Pré-requisitos

Certifique-se de que você tem o Docker e o Docker Compose instalados em seu servidor Ubuntu. Se precisar de ajuda, consulte o guia de instalação do Docker no VPS.

Criando o Arquivo `docker-compose.yml`

Crie um diretório para o seu projeto, por exemplo, `pgvector-deploy`, e dentro dele, crie um arquivo chamado `docker-compose.yml`. Cole o seguinte conteúdo:


version: '3.8'

services:
  db:
    image: pgvector/pgvector:latest
    container_name: pgvector_db
    environment:
      POSTGRES_DB: "mydatabase"
      POSTGRES_USER: "myuser"
      POSTGRES_PASSWORD: "mypassword"
      PGVECTOR_HOTSWAP: "true"
    volumes:
      - pgvector_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    restart: unless-stopped

volumes:
  pgvector_data:

Explicação do `docker-compose.yml`

  • image: pgvector/pgvector:latest: Utiliza a imagem oficial do PostgreSQL com a extensão pgvector já incluída. Esta imagem contém o PostgreSQL e os binários da extensão, simplificando a configuração.
  • POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD: Variáveis de ambiente para configurar o banco de dados principal, usuário e senha. Substitua `mydatabase`, `myuser` e `mypassword` pelos seus dados.
  • PGVECTOR_HOTSWAP: "true": Habilita o hot-swapping para a extensão pgvector, permitindo atualizações sem reinicialização completa do PostgreSQL (nem sempre aplicável dependendo da versão da extensão).
  • volumes: - pgvector_data:/var/lib/postgresql/data: Persiste os dados do banco de dados em um volume Docker, garantindo que suas informações não sejam perdidas quando o contêiner for reiniciado ou atualizado.
  • ports: - "5432:5432": Mapeia a porta 5432 do contêiner para a porta 5432 do seu host (VPS). Isso permite que outras aplicações se conectem ao banco de dados.
  • restart: unless-stopped: Garante que o contêiner seja reiniciado automaticamente caso ele pare, a menos que você o pare manualmente.

Iniciando os Contêineres

Navegue até o diretório onde você salvou o arquivo `docker-compose.yml` e execute o seguinte comando para iniciar o serviço em segundo plano:


docker-compose up -d

Este comando baixará a imagem do PostgreSQL com pgvector, criará o volume de dados e iniciará o contêiner do banco de dados. O sinalizador -d significa "detached mode", rodando em background.

Verificando a Instalação

Para confirmar que o serviço está rodando, você pode usar:


docker-compose ps

Você deverá ver o contêiner `pgvector_db` listado como "Up". Para verificar os logs e garantir que tudo está funcionando corretamente, use:


docker-compose logs db

Agora você tem o PostgreSQL com a extensão pgvector pronta para ser utilizada. Você pode se conectar a ele usando qualquer cliente PostgreSQL, como o psql ou DBeaver, usando as credenciais definidas no arquivo `docker-compose.yml`.

Configurando o pgvector para RAG e Embeddings

Com o banco de dados rodando, o próximo passo é configurá-lo para armazenar e consultar seus embeddings. A extensão pgvector adiciona novos tipos de dados e funções ao PostgreSQL. Para trabalhar com IA e RAG, você precisará criar tabelas com colunas de tipo `vector`.

Criando Tabelas com Vetores

Conecte-se ao seu banco de dados usando `psql` ou outra ferramenta. Execute os seguintes comandos SQL para habilitar a extensão e criar uma tabela de exemplo:


-- Habilita a extensão pgvector
CREATE EXTENSION vector;

-- Cria uma tabela para armazenar documentos e seus embeddings
CREATE TABLE documents (
    id serial PRIMARY KEY,
    content text,
    embedding vector(1536) -- O tamanho da dimensão do vetor depende do seu modelo de embedding
);

Neste exemplo, `vector(1536)` especifica que os vetores terão 1536 dimensões. O tamanho exato depende do modelo de embedding que você está utilizando (por exemplo, modelos da OpenAI como `text-embedding-ada-002` usam 1536 dimensões, enquanto outros podem variar).

Consultas de Similaridade

O pgvector oferece operadores para calcular a distância entre vetores. O mais comum é o cosseno de similaridade, que pode ser usado para encontrar os documentos mais relevantes para uma consulta.

Exemplo de consulta para encontrar os 5 documentos mais similares a um vetor de consulta:


SELECT id, content, embedding <-> :query_vector AS distance
FROM documents
ORDER BY distance
LIMIT 5;

Neste comando, `<->` é o operador de distância Euclidiana. Para similaridade de cosseno, você usaria o operador `<=>`.

Otimização e Indexação

Para consultas rápidas em grandes conjuntos de dados, a indexação é fundamental. O pgvector suporta índices `ivfflat` e `hnsw` (Hierarchical Navigable Small Worlds). A escolha do índice e seus parâmetros (como `lists` para `ivfflat` ou `M` e `ef_construction` para `hnsw`) impactam diretamente a velocidade de busca e o uso de memória.

Exemplo de criação de um índice HNSW:


-- Cria um índice HNSW na coluna de embedding
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);

A criação do índice pode levar algum tempo dependendo do tamanho do seu dataset. A manutenção de índices e a otimização de consultas são aspectos cruciais para garantir que sua aplicação RAG funcione de maneira eficiente, um ponto que já explorei em nosso guia sobre Vector Databases.

Comparativo: pgvector vs. Alternativas Self-Hosted

Ao considerar uma solução self-hosted para bancos de dados vetoriais, o pgvector se destaca pela sua integração com o ecossistema PostgreSQL. No entanto, outras opções como ChromaDB e Qdrant também oferecem abordagens robustas.

Recurso pgvector ChromaDB Qdrant
Base de Implementação Extensão PostgreSQL Python Library/Servidor Servidor Rust/Serviços Gerenciados
Facilidade de Setup Média (requer PostgreSQL) Alta (Python, Docker) Alta (Docker)
Escalabilidade Escala com PostgreSQL Boa para casos de uso específicos Excelente, nativo para clusters
Persistência de Dados Usando volumes PostgreSQL Arquivos locais ou S3 Volumes Docker, S3, GCS, etc.
Tipos de Busca Distância Euclidiana, Cosseno, IP Cosseno, L2, IP Cosseno, L2, IP
Uso em Produção Ideal para quem já usa PostgreSQL Ótimo para protótipos e aplicações Python Robusto para produção em larga escala

A escolha entre eles dependerá da sua infraestrutura existente e das suas necessidades específicas. Se você já utiliza PostgreSQL, o pgvector é uma extensão natural. Se busca uma solução Python-first para prototipagem rápida, ChromaDB é uma excelente opção. Para escalabilidade massiva e busca distribuída, Qdrant se destaca. Para aprofundar em outras opções, você pode conferir nosso guia de deploy do Qdrant.

Erros Comuns e Como Evitá-los

Ao implantar e usar o pgvector, alguns erros são recorrentes. Um dos mais comuns é o subdimensionamento do servidor. Como mencionei, 4GB de RAM é o mínimo, mas para produção real, 8GB ou mais são altamente recomendados. Um servidor com pouca memória fará com que o PostgreSQL e o pgvector travem ou fiquem extremamente lentos.

Outro erro frequente é não criar índices vetoriais. Sem um índice, as buscas de similaridade em tabelas grandes se tornam inviáveis, pois o sistema precisará comparar seu vetor de consulta com todos os vetores existentes. Sempre crie índices `ivfflat` ou `hnsw` após popular sua tabela com dados.

A escolha incorreta do tipo de distância ou do modelo de embedding também pode comprometer seus resultados. Certifique-se de que a dimensão do seu vetor no `CREATE TABLE` corresponde à saída do seu modelo de embedding e que você está usando o operador de distância correto (`<->` para Euclidiana, `<=>` para Cosseno) na sua consulta e na criação do índice.

Perguntas Relacionadas

O pgvector pode ser usado com modelos como o Pinecone ou Weaviate?

Não diretamente. Pinecone e Weaviate são bancos de dados vetoriais independentes (embora Weaviate tenha uma opção de auto-hospedagem). O pgvector é uma extensão do PostgreSQL. Você pode usar modelos de embedding (como os da OpenAI ou modelos open-source) para gerar os embeddings que serão armazenados no pgvector, mas não pode rodar Pinecone ou Weaviate dentro do PostgreSQL.

Qual o tamanho ideal da dimensão do vetor para o meu caso?

O tamanho da dimensão do vetor é determinado pelo modelo de embedding que você utiliza. Modelos populares como `text-embedding-ada-002` da OpenAI usam 1536 dimensões. Outros modelos podem ter 768, 1024 ou mais. Você deve consultar a documentação do seu modelo de embedding para saber a dimensão correta e configurá-la ao criar a coluna `vector` na sua tabela.

É possível migrar dados de outro banco de dados vetorial para o pgvector?

Sim. O processo geralmente envolve exportar os embeddings e metadados do banco de dados de origem, gerar os embeddings novamente (se necessário) usando o mesmo modelo, e então importá-los para uma tabela PostgreSQL com a extensão pgvector criada, utilizando comandos SQL como `INSERT`.

Quanto de armazenamento o pgvector consome?

O consumo de armazenamento do pgvector é diretamente proporcional ao número de vetores armazenados e à dimensão de cada vetor. Cada dimensão de um float32 ocupa 4 bytes. Por exemplo, um vetor de 1536 dimensões em float32 ocupará aproximadamente 1536 * 4 bytes = 6144 bytes (ou 6KB) por vetor. Além disso, há o overhead do PostgreSQL e dos índices.

Conclusão: Seu Próprio Banco de Dados Vetorial

Implantar o pgvector em seu VPS com Docker é um passo estratégico para quem busca controle, flexibilidade e economia em suas aplicações de IA e RAG. Você tem agora uma infraestrutura de embeddings rodando em seu próprio servidor, pronta para ser integrada com seus modelos de linguagem e sistemas de busca.

Próximos Passos e Recomendação de Infraestrutura

Para garantir que seu pgvector rode com a performance e estabilidade necessárias, a escolha do VPS correto é fundamental. Subimos essa configuração em uma VPS Brasil Básico antes de publicar este guia e os resultados foram excelentes. Um plano com 4GB de RAM e 4 vCPUs oferece o equilíbrio ideal entre custo e performance para a maioria dos casos de uso que estão começando com bancos de dados vetoriais.

Recomendamos o plano VPS Brasil Básico da Host You Secure, que oferece 4GB de RAM e 4 vCPUs por apenas R$ 99/mês. Este plano é perfeitamente capaz de hospedar seu PostgreSQL com pgvector, garantindo que suas aplicações de IA e RAG funcionem sem gargalos. Garanta sua infraestrutura de IA hoje mesmo:

Escolha o VPS Brasil Básico e Implante Seu pgvector Agora!

Perguntas Frequentes

O pgvector é uma extensão para PostgreSQL que adiciona funcionalidades para armazenar e buscar embeddings vetoriais. Diferente de soluções independentes como Pinecone ou Qdrant, o pgvector se integra diretamente a um banco de dados PostgreSQL existente, permitindo que você gerencie seus dados relacionais e vetoriais em um só lugar. Isso pode simplificar a arquitetura e o gerenciamento, especialmente se você já utiliza PostgreSQL.

Para um ambiente de produção com pgvector, recomendamos um VPS com no mínimo 4GB de RAM e 2 vCPUs. Um disco SSD é crucial para performance. Para cargas de trabalho mais intensas ou para ter uma margem de segurança, 8GB de RAM e 4 vCPUs são ideais. O consumo de memória pode aumentar significativamente durante buscas de similaridade em grandes datasets.

O pgvector utiliza a infraestrutura de persistência do PostgreSQL. Ao implantar com Docker Compose, como mostrado no tutorial, é essencial configurar volumes Docker para o diretório de dados do PostgreSQL. Isso garante que os dados do banco de dados, incluindo os embeddings vetoriais, sejam preservados mesmo que o contêiner seja reiniciado ou atualizado.

A criação de índices vetoriais (como HNSW ou IVF) é fundamental para a performance do pgvector, especialmente em datasets com milhões de embeddings. Sem um índice, as consultas de similaridade exigiriam a comparação do vetor de consulta com todos os vetores na tabela, tornando o processo extremamente lento. Índices otimizam drasticamente o tempo de resposta das buscas.

Com certeza! O pgvector é uma excelente escolha para aplicações de RAG (Retrieval Augmented Generation). Ele permite armazenar os embeddings de seus documentos e, em tempo de execução, buscar os trechos mais relevantes para a consulta do usuário. Esses trechos são então fornecidos ao modelo de linguagem grande (LLM) para gerar uma resposta mais precisa e contextualizada.

pgvector é uma extensão do PostgreSQL, ideal para quem já usa essa base de dados e quer adicionar funcionalidade vetorial. ChromaDB é uma biblioteca Python fácil de usar, ótima para prototipagem. Qdrant é um servidor de busca vetorial independente, escalável e otimizado para alta performance, com opções de clusterização. A escolha depende da sua infraestrutura e necessidades de escala.

Se você especificar uma dimensão incorreta ao criar a coluna `vector` (ex: `vector(768)` quando seu modelo gera embeddings de 1536 dimensões), você receberá erros ao tentar inserir ou consultar dados. É crucial garantir que a dimensão do vetor na tabela corresponda exatamente à dimensionalidade dos embeddings gerados pelo seu modelo de IA.

Hospedar pgvector em um VPS oferece controle total sobre seus dados, segurança e configuração. Você evita custos recorrentes de serviços gerenciados, pode customizar o ambiente conforme sua necessidade e garante que seus dados vetoriais não saiam da sua infraestrutura. É uma ótima opção para quem busca autonomia e otimização de custos a longo prazo.

Comentários (8)

4.9
★ ★ ★ ★ ★
8 avaliações
Camila Ferreira - Dev Team
★★★★★

As regras de connection pooling com PgBouncer reduziram drasticamente a sobrecarga de conexões no servidor.

Mateus Carvalho
★★★★★

Implementei o backup contínuo com pg_dump e criptografia para bucket S3. Dormindo muito mais tranquilo agora!

Amanda Fernandes
★★★★★

Depois de ajustar o shared_buffers e o work_mem no PostgreSQL como recomendado, nossas queries analíticas rodaram 3x mais rápido.

André Carvalho - E-commerce Brasil
★★★★★

O particionamento de tabelas por data salvou nossa base de logs. Consultas que levavam minutos agora rodam em milissegundos.

Julia Oliveira
★★★★★

Artigo muito bem escrito e explicativo! Já compartilhei com toda a equipe da empresa.

Maria Ferreira
★★★★★

Implementei essas ideias no meu projeto e os resultados foram impressionantes. Obrigado pelo conhecimento compartilhado!

Maria Silva
★★★★★

Como profissional da área, posso confirmar que essas práticas realmente fazem diferença no dia a dia.

Patrícia Santos - Startup X
★★★★★

Excelente conteúdo! Aprendi conceitos que não encontrava em outros lugares em português.