Aller au contenu principal

La recherche lexicale BM25

En construisant des pipelines RAG, vous decouvrirez rapidement que la recherche semantique seule ne retourne pas toujours les meilleurs resultats. Parfois, il faut des correspondances exactes de termes que la recherche semantique peut manquer. La solution : combiner recherche semantique et recherche lexicale avec l’algorithme BM25.

Le probleme de la recherche semantique seule

Imaginons que vous cherchez un identifiant d’incident precis comme INC-2023-Q4-011 dans un document. La recherche semantique excelle pour comprendre le contexte et le sens, mais elle peut retourner des sections qui sont semantiquement proches sans contenir le terme exact recherche.

Par exemple, la recherche semantique pourrait retourner la section cybersecurite (qui contient bien l’identifiant) mais aussi une section d’analyse financiere qui ne mentionne pas du tout l’incident. Cela arrive parce que la recherche semantique se concentre sur la similarite conceptuelle plutot que sur la correspondance exacte des termes.

La strategie de recherche hybride

La solution consiste a executer les deux types de recherche en parallele, puis a fusionner les resultats :

  • Recherche semantique : trouve du contenu conceptuellement lie via les embeddings
  • Recherche lexicale : trouve les correspondances exactes de termes via une recherche textuelle classique
  • Resultats fusionnes : combine les deux approches pour une meilleure precision

Comment fonctionne BM25

BM25 (Best Match 25) est un algorithme populaire de recherche lexicale dans les systemes RAG. Voici comment il traite une requete :

Etape 1 : Tokeniser la requete

On decoupe la question de l’utilisateur en termes individuels. Par exemple, "a INC-2023-Q4-011" devient ["a", "INC-2023-Q4-011"].

Etape 2 : Compter la frequence des termes

On regarde combien de fois chaque terme apparait dans tous les documents. Les mots courants comme “a” peuvent apparaitre 5 fois, tandis que des termes specifiques comme INC-2023-Q4-011 n’apparaissent qu’une seule fois.

Etape 3 : Ponderer par importance

Les termes qui apparaissent moins frequemment obtiennent des scores d’importance plus eleves. Le mot “a” recoit une faible importance car il est courant, alors que INC-2023-Q4-011 recoit une forte importance car il est rare.

Etape 4 : Trouver les meilleures correspondances

On retourne les documents qui contiennent le plus d’occurrences des termes les mieux ponderes.

Implementation de la recherche BM25

Voici comment mettre en place un systeme de recherche BM25 basique :

# 1. Decouper le texte par sections
chunks = chunk_by_section(text)

# 2. Creer 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 resultats
for doc, distance in results:
    print(distance, "\n", doc["content"][:200], "\n----\n")

Quand vous executez cette recherche, les resultats sont bien meilleurs qu’avec la recherche semantique seule. L’algorithme BM25 priorise les sections qui contiennent reellement vos termes de recherche, en particulier les termes rares comme les identifiants d’incidents.

Les resultats priorisent desormais correctement la section Ingenierie logicielle et la section Cybersecurite — les deux sections qui contiennent effectivement l’identifiant recherche.

Pourquoi ca fonctionne mieux

BM25 excelle pour trouver des correspondances exactes car il :

  • Donne un poids eleve aux termes rares et specifiques
  • Ignore les mots courants qui n’apportent pas de valeur a la recherche
  • Se concentre sur la frequence des termes plutot que sur le sens semantique
  • Fonctionne particulierement bien pour les termes techniques, identifiants et expressions precises

L’idee cle est que les deux methodes de recherche ont des forces complementaires. La recherche semantique comprend le contexte et le sens, tandis que la recherche lexicale garantit qu’on ne rate pas les correspondances exactes. En les combinant, on cree un systeme de recherche plus robuste qui gere a la fois les requetes conceptuelles et les recherches specifiques.

Quiz : Recherche semantique vs lexicale

Question 1 : Pour quelle requete la recherche lexicale BM25 serait-elle nettement superieure a la recherche semantique ?

Reponse : Pour les requetes contenant des identifiants precis (INC-2023-Q4-011), des codes produit (SKU-789), des noms propres techniques, ou des termes exacts a retrouver. La recherche semantique pourrait retourner du contenu “similaire” sans contenir le terme exact.

Question 2 : Pour quelle requete la recherche semantique serait-elle nettement superieure ?

Reponse : Pour les questions conceptuelles comme “Quels defis l’entreprise a-t-elle rencontres ?” ou “Parlez-moi des problemes de performance”. La recherche lexicale ne trouvera rien si le document parle de “goulots d’etranglement” au lieu de “problemes de performance”.