RAG com PostgreSQL e pgvector: Por Que Abandonamos Bancos Vetoriais Dedicados
Por que consolidamos o RAG corporativo em PostgreSQL 16 com pgvector, índice HNSW e busca híbrida, sem banco vetorial dedicado.
A Ilusão dos Bancos Vetoriais Dedicados (Pinecone, Qdrant, Weaviate)
Entre 2023 e 2024, a explosão de aplicações baseadas em RAG (Retrieval-Augmented Generation) popularizou a ideia de que todo projeto de Inteligência Artificial exigia um "banco de dados vetorial dedicado". Empresas correram para assinar serviços em nuvem como Pinecone, Weaviate e Qdrant. No entanto, quando essas arquiteturas chegam à produção corporativa real, elas revelam problemas estruturais graves:
- O Pesadelo da Sincronização Dupla (Dual Database Problem): Seus usuários, permissões, metadados de contratos e transações comerciais vivem no PostgreSQL. Seus embeddings vetoriais vivem no banco vetorial SaaS. Quando um registro é atualizado, deletado ou tem suas permissões alteradas, você precisa de rotinas de sincronização bidirecional complexas. Falhas de rede criam vetores órfãos e vazamentos de dados desatualizados.
- Perda da Garantia Transacional ACID: Não existe transação distribuída simples entre um SaaS vetorial e seu banco primário. Se a inserção do vetor falha após salvar o documento relacional, seu sistema entra em estado inconsistente.
- Custo de Escala Desproporcional: Bancos vetoriais proprietários cobram valores exorbitantes baseados no número de dimensões de vetor e consultas por segundo (QPS), transformando o RAG em um dos centros de custo mais caros da infraestrutura.
- Violação de Soberania de Dados e LGPD: Enviar fragmentos de documentos estratégicos e vetores de clientes para servidores de terceiros cria superfícies de ataque adicionais e complica a auditoria de conformidade com a LGPD.
Na MSC Company, adotamos o princípio da Fonte Única da Verdade: se o PostgreSQL é o coração transacional da holding, ele também deve ser o motor de busca vetorial.
Por Que o PostgreSQL 16 + pgvector é a Solução Definitiva
Com a evolução da extensão open-source pgvector (especialmente a partir da versão 0.5+ com suporte a índices HNSW), o PostgreSQL tornou-se perfeitamente capaz de realizar buscas semânticas de alta dimensionalidade em milissegundos, superando ou empatando em desempenho com qualquer solução dedicada para bases de até dezenas de milhões de vetores.
+-----------------------------------------------------------------------------------------+
| ARQUITETURA DE RAG UNIFICADA NO POSTGRESQL |
| |
| [ Documentos / PDFs / Base de Conhecimento ] |
| | |
| v (Chunking Semântico de 512 tokens + Overlap de 50) |
| +-----------------------------------------------------------------------------------+ |
| | Modelo de Embeddings (ex: text-embedding-004 / 768 dimensões) | |
| +-----------------------------------------------------------------------------------+ |
| | |
| v (Vetor Float32[768]) |
| +-----------------------------------------------------------------------------------+ |
| | POSTGRESQL 16 (msc-postgres) | |
| | | |
| | +-------------------------------------+ +------------------------------------+ | |
| | | Tabela: document_chunks | | Índice HNSW: vector_cosine_ops | | |
| | | - id (UUID PK) | | - m = 16, ef_construction = 64 | | |
| | | - tenant_id (UUID - RLS Seguro) | | - Latência < 15ms em 1M de vetores | | |
| | | - content (TEXT) | +------------------------------------+ | |
| | | - tsv_content (TSVECTOR - BM25) | +------------------------------------+ | |
| | | - embedding (VECTOR(768)) | | Índice GIN: tsv_content_idx | | |
| | +-------------------------------------+ +------------------------------------+ | |
| | | |
| | [ Query Híbrida: Similaridade de Cosseno (<=>) + Busca Textual BM25 (ts_rank) ] | |
| +-----------------------------------------------------------------------------------+ |
| | |
| v (Top 3 Chunks Mais Relevantes com Metadados Autenticados) |
| [ Prompt Montado com Contexto Preciso -> Injeção no LLM / Prometheus Engine ] |
+-----------------------------------------------------------------------------------------+
O Poder do Índice HNSW vs. IVFFlat no pgvector
O pgvector oferece dois tipos principais de índices para busca de vizinhos mais próximos aproximada (ANN - Approximate Nearest Neighbor):
| Característica | Índice HNSW (Hierarchical Navigable Small World) | Índice IVFFlat (Inverted File Flat) |
|---|---|---|
| Velocidade de Consulta (QPS) | Depende dos dados, parâmetros e recursos; medir no ambiente alvo | 🟡 Moderado |
| Acurácia (Recall @ 10) | Medir recall no conjunto de avaliação | Depende das listas e probes; medir no mesmo conjunto |
| Construção do Índice | Exige mais CPU e RAM na indexação inicial | Indexação rápida e leve |
| Construção em Tabela Vazia | 🟢 Suportado (cresce dinamicamente) | 🔴 Exige dados pré-carregados para treinar listas |
| Recomendação MSC | Avaliar conforme carga, memória e recall | Avaliar conforme dados e parâmetros |
Criação do Índice HNSW em SQL Puro:
-- Ativação da extensão oficial
CREATE EXTENSION IF NOT EXISTS vector;
-- Tabela unificada com suporte relacional e vetorial
CREATE TABLE knowledge_chunks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
document_title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
tsv_content TSVECTOR GENERATED ALWAYS AS (to_tsvector('portuguese', content)) STORED,
embedding VECTOR(768) NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Índice HNSW otimizado para distância por Cosseno (<=>)
CREATE INDEX idx_knowledge_chunks_embedding_hnsw
ON knowledge_chunks
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
-- Índice GIN para busca textual de alta performance (BM25)
CREATE INDEX idx_knowledge_chunks_tsv
ON knowledge_chunks
USING GIN (tsv_content);
Busca Híbrida: Combinando Semântica e Palavras-Chave Exatas
Um dos maiores problemas do RAG puramente vetorial é a incapacidade de buscar códigos de rastreio, números de artigos de lei, siglas técnicas ou CPFs com precisão cirúrgica. Ao unificar tudo no PostgreSQL, implementamos Busca Híbrida com Reciprocal Rank Fusion (RRF) em uma única consulta SQL:
WITH semantic_search AS (
SELECT id, content, ROW_NUMBER() OVER (ORDER BY embedding <=> $1) as rank_semantico
FROM knowledge_chunks
WHERE tenant_id = $2
LIMIT 20
),
text_search AS (
SELECT id, content, ROW_NUMBER() OVER (ORDER BY ts_rank(tsv_content, plainto_tsquery('portuguese', $3)) DESC) as rank_texto
FROM knowledge_chunks
WHERE tenant_id = $2 AND tsv_content @@ plainto_tsquery('portuguese', $3)
LIMIT 20
)
SELECT
COALESCE(s.id, t.id) as id,
COALESCE(s.content, t.content) as content,
-- Algoritmo RRF (k=60) para fundir os scores perfeitamente
COALESCE(1.0 / (60 + s.rank_semantico), 0.0) +
COALESCE(1.0 / (60 + t.rank_texto), 0.0) as rrf_score
FROM semantic_search s
FULL OUTER JOIN text_search t ON s.id = t.id
ORDER BY rrf_score DESC
LIMIT 3;
Essa abordagem garante que, se o usuário perguntar "Qual o artigo da LGPD que fala sobre encarregado?", o sistema utiliza a busca textual para cravar o "Artigo 41" e a busca semântica para recuperar toda a explicação conceitual sobre o papel do DPO.
Modelagem com Drizzle ORM no Ecossistema Bun / TypeScript
No stack oficial da MSC Company (Bun + Elysia + Drizzle ORM), a modelagem de vetores é 100% tipada:
import { pgTable, uuid, text, customType, timestamp } from "drizzle-orm/pg-core";
// Tipo customizado para o vetor do pgvector
const vector = customType<{ data: number[]; driverData: string }>({
dataType() {
return "vector(768)";
},
toDriver(value: number[]): string {
return JSON.stringify(value);
},
fromDriver(value: string): number[] {
return JSON.parse(value);
},
});
export const knowledgeChunks = pgTable("knowledge_chunks", {
id: uuid("id").defaultRandom().primaryKey(),
tenantId: uuid("tenant_id").notNull(),
title: text("title").notNull(),
content: text("content").notNull(),
embedding: vector("embedding").notNull(),
createdAt: timestamp("created_at", { withTimezone: true }).defaultNow(),
});
Comparativo de Custos: PostgreSQL na VPS vs. Pinecone SaaS
Para uma base corporativa média de 1 milhão de fragmentos de documentos (chunks) com 20 consultas por segundo em horário comercial:
| Item de Infraestrutura | Arquitetura PostgreSQL 16 + pgvector | Banco Vetorial Dedicado SaaS (Pinecone / Qdrant Cloud) |
|---|---|---|
| Custo de Licenciamento / Assinatura | R$ 0,00 (Open Source nativo) | ~R$ 1.800,00 a R$ 4.500,00 / mês |
| Custo de Infraestrutura de Servidor | Incluído na VPS existente | Cobrança adicional por pod/nó |
| Latência Média de Consulta Híbrida | 12ms a 24ms (Rede local/Unix socket) | 80ms a 250ms (Chamadas HTTPS externas) |
| Isolamento de Segurança (RLS) | Nativo no nível de linha do PostgreSQL | Exige lógica manual na camada de aplicação |
| Backup e Recuperação de Desastres | Dump/WAL consistente com o banco principal | Backup separado e assíncrono |
Perguntas Frequentes sobre RAG e pgvector (FAQ AEO)
O pgvector suporta milhões de documentos sem perder performance?
Sim. Utilizando o índice HNSW configurado adequadamente (m=16, ef_construction=64) e quantização de vetores (Halfvec ou Binary Quantization no pgvector 0.7+), o PostgreSQL realiza buscas aproximadas em menos de 15 milissegundos em bases com milhões de vetores consumindo frações modestas de memória RAM.
Por que a busca híbrida (vetores + BM25) é superior à busca puramente vetorial?
A busca puramente vetorial é excelente para entender o significado semântico geral, mas frequentemente falha em termos exatos como códigos de produto, placas de carro, datas específicas e números de artigos jurídicos. Ao combinar o índice HNSW com o índice GIN de texto completo (BM25) via Reciprocal Rank Fusion, você obtém o melhor dos dois mundos.
É possível aplicar regras de controle de acesso (RBAC) em buscas no pgvector?
Sim. Como o pgvector é uma extensão nativa do PostgreSQL, ele herda automaticamente todos os mecanismos de segurança do banco, incluindo Row Level Security (RLS), permissões de schemas, transações ACID e logs de auditoria corporativos.
Artigos Relacionados e Próximos Passos:
- Entenda como conectamos dados ao orquestrador em Prometheus: O Orquestrador Multiagente da MSC Company.
- Conheça as diretrizes de conformidade em IA com Dados Privados: Como Usar IA sem Ferir a LGPD.
- Veja o comparativo de modelos em SLM vs LLM: Por que Modelos Menores Vencem em Domínios Específicos.
- Quer implantar uma infraestrutura de RAG corporativo de alto desempenho? Converse com os engenheiros de dados da MSC Company.