Aller au contenu principal

Recuperation contextuelle

La recuperation contextuelle (contextual retrieval) est une technique qui ameliore la precision d’un pipeline RAG en s’attaquant a un probleme fondamental : quand on decoupe un document en chunks, chaque morceau perd son lien avec le contexte global du document.

Le probleme du chunking classique

Quand on prend un document source et qu’on le decoupe en morceaux pour les stocker dans une base vectorielle, chaque chunk ne sait plus d’ou il vient ni comment il se rattache au reste. Cela degrade la qualite de la recuperation, car les chunks manquent d’informations contextuelles essentielles.

Par exemple, un chunk qui parle d’un “incident de 2023” sans preciser qu’il s’agit d’un rapport annuel interdisciplinaire sera plus difficile a retrouver pour une requete sur ce rapport.

Comment ca marche

La recuperation contextuelle ajoute une etape de pre-traitement avant l’insertion des chunks dans la base de donnees. Voici le processus :

  1. Prendre chaque chunk individuel et le document source original
  2. Envoyer les deux a Claude avec un prompt specifique
  3. Demander a Claude de rediger un court paragraphe qui situe le chunk dans le contexte global du document
  4. Combiner ce contexte avec le chunk original pour creer un “chunk contextualise”
  5. Indexer ce chunk contextualise dans les index vectoriel et BM25

Le prompt demande a Claude d’analyser le chunk et d’ecrire un contexte explicatif. Par exemple, pour une section sur l’ingenierie logicielle mentionnant un incident de 2023, Claude pourrait generer : “Ce chunk est la Section 2 d’un rapport annuel interdisciplinaire, detaillant les efforts de l’equipe logicielle pour resoudre des problemes de stabilite sur le Projet Phoenix…”

Gerer les documents volumineux

Un probleme courant survient quand le document source est trop long pour tenir dans un seul prompt. Dans ce cas, on fournit un sous-ensemble reduit du contexte au lieu du document entier.

La strategie consiste a inclure :

  • Quelques chunks du debut du document (qui contiennent souvent des resumes ou des introductions)
  • Les chunks immediatement precedents par rapport au chunk qu’on contextualise
  • On saute les chunks du milieu qui sont moins pertinents pour le chunk courant

Cette approche donne a Claude assez de contexte pour comprendre de quoi parle le document et comment le chunk s’y insere, sans surcharger le prompt.

Implementation

Voici la fonction de base pour ajouter du contexte a un chunk individuel :

def add_context(text_chunk, source_text):
    prompt = """
    Write a short and succinct snippet of text to situate this chunk within the
    overall source document for the purposes of improving search retrieval of the chunk.

    Here is the original source document:
    <document>
    {source_text}
    </document>

    Here is the chunk we want to situate within the whole document:
    <chunk>
    {text_chunk}
    </chunk>

    Answer only with the succinct context and nothing else.
    """

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

    # Le contexte genere est prepend au chunk original
    return result["text"] + "\n" + text_chunk

Pour traiter plusieurs chunks avec un contexte limite (documents volumineux) :

# Ajouter du contexte a chaque chunk, puis l'inserer dans le retriever
num_start_chunks = 2   # Chunks du debut du document
num_prev_chunks = 2    # Chunks precedant le chunk courant

for i, chunk in enumerate(chunks):
    context_parts = []

    # Chunks du debut du document (resumes, introductions)
    context_parts.extend(chunks[: min(num_start_chunks, len(chunks))])

    # Chunks juste avant le chunk courant
    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})

Resultats attendus

Avec cette technique, les resultats de recherche incluent a la fois le contexte genere et le contenu original du chunk. Ce contexte aide le systeme de recuperation a mieux comprendre le sujet de chaque chunk et sa relation avec le document global.

Cette technique est particulierement precieuse pour les documents complexes ou les sections individuelles contiennent de nombreuses interconnexions et references a d’autres parties. Le contexte ajoute garantit que les chunks pertinents sont retrouves meme quand la requete de recherche ne correspond pas exactement au texte original du chunk.

Exercice pratique
  1. Prenez un document long (rapport, article scientifique) et decoupez-le en chunks de 500 tokens
  2. Implementez la fonction add_context avec Claude
  3. Comparez la qualite de la recherche avec et sans contextualisation sur 10 requetes
  4. Experimentez avec differentes valeurs de num_start_chunks et num_prev_chunks
  5. Mesurez le cout additionnel en tokens API pour la phase de pre-traitement