04-02-02 — Vector databases
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)
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ção | Setup | Escala | Custo | Hybrid search | Melhor para |
|---|---|---|---|---|---|
| Chroma | ⭐⭐⭐⭐⭐ | ⭐⭐ | Grátis | Não | Prototipagem, testes |
| pgvector | ⭐⭐⭐⭐ | ⭐⭐⭐ | Infra própria | Com FTS | Quem já usa PostgreSQL |
| Qdrant | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Cloud free tier | Sim | Self-hosted alta performance |
| Weaviate | ⭐⭐⭐ | ⭐⭐⭐⭐ | Cloud free tier | Sim | Casos complexos, multi-vector |
| Pinecone | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | $$$ | Sim | SaaS sem ops, escala rápida |
| Azure AI Search | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Azure pricing | Nativo | Stack Azure, compliance, enterprise |
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.
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
- 04-02-03 — Azure AI Search — detalhes do vector store recomendado para Azure
- 04-03-02 — Similaridade — como a busca dentro do vector store funciona matematicamente
- 04-03-03 — Hybrid search — combinar busca vetorial com BM25 no mesmo índice
Fontes
- Pinecone. Pinecone Documentation. docs.pinecone.io
- Qdrant. Qdrant Documentation. qdrant.tech/documentation
- pgvector. Open-source vector similarity search for Postgres. github.com/pgvector/pgvector
- Chroma. The AI-native open-source embedding database. docs.trychroma.com
- ANN Benchmarks. Benchmark results for approximate nearest neighbor algorithms. ann-benchmarks.com