Chargement

Recherche lexicale BM25

Leçon 395 min

Lorsque vous construisez un pipeline RAG, vous découvrirez rapidement que la recherche sémantique seule ne renvoie pas toujours les meilleurs résultats. Parfois, vous avez besoin de correspondances exactes de termes que la recherche sémantique pourrait manquer. La solution consiste à combiner la recherche sémantique avec la recherche lexicale en utilisant une technique appelée BM25.

Le problème de la recherche sémantique seule

Supposons que vous recherchiez un identifiant d'incident spécifique comme « INC-2023-Q4-011 » dans un document. Bien que ce terme exact apparaisse plusieurs fois dans les sections pertinentes, la recherche sémantique pourrait renvoyer des sections non pertinentes qui sont sémantiquement similaires mais qui ne contiennent pas réellement le terme spécifique que vous recherchez.

Cela se produit parce que la recherche sémantique se concentre sur le sens plutôt que sur les correspondances exactes. Lorsque vous avez besoin d'une correspondance précise des termes, vous avez besoin d'une approche différente.

Stratégie de recherche hybride

La solution consiste à exécuter deux recherches en parallèle et à fusionner les résultats :

  • Recherche sémantique - Utilise des embeddings et des bases de données vectorielles pour une correspondance basée sur le sens
  • Recherche lexicale - Utilise la recherche textuelle classique pour une correspondance exacte des termes
  • Fusion des résultats - Combine les deux ensembles de résultats pour une meilleure couverture

Comment fonctionne BM25

BM25 (Best Match 25) est un algorithme populaire pour la recherche lexicale dans les pipelines RAG. Voici comment il traite une requête de recherche :

L'algorithme suit ces étapes clés :

  1. Tokeniser la requête - Décomposer la question de l'utilisateur en termes individuels
  2. Compter la fréquence des termes - Voir à quelle fréquence chaque terme apparaît dans tous les documents
  3. Pondérer les termes par rareté - Les termes utilisés moins fréquemment obtiennent des scores d'importance plus élevés
  4. Trouver les meilleures correspondances - Renvoyer les fragments qui contiennent davantage d'occurrences des termes les plus pondérés

L'idée clé est que les termes rares comme « INC-2023-Q4-011 » sont beaucoup plus importants pour la recherche que les mots courants comme « un » ou « le ».

Voici comment configurer un système de recherche BM25 :

python
# Créer un store BM25
store = BM25Index()

# Ajouter des documents au store
for chunk in chunks:
    store.add_document({"content": chunk})

# Rechercher dans le store
results = store.search("What happened with INC-2023-Q4-011?", 3)

L'implémentation BM25 fournit la même API que votre système de recherche sémantique - les deux disposent des méthodes add_document() et search(), ce qui les rend faciles à utiliser ensemble.

De meilleurs résultats de recherche

Lorsque vous exécutez la même requête via BM25 qui avait échoué avec la recherche sémantique seule, vous obtenez des résultats bien meilleurs. Au lieu de renvoyer des sections non pertinentes, BM25 privilégie les sections qui contiennent réellement vos termes de recherche spécifiques.

L'algorithme identifie correctement que « INC-2023-Q4-011 » est un terme rare et important, et classe les documents qui le contiennent beaucoup plus haut que les documents ne contenant que des mots courants de la requête.

Prochaines étapes

Maintenant que vous disposez de systèmes de recherche sémantique et lexicale fonctionnant indépendamment, l'étape suivante consiste à fusionner leurs résultats. Cette approche hybride vous offre le meilleur des deux mondes - la compréhension contextuelle de la recherche sémantique combinée à la précision de la correspondance exacte des termes de la recherche lexicale.

Les deux systèmes de recherche utilisent des API similaires, ce qui permet d'interroger facilement les deux en parallèle et de combiner leurs résultats en un seul ensemble de résultats plus complet.