Aller au contenu principal

Re-ranking des résultats de recherche

Mis à jour le 30 juillet 2026

La recherche hybride (vecteurs + BM25) que nous avons construite fonctionne bien, mais elle a ses limites. Par exemple, pour une requête comme “qu’a fait l’équipe engineering avec l’incident INC-2023-Q4-011 ?”, on s’attendrait à voir la section ingénierie logicielle en premier — puisqu’elle mentionne explicitement l’équipe et l’incident. Pourtant, le système actuel peut renvoyer la section cybersécurité en tête.

C’est là que le re-ranking entre en jeu : une étape supplémentaire de post-traitement qui améliore la pertinence des résultats.

Comment fonctionne le re-ranking

Le principe est simple. Après avoir exécuté la recherche vectorielle et BM25 puis fusionne les résultats, on ajoute une étape finale : on envoie les résultats à Claude pour qu’il les reordonne intelligemment.

Le processus se déroule ainsi :

  1. On récupère les résultats fusionnés de la recherche hybride
  2. On les envoie à Claude avec la question originale de l’utilisateur
  3. On demande à Claude de renvoyer les documents les plus pertinents, triés par ordre décroissant de pertinence
  4. On utilise cette liste reordonnee comme résultat final

Le prompt de re-ranking

La structure du prompt est directe. On fournit à Claude la question de l’utilisateur et tous les documents potentiellement pertinents, puis on lui demande de faire le tri :

You are tasked with finding the documents most relevant to a user's question.

<user_question>
What happened with INC-2023-Q4-011?
</user_question>

Here are documents that may be relevant:
<documents>
<document>Section 10...</document>
<document>Section 2...</document>
<document>Section 7...</document>
<document>Section 6...</document>
</documents>

Return the 3 most relevant docs, in order of decreasing relevance.

Optimisation avec des identifiants

Un point important en termes d’efficacité : si on demande à Claude de renvoyer le texte complet de chaque chunk pertinent, on lui fait essentiellement recopier de gros blocs de texte. C’est lent et coûteux en tokens.

La meilleure approche consiste à attribuer un identifiant unique à chaque chunk en amont, puis à demander à Claude de renvoyer uniquement ces identifiants dans le bon ordre :

<documents>
<document>
<id>ab84</id>
<content>Section 10...</content>
</document>
<document>
<id>51n3</id>
<content>Section 8...</content>
</document>
</documents>

Claude renvoie alors une simple liste comme ["1p5g", "51n3", "ab83"] au lieu de recopier des paragraphes entiers.

Implémentation

La fonction de re-ranking est appelée automatiquement par le retriever une fois la recherche hybride terminée. Voici la structure de base :

def reranker_fn(docs, query_text, k):
    # Formater les documents avec leurs identifiants
    joined_docs = "\n".join([
        f"""
        <document>
        <document_id>{doc["id"]}</document_id>
        <document_content>{doc["content"]}</document_content>
        </document>
        """
        for doc in docs
    ])

    # Créer le prompt et obtenir la réponse de Claude
    prompt = f"""..."""
    messages = []
    add_user_message(messages, prompt)
    add_assistant_message(messages, """```json""")

    result = chat(messages, stop_sequences=["""```"""])

    return json.loads(result["text"])["document_ids"]

Notez l’astuce du pré-remplissage : on commence la réponse de l’assistant par ```json et on utilise ``` comme séquence d’arrêt. Cela force Claude à produire directement du JSON valide sans texte superflu.

Résultats

En testant avec la requête “qu’a fait l’équipe engineering avec INC-2023-Q4-011 ?”, la section ingénierie logicielle apparaît désormais en premier. Claude à compris que la question portait spécifiquement sur l’équipe d’ingénierie et sa relation avec l’incident.

Compromis à considérer

Le re-ranking implique des compromis clairs :

  • Latence accrue : il faut attendre un appel API supplémentaire à Claude
  • Précision améliorée : Claude comprend le contexte et la pertinence d’une manière que la simple similarité vectorielle ne peut pas egaler

Pour la plupart des applications, le gain en précision justifie le coût en latence — surtout pour des requêtes complexes ou la compréhension sémantique prime sur la correspondance de mots-clés.

Exercice pratique

Essayez d’implémenter un re-ranker sur votre propre pipeline RAG :

  1. Partez de votre recherche hybride existante
  2. Ajoutez des identifiants uniques à vos chunks
  3. Écrivez le prompt de re-ranking avec la technique du pré-remplissage JSON
  4. Comparez les résultats avec et sans re-ranking sur 5 requêtes différentes
  5. Mesurez la différence de latence