Pipeline RAG multi-recherche
Quand la recherche semantique (embeddings vectoriels) et la recherche lexicale (BM25) fonctionnent independamment, l’etape suivante est de les combiner dans un pipeline de recherche unifie.
Interface unifiee
Les deux implementations partagent des API quasi-identiques (add_document() et search()). Cela permet de les encapsuler dans une seule classe Retriever qui coordonne entre les deux approches :
- Recevoir la question de l’utilisateur
- La transmettre au VectorIndex et au BM25Index
- Collecter les resultats des deux systemes
- Fusionner les resultats avec un algorithme de classement
Reciprocal Rank Fusion (RRF)
Le defi : fusionner des resultats de methodes de recherche differentes. Chaque systeme renvoie des resultats avec des mecanismes de notation differents, donc les scores ne sont pas combinables directement. La technique utilisee : Reciprocal Rank Fusion (RRF).
Fonctionnement du RRF
Supposons que le VectorIndex renvoie : Section 2, Section 7, Section 6. Le BM25Index renvoie : Section 6, Section 2, Section 7.
La formule RRF calcule un score pour chaque document :
RRF_score(d) = sum(1 / (k + rank_i(d)))
Ou k est une constante (typiquement 60) et rank_i(d) est le rang du document dans le i-eme systeme.
Exemple avec k=1 :
- Section 2 : 1/(1+1) + 1/(1+2) = 0.833
- Section 6 : 1/(1+3) + 1/(1+1) = 0.750
- Section 7 : 1/(1+2) + 1/(1+3) = 0.583
Classement final : Section 2 (1er), Section 6 (2e), Section 7 (3e).
Implementation
class Retriever:
def __init__(self, *indexes):
self._indexes = list(indexes)
def add_document(self, document):
for index in self._indexes:
index.add_document(document)
def search(self, query_text, k=1, k_rrf=60):
# Obtenir les resultats de tous les index
# Calculer les scores RRF
# Renvoyer les resultats fusionnes et tries
Extensibilite
La modularite du design permet d’ajouter facilement de nouvelles methodologies de recherche. Tant qu’un index implemente add_document() et search(), il s’integre naturellement dans le pipeline hybride.
L’approche hybride combine la comprehension semantique de la recherche vectorielle avec la precision de la correspondance de mots-cles, le tout unifie par l’algorithme RRF mathematiquement solide.