Vector Databases: Pinecone vs Weaviate vs Chroma
Qual banco vetorial escolher para seu projeto de IA
•15 min de leitura
Vector databases são essenciais para RAG. Eles armazenam embeddings e permitem busca por similaridade semântica. Mas qual escolher?
TL;DR: Resumo Rápido
| Database | Melhor para | Preço |
|---|---|---|
| Chroma | Prototipação, projetos pequenos | Grátis |
| Pinecone | Produção, managed, escala | $$ |
| Weaviate | Features avançadas, hybrid search | $ - $$ |
| Qdrant | Performance, filtering avançado | $ - $$ |
| pgvector | Já usa PostgreSQL | $ |
O que é um Vector Database?
Banco de dados tradicional:
- Busca por valor exato: WHERE name = 'João'
- Busca por range: WHERE age > 18
Vector database:
- Busca por similaridade semântica
- "Encontre documentos parecidos com esta query"
Como funciona:
1. Texto → Embedding (vetor de números)
2. Armazena vetores no banco
3. Query → Embedding → Busca vetores similares
4. Retorna top K mais similaresComparativo Detalhado
🔷 Chroma
Chroma - Simples e Local
✅ Prós:
- Totalmente open source
- Roda localmente (embedded)
- Setup em 2 minutos
- Ótimo para prototipação
- Integração nativa com LangChain
❌ Contras:
- Não escala bem para milhões de vetores
- Sem managed service oficial
- Features mais limitadas
📊 Specs:
- Tipo: Embedded / Self-hosted
- Algoritmo: HNSW
- Preço: Grátis
Melhor para: Desenvolvimento, MVPs, projetos pequenos
# Exemplo
import chromadb
client = chromadb.Client()
collection = client.create_collection("docs")
collection.add(
documents=["texto 1", "texto 2"],
ids=["id1", "id2"]
)
results = collection.query(query_texts=["busca"], n_results=5)🌲 Pinecone
Pinecone - Managed e Escalável
✅ Prós:
- Fully managed (sem infra para gerenciar)
- Escala para bilhões de vetores
- Alta disponibilidade
- Excelente performance
- Namespaces para multi-tenancy
❌ Contras:
- Mais caro
- Vendor lock-in
- Não é open source
📊 Specs:
- Tipo: Cloud managed
- Algoritmo: Proprietário (otimizado)
- Preço: $70+/mês (produção)
Melhor para: Produção, startups com funding, enterprise
# Exemplo
from pinecone import Pinecone
pc = Pinecone(api_key="...")
index = pc.Index("my-index")
index.upsert(vectors=[
{"id": "id1", "values": [0.1, 0.2, ...], "metadata": {"text": "..."}}
])
results = index.query(vector=[0.1, 0.2, ...], top_k=5)🔮 Weaviate
Weaviate - Features Avançadas
✅ Prós:
- Hybrid search (vector + keyword)
- GraphQL API
- Módulos de ML integrados
- Self-hosted ou cloud
- Open source
❌ Contras:
- Mais complexo de configurar
- Curva de aprendizado maior
📊 Specs:
- Tipo: Self-hosted / Cloud
- Algoritmo: HNSW
- Preço: Grátis (self) / $25+/mês (cloud)
Melhor para: Projetos que precisam de hybrid search, GraphQL
# Exemplo
import weaviate
client = weaviate.Client("http://localhost:8080")
client.data_object.create(
{"text": "conteúdo do documento"},
class_name="Document"
)
results = client.query.get("Document", ["text"]).with_near_text(
{"concepts": ["busca"]}
).with_limit(5).do()⚡ Qdrant
Qdrant - Performance e Filtering
✅ Prós:
- Muito rápido
- Filtering avançado eficiente
- Rust (performance)
- Self-hosted ou cloud
- Open source
❌ Contras:
- Comunidade menor que Pinecone
- Menos integrações prontas
📊 Specs:
- Tipo: Self-hosted / Cloud
- Algoritmo: HNSW
- Preço: Grátis (self) / $25+/mês (cloud)
Melhor para: Alta performance, filtering complexo
# Exemplo
from qdrant_client import QdrantClient
client = QdrantClient("localhost", port=6333)
client.upsert(
collection_name="docs",
points=[
{"id": 1, "vector": [0.1, 0.2, ...], "payload": {"text": "..."}}
]
)
results = client.search(
collection_name="docs",
query_vector=[0.1, 0.2, ...],
limit=5
)🐘 pgvector
pgvector - PostgreSQL Extension
✅ Prós:
- Usa Postgres existente
- SQL familiar
- Transações ACID
- Sem novo serviço para gerenciar
❌ Contras:
- Não escala tão bem quanto especializados
- Performance inferior em scale
📊 Specs:
- Tipo: PostgreSQL extension
- Algoritmo: IVFFlat / HNSW
- Preço: Custo do Postgres
Melhor para: Já usa Postgres, quer simplicidade
# Exemplo
-- Criar extensão
CREATE EXTENSION vector;
-- Criar tabela
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding VECTOR(1536)
);
-- Buscar similares
SELECT * FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'
LIMIT 5;Comparativo de Performance
Benchmark com 1 milhão de vetores (1536 dims):
Query Latency (p99):
- Pinecone: ~20ms
- Qdrant: ~25ms
- Weaviate: ~30ms
- Chroma: ~50ms
- pgvector: ~100ms
Nota: Valores aproximados, variam com config.
Throughput (queries/segundo):
- Pinecone: ~1000 qps
- Qdrant: ~800 qps
- Weaviate: ~500 qps
- Chroma: ~200 qps
- pgvector: ~100 qpsComparativo de Preços
| Database | 1M vetores | 10M vetores |
|---|---|---|
| Chroma (self) | ~$20 (server) | ~$100 (server) |
| Pinecone | ~$70/mês | ~$200/mês |
| Weaviate Cloud | ~$25/mês | ~$100/mês |
| Qdrant Cloud | ~$25/mês | ~$100/mês |
| pgvector | Custo do PG | Custo do PG |
Qual Escolher?
FLOWCHART DE DECISÃO:
Está prototipando?
├── Sim → Chroma
└── Não → Continue...
Já usa PostgreSQL e quer simplicidade?
├── Sim → pgvector
└── Não → Continue...
Precisa de managed service?
├── Sim → Pinecone ou Weaviate Cloud
└── Não → Continue...
Precisa de hybrid search?
├── Sim → Weaviate
└── Não → Continue...
Precisa de máxima performance?
├── Sim → Qdrant
└── Não → Pinecone (mais fácil)
RESUMO:
- Começando: Chroma
- Produção simples: Pinecone
- Produção avançada: Weaviate ou Qdrant
- Já usa Postgres: pgvectorMigração entre Databases
# Todos usam conceitos similares, migração é relativamente fácil
# Padrão comum:
1. Gerar embeddings com mesmo modelo
2. Extrair vetores do banco atual
3. Inserir no novo banco
# Dica: Use abstração do LangChain
from langchain.vectorstores import Chroma, Pinecone, Weaviate
# Trocar é só mudar a classe:
# vectorstore = Chroma.from_documents(...)
vectorstore = Pinecone.from_documents(...)