Busca semântica com Python e modelos open-source
O que separa uma busca que entende o significado de uma que apenas acha palavras-chave? Em 2026, a resposta tem nome: embeddings.
Por trás de sistemas de recomendação, chatbots e mecanismos de busca modernos, há uma técnica que transforma texto em números. E não em qualquer número — em vetores que capturam contexto e significado.
A boa notícia? Você não precisa de um orçamento de big tech para implementar isso. Modelos como BGE-M3 (da BAAI) e GTE-Qwen2 (do Alibaba) lideram o ranking MTEB com scores acima de 60 (fonte: Hugging Face MTEB Leaderboard, junho/2026). E rodam em hardware modesto.
Neste tutorial, você vai aprender a usar embeddings para busca semântica em Python — com código que funciona, métricas reais e sem depender de APIs caras.
O que são embeddings e por que eles importam (de verdade)
Embeddings são representações numéricas de texto. Cada frase, parágrafo ou documento vira um vetor — uma lista de centenas ou milhares de números.
A mágica está na geometria. Textos semelhantes geram vetores próximos no espaço multidimensional. "Gato come ração" e "O felino se alimenta" ficam pertinho. "Carro quebrado" fica longe.
A busca semântica não encontra palavras — ela encontra intenções. Embeddings transformam linguagem em geometria, e isso muda tudo na recuperação de informação.
Essa técnica substitui a busca por palavras-chave exatas. Em vez de procurar por "cachorro", o sistema entende que "pet canino" também serve. Isso reduz falsos negativos drasticamente.
O benchmark MTEB (Massive Text Embedding Benchmark) avalia modelos em tarefas como classificação, clustering e busca. Em junho de 2026, os modelos open-source dominam o topo. O BGE-M3, por exemplo, alcança performance competitiva com soluções proprietárias (fonte: sbert.net).
Passo a passo: implementando busca semântica com Python
Vamos construir um sistema de busca semântica do zero. Usaremos a biblioteca sentence-transformers, que oferece modelos pré-treinados e uma API limpa.
1. Instalação e setup
Primeiro, instale as dependências:
pip install sentence-transformers numpy scikit-learn
O sentence-transformers abstrai a complexidade dos modelos. Você não precisa lidar com tokenização manual ou otimização de GPU.
2. Carregando o modelo
Vamos usar o BGE-M3, um dos líderes do MTEB. Ele é eficiente e roda em CPU:
from sentence_transformers import SentenceTransformer
modelo = SentenceTransformer('BAAI/bge-m3')
O download do modelo acontece na primeira execução. O peso total fica em torno de 2 GB.
3. Criando embeddings para um conjunto de documentos
Digamos que você tem uma base de artigos técnicos:
documentos = [
"Python é uma linguagem de programação de alto nível.",
"JavaScript é usado principalmente para desenvolvimento web.",
"Aprendizado de máquina utiliza algoritmos para encontrar padrões.",
"Redes neurais são inspiradas no cérebro humano.",
"O pandas é uma biblioteca Python para análise de dados.",
]
embeddings_docs = modelo.encode(documentos) print(embeddings_docs.shape) # (5, 1024) para BGE-M3
Cada documento vira um vetor de 1024 dimensões. A similaridade entre eles é calculada por cosseno.
4. Função de busca semântica
Agora, a busca propriamente dita:
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
def buscar(query, documentos, embeddings_docs, top_k=3): embedding_query = modelo.encode([query]) similaridades = cosine_similarity(embedding_query, embeddings_docs)[0] indices = np.argsort(similaridades)[::-1][:top_k] resultados = [] for i in indices: resultados.append({ "documento": documentos[i], "score": similaridades[i] }) return resultados
Testando
query = "Como analisar dados em Python?" resultados = buscar(query, documentos, embeddings_docs) for r in resultados: print(f"{r['score']:.2f} - {r['documento']}")
A saída deve ser algo como:
0.89 - O pandas é uma biblioteca Python para análise de dados.
0.72 - Python é uma linguagem de programação de alto nível.
0.45 - Aprendizado de máquina utiliza algoritmos para encontrar padrões.
Repare: a busca entendeu que "analisar dados" se relaciona com pandas, mesmo a palavra "pandas" não estar na consulta.
Embeddings locais vs API: custo, latência e performance
Vale a pena pagar por uma API como a da OpenAI? Depende do seu cenário.
| Característica | Embedding local (BGE-M3) | API OpenAI (text-embedding-3-small) |
|---|---|---|
| Custo por 1M tokens | Zero (após hardware) | ~$0.02 (80% menor que 2025, fonte: OpenAI Pricing, junho/2026) |
| Latência (primeiro token) | 10-50ms (depende da GPU) | 200-500ms (rede + processamento) |
| Privacidade dos dados | Total | Dados vão para servidor externo |
| Dependência de internet | Não | Sim |
| Performance (MTEB) | 64.2 (BGE-M3, fonte: MTEB Leaderboard, junho/2026) | 62.3 (text-embedding-3-small, fonte: MTEB Leaderboard, junho/2026) |
O modelo open-source mais barato é o que roda na sua máquina. Custo zero de API. Latência zero de rede. Privacidade total dos dados.
Para aplicações que exigem baixa latência (como chatbots em tempo real), modelos locais vencem. Para projetos esporádicos com poucos documentos, a API pode ser mais prática.
Um ponto crucial: a API OpenAI reduziu 80% de custo desde 2025, mas ainda depende de conexão. Se seu sistema precisar funcionar offline (indústria, saúde, dados sensíveis), modelo local é o único caminho.
Como escolher o modelo certo para sua aplicação
O ranking MTEB (acessível em huggingface.co/spaces/mteb/leaderboard) é o melhor ponto de partida. Em junho/2026, estes são os destaques open-source:
- BGE-M3 (BAAI): Excelente para busca multilíngue. Suporta chinês, inglês e português razoavelmente bem.
- GTE-Qwen2 (Alibaba): Performance superior em tarefas de recuperação de informação. Ligeiramente maior que o BGE-M3.
- E5-mistral-7b-instruct (Microsoft): Maior, mas com melhor compreensão de instruções complexas.
Para a maioria dos casos, o BGE-M3 oferece o melhor equilíbrio entre tamanho, velocidade e acurácia.
Dica prática: normalização e batch size
Sempre normalize os embeddings antes de calcular similaridade. O sentence-transformers faz isso automaticamente, mas é bom confirmar:
embeddings_docs = modelo.encode(documentos, normalize_embeddings=True)
Para grandes volumes (milhares de documentos), use batch_size para evitar estouro de memória:
embeddings_docs = modelo.encode(documentos, batch_size=32, show_progress_bar=True)
Conclusão: embeddings são o alicerce da busca inteligente
Embeddings transformaram a recuperação de informação. Em 2026, com modelos open-source batendo scores competitivos no MTEB, não há desculpa para depender de APIs caras ou soluções fechadas.
Você viu neste tutorial como implementar busca semântica em menos de 30 linhas de Python. O BGE-M3 e o GTE-Qwen2 oferecem performance de ponta com custo zero de API.
O próximo passo? Integrar embeddings com bancos vetoriais como ChromaDB ou Qdrant para escalar para milhões de documentos. Mas isso já é história para outro tutorial.
Comece com o código acima. Teste com seus próprios dados. A diferença entre uma busca por palavras-chave e uma busca semântica é a capacidade de entender o contexto e a intenção por trás da consulta, algo que os embeddings tornam possível de forma acessível e eficiente.
Artigos Relacionados
NeuralPulse
Blog profissional sobre Inteligencia Artificial. Exploramos tendencias, ferramentas, tutoriais e analises profundas sobre como a IA esta transformando negocios, tecnologia e o dia a dia.
Receba as novidades sobre IA
Junte-se a milhares de leitores que acompanham as ultimas tendencias em inteligencia artificial.
Artigos Relacionados
Function Calling na Prática: Tutorial Python para Chatbots com LLMs que Executam Ações em 2026
Aprenda a implementar function calling em Python com OpenAI, Anthropic Claude e Google Gemini. Tutorial completo com código para integrar APIs, bancos de dad...
Mistral Search Toolkit: Monte Seu Próprio Motor de Busca com IA em 30 Minutos (Open Source)
Mistral AI lançou framework open source para pipelines de busca com IA em produção. Tutorial prático: monte do zero um motor de busca híbrida com Docker + Ve...
Automação de Licitações com IA: Guia Prático para Órgãos Públicos
Aprenda a usar IA gratuita para automatizar a análise de editais e propostas em licitações públicas com Python, dados abertos e modelos como Sabiá-4 e Gemini.
Comentarios
Powered by Disqus
Para ativar os comentarios, configure seu shortname do Disqus no componente.
<div id="disqus_thread"></div>