Aller au contenu principal

Pipeline RAG multi-index

Quand la recherche semantique et BM25 fonctionnent independamment, l’etape suivante est de les combiner en un pipeline unifie.

Reciprocal Rank Fusion (RRF)

Les deux methodes utilisent des systemes de scores differents (similarite cosinus vs scores de pertinence). On ne peut pas simplement additionner les nombres. Le RRF se base sur la position dans le classement plutot que sur les scores bruts.

Exemple

Recherche vectorielle retourne : sections 2, 7, 6 BM25 retourne : sections 6, 2, 7

Formule RRF : RRF_score(d) = sum(1 / (k + rank_i(d)))

Avec k=1 :

  • Section 2 : 1/(1+1) + 1/(1+2) = 0.833
  • Section 7 : 1/(1+2) + 1/(1+3) = 0.583
  • Section 6 : 1/(1+3) + 1/(1+1) = 0.75

Classement final : Section 2, Section 6, Section 7.

Implementation du Retriever

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):
        all_results = [index.search(query_text, k) for index in self._indexes]
        # Logique de fusion RRF...

Avantages de l’architecture hybride

  • Design modulaire : chaque index est independant
  • Extensibilite : ajoutez de nouveaux index en implementant la meme interface
  • Meilleure precision : combine comprehension semantique et correspondance de mots-cles
  • Fusion flexible : le RRF fonctionne quel que soit le nombre d’index