Aller au contenu principal

Retrieval contextuel

Mis à jour le 30 juillet 2026

Dernière amélioration du pipeline, et l’une des plus rentables : le retrieval contextuel. Cette technique améliore la précision du RAG en résolvant un problème fondamental, présent depuis la toute première leçon de découpage : quand vous découpez un document en chunks, chaque chunk perd sa connexion avec le contexte global. « Le chiffre a doublé par rapport à l’année précédente » — quel chiffre ? quelle année ? Le paragraphe le savait dans le document ; isolé dans l’index, il ne le sait plus, et aucune recherche ne le retrouvera sur les bons termes.

Le principe

La réparation se fait avant l’indexation. Après le découpage, vous demandez à Claude d’ajouter du contexte à chaque chunk avant de le stocker dans votre base de retrieval. Cette étape de prétraitement « situe » chaque chunk dans le document global — les pronoms retrouvent leurs référents, les sujets implicites redeviennent explicites.

Comment ça fonctionne

Pour chaque chunk, envoyez le chunk et le document original à Claude avec ce prompt :

Ecrivez un court extrait de texte pour situer ce chunk dans le contexte
du document source global, afin d'ameliorer le retrieval de ce chunk.

Voici le document source original :
<document>
{source_text}
</document>

Voici le chunk a situer dans le document :
<chunk>
{text_chunk}
</chunk>

Repondez uniquement avec le contexte succinct et rien d'autre.

Claude pourrait générer : « Cette section est extraite d’un rapport plus large sur un groupe interdisciplinaire. Elle mentionne INC-2023-04-011, également mentionné dans la section Analyse Cybersécurité. » Regardez ce que cette phrase apporte aux deux moteurs à la fois : des termes exacts pour BM25 (l’identifiant, les noms de sections) et du sens explicite pour les embeddings. Vous combinez ensuite ce contexte généré avec le texte original du chunk pour créer un « chunk contextualisé », stocké dans vos index vectoriel et BM25 — c’est ce couple, jamais le chunk nu, qui est indexé.

Gérer les grands documents

Un obstacle pratique surgit vite : « envoyer le document original » suppose qu’il tienne dans le prompt de contextualisation. Si le document source est trop grand, fournissez un ensemble réduit de contexte :

  • Quelques chunks du début du document (souvent des résumés)
  • Les chunks immédiatement avant le chunk cible (contexte local)

L’intuition est documentaire : l’ouverture d’un rapport pose le cadre général — titre, résumé exécutif —, et les chunks qui précèdent portent le fil local. Ce condensé suffit à situer correctement la plupart des passages, à une fraction du coût.

Implémentation

def add_context(text_chunk, source_text):
    prompt = f"""
    Ecrivez un court extrait pour situer ce chunk dans le document source.

    <document>
    {source_text}
    </document>

    <chunk>
    {text_chunk}
    </chunk>

    Repondez uniquement avec le contexte succinct.
    """

    messages = []
    add_user_message(messages, prompt)
    result = chat(messages)

    return result["text"] + "\n" + text_chunk

La dernière ligne fait l’assemblage : le contexte généré (extrait du champ text que renvoie notre fonction chat), un saut de ligne, puis le chunk original intact. Boucle de traitement :

for i, chunk in enumerate(chunks):
    context_parts = []
    context_parts.extend(chunks[:min(num_start_chunks, len(chunks))])

    start_idx = max(0, i - num_prev_chunks)
    context_parts.extend(chunks[start_idx:i])

    context = "\n".join(context_parts)
    contextualized_chunk = add_context(chunk, context)
    retriever.add_document({"content": contextualized_chunk})

La boucle applique la stratégie du contexte réduit : chunks de tête plus chunks précédents, avec les gardes min/max pour les bords du document. Et regardez la dernière ligne : le chunk contextualisé rejoint le Retriever des leçons précédentes — le retrieval contextuel s’empile naturellement sur la recherche hybride et le reranking, sans en modifier une ligne.

Le coût du dispositif est explicite — un appel à Claude par chunk, une seule fois, à l’indexation — pour un bénéfice permanent : le système de retrieval comprend non seulement le contenu de chaque chunk, mais aussi sa place dans la structure du document et ses relations avec les autres sections. L’amélioration devient de plus en plus significative à mesure que les documents deviennent complexes — c’est sur les rapports denses aux sections entrelacées qu’elle creuse l’écart.

Points clés à retenir

  • Le découpage ampute chaque chunk de son contexte — la contextualisation le restitue avant indexation
  • Claude génère une phrase de situation ; c’est le couple contexte + chunk qui entre dans les index
  • Le contexte généré nourrit les deux moteurs : termes exacts pour BM25, sens explicite pour les embeddings
  • Grands documents : contexte réduit = chunks de tête (résumés) + chunks précédents
  • Un appel par chunk à l’indexation, bénéfice à chaque recherche — décisif sur les documents complexes