Aller au contenu principal

La recuperation contextuelle

La recuperation contextuelle ameliore la precision du RAG en resolvant un probleme fondamental : quand on decoupe un document en segments, chaque segment perd sa connexion au contexte global.

Le principe

Avant d’inserer les segments dans la base de donnees, on ajoute une etape de preprocessing :

  1. Prendre chaque segment et le document source complet
  2. Demander a Claude d’ajouter du contexte
  3. Claude genere un court texte situant le segment dans le document global
  4. Combiner ce contexte avec le segment original pour creer un “segment contextualise”
  5. Utiliser le segment contextualise dans les index

Gerer les gros documents

Si le document source est trop volumineux pour le contexte de Claude, fournissez un contexte reduit :

  • Quelques segments du debut du document (souvent des resumes)
  • Les segments juste avant le segment a contextualiser

Implementation

def add_context(text_chunk, source_text):
    prompt = f"""
Ecris un court extrait pour situer ce segment dans le document global,
afin d'ameliorer la recuperation lors de la recherche.

<document>
{source_text}
</document>

<chunk>
{text_chunk}
</chunk>

Reponds uniquement avec le contexte succinct.
"""
    messages = []
    add_user_message(messages, prompt)
    result = chat(messages)
    return result["text"] + "\n" + text_chunk

Strategie pour les gros documents

num_start_chunks = 2
num_prev_chunks = 2

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

Quand l’utiliser

  • Documents avec des relations internes complexes entre sections
  • Segments faisant reference a des concepts definis ailleurs
  • Documents techniques, rapports, articles academiques