04-02-02 — Vector databases

⏱ 15 minFontes validadas em: 2026-04-29

Por que um banco especializado?

Bancos relacionais tradicionais não são feitos para busca por similaridade em vetores de alta dimensão. Uma query "encontre os 10 vetores mais próximos de X num espaço de 1536 dimensões" seria absurdamente lenta num SQL Server ou PostgreSQL sem extensão.

Vector databases usam algoritmos de Approximate Nearest Neighbor (ANN) — especialmente HNSW (Hierarchical Navigable Small World) e IVF (Inverted File Index) — que permitem busca em milissegundos mesmo com milhões de vetores.

Os principais players

Pinecone — gerenciado, foco em simplicidade

SaaS puro. Sem infra para gerenciar. API simples. Suporta namespaces para multi-tenant, filtros por metadados e hybrid search (sparse+dense). Bom para times que querem ir rápido sem operações.

from pinecone import Pinecone

pc = Pinecone(api_key="SUA_KEY")
index = pc.Index("meu-rag-index")

# Upsert vetores
index.upsert(vectors=[
    {"id": "doc-001-chunk-1", "values": embedding, "metadata": {"source": "contrato.pdf", "page": 1}}
])

# Query
results = index.query(vector=query_embedding, top_k=5, include_metadata=True)
⚠️ Custo Pinecone

Pinecone cobra por pod/unidade de índice. Com 1M vetores de 1536 dims, espere ~$70-100/mês no plano Standard. Não tem tier gratuito com boa performance para produção. Avalie se faz sentido vs Azure AI Search se você já paga Azure.

Qdrant — open-source, self-hosted ou cloud

Escrito em Rust, extremamente performático. Suporta filtros complexos no momento da busca (payload filtering), quantização de vetores (reduz memória 4-8x), named vectors (múltiplos vetores por documento). Qdrant Cloud tem tier gratuito generoso.

from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct

client = QdrantClient(url="http://localhost:6333")  # ou Qdrant Cloud URL

# Criar coleção
client.create_collection(
    collection_name="docs",
    vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
)

# Inserir
client.upsert(
    collection_name="docs",
    points=[PointStruct(id=1, vector=embedding, payload={"source": "manual.pdf"})]
)

# Buscar
hits = client.search(collection_name="docs", query_vector=query_embedding, limit=5)

Weaviate — rich features, GraphQL

Destaque: módulos nativos que integram diretamente com APIs de embedding e LLM (sem você escrever código de embedding). Suporta hybrid search nativo, multi-vector, cross-references entre objetos. API GraphQL e REST. Mais complexo de configurar, mais poderoso.

Chroma — local first, ideal para dev

Zero configuração. Roda em processo Python ou como servidor local. Persistência em SQLite. Não escala para produção, mas é o melhor para prototipagem rápida e CI/CD de testes.

import chromadb

client = chromadb.PersistentClient(path="./chroma_db")
collection = client.get_or_create_collection("docs")

collection.add(
    documents=["texto do chunk 1", "texto do chunk 2"],
    embeddings=[embedding1, embedding2],
    ids=["id1", "id2"],
    metadatas=[{"source": "doc.pdf"}, {"source": "doc.pdf"}]
)

results = collection.query(query_embeddings=[query_embedding], n_results=5)

pgvector — PostgreSQL com superpoderes

Extensão open-source para PostgreSQL que adiciona tipo vector e operadores de similaridade. Ideal se você já tem infra PostgreSQL e quer minimizar componentes. Suporta HNSW e IVF. Azure Database for PostgreSQL tem suporte nativo.

import psycopg2

conn = psycopg2.connect("postgresql://user:pass@host/db")
cur = conn.cursor()

# Criar tabela com coluna vetorial
cur.execute("""
    CREATE TABLE chunks (
        id SERIAL PRIMARY KEY,
        content TEXT,
        embedding vector(1536),
        metadata JSONB
    );
    CREATE INDEX ON chunks USING hnsw (embedding vector_cosine_ops);
""")

# Inserir
cur.execute(
    "INSERT INTO chunks (content, embedding, metadata) VALUES (%s, %s, %s)",
    (chunk_text, embedding, json.dumps({"source": "doc.pdf"}))
)

# Buscar top-5 similares
cur.execute("""
    SELECT content, 1 - (embedding <=> %s::vector) AS similarity
    FROM chunks ORDER BY embedding <=> %s::vector LIMIT 5
""", (query_embedding, query_embedding))

Decision matrix

OpçãoSetupEscalaCustoHybrid searchMelhor para
Chroma⭐⭐⭐⭐⭐⭐⭐GrátisNãoPrototipagem, testes
pgvector⭐⭐⭐⭐⭐⭐⭐Infra própriaCom FTSQuem já usa PostgreSQL
Qdrant⭐⭐⭐⭐⭐⭐⭐⭐⭐Cloud free tierSimSelf-hosted alta performance
Weaviate⭐⭐⭐⭐⭐⭐⭐Cloud free tierSimCasos complexos, multi-vector
Pinecone⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐$$$SimSaaS sem ops, escala rápida
Azure AI Search⭐⭐⭐⭐⭐⭐⭐⭐⭐Azure pricingNativoStack Azure, compliance, enterprise
🏢 Microsoft

Para projetos no ecossistema Azure, Azure AI Search é a escolha natural — integra com Azure OpenAI, tem semantic ranker, RBAC nativo, e compliance (SOC2, ISO27001, LGPD-ready). Veremos em detalhes no próximo tópico.

💡 Insight

A escolha do vector store raramente é o fator limitante de qualidade do RAG. Chunking ruim e embedding model inadequado causam muito mais problema do que a diferença entre Qdrant e Pinecone. Comece simples, migre depois se precisar.

Fontes

  1. Pinecone. Pinecone Documentation. docs.pinecone.io
  2. Qdrant. Qdrant Documentation. qdrant.tech/documentation
  3. pgvector. Open-source vector similarity search for Postgres. github.com/pgvector/pgvector
  4. Chroma. The AI-native open-source embedding database. docs.trychroma.com
  5. ANN Benchmarks. Benchmark results for approximate nearest neighbor algorithms. ann-benchmarks.com