Context Engineering — Section 5 : Distillation
Réduire le bruit, garder la preuve. Maximiser le signal pour le LLM.
5. Compression : Moins de Bruit, Plus de Signal
- A. Panorama
- B. Ranking
- C. Compression Extractive
- D. Compression Abstractive
- E. Distillation
- F. Architecture
- G. Évaluation
- H. Pitfalls
- I. Snippets
- J. Playbook
Panorama : Le Fardeau du Contexte Brut
Injecter des documents entiers dans un prompt est la voie de la facilité, mais mène à des systèmes lents, coûteux et peu fiables. La compression et la distillation sont des étapes de pré-traitement qui visent à ne conserver que la "substantifique moelle" de l'information.
- Latence : Moins de tokens à traiter = réponse plus rapide.
- "Lost in the Middle" : Les LLMs ont tendance à oublier les informations situées au milieu d'un long contexte.
- Dépassement de Contexte : Éviter de dépasser la limite de la fenêtre du modèle (ex: 128k tokens).
- Distillation : Transformer l'information en un format structuré plus dense (extraire des faits clés, des citations). C'est une opération de transformation.
Étape 1 : Le Ranking, Prérequis Indispensable
On ne peut pas compresser efficacement du bruit. Avant toute chose, il faut s'assurer que les documents ou passages sur lesquels on travaille sont les plus pertinents possibles. Un bon ranking est 90% du travail.
| Technique de Ranking | Description | Idéal pour... |
|---|---|---|
| Retrieval Hybride | Combine la recherche par mot-clé (BM25) et la recherche sémantique (vecteurs). Fusion des scores avec Reciprocal Rank Fusion (RRF). | Le standard de fait pour un RAG robuste. |
| Cross-Encoders | Modèle Transformer qui ré-évalue la pertinence d'une paire (question, document). Lent mais très précis. | À utiliser sur le top 20-50 des résultats du retrieval hybride pour un classement final. |
| MMR (Maximal Marginal Relevance) | Algorithme qui optimise à la fois la pertinence par rapport à la question et la diversité entre les documents sélectionnés. | Éviter d'avoir 5 documents qui disent la même chose dans le top 5. |
Compression Extractive (Lossless)
Cette approche consiste à sélectionner et conserver des phrases ou des passages entiers des documents originaux, sans les modifier. C'est la méthode la plus sûre car elle n'introduit aucun risque d'hallucination.
- **Traçabilité Parfaite** : Chaque extrait est directement citable.
- **Manque de Cohérence** : Le texte final peut être décousu.
- **Basée sur des résumeurs extractifs** : Utiliser des algorithmes (TextRank, LexRank) pour identifier les phrases les plus "centrales" d'un document.
Compression Abstractive (Lossy)
Cette approche utilise un LLM pour réécrire et synthétiser l'information contenue dans les passages sources. C'est plus puissant, mais aussi plus risqué.
- **Cohérence** : Le texte généré est fluide et agréable à lire.
- **Latence & Coût** : Nécessite un appel LLM supplémentaire.
- **Température basse** : Utiliser une température de 0.0 ou 0.1 pour limiter la créativité.
Distillation : Extraire des Faits Structurés
La distillation est une forme de compression abstractive qui transforme le texte brut en données structurées (JSON). C'est le summum de la compression : on ne garde que les faits, débarrassés de toute prose.
{
"summary": "Le déploiement sur le cluster K8s requiert une authentification via le token JWT qui expire après 60 minutes.",
"key_facts": [
{
"fact": "L'authentification pour le déploiement se fait via un token JWT.",
"relevance_score": 0.95,
"citations": [
{ "doc_id": "doc-deploiement-k8s.md", "text": "...le client doit présenter un token JWT valide..." }
]
},
{
"fact": "La durée de vie du token JWT est de 60 minutes.",
"relevance_score": 0.88,
"citations": [
{ "doc_id": "doc-auth-policy.md", "text": "Tous les tokens d'accès ont un TTL fixé à 3600 secondes." }
]
}
]
}
Architecture & Pipeline de Compression
Un pipeline de compression robuste combine le ranking et plusieurs techniques de compression en cascade.
Évaluation de la Compression
Une compression trop agressive peut supprimer des informations vitales. Il faut donc la mesurer.
| Métrique | Description | Comment mesurer ? |
|---|---|---|
| Faithfulness (Fidélité) | Le contexte compressé (surtout abstrait) contredit-il les sources originales ? | Utiliser un LLM puissant (GPT-4, Claude 3 Opus) en tant que juge pour comparer chaque fait résumé à sa source. |
| Context Recall (Rappel) | Le contexte compressé contient-il toujours les informations nécessaires pour répondre à la question ? | Générer des réponses avec le contexte brut et le contexte compressé. Comparer la qualité des réponses. |
| Compression Ratio | Quel est le gain en termes de tokens ? | `1 - (tokens_après_compression / tokens_avant_compression)`. Viser un ratio de 50-80%. |
Pièges & Erreurs à Éviter
Ajouter une étape de compression abstractive (avec un appel LLM) peut parfois coûter plus cher en tokens et en latence que de simplement envoyer un contexte un peu plus long au LLM final. Mesurez toujours l'impact de bout en bout avant de généraliser une technique.
- Compresser avant de ranker : La pire erreur. On passe du temps et de l'argent à compresser des informations non pertinentes.
- Abstractif sans citations : Ne jamais faire confiance à un résumé généré sans fournir à l'utilisateur final (et au LLM) les sources exactes qui le justifient.
- Une seule technique pour tout : La compression extractive est idéale pour le juridique, l'abstractive pour la synthèse de news. Adaptez la stratégie au cas d'usage.
Snippet : Distillation de "KeyFacts" avec Pydantic
import instructor
from openai import OpenAI
from pydantic import BaseModel, Field
from typing import List
# 1. Définir les schémas de sortie Pydantic
class Citation(BaseModel):
doc_id: str
text_quote: str = Field(description="The exact quote from the source document that supports the fact.")
class KeyFact(BaseModel):
fact: str = Field(description="An atomic, verifiable fact.")
relevance: float = Field(description="Relevance score of the fact to the user's query, from 0.0 to 1.0.")
citations: List[Citation]
class DistilledContext(BaseModel):
summary: str
key_facts: List[KeyFact]
# 2. Patch OpenAI client with instructor
client = instructor.patch(OpenAI())
def distill_context(documents: List[str], query: str) -> DistilledContext:
# A simplified context string
context_str = "\n".join(f"{doc} " for i, doc in enumerate(documents))
return client.chat.completions.create(
model="gpt-4-turbo",
response_model=DistilledContext,
messages=[
{"role": "system", "content": "You are a world-class information distillation engine. Extract key facts relevant to the user's query from the provided documents. Every fact must be supported by a direct citation."},
{"role": "user", "content": f"User Query: {query}\n\nDocuments:\n{context_str}"}
]
)
# Utilisation:
# documents = ["...", "..."]
# query = "What is the security policy for JWT tokens?"
# distilled_info = distill_context(documents, query)
# print(distilled_info.key_facts[0].fact)
Playbook de Déploiement
- Étape 1 : Mettre en place un Ranking de premier ordre. Avant tout, assurez-vous que votre pipeline de retrieval (hybride + cross-encoder) est performant. C'est votre fondation.
- Étape 2 : Implémenter la compression extractive la plus simple. Commencez par simplement tronquer les documents ou ne garder que le top-k des passages les plus pertinents. Mesurez le gain.
- Étape 3 : Introduire la Distillation de Faits Structurés. Passez directement à la distillation de `KeyFacts` (cf. onglet Snippets). C'est souvent plus robuste que la compression abstractive "en texte libre", car le format JSON et l'obligation de citer forcent le LLM à être plus rigoureux.
- Étape 4 : Utiliser une compression abstractive (résumé) en dernier recours. Si le contexte est encore trop grand après la distillation, générez un résumé global à partir des `KeyFacts` (et non des documents bruts). Cela limite les hallucinations.
- Étape 5 : Monitorer les métriques clés. Mettez en place un dashboard qui suit : le taux de compression, la latence de bout-en-bout, le coût par requête, et le score de "Faithfulness" de vos résumés. Itérez sur vos prompts de distillation en fonction de ces données.
