Código Python sendo executado em um editor de texto com gráficos de similaridade semântica ao fundo
tutoriais

Busca semântica com Python e modelos open-source

NeuralPulse|13 de junho de 2026|5 min de leitura|Read in English
Preparando avatar...
🎬 NeuralPulse Shorts

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ísticaEmbedding local (BGE-M3)API OpenAI (text-embedding-3-small)
Custo por 1M tokensZero (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 dadosTotalDados vão para servidor externo
Dependência de internetNãoSim
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

Compartilhar:
NeuralPulse

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.

Comentarios

Powered by Disqus

Para ativar os comentarios, configure seu shortname do Disqus no componente.

<div id="disqus_thread"></div>