La recherche lexicale BM25
Mis à jour le 30 juillet 2026
En construisant des pipelines RAG, vous découvrirez rapidement que la recherche sémantique seule ne retourne pas toujours les meilleurs résultats. Parfois, il faut des correspondances exactes de termes que la recherche sémantique peut manquer. La solution : combiner recherche sémantique et recherche lexicale avec l’algorithme BM25.
Le problème de la recherche sémantique seule
Imaginons que vous cherchez un identifiant d’incident précis comme INC-2023-Q4-011 dans un document. La recherche sémantique excelle pour comprendre le contexte et le sens, mais elle peut retourner des sections qui sont sémantiquement proches sans contenir le terme exact recherche.
Par exemple, la recherche sémantique pourrait retourner la section cybersécurité (qui contient bien l’identifiant) mais aussi une section d’analyse financière qui ne mentionne pas du tout l’incident. Cela arrive parce que la recherche sémantique se concentre sur la similarité conceptuelle plutôt que sur la correspondance exacte des termes.
La stratégie de recherche hybride
La solution consiste à exécuter les deux types de recherche en parallèle, puis à fusionner les résultats :
- Recherche sémantique : trouve du contenu conceptuellement lié via les embeddings
- Recherche lexicale : trouve les correspondances exactes de termes via une recherche textuelle classique
- Résultats fusionnés : combine les deux approches pour une meilleure précision
Comment fonctionne BM25
BM25 (Best Match 25) est un algorithme populaire de recherche lexicale dans les systèmes RAG. Voici comment il traite une requête :
Étape 1 : Tokeniser la requête
On découpe la question de l’utilisateur en termes individuels. Par exemple, "a INC-2023-Q4-011" devient ["a", "INC-2023-Q4-011"].
Étape 2 : Compter la fréquence des termes
On regarde combien de fois chaque terme apparaît dans tous les documents. Les mots courants comme “à” peuvent apparaître 5 fois, tandis que des termes spécifiques comme INC-2023-Q4-011 n’apparaissent qu’une seule fois.
Étape 3 : Pondérer par importance
Les termes qui apparaissent moins fréquemment obtiennent des scores d’importance plus élèves. Le mot “à” reçoit une faible importance car il est courant, alors que INC-2023-Q4-011 reçoit une forte importance car il est rare.
Étape 4 : Trouver les meilleures correspondances
On retourne les documents qui contiennent le plus d’occurrences des termes les mieux pondérés.
Implémentation de la recherche BM25
Voici comment mettre en place un système de recherche BM25 basique :
# 1. Découper le texte par sections
chunks = chunk_by_section(text)
# 2. Créer un store BM25 et ajouter les documents
store = BM25Index()
for chunk in chunks:
store.add_document({"content": chunk})
# 3. Lancer la recherche
results = store.search("What happened with INC-2023-Q4-011?", 3)
# Afficher les résultats
for doc, distance in results:
print(distance, "\n", doc["content"][:200], "\n----\n")
Quand vous exécutez cette recherche, les résultats sont bien meilleurs qu’avec la recherche sémantique seule. L’algorithme BM25 priorise les sections qui contiennent réellement vos termes de recherche, en particulier les termes rares comme les identifiants d’incidents.
Les résultats priorisent désormais correctement la section Ingénierie logicielle et la section Cybersécurité — les deux sections qui contiennent effectivement l’identifiant recherche.
Pourquoi ça fonctionne mieux
BM25 excelle pour trouver des correspondances exactes car il :
- Donne un poids élève aux termes rares et spécifiques
- Ignore les mots courants qui n’apportent pas de valeur à la recherche
- Se concentre sur la fréquence des termes plutôt que sur le sens sémantique
- Fonctionne particulièrement bien pour les termes techniques, identifiants et expressions précises
L’idée clé est que les deux méthodes de recherche ont des forces complémentaires. La recherche sémantique comprend le contexte et le sens, tandis que la recherche lexicale garantit qu’on ne rate pas les correspondances exactes. En les combinant, on crée un système de recherche plus robuste qui gère à la fois les requêtes conceptuelles et les recherches spécifiques.
Quiz : Recherche sémantique vs lexicale
Question 1 : Pour quelle requête la recherche lexicale BM25 serait-elle nettement supérieure à la recherche sémantique ?
Réponse : Pour les requêtes contenant des identifiants précis (INC-2023-Q4-011), des codes produit (SKU-789), des noms propres techniques, ou des termes exacts à retrouver. La recherche sémantique pourrait retourner du contenu “similaire” sans contenir le terme exact.
Question 2 : Pour quelle requête la recherche sémantique serait-elle nettement supérieure ?
Réponse : Pour les questions conceptuelles comme “Quels défis l’entreprise a-t-elle rencontres ?” ou “Parlez-moi des problèmes de performance”. La recherche lexicale ne trouvera rien si le document parle de “goulots d’étranglement” au lieu de “problèmes de performance”.