Se você está construindo qualquer sistema de IA que precisa recuperar informações — um chatbot com conhecimento da empresa, um buscador semântico, um agente que consulta documentos — você vai ouvir sobre vector databases. E provavelmente vai se confundir na primeira vez.
Este artigo é para acabar com a confusão e dar clareza técnica sem complicar desnecessariamente.
O problema que vector databases resolvem
Bancos de dados tradicionais (PostgreSQL, MySQL, MongoDB) são ótimos para buscas exatas e estruturadas:
- “Me dê todos os pedidos com status = ‘pendente’ do cliente 1234”
- “Liste todos os funcionários do departamento = ‘vendas’”
- “Busque documentos onde título contém ‘contrato’”
Funciona porque a consulta é determinística — você sabe exatamente o que quer, e o banco sabe exatamente onde procurar.
Mas e quando a consulta é semântica?
- “Quais contratos falam sobre multa por rescisão antecipada?”
- “Encontre e-mails onde clientes reclamam de lentidão no sistema”
- “Mostre documentos similares a este relatório de vendas”
Um banco SQL não consegue responder isso. Ele não entende significado, só estrutura. Uma busca por texto completo (full-text search) ajuda, mas é limitada: só encontra documentos que contêm as palavras exatas. Se o contrato fala de “penalidade por término prematuro” em vez de “multa por rescisão antecipada”, a busca não encontra.
Vector databases resolvem isso porque armazenam dados como vetores (sequências de números que representam o significado semântico do conteúdo) e permitem buscar por similaridade semântica — encontrando os documentos mais próximos em significado à consulta, mesmo que as palavras exatas não coincidam.
Como funciona na prática (passo a passo técnico)
O processo tem duas etapas principais:
Indexação (feita uma vez, atualizada quando necessário)
-
Você tem um documento: “O contrato prevê multa de 20% do valor total em caso de rescisão antes de 12 meses.”
-
Um modelo de embedding transforma o texto em vetor: Usando modelos como
text-embedding-3-small(OpenAI),embed-multilingual-v3.0(Cohere), ounomic-embed-text(open-source), o texto vira um vetor de 384-1536 números.Exemplo simplificado (vetor real tem centenas de dimensões):
[0.23, -0.45, 0.89, 0.12, -0.67, ...] -
Esse vetor é armazenado no vector database junto com:
- O texto original
- Metadados (fonte, data, tipo de documento, cliente, etc.)
- ID único
Busca (feita em cada consulta)
-
O usuário pergunta: “Qual é a penalidade se eu cancelar antes do prazo?”
-
A pergunta também é transformada em vetor (usando o mesmo modelo de embedding)
-
O banco calcula a distância entre o vetor da pergunta e todos os vetores armazenados
-
Retorna os N documentos mais próximos (tipicamente top 3-10)
-
Esses documentos são enviados ao LLM junto com a pergunta — e o LLM gera a resposta contextualizada
Isso é o que o RAG (Retrieval-Augmented Generation) faz por baixo dos panos. O vector database é a peça que torna a busca semântica possível em escala.
Métricas de similaridade: o que está acontecendo matematicamente
A “distância” entre vetores pode ser calculada de diferentes formas. As mais comuns:
Cosine similarity (cosseno do ângulo)
Mede o ângulo entre os vetores, ignorando magnitude. Mais usada para texto — dois textos com o mesmo significado vão ter vetores com ângulo pequeno mesmo que tenham comprimentos (magnitudes) diferentes.
Valores: de -1 (completamente oposto) a +1 (idêntico).
Quando usar: praticamente sempre para busca semântica de texto.
Dot product (produto escalar)
Produto dos componentes correspondentes dos vetores. Mais rápido computacionalmente que cosine, mas sensível à magnitude dos vetores.
Quando usar: quando os vetores são normalizados (magnitude = 1), dot product é equivalente a cosine e mais rápido.
Euclidean distance (distância geométrica)
Distância em linha reta entre dois pontos no espaço vetorial.
Quando usar: menos comum para texto, mas útil para embeddings de imagens ou quando você quer que a magnitude importe.
Para a maioria dos casos empresariais com texto, cosine similarity é a escolha padrão.
Comparativo das principais opções no mercado
| Opção | Tipo | Ideal para | Prós | Contras | Custo |
|---|---|---|---|---|---|
| Pinecone | SaaS gerenciado | Produção rápida, sem gestão de infra | Setup em minutos, escalável, bom suporte | Vendor lock-in, preço sobe rápido com volume | Pago por uso ($$) |
| Weaviate | Open-source / cloud | Controle + flexibilidade | Features ricas, ativo, cloud opcional | Mais complexo de configurar | Self-hosted grátis, cloud $$ |
| Qdrant | Open-source / cloud | Performance + filtros ricos | Rápido, filtros avançados, API clara | Comunidade menor que Weaviate | Self-hosted grátis, cloud $ |
| pgvector | Extensão PostgreSQL | Quem já usa Postgres | Sem nova infra, transações ACID, familiar | Performance inferior em escala massiva | Grátis |
| Chroma | Open-source | Prototipagem e testes | Muito fácil de usar, ótimo para dev local | Não é para produção de alto volume | Grátis |
| Milvus | Open-source | Escala massiva | Performance excepcional, features completas | Complexo de operar | Self-hosted grátis |
Recomendação prática por cenário
Prototipando localmente: Chroma (extremamente fácil de usar, roda em memória ou SQLite)
Produção pequena a média (< 10M vetores):
- Se já usa PostgreSQL → pgvector (adiciona funcionalidade sem nova infra)
- Se não quer gerenciar infra → Pinecone (setup rápido, escalável)
- Se quer controle total → Qdrant self-hosted (bom custo-benefício)
Produção com requisitos avançados de filtragem: Qdrant ou Weaviate (suportam filtros complexos combinados com busca vetorial)
Escala massiva (> 100M vetores): Milvus (projetado para bilhões de vetores, mas exige expertise para operar)
Além do RAG: outros casos de uso empresariais
Vector databases não servem só para RAG. Outros usos comuns:
Busca semântica de produtos (e-commerce)
Clientes pesquisam “algo para presentear minha mãe que gosta de jardim” e o sistema retorna produtos semanticamente relevantes (sementes, ferramentas de jardinagem, livros de plantas), não só produtos com a palavra “jardim” na descrição.
Resultado: aumenta conversão ao mostrar produtos relevantes que busca por keyword perderia.
Detecção de duplicatas inteligente
Verificar se um novo documento, ticket de suporte ou feedback de cliente já existe na base, mesmo com palavras completamente diferentes.
Exemplo: detectar que estes dois tickets são duplicatas:
- “O sistema trava quando tento exportar relatório grande”
- “Excel não abre quando faço download de arquivo com muitos dados”
Resultado: reduz retrabalho ao consolidar problemas duplicados.
Recomendação de conteúdo
Recomendar artigos, produtos ou conteúdos similares ao que o usuário está consumindo, sem precisar de tags ou categorias predefinidas.
Se alguém lê um artigo sobre “automação de cobrança”, o sistema recomenda automaticamente artigos sobre “gestão de inadimplência”, “integração com ERP financeiro”, etc.
Clustering e análise de feedback
Agrupar automaticamente feedbacks de clientes, reviews de produtos ou respostas de NPS por tema, sem categorias predefinidas.
Exemplo: processar 5.000 respostas abertas de NPS e agrupar automaticamente em temas como:
- Performance lenta (327 menções)
- Interface confusa (189 menções)
- Falta de integração com sistema X (143 menções)
- Suporte demorado (98 menções)
Resultado: insights acionáveis de volume grande de texto não-estruturado.
Detecção de anomalias
Identificar documentos, transações ou comportamentos que são semanticamente diferentes do padrão normal.
Exemplo: detectar e-mails de phishing que não batem com o padrão de comunicação legítima da empresa, mesmo que não tenham palavras suspeitas conhecidas.
Armadilhas comuns (e como evitar)
Achar que vector database substitui banco relacional
Não substitui — complementa. Você ainda precisa de banco relacional para:
- Dados estruturados (usuários, pedidos, transações)
- Relacionamentos complexos (foreign keys, joins)
- Transações ACID
- Queries agregadas (SUM, COUNT, GROUP BY)
Vector database é para busca semântica. Banco relacional é para estrutura e transações. Use ambos.
Ignorar o modelo de embedding usado
A qualidade dos vetores depende do modelo usado para gerá-los. Se você mudar o modelo (ex: de text-embedding-ada-002 para text-embedding-3-small), precisa re-indexar tudo — os vetores não são compatíveis.
Planeje isso desde o início. Tenha um processo de re-indexação que pode rodar em background quando necessário.
Não otimizar o chunking
Documentos longos precisam ser divididos em fragmentos (chunks) antes de gerar embeddings. Tamanho de chunk afeta diretamente a qualidade da busca.
Chunk muito pequeno (< 200 tokens): perde contexto, resposta incompleta Chunk muito grande (> 1000 tokens): dilui relevância, retorna muita informação irrelevante junto
Tamanho ideal típico: 400-600 tokens com overlap de 50-100 tokens entre chunks consecutivos.
Não usar metadados para filtrar
Vector databases modernos permitem combinar busca semântica com filtros tradicionais. Aproveite isso.
Exemplo:
# Busca semântica pura (não otimizada)
results = db.search("contratos com cláusula de rescisão")
# Busca semântica + filtros (otimizada)
results = db.search(
query="contratos com cláusula de rescisão",
filters={
"document_type": "contrato",
"client_id": "abc_corp",
"date_range": {"gte": "2023-01-01", "lte": "2024-12-31"}
},
top_k=10
)
Filtros reduzem o espaço de busca e melhoram precisão dramaticamente.
Não atualizar o índice
Documentos removidos ou atualizados precisam ser refletidos no índice. Sem isso, o sistema responde com informações desatualizadas ou referencia documentos que não existem mais.
Solução: tenha um processo claro de sincronização entre fonte de dados (CRM, documentos, etc.) e vector database. Pode ser batch noturno, CDC (change data capture), ou webhook em tempo real.
Como escolher (decision tree)
Você já usa PostgreSQL?
├─ Sim → Comece com pgvector (sem nova infra)
│ Volume vai exceder 10M vetores?
│ ├─ Sim → Migre para Qdrant/Weaviate/Pinecone
│ └─ Não → Fique com pgvector
│
└─ Não →
Você quer gerenciar infraestrutura?
├─ Não → Use Pinecone (SaaS gerenciado)
└─ Sim →
Volume esperado?
├─ < 50M vetores → Qdrant (bom custo-benefício)
├─ 50M-500M → Weaviate ou Qdrant
└─ > 500M → Milvus (para escala massiva)
Setup básico (exemplo com pgvector)
Para quem já usa PostgreSQL, adicionar capacidade vetorial é trivial:
-- Instalar extensão
CREATE EXTENSION vector;
-- Criar tabela com coluna vetorial
CREATE TABLE documentos (
id SERIAL PRIMARY KEY,
texto TEXT,
embedding VECTOR(1536), -- dimensão do modelo usado
metadata JSONB,
created_at TIMESTAMP DEFAULT NOW()
);
-- Criar índice para busca rápida
CREATE INDEX ON documentos
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
-- Buscar documentos similares
SELECT id, texto, metadata,
1 - (embedding <=> '[0.1, 0.2, ...]') AS similarity
FROM documentos
WHERE metadata->>'tipo' = 'contrato'
ORDER BY embedding <=> '[0.1, 0.2, ...]'
LIMIT 10;
Simples. Funciona. Escalável para dezenas de milhões de vetores.
Custos esperados (referência)
Para dar ordem de magnitude:
| Cenário | Volume | Custo mensal estimado |
|---|---|---|
| Prototipagem | < 100k vetores | R$ 0 (Chroma local ou pgvector) |
| Produção pequena | 100k-1M vetores | R$ 50-200 (pgvector ou Qdrant self-hosted) |
| Produção média | 1M-10M vetores | R$ 200-800 (Qdrant/Weaviate cloud ou Pinecone starter) |
| Produção grande | 10M-100M vetores | R$ 800-3.000 (Pinecone/Weaviate/Qdrant) |
| Escala massiva | > 100M vetores | R$ 3.000-10.000+ (Milvus ou Pinecone enterprise) |
Valores variam com tráfego de queries, latência desejada e features usadas.
Se você está construindo um sistema RAG, busca semântica ou qualquer aplicação de IA que precisa consultar informações em escala, fale com a gente. Implementamos desde prototipagem até produção escalável, ajudando a escolher a arquitetura certa para o seu volume e caso de uso.