Aller au contenu principal

Chapitre 2 : Recherche Hybride

Pourquoi la Recherche Hybride ?​

Type de RechercheForceFaiblesse
Mot-clé (BM25)Correspondances exactes, termes raresManque de synonymes
SémantiqueCompréhension du sensPeut manquer des termes exacts
HybrideMeilleur des deuxPlus complexe

Aperçu de BM25​

BM25 est un algorithme de classement basé sur les mots-clés :

from rank_bm25 import BM25Okapi

# Tokeniser les documents
tokenized_corpus = [doc.split() for doc in documents]
bm25 = BM25Okapi(tokenized_corpus)

# Recherche
query_tokens = query.split()
scores = bm25.get_scores(query_tokens)

Mise en œuvre de la Recherche Hybride​

Avec LangChain​

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

# Récupérateur BM25
bm25_retriever = BM25Retriever.from_documents(documents)
bm25_retriever.k = 5

# Récupérateur de vecteurs
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})

# Combinaison
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever],
weights=[0.4, 0.6] # Poids BM25, Poids Vecteur
)

# Recherche
results = ensemble_retriever.get_relevant_documents(query)

Fusion de Rang Réciproque (RRF)​

Combiner les classements de plusieurs récupérateurs :

def reciprocal_rank_fusion(rankings, k=60):
"""
Combiner plusieurs classements en utilisant RRF.
k : constante pour éviter que les rangs élevés ne dominent
"""
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)

# Trier par score fusionné
sorted_docs = sorted(
fused_scores.values(),
key=lambda x: x['score'],
reverse=True
)

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

Quand Utiliser la Recherche Hybride​

✅ Utilisez l'hybride lorsque :

  • Les requêtes contiennent des termes/noms spécifiques
  • Le domaine a un vocabulaire spécialisé
  • Les utilisateurs s'attendent à des correspondances exactes

❌ Restez avec le sémantique lorsque :

  • Requêtes en langage naturel
  • Recherche basée sur des concepts
  • Contenu multilingue

Prochaines Étapes​

Continuez vers Chapitre 3 : Reclassement.