La recherche lexicale BM25
La recherche semantique seule ne retourne pas toujours les meilleurs resultats. Parfois, il faut une correspondance exacte de termes. La solution : combiner recherche semantique et recherche lexicale via BM25.
Le probleme de la recherche semantique seule
Chercher un identifiant specifique comme “INC-2023-Q4-011” peut echouer avec la recherche semantique, qui se concentre sur le sens plutot que sur les correspondances exactes.
Strategie de recherche hybride
- Recherche semantique : embeddings et base vectorielle pour la correspondance de sens
- Recherche lexicale : recherche textuelle classique pour les correspondances exactes
- Fusion des resultats
Comment fonctionne BM25
- Tokeniser la requete : decomposer la question en termes individuels
- Compter la frequence : combien de fois chaque terme apparait dans les documents
- Ponderer par rarete : les termes rares recoivent des scores d’importance plus eleves
- Trouver les meilleures correspondances : retourner les segments contenant le plus de termes importants
Le terme rare “INC-2023-Q4-011” pese beaucoup plus que les mots courants comme “a” ou “le”.
Implementation
store = BM25Index()
for chunk in chunks:
store.add_document({"content": chunk})
results = store.search("Que s'est-il passe avec INC-2023-Q4-011 ?", 3)
BM25 et la recherche vectorielle partagent la meme API (add_document() et search()), ce qui facilite leur utilisation conjointe.