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 :
- Prendre chaque segment et le document source complet
- Demander a Claude d’ajouter du contexte
- Claude genere un court texte situant le segment dans le document global
- Combiner ce contexte avec le segment original pour creer un “segment contextualise”
- 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