Embeddings e Busca Vetorial: Um Roteiro para Iniciantes
Você quer adicionar busca semântica ao seu aplicativo—os usuários digitam uma consulta e obtêm resultados com base no significado, não em palavras-chave exatas. Mas você não tem certeza de onde começar: o que são embeddings? Você precisa de um banco de dados vetorial? Como medir a similaridade? Este roteiro responde a essas perguntas com passos práticos e código que você pode executar hoje.
O que são Embeddings?
Um embedding é um vetor denso de números de ponto flutuante que representa o significado de uma entrada—texto, imagem, áudio, etc. Para texto, um modelo como text-embedding-3-small ou uma alternativa de código aberto (por exemplo, all-MiniLM-L6-v2) converte uma frase em, digamos, um vetor de 384 dimensões. Palavras ou frases com significados semelhantes acabam próximas nesse espaço vetorial.
Exemplo: "gato" e "gatinho" terão vetores mais próximos do que "gato" e "avião". Essa propriedade possibilita a busca semântica: você gera embeddings dos seus documentos e da consulta, depois encontra os vetores de documentos mais próximos.
Como Funciona a Busca Vetorial
A busca vetorial (também chamada de busca por similaridade) encontra os vetores no seu conjunto de dados que são mais semelhantes a um vetor de consulta. A similaridade é tipicamente medida com similaridade de cosseno ou produto escalar. Para vetores normalizados, a similaridade de cosseno e o produto escalar são equivalentes.
A busca por força bruta compara a consulta com todos os vetores—adequada para milhares de vetores, muito lenta para milhões. É aí que entram os algoritmos de Vizinho Mais Próximo Aproximado (ANN), como HNSW (Hierarchical Navigable Small World) ou IVF (Inverted File Index). Eles trocam um pouco de precisão por enormes ganhos de velocidade.
Passo a Passo: Construa um Protótipo de Busca Semântica
- Escolha um modelo de embedding. Para texto em inglês, comece com um modelo pequeno e rápido como
all-MiniLM-L6-v2(384 dims) do Sentence Transformers. Para produção, considere otext-embedding-3-small(1536 dims) outext-embedding-3-large(3072 dims) da OpenAI. - Gere embeddings dos seus documentos. Divida textos longos em pedaços (por exemplo, 200–500 palavras) para que cada pedaço capture uma ideia coerente. Armazene o texto original junto com o vetor.
- Escolha um armazenamento vetorial. Para começar rapidamente, use uma biblioteca em memória como FAISS ou um simples array NumPy. Para produção, escolha um banco de dados vetorial dedicado (veja a tabela abaixo).
- Gere o embedding da consulta. Use o mesmo modelo para gerar o embedding da consulta de busca do usuário.
- Busque. Calcule a similaridade entre o vetor da consulta e todos os vetores de documentos (ou use um índice ANN) e retorne os top-k resultados.
- Itere. Avalie os resultados, ajuste o tamanho do chunk, o modelo ou a métrica de similaridade.
Exemplo Mínimo em Python com Sentence Transformers e FAISS
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# 1. Carregar modelo
model = SentenceTransformer('all-MiniLM-L6-v2')
# 2. Documentos de exemplo
docs = [
"The cat sat on the mat.",
"A kitten is playing with yarn.",
"The stock market crashed today.",
"Investors are worried about inflation."
]
# 3. Criar embeddings
embeddings = model.encode(docs, convert_to_numpy=True)
# 4. Construir índice FAISS
dim = embeddings.shape[1]
index = faiss.IndexFlatL2(dim) # Distância L2; para cosseno, normalize primeiro
index.add(embeddings)
# 5. Buscar
query = "feline resting"
query_vec = model.encode([query], convert_to_numpy=True)
D, I = index.search(query_vec, k=2)
print([docs[i] for i in I[0]])
# Saída provável: ['The cat sat on the mat.', 'A kitten is playing with yarn.']
Escolhendo um Banco de Dados Vetorial
Para projetos pequenos, você pode armazenar vetores em um arquivo simples ou em um índice em memória. À medida que você escala, um banco de dados vetorial dedicado oferece persistência, filtragem e índices ANN. Aqui está uma comparação rápida:
| Banco de Dados | Tipo | Melhor Para |
|---|---|---|
| FAISS | Biblioteca | Prototipagem, experimentos locais |
| Chroma | Embutido / Cliente-Servidor | Aplicativos pequenos a médios, configuração fácil |
| Pinecone | Nuvem Gerenciada | Produção, escalabilidade serverless |
| Weaviate | Código Aberto / Nuvem | Busca híbrida, API GraphQL |
| Qdrant | Código Aberto / Nuvem | Alto desempenho, filtragem |
| pgvector | Extensão PostgreSQL | Stack Postgres existente |
Melhores Práticas e Armadilhas Comuns
- Normalize os vetores se usar similaridade de cosseno—muitas bibliotecas assumem vetores unitários para produto escalar.
- Divida com sabedoria: muito grande e você perde especificidade; muito pequeno e você perde contexto. Experimente com sobreposição.
- Use o mesmo modelo para documentos e consultas. Misturar modelos quebra a similaridade.
- Considere redução de dimensionalidade (por exemplo, PCA) apenas se armazenamento ou velocidade forem críticos; pode prejudicar a precisão.
- Busca híbrida (combinando palavras-chave e vetores) geralmente melhora os resultados para correspondências exatas.
Perguntas Frequentes
Preciso de um banco de dados vetorial para um projeto pequeno?
Não. Para até alguns milhares de vetores, você pode usar uma biblioteca em memória como FAISS ou até um array NumPy. Um banco de dados vetorial se torna útil quando você precisa de persistência, filtragem ou escala além da memória.
Como escolho um modelo de embedding?
Comece com um modelo pequeno e rápido como all-MiniLM-L6-v2 para prototipagem. Se precisar de maior precisão e puder arcar com custos de API, experimente o text-embedding-3-small ou text-embedding-3-large da OpenAI. Sempre avalie com seus próprios dados.
Qual é a diferença entre similaridade de cosseno e distância euclidiana?
A similaridade de cosseno mede o ângulo entre vetores, ignorando a magnitude. A distância euclidiana mede a distância em linha reta. Para vetores normalizados, elas fornecem a mesma classificação. Cosseno é comum para embeddings de texto porque foca na direção (significado) em vez do comprimento.
Próximos Passos
Agora que você entende o básico, tente construir uma pequena busca semântica sobre suas próprias anotações ou documentação. Experimente tamanhos de chunk e modelos. À medida que crescer, migre para um banco de dados vetorial gerenciado e adicione busca híbrida. A área evolui rápido, mas esses fundamentos permanecerão relevantes.
Quando precisar formatar respostas de API ou depurar payloads JSON de serviços de embedding, o JSON Formatter pode ajudar você a inspecionar e validar os dados rapidamente.