logo
Développement
Rechercher
Stratégie de compression du contexte sur 5 niveaux

Stratégie de compression du contexte sur 5 niveaux

Aperçu

Dans les scénarios de conversations longues, le nombre de tokens du contexte se rapproche progressivement de la limite de la fenêtre de contexte du modèle. Le système adopte une approche en cascade reposant sur une architecture à trois couches et cinq stratégies de compression, qui gère intelligemment la longueur du contexte tout en garantissant la qualité de la conversation.


Vue d'ensemble des stratégies

Stratégie de compression du contexte-CN

Couche Nom de la stratégie Condition de déclenchement Mode de traitement
Layer 1 Troncature d'un seul résultat d'outil Un résultat d'outil unique dépasse 50 % du contexte Troncature au budget, à un point de coupure sur un saut de ligne
Layer 1 Compactage des anciens résultats d'outils L'entrée totale dépasse 75 % du contexte Remplacement des résultats des outils de la liste blanche par un espace réservé
Layer 2 Élagage de l'historique des messages Le LLM renvoie une erreur de dépassement du contexte Conservation des messages clés, élagage de l'historique intermédiaire
Layer 3 Résumé complet par LLM La Layer 2 ne suffit pas à soulager la pression Résumé par blocs + fusion, format structuré en 9 sections
Layer 3 Dégradation vers un résumé partiel Échec du résumé LLM Nouvelle tentative après exclusion des messages surdimensionnés, dégradation finale vers une notification en texte brut

Layer 1 : troncature préventive des résultats d'outils

