Bancos de Dados Vetoriais e Sistemas de Busca por Embeddings
Bancos de dados vetoriais são bancos especializados otimizados para armazenar e realizar buscas por similaridade em vetores de alta dimensão. Eles são o componente fundamental de aplicações modernas de IA, especialmente sistemas RAG (Retrieval-Augmented Generation).
O que é um Banco de Dados Vetorial?
Enquanto bancos de dados tradicionais são otimizados para consultas de correspondência exata, bancos de dados vetoriais focam em buscas de Vizinhos Aproximados Mais Próximos (ANN).
Conceitos Centrais
Embedding: Uma representação vetorial numérica de dados (texto, imagem, áudio).
"Artificial intelligence" → [0.12, -0.45, 0.89, ..., 0.34] (e.g., 1536 dimensions)
Busca por Similaridade: Encontrar os vetores mais próximos de um vetor de consulta.
query_vector → Top-K most similar vectors
Métricas de Distância:
- Similaridade de Cosseno: Similaridade direcional.
- Distância Euclidiana (L2): Distância geométrica.
- Produto Escalar: Produto interno entre vetores.
Métricas de Similaridade: Análise Detalhada
Similaridade de Cosseno
cos(A, B) = (A · B) / (||A|| × ||B||)
Intervalo de Valores: [-1, 1]
- 1: Mesma direção (idênticos).
- 0: Ortogonais (não relacionados).
- -1: Direções opostas.
Caso de Uso: Similaridade textual, busca semântica.
Distância Euclidiana (L2)
d(A, B) = √(Σ(Aᵢ - Bᵢ)²)
Intervalo de Valores: [0, ∞) Caso de Uso: Similaridade de imagens, clustering.
Produto Escalar
A · B = Σ(Aᵢ × Bᵢ)
Caso de Uso: Equivalente ao cosseno para embeddings normalizados.
Algoritmos de Indexação
1. Força Bruta (Índice Plano)
Comparando a consulta contra todos os vetores no banco.
Complexidade: O(n × d)
- n: Número de vetores.
- d: Dimensão.
Vantagem: 100% de acurácia. Desvantagem: Muito lento para grandes conjuntos de dados.
2. IVF (Inverted File Index)
Reduzindo o espaço de busca ao dividir vetores em clusters.
Algoritmo:
- Criar centróides usando K-means.
- Atribuir cada vetor ao centróide mais próximo.
- Durante a busca, consultar apenas os nprobe clusters mais próximos.
1Parameters: 2- nlist: Number of clusters (typically √n) 3- nprobe: Number of clusters to search 4 5Trade-off: Higher nprobe → higher accuracy, lower speed.
3. HNSW (Hierarchical Navigable Small World)
Uma abordagem baseada em grafos e atualmente o método mais popular.
Estrutura:
1Layer 2: o-------o-------o (sparse) 2 | | | 3Layer 1: o-o-o---o-o-o---o-o-o (medium) 4 | | | | | | | | | 5Layer 0: o-o-o-o-o-o-o-o-o-o-o-o (dense)
Parâmetros:
- M: Número máximo de conexões por nó.
- ef_construction: Número de candidatos durante a construção do índice.
- ef_search: Número de candidatos durante a consulta.
Vantagens:
- Busca extremamente rápida: O(log n).
- Altas taxas de recall.
- Suporta inserção/exclusão dinâmica.
4. Product Quantization (PQ)
Reduzindo o uso de memória por meio da compressão de vetores.
Método:
- Dividir o vetor em M subvetores.
- Mapear cada subvetor para um de K centróides.
- Armazenar IDs dos centróides em vez dos componentes originais.
1Original: 1536 dim × 4 bytes = 6KB 2PQ (M=96, K=256): 96 × 1 byte = 96 bytes 3Compression: ~64x
5. Scalar Quantization (SQ)
Convertendo representações Float32 para Int8.
1Original: 1536 × 4 bytes = 6KB 2SQ8: 1536 × 1 byte = 1.5KB 3Compression: 4x 4## Comparação de Bancos de Dados Vetoriais Populares 5 6### Pinecone 7 8**Recursos:** 9- Serviço de cloud totalmente gerenciado. 10- Escalonamento automático. 11- Filtragem por metadados. 12- Isolamento por namespace. 13 14**Uso:** 15```python 16import pinecone 17 18pinecone.init(api_key="xxx", environment="us-west1-gcp") 19index = pinecone.Index("my-index") 20 21# Upsert 22index.upsert(vectors=[ 23 {"id": "vec1", "values": [0.1, 0.2, ...], "metadata": {"category": "tech"}} 24]) 25 26# Query 27results = index.query(vector=[0.1, 0.2, ...], top_k=10, filter={"category": "tech"})
Weaviate
Recursos:
- Open source.
- Vetorização integrada.
- Suporte a GraphQL API.
- Capacidade de busca híbrida (vetor + palavra-chave).
Qdrant
Recursos:
- Escrito em Rust para alta performance.
- Opções avançadas de filtragem.
- Indexação de payload.
- Suporte a implantação distribuída.
Milvus
Recursos:
- Aceleração por GPU.
- Busca multi-vetor.
- Time travel (versionamento).
- Arquitetura nativa em Kubernetes.
ChromaDB
Recursos:
- Fácil para desenvolvedores e simples de configurar.
- Modos in-memory + persistente.
- Abordagem Python-first.
- Ideal para prototipagem.
Tabela de Comparação
| Recurso | Pinecone | Weaviate | Qdrant | Milvus |
|---|---|---|---|---|
| Hosting | Cloud | Ambos | Ambos | Ambos |
| Escalabilidade | Auto | Manual | Manual | Auto |
| Busca Híbrida | ✓ | ✓ | ✓ | ✓ |
| Suporte a GPU | - | - | ✓ | ✓ |
| Preço | Por vetor | Gratuito/Pago | Gratuito/Pago | Gratuito/Pago |
Filtragem e Metadados
Pré-filtragem vs Pós-filtragem
Pré-filtragem:
- Aplicar filtro de metadados primeiro.
- Executar a busca vetorial dentro do conjunto filtrado.
- Vantagem: Mais rápido.
- Desvantagem: Possível perda de recall.
Pós-filtragem:
- Encontrar resultados Top-K × multiplicador via busca vetorial.
- Aplicar o filtro de metadados nesses resultados.
- Retornar os top K finais.
- Vantagem: Melhor recall.
- Desvantagem: Performance mais lenta.
Busca Híbrida
Combinando busca por palavra-chave (BM25) + busca vetorial:
final_score = α × vector_score + (1-α) × keyword_score
Otimização de Performance
Parâmetros de Indexação
Configurações HNSW Ideais:
1High Recall: M=32, ef=200 2High Speed: M=16, ef=50 3Balanced: M=24, ef=100
Processamento em Lotes
1# Ruim: Inserção individual 2for vec in vectors: 3 index.upsert([vec]) 4 5# Bom: Inserção em lote 6index.upsert(vectors, batch_size=100)
Pooling de Conexões
1from pinecone import Pinecone 2 3pc = Pinecone( 4 api_key="xxx", 5 pool_threads=30 # Conexões paralelas 6)
Exemplo de Arquitetura Enterprise
1┌─────────────────────────────────────────────────────┐ 2│ Application │ 3└──────────────────────┬──────────────────────────────┘ 4 │ 5┌──────────────────────▼──────────────────────────────┐ 6│ Vector Search Service │ 7│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 8│ │ Query │ │ Reranker │ │ Cache │ │ 9│ │ Engine │ │ Service │ │ (Redis) │ │ 10│ └─────────────┘ └─────────────┘ └─────────────┘ │ 11└──────────────────────┬──────────────────────────────┘ 12 │ 13┌──────────────────────▼──────────────────────────────┐ 14│ Vector Database Cluster │ 15│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ 16│ │ Shard 1 │ │ Shard 2 │ │ Shard 3 │ │ 17│ └─────────┘ └─────────┘ └─────────┘ │ 18└─────────────────────────────────────────────────────┘
Monitoramento e Observabilidade
Métricas-Chave
- Latência de Query (p50, p95, p99)
- Taxa de Recall
- QPS (Queries Per Second)
- Tamanho do Índice
- Uso de Memória
Limites de Alertas
1alerts: 2 - name: high_latency 3 condition: p99_latency > 200ms 4 severity: warning 5 6 - name: low_recall 7 condition: recall < 0.9 8 severity: critical 9## Conclusão 10 11Os bancos de dados vetoriais são componentes indispensáveis das aplicações modernas de IA. Com a escolha correta do banco de dados, da estratégia de indexação e das otimizações, você pode construir sistemas de busca semântica de alto desempenho. 12 13Na Veni AI, oferecemos soluções empresariais de busca vetorial. Entre em contato conosco para suas necessidades.
