Capítulo 2: Busca Híbrida
Por que Busca Híbrida?
| Tipo de Busca | Força | Fraqueza |
|---|---|---|
| Palavra-chave (BM25) | Correspondências exatas, termos raros | Não encontra sinônimos |
| Semântica | Compreensão de significado | Pode não encontrar termos exatos |
| Híbrida | Melhor dos dois | Mais complexa |
Visão Geral do BM25
BM25 é um algoritmo de ranqueamento baseado em palavras-chave:
from rank_bm25 import BM25Okapi
# Tokenizar documentos
tokenized_corpus = [doc.split() for doc in documents]
bm25 = BM25Okapi(tokenized_corpus)
# Buscar
query_tokens = query.split()
scores = bm25.get_scores(query_tokens)
Implementando Busca Híbrida
Com LangChain
from langchain.retrievers import EnsembleRetriever
from langchain.retrievers import BM25Retriever
# Recuperador BM25
bm25_retriever = BM25Retriever.from_documents(documents)
bm25_retriever.k = 5
# Recuperador vetorial
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
# Combinar
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever],
weights=[0.4, 0.6] # Peso do BM25, Peso do Vetor
)
# Buscar
results = ensemble_retriever.get_relevant_documents(query)
Reciprocal Rank Fusion (RRF)
Combina os rankings de múltiplos recuperadores:
def reciprocal_rank_fusion(rankings, k=60):
"""
Combine multiple rankings using RRF.
k: constant to prevent high ranks from dominating
"""
fused_scores = {}
for ranking in rankings:
for rank, doc in enumerate(ranking):
doc_id = doc.metadata.get('id', hash(doc.page_content))
if doc_id not in fused_scores:
fused_scores[doc_id] = {'doc': doc, 'score': 0}
fused_scores[doc_id]['score'] += 1 / (k + rank + 1)
# Sort by fused score
sorted_docs = sorted(
fused_scores.values(),
key=lambda x: x['score'],
reverse=True
)
return [item['doc'] for item in sorted_docs]
Quando Usar Busca Híbrida
✅ Use a busca híbrida quando:
- As consultas contêm termos ou nomes específicos
- O domínio possui vocabulário especializado
- Usuários esperam correspondências exatas
❌ Prefira apenas a semântica quando:
- Consultas em linguagem natural
- Busca baseada em conceitos
- Conteúdo multilíngue
Próximos Passos
Continue para Capítulo 3: Reranking.