Aller au contenu principal

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

  1. Recherche semantique : embeddings et base vectorielle pour la correspondance de sens
  2. Recherche lexicale : recherche textuelle classique pour les correspondances exactes
  3. Fusion des resultats

Comment fonctionne BM25

  1. Tokeniser la requete : decomposer la question en termes individuels
  2. Compter la frequence : combien de fois chaque terme apparait dans les documents
  3. Ponderer par rarete : les termes rares recoivent des scores d’importance plus eleves
  4. 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.