Aller au contenu principal

Retrieval contextuel

Le retrieval contextuel est une technique qui ameliore la precision du pipeline RAG en resolvant un probleme fondamental : quand vous decoupez un document en chunks, chaque chunk perd sa connexion avec le contexte global du document.

Le principe

Apres le decoupage, vous demandez a Claude d’ajouter du contexte a chaque chunk avant de le stocker dans votre base de retrieval. Cette etape de pretraitement aide a “situer” chaque chunk dans le document global.

Comment ca fonctionne

Pour chaque chunk, envoyez le chunk et le document original a 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 generer : “Cette section est extraite d’un rapport plus large sur un groupe interdisciplinaire. Elle mentionne INC-2023-04-011, egalement mentionne dans la section Analyse Cybersecurite.”

Vous combinez ensuite ce contexte genere avec le texte original du chunk pour creer un “chunk contextualise” stocke dans vos index vectoriel et BM25.

Gerer les grands documents

Si le document source est trop grand pour tenir dans un seul prompt, fournissez un ensemble reduit de contexte :

  • Quelques chunks du debut du document (souvent des resumes)
  • Les chunks immediatement avant le chunk cible (contexte local)

Implementation

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

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})

Le contexte additionnel aide le systeme de retrieval a comprendre non seulement le contenu de chaque chunk, mais aussi sa place dans la structure du document et ses relations avec les autres sections. L’amelioration devient de plus en plus significative a mesure que les documents deviennent plus complexes.