Vector DBs: pgvector, Pinecone, Weaviate, Qdrant
- ⬜🪨 SQLite moderno: edge, mobile e backend 2026(NoSQL + Vector Databases)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Vector DB é infra especializada
📋 Banco vetorial dedicado ou extensão no banco que você já tem
Manter um sistema a mais custa operação, sincronização e mais um ponto de falha. Com até alguns milhões de vetores e filtro por permissão no mesmo banco, a extensão resolve — e a consulta faz junção com o dado relacional numa transação só, o que um sistema separado não permite.
Alt: Dedicado desde o início — Paga operação e sincronização antes de precisar da escala
Alt: Índice em memória no processo — Rápido e some no reinício; sem filtro por permissão
Alt: Serviço gerenciado — Some a operação e volta o problema de manter dois lugares em sincronia
Um vetor de embedding é um ponto num espaço de 384 a 3072 dimensões. Buscar "os 10 mais próximos desta query" num milhão de pontos por força bruta é O(N) com cálculo denso — inviável em latência de produto. Vector DBs resolvem isso com indexes ANN (Approximate Nearest Neighbor): HNSW, IVF, PQ. Recall < 100% trocado por latência p99 de milissegundos.
pgvector em Postgres real
-- Habilita extensao
CREATE EXTENSION IF NOT EXISTS vector;
-- Tabela com embedding + metadata relacional
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
title TEXT NOT NULL,
content TEXT NOT NULL,
embedding vector(1536) NOT NULL, -- OpenAI text-embedding-3-small
created_at TIMESTAMPTZ DEFAULT now()
);
-- Indice HNSW (Hierarchical Navigable Small World)
-- Melhor recall/latencia em 2026. IVFFlat e alternativa mais barata de build.
CREATE INDEX documents_embedding_hnsw
ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
-- Index combinado para filtro por tenant (partial index)
CREATE INDEX documents_tenant ON documents (tenant_id);
-- Analyze para planner usar estatisticas
ANALYZE documents;Busca: ANN + filtro + rerank
-- Top 50 mais proximos do embedding da query, dentro do tenant
-- ef_search controla qualidade vs latencia (default 40, prod 100+)
SET LOCAL hnsw.ef_search = 100;
SELECT id, title, content,
1 - (embedding <=> $1::vector) AS cosine_similarity
FROM documents
WHERE tenant_id = $2
ORDER BY embedding <=> $1::vector
LIMIT 50;import OpenAI from 'openai';
import { CohereClient } from 'cohere-ai';
const openai = new OpenAI();
const cohere = new CohereClient({ text: process.env.COHERE_API_KEY! });
async function semanticSearch(query: string, tenantId: number) {
// 1) Embed a query
const emb = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: query,
});
const vec = emb.data[0].embedding;
// 2) Top-50 via pgvector
const candidates = await db.query(
'SELECT id, title, content FROM documents WHERE tenant_id = $1 ' +
'ORDER BY embedding <=> $2::vector LIMIT 50',
[tenantId, toPgVector(vec)]
);
// 3) Rerank cross-encoder -> top-5 reais
const rerank = await cohere.rerank({
model: 'rerank-multilingual-v3.0',
query,
documents: candidates.rows.map(r => r.content),
topN: 5,
});
return rerank.results.map(r => candidates.rows[r.index]);
}O pipeline de 2 estágios (ANN recall + reranker precision) é o que separa RAG de brinquedo de RAG que responde bem. Sem reranker, você devolve documentos semanticamente próximos mas não necessariamente relevantes para a intenção.
Quando manter os vetores no banco relacional existente é a melhor escolha?
Quando migrar de pgvector para dedicado
# Regras de migração
pgvector basta se:
- < 5M vetores
- ja tem Postgres gerenciado
- filtro metadata relacional importa
- p99 < 200ms tolerado
considere Pinecone/Qdrant/Weaviate se:
- > 10M vetores
- multi-tenant com isolamento hard
- hybrid search (BM25 + dense) nativo
- p99 < 50ms obrigatorio
- replicacao geografica gerenciada
considere Milvus/Vespa se:
- > 100M vetores, self-hosted
- features avancadas (filtering DSL, analytics)
- time dedicado pra operarAnti-patterns comuns
Embeddings de modelos diferentes não são comparáveis — nunca misture OpenAI com Cohere no mesmo índice. Chunks muito grandes (> 1000 tokens) viram embedding genérico. Chunks muito pequenos (< 50 tokens) perdem contexto. Metadata filter mal indexado degrada ANN. Reranker custa dinheiro — use apenas no top-50, não em tudo.
Vector DB é infraestrutura de busca semântica. Dominar pgvector primeiro (simples, barato) e migrar para dedicado quando a dor chegar é o caminho sensato em 2026.
Perguntas frequentes
❓ Quando o Postgres com extensão de vetor basta?
❓ Qual a diferença entre os tipos de índice vetorial?
❓ Como escolher entre serviços de banco vetorial?
Fixando
O que indica que é hora de migrar para um banco vetorial dedicado?
Por que a busca aproximada é aceitável na maioria dos casos de recuperação?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…