Saltar al contenido principal

Capítulo 2: Búsqueda híbrida

¿Por qué búsqueda híbrida?​

Tipo de búsquedaFortalezaDebilidad
Palabra clave (BM25)Coincidencias exactas, términos poco comunesNo detecta sinónimos
SemánticaComprensión del significadoPuede omitir términos exactos
HíbridaLo mejor de ambosMás compleja

Resumen de BM25​

BM25 es un algoritmo de ranking basado en palabras clave:

from rank_bm25 import BM25Okapi

# Tokenizar documentos
tokenized_corpus = [doc.split() for doc in documents]
bm25 = BM25Okapi(tokenized_corpus)

# Búsqueda
query_tokens = query.split()
scores = bm25.get_scores(query_tokens)

Implementación de búsqueda híbrida​

Con LangChain​

from langchain.retrievers import EnsembleRetriever
from langchain.retrievers import BM25Retriever

# Recuperador BM25
bm25_retriever = BM25Retriever.from_documents(documents)
bm25_retriever.k = 5

# Recuperador vectorial
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})

# Combinar
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever],
weights=[0.4, 0.6] # Peso BM25, Peso vectorial
)

# Búsqueda
results = ensemble_retriever.get_relevant_documents(query)

Fusión de ranking recíproco (RRF)​

Combina rankings de múltiples recuperadores:

def reciprocal_rank_fusion(rankings, k=60):
"""
Combina múltiples rankings usando RRF.
k: constante para evitar que los primeros puestos dominen
"""
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)

# Ordenar por puntuación fusionada
sorted_docs = sorted(
fused_scores.values(),
key=lambda x: x['score'],
reverse=True
)

return [item['doc'] for item in sorted_docs]

Cuándo usar búsqueda híbrida​

✅ Utilice la búsqueda híbrida cuando:

  • Las consultas contienen términos o nombres específicos
  • El dominio tiene vocabulario especializado
  • Los usuarios esperan coincidencias exactas

❌ Manténgase solo con la semántica cuando:

  • Consultas en lenguaje natural
  • Búsqueda basada en conceptos
  • Contenido multilingüe

Próximos pasos​

Continúe con Capítulo 3: Re-ranking.