Comprendre l’algorithme de recherche plein texte BM25
(emschwartz.me)- BM25 reste largement utilisé pour la recherche plein texte nécessitant une correspondance exacte des mots-clés, et constitue l’un des piliers de la recherche hybride, en complément de la recherche par similarité vectorielle
- Sans calculer directement des probabilités, BM25 classe les documents en additionnant des pondérations pour chaque terme de la requête afin de placer en tête ceux qui semblent les plus pertinents
- Le score se décompose en IDF, fréquence du terme dans le document et normalisation de la longueur du document ; les mots rares pèsent davantage, tandis que les occurrences répétées sont progressivement moins récompensées
k1contrôle la vitesse de saturation de la récompense liée aux occurrences répétées, etbl’intensité de la normalisation par la longueur du document ; on utilise généralementk1=1.2~2etb=0.75- Le score BM25 n’étant pas une probabilité réelle de pertinence, il est difficile de l’utiliser comme valeur de comparaison universelle ; il a du sens lorsqu’on compare des éléments au sein de la même collection de documents
Le problème de recherche que BM25 cherche à résoudre
- BM25, ou Best Match 25, est un algorithme largement utilisé en recherche plein texte
- Il est utilisé par défaut dans Lucene/Elasticsearch, SQLite, entre autres
- Récemment, la recherche hybride, qui combine recherche plein texte et recherche par similarité vectorielle, est devenue courante
- Dans les flux de contenu personnalisés, la recherche par similarité vectorielle seule peut être insuffisante pour traiter précisément les mots-clés
- Si un centre d’intérêt est
Solid.js, utiliser uniquement la recherche par similarité vectorielle peut faire remonter plus de contenus liés à React qu’à Solid
- Si un centre d’intérêt est
- La question centrale est de savoir si l’on peut comparer le score BM25 d’un même document entre plusieurs requêtes afin de déterminer à quelle requête ce document correspond le mieux
Le principe de classement probabiliste et l’approche de BM25
- L’objectif de la recherche plein texte est de trouver les documents les plus pertinents dans l’ensemble de documents possibles pour une requête donnée
- Comme il est impossible de connaître avec certitude la pertinence réelle, la recherche tente de trier les documents selon la probabilité qu’un document soit pertinent pour la requête
- Cette idée est appelée Probability Ranking Principle
- Une recherche lexicale comme BM25 n’utilise que les caractéristiques de la requête et des documents dans la collection
- La recherche par similarité vectorielle peut utiliser un modèle d’embeddings entraîné sur un corpus de textes externe pour représenter le sens de la requête et des documents
Les composants du score BM25
- BM25 calcule un score en combinant plusieurs signaux issus de la requête et de la collection de documents
-
Termes de la requête
- Lorsqu’une requête de recherche se compose de plusieurs termes, le score de chaque terme est calculé puis additionné
-
Fréquence inverse de document (IDF)
- Indique à quel point un terme de recherche donné est rare dans l’ensemble de la collection de documents
- Les mots fréquents comme
theouandsont considérés comme peu informatifs, tandis que l’importance des mots rares est renforcée
-
Fréquence du terme dans le document
- Reflète le nombre d’occurrences d’un terme de recherche dans un document donné
- Plus un même terme est répété, plus la probabilité de pertinence est considérée comme élevée, mais BM25 applique un effet de saturation aux occurrences répétées
-
Longueur du document
- Dans un document long, un terme de recherche peut apparaître plus souvent simplement parce que le document est plus long
- BM25 normalise la longueur du document par rapport à la longueur moyenne des documents afin d’éviter qu’un document long n’obtienne un score indûment élevé
Les différentes parties de la formule BM25
- Le score global de BM25 consiste à additionner, pour un document
Det une requêteQ, les scores de chaque terme de requêteq_iD: document cibleQ: requête complèten: nombre de termes dans la requêteq_i: chaque terme de la requête
-
IDF : donner plus de poids aux mots rares dans la collection
- Le terme IDF calcule à quel point un terme de la requête est rare dans l’ensemble de la collection de documents
N: nombre total de documents dans la collectionn(q_i): nombre de documents contenant le terme de requêteN - n(q_i): nombre de documents ne contenant pas le terme de requête- Les termes fréquents apparaissant dans de nombreux documents ont donc un effet plus faible sur le score
- Les termes rares, n’apparaissant que dans peu de documents, pèsent davantage dans le score
- Les
0.5et1de la formule jouent un rôle d’amortissement pour éviter que le résultat ne varie trop fortement lorsque le terme est très rare ou très fréquent
-
Fréquence du terme : tenir compte des répétitions sans les récompenser indéfiniment
- La fréquence du terme dans le document reflète la fréquence à laquelle un terme de requête donné apparaît dans un document donné
f(q_i, D): fréquence d’apparition du terme de requêteq_idans le documentDk1: paramètre de réglage généralement fixé entre1.2et2- BM25 tient compte des répétitions d’un terme dans le score, mais plus les répétitions augmentent, plus le gain de score supplémentaire diminue
k1contrôle la rapidité avec laquelle la récompense liée aux répétitions du terme diminue
-
Normalisation de la longueur du document : ajuster l’avantage des documents longs
- La normalisation de la longueur du document compare la longueur du document cible à la longueur moyenne des documents de la collection
|D|: longueur du document cibleavgdl: longueur moyenne des documents de la collectionb: paramètre de réglage contrôlant l’intensité de la normalisation par la longueur du document- Comme les documents plus longs que la moyenne ont plus de chances de contenir plus souvent le terme de recherche, ils sont pénalisés dans le dénominateur de la formule finale
- Si
b=0, la normalisation par la longueur du document est désactivée ; sib=1, elle est appliquée entièrement best généralement fixé à0.75
L’idée centrale de BM25
- BM25 repose sur le Probability Ranking Principle, mais il est presque impossible de calculer la vraie probabilité de pertinence d’un document
- Ce qui compte en recherche est davantage l’ordre des documents que la valeur exacte de probabilité ; BM25 rend donc le calcul praticable en supprimant de la formule les termes qui n’influencent pas l’ordre
- C’est pourquoi BM25 ne calcule pas une probabilité elle-même, mais une pondération
- Le Robertson/Sparck Jones Weight est une méthode qui estime une probabilité à partir du nombre de documents pertinents et du nombre de documents contenant un terme de requête
r: nombre de documents pertinents contenant le terme de requêteN: nombre total de documents dans la collectionR: nombre de documents pertinents dans la collectionn: nombre de documents contenant le terme de requête
- La grande limite de cette approche est qu’elle suppose de savoir à l’avance quels documents sont pertinents
L’hypothèse selon laquelle « la plupart des documents ne sont pas pertinents »
- Les créateurs de BM25 partent du principe que, pour une requête arbitraire, la plupart des documents ne sont pas pertinents
- Si l’on considère que le nombre de documents pertinents est négligeable, on peut poser
R = r = 0 - En substituant ces valeurs dans la formule du Robertson/Sparck Jones Weight, on obtient une forme presque identique au terme IDF utilisé dans BM25
- Comme BM25 ne demande pas d’informations préalables sur la pertinence tout en conservant le même fondement théorique, il devient beaucoup plus pratique
- Victor Lavrenko a qualifié cela de « very impressive leap of faith »
Portée de la comparaison des scores BM25
- Les scores BM25 sont généralement difficiles à comparer directement
- Ils ne produisent pas un score de probabilité entre 0 et 1
- BM25 n’est pas non plus un algorithme qui cherche à estimer la probabilité réelle qu’un document soit pertinent
- Il vise à approximer, au sein d’une collection donnée, l’ordre de probabilité de pertinence des documents pour une requête
- Un score BM25 plus élevé indique qu’un document a plus de chances d’être pertinent, mais ce n’est pas une probabilité réelle de pertinence
- Pour un même document dans une même collection de documents, il est possible de comparer les scores BM25 de plusieurs requêtes
- Comme BM25 additionne les scores de chaque terme de requête, on peut considérer qu’il n’y a pas de différence sémantique entre comparer les scores de deux termes de requête et comparer les scores de deux requêtes complètes
- La contrainte importante est : même document, même collection
- BM25 utilise l’IDF et la longueur moyenne des documents au sein de la collection
- Si la collection change, les scores peuvent changer eux aussi ; la comparaison des scores dans le temps n’est donc pas garantie
- Dans un flux de contenu personnalisé, on peut lancer une recherche plein texte pour chaque centre d’intérêt utilisateur et comparer les scores BM25 afin de déterminer quel contenu correspond le mieux à quel centre d’intérêt
Pour aller plus loin
- Pour approfondir la théorie et l’histoire de BM25, on peut regarder la présentation de 2016 de Britta Weber, ingénieure chez Elastic, Improved Text Scoring with BM25
- The Probabilistic Relevance Framework: BM25 and Beyond, de Stephen Robertson et Hugo Zaragoza, traite du cadre probabiliste de pertinence de BM25
- Une comparaison entre BM25 et d’autres algorithmes de recherche plein texte est disponible dans Comparing full text search algorithms: BM25, TF-IDF, and Postgres
1 commentaires
Avis sur Hacker News
J’utilise https://typesense.org/ pour la recherche classique, et comme il prend désormais aussi en charge la recherche hybride, je me demande si certains l’ont essayé
Ça fait plaisir de voir Typesense mentionné ici ; il convient souvent très bien aux petits projets RAG, mais il reste étonnamment peu connu
Il est facile à déployer, ses valeurs par défaut sont raisonnables, la documentation est bonne et le clustering est assez simple ; et quand il faut aller plus loin, il reste suffisamment performant et puissant
En revanche, si l’on utilise un fournisseur externe pour le modèle d’embeddings, la latence dépasse les 500 ms, ce qui est absurdement élevé ; mieux vaut donc l’héberger soi-même dans le cluster
La qualité de la recherche hybride est bonne, mais les options de réglage sont très limitées, et les scores restent assez opaques en dehors du classement à l’intérieur de l’ensemble de résultats
Avec les progrès récents de la recherche sémantique vectorielle, je me demande quelle est aujourd’hui la stack de recherche moderne utilisée pour l’hybride mots-clés + recherche sémantique
Récemment, nous avons reçu environ 3 millions de réponses à une enquête comportant chacune une dizaine de champs en texte libre, et nous devions identifier les éléments sur lesquels l’entreprise devait agir
En utilisant quelques petits modèles de classification, en supprimant manuellement des mots fréquents après avoir observé le bruit apparu dans les 10 000 premiers enregistrements, puis en pondérant les réponses des modèles, cela a fonctionné presque parfaitement
Ce genre de travail relève moins de la « programmation » que de l’ajustement des sorties en boîte noire de divers outils jusqu’à ce qu’elles paraissent bonnes aux tests et aux clients
Pour info, nous avons chaîné plusieurs petits modèles Hugging Face avec Node.js sur un petit serveur
Les résultats sont généralement combinés avec la fusion réciproque des rangs (RRF)
L’article sur RRF est étonnamment simple, ce qui est impressionnant, et il ne fait que 2 pages : https://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf
Pour les tâches de type BM25, Elasticsearch ; pour une recherche vectorielle simple et rapide, Turbopuffer ; pour précalculer les résultats de certaines requêtes ou gérer des attributs dynamiques qui changent souvent, comme les prix, Redis peut aussi convenir
À mon avis, il vaut mieux combiner tout cela avec une approche scatter/gather
En dehors de la stack de recherche, il y a presque toujours une couche de services d’inférence pour le reranking, idéalement un service simple comparable au reste de l’infrastructure de machine learning
Il faut aussi presque toujours router les requêtes utilisateur en les comprenant : par exemple envoyer une « recherche par ID » vers un système, et une « recherche sémantique floue » vers un autre
Leurs structures de données sont très différentes, et la recherche couvre en général un large éventail de cas d’usage distincts
Essayer de tout faire entrer dans un seul système est, à mon sens, un anti-pattern
Chaque système correspond à des charges de travail différentes, et les fonctions d’inférence intégrées ont du mal à suivre le rythme des outils de machine learning généraux auxquels les ingénieurs ML sont habitués
J’ai essayé avec Elasticsearch Learning to Rank, mais c’était une impasse
Cela dit, parmi les tentatives de couvrir un large éventail de cas d’usage avec une seule stack, Vespa est probablement la meilleure
En tant qu’auteur de txtai, txtai implémente en Python un index BM25 performant via le package arrays, et stocke les vecteurs de fréquence des termes dans SQLite
La méthode d’indexation hybride de txtai prend en charge une combinaison convexe lorsque les scores BM25 sont normalisés, et la fusion réciproque des rangs (RRF) lorsqu’ils ne le sont pas
[1] https://github.com/neuml/txtai
[2] https://neuml.hashnode.dev/building-an-efficient-sparse-keyw...
[3] https://neuml.hashnode.dev/benefits-of-hybrid-search
[4] https://github.com/neuml/txtai/blob/master/src/python/txtai/...
Elle utilise plusieurs techniques de recherche : recherche lexicale (bm25, recherche floue), recherche sémantique (embeddings), reranking (cross-encoder, fusion réciproque des rangs), ainsi que du reranking pour assurer la diversité et atténuer le phénomène de lost-in-the-middle
[1] Langroid - un framework LLM multi-agent créé par des chercheurs de CMU/UW-Madison https://github.com/langroid/langroid
[2] Implémentation de DocChatAgent -
https://github.com/langroid/langroid/blob/main/langroid/agen...
Il suffit de partir de la méthode answer_from_docs et de suivre le fil
Au passage, si vous êtes le fondateur de Kadoa, Kadoa-snack est l’un des outils que j’utilise volontiers au quotidien pour trouver des discussions HN liées aux LLM
Excellent article.
Pour ajouter un peu de contexte plus difficile à trouver, BM25 est l’abréviation de « Best Matching 25 », et « best matching » signifie qu’il s’agit d’une formule qui fait correspondre les termes de la requête avec ceux des documents afin d’établir un classement et de pondérer les termes.
Le 25 est simplement un numéro de série : il y avait eu auparavant 24 variantes de la formule, puis d’autres ensuite, mais la numéro 25 fonctionnait le mieux et c’est celle qui a été publiée.
Elle a été conçue par Stephen Robertson et Karen Spärck Jones, connue pour l’IDF, et implémentée pour la première fois dans le système expérimental de recherche d’information OKAPI de Robertson.
Le système OKAPI a été benchmarké pendant plusieurs années lors de la TREC (Text Retrieval Conference) annuelle du NIST américain, qui ressemble assez à un « championnat du monde » international des méthodologies de moteurs de recherche.
Cela dit, l’objectif de cet événement est davantage la comparaison et l’apprentissage mutuel que la victoire ; il a lieu chaque année en novembre à Gaithersburg, dans le Maryland, et mérite d’être recommandé.
Outre le modèle d’espace vectoriel en « sac de mots » (vecteurs creux de termes) et les modèles probabilistes auxquels appartient BM25, il existe un nombre étonnamment grand, et toujours croissant, de cadres théoriques pour classer un ensemble de documents étant donnée une requête.
Par exemple, la divergence from randomness, la modélisation statistique du langage, le Learning to Rank, la recherche d’information quantique et le ranking neuronal.
Dans des conférences comme ICTIR ou SIGIR, il arrive encore aujourd’hui que des paradigmes de recherche entièrement nouveaux apparaissent.
Ici, « modélisation statistique du langage » ne désigne pas les grands modèles de langage à la mode aujourd’hui ; ceux-ci relèvent plutôt de la catégorie de la « recherche neuronale ».
Par ailleurs, si vous cherchez « Quantum IR », vous risquez de tomber non pas sur un tutoriel de recherche d’information quantique, mais sur de la spectroscopie infrarouge ou sur une cimenterie du même nom.
Même au XXIe siècle, la technologie de recherche comporte ce genre de subtilités.
Si vous voulez comparer directement BM25 à ses alternatives, je recommande Terrier, un moteur de recherche open source et une plateforme de recherche développés par l’University of Glasgow.
BM25 a plus de 25 ans, mais il s’est encore imposé comme une baseline difficile à dépasser, et il est souvent utilisé comme point de référence pour comparer de nouvelles méthodes.
Une variante plus récente, BM24F, peut gérer plusieurs champs comme le titre, le corps du texte et les hyperliens, ainsi que l’hypertexte.
L’article recommandé est Spärck Jones, K.; Walker, S.; Robertson, S. E. (2000). « A probabilistic model of information retrieval: Development and comparative experiments: Part 1 ». Information Processing & Management 36(6): 779–808, ainsi que la Part 2 qui suit.
Malheureusement, il n’est pas en open access.
Il a commencé le 18 et se termine le 22.
Plus de détails : https://trec.nist.gov/
Même en cherchant sur Google et Google Scholar, je n’ai rien trouvé de pertinent.
Un peu honteux, mais je fais ma pub : https://github.com/jankovicsandras/plpgsql_bm25
https://github.com/jankovicsandras/bm25opt
https://github.com/softwaredoug/searcharray
J’en profite aussi pour promouvoir BM25S de Xing Han Lu, très populaire et avec un objectif similaire.
https://github.com/xhluca/bm25s
Je me demande s’il existe un projet wrapper en pur Python pour gérer beaucoup de textes et de documents PDF.
J’avais pensé à Solr ou ElasticSearch, mais cela semble trop lourd pour ce que je veux faire maintenant.
Comme SQLite utilise BM25, j’envisage d’utiliser pysqlite3 avec PyPDF2.
C’est un peu hors sujet, mais je pense que beaucoup de gens cherchent des outils pour créer des applications hybrides BM25 / stockage vectoriel / LLM.
Je me demande si la longueur moyenne des documents mentionnée dans la normalisation de la longueur des documents est la médiane.
Pour réduire correctement le poids des documents excessivement longs, il me semble que cela devrait être la médiane ; sinon, les documents trop longs ne tirent-ils pas indûment la moyenne vers le haut ?
Utiliser la médiane serait aussi une expérience intéressante.
Je me demande si vous connaissez un dataset de recherche où les longueurs de documents varient énormément.
Par exemple, MSMarco a des longueurs plutôt régulières.
Excellent article.
J’aimerais vraiment apprendre à penser ce genre de problème sous une forme mathématique et à le tester ; auriez-vous des ressources à recommander ?
La recherche hybride résout le vieux problème de la pertinence des résultats de recherche.
En utilisant une fusion des classements entre mots-clés et vecteurs, on peut construire une recherche hybride qui fonctionne dans la plupart des situations.
BM25 est un ancien algorithme développé dans les années 1970
À la base, c’est un modèle statistique assez rudimentaire, et les statisticiens d’aujourd’hui peuvent faire bien mieux
Je pense que la recherche est strictement dominée par les méthodes fondées sur l’apprentissage
Bien sûr, l’apprentissage peut utiliser la recherche comme entrée
Beaucoup de gens ne l’ont pas encore compris, ou ont intérêt à maintenir les anciennes technologies aussi longtemps que possible, mais la pression du marché finira par changer les choses
N’est-ce pas à cause de cette technologie qu’on se retrouve à ajouter “+reddit” à chaque requête pour éviter la guerre du SEO hostile ?
Ce n’est pas parce que c’est ancien que c’est mauvais
Il faut juger l’utilité d’une invention, d’une découverte ou d’une technique plutôt que son âge ; cette étrange attitude techniciste obsédée par l’âge m’inquiète
Quelles approches statistiques modernes précises considères-tu comme suffisamment supérieures pour remplacer BM25 dans des applications réelles ?
Je suis particulièrement curieux de savoir comment elles gèrent les cas limites que BM25 cherchait explicitement à traiter, comme les termes rares et la normalisation de la longueur des documents
Je suis d’accord pour dire que les approches fondées sur l’apprentissage ont donné des résultats impressionnants, mais j’aimerais aussi comprendre plus précisément ce que signifie dire que la recherche est « strictement dominée » par les méthodes d’apprentissage
Parles-tu de benchmarks spécifiques, ou de cas d’exploitation en production ?
Je pense que beaucoup de spécialistes de la recherche ne seraient pas d’accord
Un excellent podcast de David Tippet (ex-OpenSearch, aujourd’hui chez Github) et Nicolay Gerold porte ce titre :
“BM25 is the workhorse of search; vectors are its visionary cousin”
https://www.youtube.com/watch?v=ENFW1uHsrLM
Dans le domaine de la recherche, j’ai vu passer quantité de modes et de technologies liées à l’IA tout au long de ma carrière
En ce moment, des entreprises de recherche vectorielle massivement financées par le capital-risque poussent un certain point de vue avec des armées d’évangélistes techniques
À l’inverse, chez Google et ailleurs, la quantité de curation manuelle et de taxonomies basiques, ennuyeuses et faites à la main qui font réellement fonctionner la « recherche sémantique » est énorme
C’est juste que ce n’est pas sexy, donc on en parle peu dans les conférences