Busca semântica
O que é Busca Semântica (Semantic Search)?
Busca semântica é uma família de técnicas de recuperação de informação que visam encontrar resultados com base no significado em vez de sobreposição exata de palavras-chave. Em vez de apenas corresponder as palavras literais de uma consulta às palavras em documentos, a busca semântica tenta recuperar conteúdo que seja conceitualmente relacionado — mesmo que use vocabulário diferente.
Exemplo:
- Consulta: “Como eu conserto um pneu furado?”
- Documento relevante pode dizer: “Remende uma câmara de bicicleta perfurada” (poucas palavras-chave em comum, mas a mesma intenção)
A busca semântica é amplamente usada em:
- Busca em suporte ao cliente e centrais de ajuda
- Busca de produtos em e-commerce (“tênis de corrida para trilhas de inverno”)
- Recuperação de documentos corporativos (políticas, wikis, PDFs)
- Sistemas de Geração Aumentada por Recuperação (Retrieval-Augmented Generation, RAG) que fundamentam saídas de modelos de linguagem de grande porte (Large Language Models, LLMs) em documentos
A busca semântica fica na interseção da Recuperação de Informação (Information Retrieval) clássica e do Processamento de Linguagem Natural (Natural Language Processing, NLP) moderno baseado em incorporações (embeddings), apoiando-se em Representação de Texto (Text Representation) e Modelos de Incorporação (Embedding Models).
Fundamentos de recuperação: do ranqueamento a “recuperar e depois reordenar”
A maioria dos sistemas de busca pode ser descrita como:
- Indexar um corpus (documentos, passagens, descrições de produto etc.)
- Recuperar um conjunto candidato de resultados para uma consulta (rápido)
- Ranquear / reordenar candidatos usando um modelo de pontuação mais caro (mais preciso)
A busca semântica altera principalmente a etapa 2 (recuperação) ao usar representações sensíveis ao significado e, muitas vezes, melhora a etapa 3 usando reordenadores neurais (neural re-rankers).
Dois grandes paradigmas de recuperação dominam a busca semântica:
- Recuperação esparsa (sparse retrieval) (baseada em palavras-chave, vetores esparsos)
- Recuperação densa (dense retrieval) (baseada em incorporação, vetores densos)
Muitos sistemas em produção usam um híbrido de ambos.
Recuperação esparsa (baseada em palavras-chave): correspondência lexical forte
O que “esparso” significa
Na recuperação esparsa, documentos e consultas são representados como vetores sobre um vocabulário enorme (frequentemente milhões de termos). A maioria das entradas é zero, então os vetores são esparsos. A abordagem clássica é a frequência do termo–frequência inversa de documentos (term frequency–inverse document frequency, TF-IDF) e sua variante padrão moderna BM25.
- Vetor de consulta: pesos para termos na consulta
- Vetor de documento: pesos para termos no documento
- Pontuação: alguma função de sobreposição de termos e importância dos termos
BM25 em um parágrafo
BM25 atribui uma pontuação maior a um documento quando:
- Ele contém termos da consulta (correspondência lexical)
- Esses termos são “raros” no corpus (alta IDF (Inverse Document Frequency, IDF))
- O documento não é excessivamente longo (normalização por comprimento (length normalization))
BM25 continua sendo uma linha de base forte porque é:
- Rápido e escalável
- Robusto e previsível
- Excelente quando termos exatos importam (IDs, códigos de erro, frases jurídicas, nomes)
Quando a recuperação esparsa se destaca
A recuperação esparsa geralmente é melhor quando:
- Correspondência exata é necessária: “error 0x80070005”, “Section 3.2.1”
- A consulta é longa e detalhada (muitos termos)
- O domínio usa terminologia precisa que os usuários também digitam
- Você precisa de transparência: quais termos corresponderam?
Fraquezas da recuperação esparsa
Métodos esparsos têm dificuldade com:
- Sinônimos (synonyms): “car” vs “automobile”
- Paráfrases (paraphrases): “how to renew passport” vs “passport extension procedure”
- Correspondência conceitual (concept matching): “treatment for hypertension” vs “blood pressure medication”
- Recuperação multilíngue (multilingual retrieval) sem tradução explícita
Recuperação densa (baseada em incorporação): significado via similaridade vetorial
O que “denso” significa
A recuperação densa representa texto como um vetor de tamanho fixo de números de ponto flutuante (por exemplo, 384 ou 768 dimensões). A maioria das entradas é diferente de zero — daí denso.
A ideia central:
- Usar um modelo de incorporação para mapear consultas e documentos no mesmo espaço vetorial
- Recuperar documentos cujas incorporações são as mais próximas da incorporação da consulta
Isto é o que normalmente se entende por “busca semântica” hoje.
Incorporações densas são produzidas por redes neurais (neural networks), frequentemente baseadas na Arquitetura Transformer (Transformer Architecture). Diferentemente de modelos de linguagem clássicos treinados para predição do próximo token (Modelagem de Linguagem (Language Modeling)), incorporações para recuperação normalmente são treinadas com objetivos contrastivos (contrastive) ou objetivos de ranqueamento (ranking objectives), de modo que pares relevantes fiquem próximos e pares irrelevantes fiquem distantes.
Funções de similaridade
Medidas comuns de similaridade:
- Similaridade cosseno (cosine similarity)
[ \cos(q, d) = \frac{q \cdot d}{|q||d|} ] - Produto escalar (dot product) (frequentemente com vetores normalizados, efetivamente cosseno)
- Distância euclidiana (Euclidean distance) (menos comum para incorporações modernas de recuperação)
Na prática, muitos sistemas normalizam vetores em L2 (L2-normalize) e usam produto escalar por velocidade.
Fluxo de trabalho de recuperação densa
- Fragmentar documentos em passagens (por exemplo, 200–500 tokens) para melhorar a revocação
- Gerar incorporações de cada fragmento e armazenar vetores em um índice vetorial
- Gerar a incorporação da consulta em tempo de execução
- Executar busca por Vizinhos Mais Próximos Aproximados (Approximate Nearest Neighbor, ANN) para obter os top-k vetores mais próximos
- Opcionalmente reordenar usando um codificador cruzado (cross-encoder) ou um ranqueador baseado em modelos de linguagem de grande porte
Quando a recuperação densa se destaca
A recuperação densa é forte quando:
- As consultas são curtas, vagas ou conversacionais
- Usuários usam sinônimos ou linguagem não técnica
- Você precisa de correspondência semântica apesar de diferenças de formulação
- Você está construindo sistemas de Geração Aumentada por Recuperação (RAG), nos quais a revocação de passagens conceitualmente relevantes importa
Fraquezas da recuperação densa
Métodos densos podem falhar quando:
- Strings exatas importam (números de peça, citações, códigos)
- Você precisa de alta precisão para consultas curtas com intenção ambígua
- Mudanças de domínio (jargão jurídico/médico/engenharia) não estão representadas nos dados de treino
- Documentos longos excedem limites do modelo, exigindo fragmentação (o que introduz seus próprios trade-offs)
- Você precisa de interpretabilidade (similaridade densa é menos transparente do que sobreposição de termos)
Recuperação esparsa aprendida (learned sparse retrieval): “semântica”, mas ainda esparsa
Entre BM25 clássico e incorporações densas existe uma categoria moderna: recuperação esparsa aprendida.
Modelos como SPLADE produzem vetores esparsos, mas os pesos são aprendidos por redes neurais. Isso pode oferecer:
- Alguma expansão de sinônimos/semântica (associações de termos aprendidas)
- Compatibilidade com infraestrutura de índice invertido (inverted-index)
- Melhor interpretabilidade do que vetores densos (ainda com dimensões “parecidas com termos”)
É uma opção útil quando você quer melhorias semânticas mantendo os benefícios da indexação esparsa.
Codificadores duplos vs codificadores cruzados (e por que isso importa)
A busca semântica frequentemente combina dois tipos de modelo:
Codificador duplo (bi-encoder) (codificador dual (dual encoder)) para recuperação
Um codificador duplo codifica consulta e documento de forma independente:
- ( q = f(\text{query}) )
- ( d = g(\text{document}) )
- pontuação = similaridade((q, d))
Isso permite pré-computar incorporações de documentos e fazer recuperação ANN rápida.
Exemplos: recuperadores no estilo DPR, modelos de incorporação no estilo Sentence-BERT.
Codificador cruzado (cross-encoder) para reordenamento
Um codificador cruzado recebe consulta e documento juntos:
- pontuação = ( h(\text{[query; document]}) )
Isso permite interação profunda em nível de token e geralmente produz melhor ranqueamento — mas é lento demais para executar sobre todo o corpus. Em vez disso, você reordena os 50–500 principais candidatos de um recuperador rápido.
Esse padrão “recuperar e depois reordenar” é um ponto ótimo prático para qualidade.
Recuperação densa vs esparsa: comparação prática
Intuição com um exemplo
Corpus:
- “How to reset your Apple ID password”
- “Troubleshooting login issues for iCloud”
- “Change your account credentials”
Consulta: “I forgot my iCloud password”
- BM25 provavelmente recupera (2) porque “iCloud” corresponde e talvez (1) se “password” corresponder.
- Recuperação densa pode recuperar (1) e (3) mesmo que a redação seja diferente, porque “forgot password” e “reset credentials” são semanticamente próximas.
Mas para a consulta: “error code 0x80070005”
- BM25 será excelente (correspondência exata).
- Recuperação densa pode ou não recuperar corretamente a menos que o código apareça em contextos semelhantes aos de treinamento; ela também pode retornar falsos positivos com discussões de erro “similares”.
Diferenças operacionais
- Tamanho do índice
- Esparso: índice invertido; escala bem; depende de tokens
- Denso: armazenamento de vetores (frequentemente float16/float32), além de estruturas ANN
- Latência
- Esparso: extremamente rápido em CPUs
- Denso: busca ANN é rápida, mas frequentemente se beneficia de bibliotecas e hardware otimizados
- Atualizações
- Esparso: atualizações incrementais fáceis
- Denso: computação de incorporações é necessária; manutenção do índice depende do banco de dados vetorial/biblioteca ANN
- Explicabilidade
- Esparso: termos correspondidos e pesos
- Denso: mais difícil de explicar além de raciocínio de vizinho mais próximo
Busca híbrida: o melhor dos dois mundos
Como métodos esparsos e densos têm forças complementares, muitos sistemas em produção usam recuperação híbrida (hybrid retrieval):
- Recuperar candidatos com BM25 (lexical)
- Recuperar candidatos com vetores densos (semântico)
- Mesclar conjuntos de candidatos (união) e reordenar
Abordagens híbridas melhoram a robustez:
- BM25 garante revocação de correspondência exata (códigos, nomes)
- Recuperação densa adiciona revocação semântica (paráfrases, sinônimos)
Alguns sistemas combinam pontuações:
[ \text{score} = \alpha \cdot \text{BM25} + (1-\alpha)\cdot \text{DenseSim} ]
Na prática, calibrar pontuações não é trivial porque BM25 e similaridade cosseno estão em escalas diferentes; muitos sistemas preferem mesclagem de candidatos + reordenamento aprendido (learned re-ranking).
Construindo um sistema de busca semântica (ponta a ponta)
Etapa 1: Pré-processamento de documentos e fragmentação
A recuperação densa geralmente funciona melhor sobre passagens (passages) em vez de documentos inteiros:
- Fragmentar por títulos/parágrafos quando possível (preserve a coerência)
- Usar janelas com sobreposição (por exemplo, 20–50 tokens de sobreposição) para evitar problemas de fronteira
- Armazenar metadados: ID do documento, título da seção, URL, permissões
A fragmentação deve respeitar o comportamento de tokenização (tokenization); detalhes importam especialmente para texto multilíngue e pontuação. Veja Análise Profunda de Tokenização (Tokenization Deep Dive) para entender o porquê.
Etapa 2: Escolha um modelo de incorporação
Critérios principais:
- Incorporações otimizadas para recuperação (não apenas similaridade genérica de sentenças)
- Adequação ao domínio (web geral vs docs internos vs jurídico/médico)
- Necessidades multilíngues
- Dimensão da incorporação vs custo/latência
- Restrições de licenciamento e implantação
A qualidade de incorporações costuma ser avaliada usando benchmarks e tarefas como MTEB; veja Modelos de Incorporação para objetivos de treinamento e avaliação.
Etapa 3: Indexe vetores para busca ANN
Como a busca exata de vizinhos mais próximos em milhões de vetores é cara, sistemas usam ANN:
- HNSW (baseado em grafo)
- IVF (arquivo invertido)
- PQ (quantização de produto (product quantization))
Bancos de dados vetoriais e bibliotecas (por exemplo, FAISS, ScaNN, HNSWlib) implementam isso. Trade-offs incluem memória, tempo de construção, revocação e complexidade de atualização.
Etapa 4: Recuperação + reordenamento
Um fluxo típico em produção:
- Recuperação densa: top 200 passagens
- Recuperação esparsa: top 200 passagens
- Mesclar (deduplicar)
- Reordenar o top 200 com um codificador cruzado (ou um ranqueador leve)
- Retornar o top 10 com trechos e destaque
Etapa 5: Avaliação e monitoramento
Métricas offline de recuperação de informação incluem:
- Recall@k (revocação@k) (recuperamos um doc relevante no top k?)
- MRR (posto recíproco médio (mean reciprocal rank))
- nDCG@k (relevância graduada, sensível à posição)
Mas avaliar busca semântica muitas vezes é difícil: relevância pode ser subjetiva e rotulagem é cara. Veja Avaliação para PLN (Evaluation for NLP) para entender por que a escolha de métrica e o desenho do conjunto de dados importam.
Em produção, também monitore:
- Latência de consulta (p50/p95)
- Taxa de zero resultados
- Taxa de cliques e taxa de reformulação
- Deriva (drift): mudanças no modelo de incorporação, mudanças no corpus, mudanças na distribuição de consultas
Exemplo prático: busca semântica densa com SentenceTransformers + FAISS
Abaixo está um protótipo mínimo ilustrando o ciclo de recuperação densa. (Isto não está pronto para produção, mas captura a ideia central.)
# pip install sentence-transformers faiss-cpu numpy
import numpy as np
import faiss
from sentence_transformers import SentenceTransformer
docs = [
"Patch a punctured bicycle tube using a repair kit.",
"How to replace a car tire safely with a jack.",
"Reset your account password by email verification.",
"Troubleshoot login issues when multi-factor auth fails."
]
model = SentenceTransformer("all-MiniLM-L6-v2") # example model
# 1) Encode documents (often done offline)
doc_emb = model.encode(docs, normalize_embeddings=True)
doc_emb = np.array(doc_emb, dtype="float32")
# 2) Build ANN index (inner product works like cosine due to normalization)
dim = doc_emb.shape[1]
index = faiss.IndexFlatIP(dim)
index.add(doc_emb)
def search(query, k=3):
q = model.encode([query], normalize_embeddings=True)
q = np.array(q, dtype="float32")
scores, ids = index.search(q, k)
return [(docs[i], float(scores[0][rank])) for rank, i in enumerate(ids[0])]
print(search("How do I fix a flat tire?", k=3))
Principais pontos:
- Normalizamos as incorporações, então produto escalar ≈ similaridade cosseno.
- FAISS retorna rapidamente os vetores mais próximos.
- Em um sistema real, você armazenaria IDs de fragmentos + metadados e reordenaria resultados.
Decisões comuns de design e armadilhas
Compreensão de consulta: consultas curtas são difíceis
A recuperação densa ajuda com semântica, mas consultas curtas e ambíguas (“jaguar”, “python”, “apple”) continuam difíceis. Considere:
- Classificação de consultas ou detecção de intenção (intent detection) (leve)
- Ranqueamento personalizado ou sensível ao contexto (se apropriado)
- Reordenamento com um codificador cruzado para desambiguar usando o texto do documento
Trade-offs de fragmentação
- Fragmentos menores: melhor foco, potencialmente maior revocação; mais entradas no índice
- Fragmentos maiores: mais contexto, menos entradas; podem diluir a relevância
Uma abordagem comum é recuperação de passagens (passage retrieval) + exibir o contexto ao redor na interface.
Adaptação ao domínio
Incorporações fora do domínio podem ter desempenho inferior. Opções:
- Usar um modelo de incorporação específico do domínio
- Ajuste fino (fine-tuning) em pares do domínio (consulta ↔ passagem relevante)
- Usar supervisão fraca (weak supervision) (registros de clique (click logs), links âncora (anchor links), pares de FAQ)
Híbrido costuma ser o padrão mais seguro
Se seu corpus inclui códigos, nomes, SKUs, citações ou cláusulas jurídicas, recuperação somente densa pode perder correspondências exatas. Recuperação híbrida reduz falhas catastróficas.
Segurança e permissões
Busca semântica corporativa deve impor controle de acesso (access control):
- Filtrar por permissões do usuário antes de retornar resultados
- Se usar filtros de metadados (metadata filters) do banco de dados vetorial, garanta que os filtros sejam aplicados corretamente e com eficiência
- Considerar indexação por tenant (tenant) ou estratégias de criptografia quando necessário
“Deriva semântica” e falsos positivos
A recuperação densa pode retornar passagens que parecem relacionadas, mas não são realmente relevantes (especialmente em domínios técnicos). Reordenamento e avaliação cuidadosa reduzem esse risco.
Aplicações: onde a busca semântica é usada hoje
Geração Aumentada por Recuperação (RAG)
RAG usa busca semântica para recuperar passagens de contexto que são fornecidas a um modelo de linguagem de grande porte para gerar respostas fundamentadas. A qualidade da recuperação frequentemente domina a qualidade da resposta final.
Sistemas RAG normalmente exigem:
- Recuperação com alta revocação (não perder fatos-chave)
- Reordenamento forte
- Boa fragmentação e bom tratamento de metadados
- Avaliação que meça factualidade ponta a ponta, não apenas métricas de recuperação
Busca em e-commerce e marketplaces
A busca semântica oferece suporte a:
- Inferência de atributos (“jaqueta quente para hiking”)
- Sinônimos e variação na forma como usuários formulam consultas
- Descoberta translinguística (cross-lingual) (com incorporações multilíngues)
Frequentemente combinada com regras de negócio, restrições de inventário e aprendizado para ranqueamento (learning-to-rank).
Busca de conhecimento corporativo
Casos de uso:
- Consulta a políticas e procedimentos
- Busca em wiki interna
- Recuperação de tickets e incidentes
- Busca por cláusulas contratuais (frequentemente híbrida devido a requisitos de linguagem exata)
Escolhendo entre densa, esparsa e híbrida
Um guia pragmático:
Escolha esparsa (BM25) se:
- Correspondência exata de termos é crítica
- Você precisa de máxima transparência
- Você quer infraestrutura simples e um baseline forte
Escolha densa se:
- Consultas são em linguagem natural e semânticas
- Sinônimos/paráfrases são comuns
- Você pode investir em infraestrutura de incorporação + ANN e em avaliação
Escolha híbrida se:
- Você precisa de comportamento robusto tanto para consultas exatas quanto semânticas
- Seu corpus mistura identificadores técnicos com linguagem natural
- Você está construindo sistemas em produção nos quais “nenhuma falha grave” importa
Resumo
A busca semântica expande a recuperação clássica ao incorporar representações sensíveis ao significado. As principais escolhas de engenharia giram em torno de recuperação esparsa vs recuperação densa:
- Esparsa (BM25) é rápida, interpretável e se destaca em correspondência exata.
- Densa (incorporações + ANN) captura similaridade semântica e lida bem com paráfrases.
- Híbrida + reordenamento costuma ser a abordagem mais confiável em produção.
Para construir uma busca semântica eficaz, foque em:
- Fragmentação de texto e metadados de alta qualidade
- Modelos de incorporação otimizados para recuperação
- Indexação ANN e restrições operacionais
- Avaliação robusta (offline + online)
- Estratégias híbridas e reordenamento para precisão
Para um aprofundamento, veja Recuperação de Informação, Modelos de Incorporação e Avaliação para PLN.