Reranking des résultats
La recherche hybride marche bien, mais il reste des aspérités. Avec un terme précis ou une abréviation, l’ordre des résultats n’est pas toujours le bon : « Qu’a fait l’équipe d’ingénierie au sujet de INC-2023-Q4-011 ? » peut remonter la section de cybersécurité en premier, alors que celle d’ingénierie logicielle répond mieux. Le reranking ajoute une dernière étape : demander à Claude de remettre les résultats dans l’ordre.
Le principe
- Lancer la recherche hybride, avec un peu plus de candidats que nécessaire.
- Envoyer à Claude la question et ces candidats.
- Lui demander les plus pertinents, du plus au moins pertinent.
Une astuce d’efficacité, donnée par le cours officiel : ne pas faire recopier les textes. On donne un identifiant à chaque morceau, et Claude ne renvoie que la liste des identifiants. C’est bien plus rapide que de lui faire réécrire des sections entières.
L’implémentation
Le cours officiel extrait la liste par pré-remplissage et séquence d’arrêt, que Haiku 5.5 refuse. Nous utilisons les sorties structurées de la leçon 10, avec un appel converse direct :
import json
SCHEMA_RERANK = {
"type": "object",
"properties": {"document_ids": {"type": "array", "items": {"type": "string"}}},
"required": ["document_ids"],
"additionalProperties": False,
}
def rerank_with_claude(docs, query, k):
by_id = {f"doc{i}": doc for i, doc in enumerate(docs)}
joined = "\n".join(
f"<document>\n<document_id>{doc_id}</document_id>\n"
f"<document_content>\n{doc['content']}\n</document_content>\n</document>"
for doc_id, doc in by_id.items()
)
prompt = (
"Trouve les documents les plus pertinents pour répondre à la question de l'utilisateur.\n\n"
f"<documents>\n{joined}\n</documents>\n\n"
f"<user_question>\n{query}\n</user_question>\n\n"
f"Renvoie les identifiants des {k} documents les plus pertinents, du plus au moins pertinent."
)
response = client.converse(
modelId=model_id,
messages=[{"role": "user", "content": [{"text": prompt}]}],
outputConfig={
"textFormat": {
"type": "json_schema",
"structure": {"jsonSchema": {"schema": json.dumps(SCHEMA_RERANK), "name": "reranking"}},
}
},
)
content = response["output"]["message"]["content"]
ids = json.loads("".join(block["text"] for block in content if "text" in block))["document_ids"]
return [by_id[doc_id] for doc_id in ids if doc_id in by_id][:k]
Les documents passent avant la question, comme le conseille la leçon 20. La dernière ligne ignore un identifiant inventé et ne garde que k résultats : on ne fait pas une confiance aveugle à la liste reçue. Rappel de la leçon 10 : un nouveau schéma demande une compilation au premier appel, d’où le délai de lecture de 120 secondes.
query = "Qu'a fait l'équipe d'ingénierie au sujet de l'incident INC-2023-Q4-011 ?"
candidates = [doc for doc, _ in retriever.search(query, k=10)]
best = rerank_with_claude(candidates, query, k=3)
Claude comprend le contexte : une question sur l’équipe d’ingénierie doit faire passer la section d’ingénierie logicielle avant les autres sections qui citent l’incident.
Le compromis
Le reranking ajoute un appel à Claude, donc de la latence et un coût, à chaque question. En échange, il améliore nettement l’ordre des résultats. Bedrock propose aussi des modèles dédiés au reranking, plus rapides qu’un appel à Claude : Amazon Rerank 1.0 (amazon.rerank-v1:0) et Cohere Rerank 3.5 (cohere.rerank-v3-5:0), disponibles dans certaines régions seulement. Comparez-les sur vos questions.
À vous de jouer
Mesurer l’apport. Préparez cinq questions sur votre document, avec pour chacune la section qui y répond. Comptez combien de fois cette section arrive première avec le Retriever seul, puis avec le reranking. Mesurez aussi le temps de réponse ajouté.
Sources officielles : Reranking results (Claude Academy) · Supported Regions and models for reranking et Get validated JSON results from models (documentation AWS)
Points clés à retenir
- Le reranking demande à Claude de remettre dans l’ordre les candidats de la recherche hybride.
- Claude renvoie des identifiants, pas des textes : c’est plus rapide.
- Les sorties structurées remplacent le pré-remplissage du cours officiel.
- Vérifiez la liste reçue : identifiants connus seulement,
krésultats au plus. - Un appel de plus à chaque question : comparez avec les modèles de reranking de Bedrock.