Guide
Recherche hybride RAG : BM25 et vectorielle combinées
Pourquoi combiner recherche plein texte (BM25) et vectorielle dans un RAG, comment fusionner les résultats et avec quels outils.
Mis à jour le
La recherche hybride lance, pour chaque question, deux recherches en parallèle : une recherche vectorielle, qui trouve les passages de même sens, et une recherche plein texte (le plus souvent l'algorithme BM25, qui classe les passages selon les mots de la question qu'ils contiennent), qui trouve les mots exacts. Les deux listes sont ensuite fusionnées. C'est souvent le premier gain facile d'un RAG qui ne s'appuyait que sur les vecteurs.
Pourquoi les vecteurs seuls ne suffisent pas
La recherche vectorielle compare le sens. Elle retrouve « résiliation du contrat » quand on demande « comment mettre fin à l'abonnement ». Mais elle est faible sur les chaînes exactes : un numéro de pièce, une référence d'article de loi, un code d'erreur. Anthropic, dans son article du 19/09/2024 sur la récupération contextuelle, prend l'exemple d'une demande d'assistance sur « Error code TS-999 » : les plongements peuvent manquer le code exact, BM25 le retrouve. LlamaIndex fait le même constat : les plongements peuvent manquer des passages qui contiennent justement les mots-clés recherchés.
| Type de question | Vectorielle | Plein texte (BM25) |
|---|---|---|
| Reformulée, synonymes | bonne | faible |
| Référence, code, numéro | faible | bonne |
| Nom propre rare | variable | bonne |
| Question vague, concept | bonne | faible |
Fusionner deux listes : RRF ou pondération
Les scores des deux recherches ne sont pas comparables entre eux : un score BM25 et une similarité cosinus ne vivent pas sur la même échelle. Deux façons de faire.
La fusion par rang réciproque (RRF, Reciprocal Rank Fusion). On ignore les scores et l'on ne garde que les rangs. Chaque document reçoit, pour chaque liste où il apparaît, 1 / (k + rang), et l'on additionne. La méthode vient d'un article de Cormack, Clarke et Büttcher présenté à SIGIR, conférence internationale consacrée à la recherche d'information, du 19/07/2009 au 23/07/2009 à Boston. Les auteurs ont fixé k = 60 lors d'essais préliminaires et notent que ce choix n'était « pas critique ». Avantage : aucun réglage, aucune normalisation.
La fusion pondérée des scores. On normalise les scores de chaque liste, puis on les combine avec un poids. Weaviate, par exemple, expose un paramètre alpha : selon sa documentation, alpha = 1 donne une recherche purement vectorielle, alpha = 0 une recherche purement par mots-clés, et la fusion par scores relatifs (relativeScoreFusion) y est la méthode par défaut depuis la version 1.24. Plus fin, mais il faut régler le poids.
Exemple de calcul RRF (illustratif)
Un passage arrive 1er en recherche vectorielle et 3e en plein texte. Avec k = 60 : 1/61 + 1/63 ≈ 0,0164 + 0,0159 = 0,0323. Un autre passage n'apparaît qu'en recherche vectorielle, 2e : 1/62 ≈ 0,0161. Le premier passe devant : il a été trouvé par les deux méthodes.
Où la faire tourner
- PostgreSQL avec pgvector. Le dépôt pgvector indique qu'on peut l'utiliser avec la recherche plein texte de PostgreSQL pour faire de la recherche hybride, et renvoie à des exemples de fusion par RRF ou par cross-encoder. Sa requête plein texte d'exemple utilise
plainto_tsqueryetts_rank_cd. Intérêt pour une petite ou moyenne entreprise : une seule base, celle que vous avez peut-être déjà. - Bases vectorielles avec hybride intégré. Weaviate le propose nativement (paramètre
alphaci-dessus). LlamaIndex prévoit les deux voies : passer par une base vectorielle qui fait l'hybride, ou monter une recherche BM25 locale.
Le choix de la base vectorielle elle-même est un sujet à part ; ici, retenez seulement de vérifier qu'elle sait filtrer par métadonnées pendant la recherche hybride, pour les droits d'accès.
Ce que la recherche hybride a apporté dans un essai publié
Dans les essais d'Anthropic, ajouter une recherche BM25 aux plongements contextualisés a fait passer la réduction des échecs de récupération (sur les 20 premiers résultats) de 35 % à 49 %, et à 67 % avec un tri supplémentaire. Ces chiffres valent pour leurs jeux de données ; seuls vos propres essais diront ce qu'il en est chez vous (voir Évaluer un RAG).
Mise en place pas à pas
- Gardez le texte brut de chaque passage dans l'index, pas seulement son vecteur.
- Ajoutez un index plein texte avec la bonne langue (le français n'a pas les mêmes racines de mots que l'anglais).
- Lancez les deux recherches en demandant plus de résultats que vous n'en donnerez au modèle (Anthropic en récupère 150 avant tri).
- Fusionnez par RRF pour commencer : rien à régler.
- Passez la liste fusionnée à un modèle de tri, puis gardez les meilleurs passages pour le modèle.
Questions fréquentes
Qu'est-ce que la constante k = 60 dans la fusion RRF ?
C'est la valeur fixée par les auteurs de la méthode, Cormack, Clarke et Büttcher, lors de leurs essais publiés à la conférence SIGIR 2009. Elle atténue le poids des tout premiers rangs.
La recherche hybride est-elle toujours meilleure ?
Non garanti : elle aide surtout quand les questions contiennent des termes exacts (références, codes, noms propres). Mesurez-la sur vos propres questions.
Sources
Pages consultées pour écrire cet article :