04-02-02 — Vector databases

⏱ 15 minFontes validadas em: 2026-04-29

TL;DR

Vector databases armazenam embeddings e fazem busca por similaridade em alta velocidade. Para prototipagem use Chroma (local, zero infra). Para produção no Azure, use Azure AI Search. Se precisar de solução gerenciada multi-cloud, Pinecone ou Qdrant Cloud. Para quem já usa PostgreSQL, pgvector elimina um componente extra.

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.

Como isso se conecta

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