Moment de déclenchement : exécuté automatiquement avant chaque appel LLM (de manière préventive, sans attendre qu'un dépassement se produise).

Stratégie ① — Troncature d'un seul résultat d'outil

Lorsqu'un résultat d'outil unique dépasse 50 % de la fenêtre de contexte, il est tronqué au budget :

Sortie d'outil brute (trop longue) │ ├── Conservation des N premiers caractères (point de coupure sur un saut de ligne) └── Ajout d'un marqueur : [truncated: output exceeded context limit]
                      
                      Sortie d'outil brute (trop longue)
│
├── Conservation des N premiers caractères (point de coupure sur un saut de ligne)
└── Ajout d'un marqueur : [truncated: output exceeded context limit]

                    
Ce bloc de code dans la fenêtre flottante

Constante clé :

  • SINGLE_TOOL_RESULT_CONTEXT_SHARE = 0.5 (part maximale pour un seul outil)

Stratégie ② — Compactage des anciens résultats d'outils

Lorsque l'entrée totale dépasse 75 % de la fenêtre de contexte, le compactage commence par les résultats d'outils les plus anciens :

Historique des appels d'outils (série chronologique) │ ├── Résultats d'outils les plus récents → contenu intégral conservé ├── Résultats d'outils plus récents → contenu intégral conservé ├── Résultats d'outils plus anciens → [compacted: tool output removed to free context] └── Résultats d'outils les plus anciens → [compacted: tool output removed to free context]
                      
                      Historique des appels d'outils (série chronologique)
│
├── Résultats d'outils les plus récents → contenu intégral conservé
├── Résultats d'outils plus récents → contenu intégral conservé
├── Résultats d'outils plus anciens → [compacted: tool output removed to free context]
└── Résultats d'outils les plus anciens → [compacted: tool output removed to free context]

                    
Ce bloc de code dans la fenêtre flottante

Mécanisme de liste blanche : le compactage n'est appliqué qu'aux outils à sortie volumineuse suivants :

  • Read File, Bash, Grep, Glob, Search Files, Web Fetch, Edit

Les sorties des outils de type Write/Create sont toujours conservées, car elles servent de base aux opérations ultérieures.

Constante clé :

  • CONTEXT_INPUT_HEADROOM_RATIO = 0.75 (part maximale de l'entrée totale)

Layer 2 : détection des dépassements et élagage de l'historique des messages

Moment de déclenchement : déclenché de manière passive lorsque le LLM renvoie une erreur de dépassement du contexte.

Stratégie ③ — Élagage de l'historique des messages

Élagage des messages intermédiaires de l'historique, tout en conservant les messages clés :

Historique des messages │ ├── System Prompt ← toujours conservé ├── Premier message utilisateur ← toujours conservé ├── Messages avec _pin: true ← toujours conservés ├── ........ historique intermédiaire ........ ← élagué (remplacé par une notification) ├── [context compacted: X earlier messages removed] ├── N messages les plus récents ← conservés (N = min(6, ⌊total/3⌋)) └── Message actuel ← conservé
                      
                      Historique des messages
│
├── System Prompt                    ← toujours conservé
├── Premier message utilisateur       ← toujours conservé
├── Messages avec _pin: true          ← toujours conservés
├── ........ historique intermédiaire ........       ← élagué (remplacé par une notification)
├── [context compacted: X earlier messages removed]
├── N messages les plus récents        ← conservés (N = min(6, ⌊total/3⌋))
└── Message actuel                     ← conservé

                    
Ce bloc de code dans la fenêtre flottante

Après l'élagage, les paires d'outils orphelines (un tool_use sans tool_result correspondant, ou inversement) sont automatiquement réparées afin de garantir la validité du format des messages.


Layer 3 : résumé intelligent par LLM

Moment de déclenchement : déclenché lorsque l'élagage de la Layer 2 ne suffit toujours pas à soulager la pression sur le contexte.

Stratégie ④ — Résumé complet

Un appel LLM dédié est utilisé pour produire un résumé structuré des messages de l'historique :

Format de résumé en 9 sections :

  1. Intention et objectifs de l'utilisateur
  2. Concepts et terminologie clés
  3. Fichiers et chemins concernés
  4. Erreurs rencontrées et solutions
  5. Démarche de résolution des problèmes
  6. Messages clés de l'utilisateur
  7. Tâches à accomplir
  8. Progression actuelle du travail
  9. Prochaines étapes

Stratégie de découpage : lorsque les messages dépassent 50 000 caractères, ils sont divisés en 4 blocs au maximum, résumés séparément, puis fusionnés en un résumé final.

Stratégie ⑤ — Dégradation vers un résumé partiel

Lorsque le résumé complet échoue, une dégradation à trois niveaux est appliquée :

Niveau de dégradation Mode de traitement
Level 1 Exclusion des messages surdimensionnés (>50 000 caractères) et nouvelle tentative de résumé sur les messages restants
Level 2 Ajout de l'annotation [Note: X oversized message(s) were excluded]
Level 3 Renvoi d'une notification en texte brut [Summary unavailable — X messages could not be summarized]

Récapitulatif des constantes clés

Constante Valeur Description
CONTEXT_INPUT_HEADROOM_RATIO 0.75 Part maximale de l'entrée totale (Layer 1)
SINGLE_TOOL_RESULT_CONTEXT_SHARE 0.5 Part maximale pour un seul outil (Layer 1)
MAX_OVERFLOW_COMPACTION_ATTEMPTS 5 Nombre maximal de tentatives de compression
COMPACT_MAX_OUTPUT_TOKENS 20,000 Limite de sortie de l'appel LLM de résumé
COMPACT_BUFFER_TOKENS 13,000 Tampon du seuil de compactage
CHARS_PER_TOKEN 4 Nombre de caractères par token pour le texte ordinaire
TOOL_RESULT_CHARS_PER_TOKEN 2 Nombre de caractères par token pour les résultats d'outils (plus denses)

Calibrage EMA des tokens

Le système utilise une moyenne mobile exponentielle pour calibrer dynamiquement l'estimation du nombre de caractères par token :

Phase Mode de calibrage
Initial 3.0 chars/token (conservateur, adapté au chinois + code)
3 premiers appels LLM Convergence par moyenne
Ensuite Suivi lissé par EMA α=0.15
Filtrage des anomalies Valeurs hors de l'intervalle 0.5 < observed < 8 ignorées

Diagramme du flux de compression

Avant chaque appel LLM │ ├── Layer 1: enforceToolResultBudget() │ ├── Troncature d'un seul outil (>50 % du contexte) │ └── Compactage des anciens outils (entrée totale >75 % du contexte) │ ├── shouldPreemptiveCompact() ? │ └── Oui → compact() (élagage Layer 2) │ └── Appel LLM │ ├── Succès → poursuite └── Erreur de dépassement → getRetryStrategy() │ ├── compact() (Layer 2) │ │ │ └── Toujours insuffisant → compactWithSummary() (Layer 3) │ ├── summarizeMessagesFull() (stratégie ④) │ ├── Échec → summarizeMessagesPartial() (stratégie ⑤ Level 1-2) │ └── Échec total → bare notice (stratégie ⑤ Level 3) │ └── Nouvelle tentative d'appel LLM (5 fois au maximum)
                      
                      Avant chaque appel LLM
    │
    ├── Layer 1: enforceToolResultBudget()
    │   ├── Troncature d'un seul outil (>50 % du contexte)
    │   └── Compactage des anciens outils (entrée totale >75 % du contexte)
    │
    ├── shouldPreemptiveCompact() ?
    │   └── Oui → compact() (élagage Layer 2)
    │
    └── Appel LLM
        │
        ├── Succès → poursuite
        └── Erreur de dépassement → getRetryStrategy()
            │
            ├── compact() (Layer 2)
            │   │
            │   └── Toujours insuffisant → compactWithSummary() (Layer 3)
            │       ├── summarizeMessagesFull() (stratégie ④)
            │       ├── Échec → summarizeMessagesPartial() (stratégie ⑤ Level 1-2)
            │       └── Échec total → bare notice (stratégie ⑤ Level 3)
            │
            └── Nouvelle tentative d'appel LLM (5 fois au maximum)

                    
Ce bloc de code dans la fenêtre flottante


Ce que cela signifie pour vous

La compression du contexte est la raison du phénomène « l'Agent a oublié le contenu précédent » que vous pouvez ressentir dans les conversations longues. Ce n'est pas un bug, mais un mécanisme par lequel le système gère intelligemment l'information dans une fenêtre de contexte limitée.

Phénomènes que vous pouvez observer :

  • Dans une longue conversation, l'Agent « ne se souvient » soudainement plus du besoin que vous aviez mentionné au début → c'est que la Layer 2/3 a compressé les premiers messages
  • L'Agent dit « d'après la discussion précédente... » mais les détails peuvent ne pas être tout à fait exacts → seul le résumé a été conservé après la compression
  • Les résultats historiques des appels d'outils deviennent [compacted] → c'est que la Layer 1 a compacté les anciennes sorties d'outils

Comment y faire face :

  • Dites « merci de retenir » pour les informations clés : cela déclenche le stockage par le système de mémoire, à l'abri de la compression du contexte
  • Reformulez les besoins essentiels : dans une longue conversation, reformulez périodiquement vos besoins fondamentaux
  • Choisissez un modèle à grand contexte : GPT-4.1 (1M) ou Claude (200K) conservent davantage de contexte que DeepSeek (64K)
  • Ouvrez une nouvelle conversation : si la conversation est déjà très longue et confuse, ouvrir une nouvelle conversation peut être plus efficace que de la poursuivre

Documents connexes