Recherche lexicale BM25
La recherche semantique seule ne renvoie pas toujours les meilleurs resultats. Parfois, vous avez besoin de correspondances exactes de mots-cles que la recherche semantique peut manquer. La solution : combiner la recherche semantique avec la recherche lexicale via BM25.
Le probleme de la recherche semantique seule
Si vous cherchez un identifiant d’incident specifique comme “INC-2023-Q4-011”, la recherche semantique pourrait renvoyer des sections non pertinentes qui semblent semantiquement similaires mais ne contiennent pas l’information specifique recherchee. La recherche semantique se concentre sur le sens plutot que sur les correspondances exactes de texte.
Strategie de recherche hybride
La solution : executer les deux recherches en parallele puis fusionner les resultats.
- Recherche semantique : trouve du contenu conceptuellement relie via les embeddings
- Recherche lexicale : trouve des correspondances exactes de mots-cles
- Resultats fusionnes : combine les deux pour une meilleure pertinence globale
Comment fonctionne BM25
BM25 (Best Match 25) est un algorithme populaire de recherche lexicale. Les etapes cles :
- Tokeniser la requete : decomposer la question en termes individuels
- Compter la frequence des termes : voir combien de fois chaque terme apparait dans tous les documents
- Ponderer par rarete : les termes moins frequents recoivent des scores d’importance plus eleves
- Noter les documents : trouver les chunks contenant plus d’instances des termes les plus ponderes
Insight cle : les termes rares comme “INC-2023-Q4-011” sont beaucoup plus importants que les mots courants comme “le” ou “de”.
Implementation
# Creer un store BM25
store = BM25Index()
# Ajouter les documents
for chunk in chunks:
store.add_document({"content": chunk})
# Rechercher
results = store.search("Que s'est-il passe avec INC-2023-Q4-011 ?", 3)
L’API BM25 est similaire a celle du store vectoriel (add_document() et search()), ce qui facilite l’utilisation conjointe des deux systemes.
Meilleurs resultats
Avec BM25, les sections contenant l’identifiant exact de l’incident sont correctement priorisees, au lieu de renvoyer du contenu non pertinent. L’etape suivante est de fusionner les resultats des deux systemes de recherche.