logo
Entwicklung
Suchen
5-Schichten-Strategie zur Kontextkomprimierung

5-Schichten-Strategie zur Kontextkomprimierung

Überblick

In langen Konversationsszenarien nähert sich die Anzahl der Kontext-Token allmählich der Kontextfenster-Grenze des Modells. Das System verwendet ein kaskadiertes Verfahren mit drei Architekturschichten und fünf Komprimierungsstrategien, um die Kontextlänge intelligent zu verwalten, ohne die Konversationsqualität zu beeinträchtigen.


Strategie-Übersicht

Kontextkomprimierungsstrategie-CN

Nummer Schicht Strategiename Auslösebedingung Verarbeitungsweise
Layer 1 Kürzung einzelner Tool-Ergebnisse Ein einzelnes Tool-Ergebnis überschreitet 50 % des Kontexts Kürzung auf das Budget, Umbruch an Zeilenumbruchgrenze
Layer 1 Verdichtung alter Tool-Ergebnisse Gesamteingabe überschreitet 75 % des Kontexts Whitelist-Tool-Ergebnisse werden durch Platzhalter ersetzt
Layer 2 Bereinigung der Nachrichtenhistorie LLM gibt einen Kontextüberlauf-Fehler zurück Schlüsselnachrichten behalten, mittlere Historie entfernen
Layer 3 Vollständige LLM-Zusammenfassung Layer 2 reicht zur Entlastung nicht aus Blockweise Zusammenfassung + Zusammenführung, strukturiertes Format mit 9 Abschnitten
Layer 3 Herabstufung der Teilzusammenfassung LLM-Zusammenfassung schlägt fehl Erneuter Versuch nach Ausschluss übergroßer Nachrichten, letztlich Herabstufung auf reine Textbenachrichtigung

Layer 1: Präventive Kürzung von Tool-Ergebnissen

Auslösezeitpunkt: Wird vor jedem LLM-Aufruf automatisch ausgeführt (präventiv, ohne auf einen Überlauf zu warten).

Strategie ① — Kürzung einzelner Tool-Ergebnisse

Wenn ein einzelnes Tool-Ergebnis 50 % des Kontextfensters überschreitet, wird auf das Budget gekürzt:

Ursprüngliche Tool-Ausgabe (überlang) │ ├── Behalte die ersten N Zeichen (Umbruch an Zeilenumbruchgrenze) └── Markierung anhängen: [truncated: output exceeded context limit]
                      
                      Ursprüngliche Tool-Ausgabe (überlang)
│
├── Behalte die ersten N Zeichen (Umbruch an Zeilenumbruchgrenze)
└── Markierung anhängen: [truncated: output exceeded context limit]

                    
Dieser Codeblock im schwebenden Fenster

Schlüsselkonstante:

  • SINGLE_TOOL_RESULT_CONTEXT_SHARE = 0.5 (Obergrenze für ein einzelnes Tool als Anteil)

Strategie ② — Verdichtung alter Tool-Ergebnisse

Wenn die Gesamteingabe 75 % des Kontextfensters überschreitet, wird ab dem ältesten Tool-Ergebnis verdichtet:

Historie der Tool-Aufrufe (Zeitreihe) │ ├── Neueste Tool-Ergebnisse → vollständiger Inhalt bleibt erhalten ├── Neuere Tool-Ergebnisse → vollständiger Inhalt bleibt erhalten ├── Ältere Tool-Ergebnisse → [compacted: tool output removed to free context] └── Älteste Tool-Ergebnisse → [compacted: tool output removed to free context]
                      
                      Historie der Tool-Aufrufe (Zeitreihe)
│
├── Neueste Tool-Ergebnisse → vollständiger Inhalt bleibt erhalten
├── Neuere Tool-Ergebnisse → vollständiger Inhalt bleibt erhalten
├── Ältere Tool-Ergebnisse → [compacted: tool output removed to free context]
└── Älteste Tool-Ergebnisse → [compacted: tool output removed to free context]

                    
Dieser Codeblock im schwebenden Fenster

Whitelist-Mechanismus: Die Verdichtung wird nur bei folgenden Tools mit hoher Ausgabemenge durchgeführt:

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

Die Ausgabe von Tools der Kategorie Write/Create bleibt immer erhalten, da ihre Ausgabe die Grundlage für nachfolgende Operationen bildet.

Schlüsselkonstante:

  • CONTEXT_INPUT_HEADROOM_RATIO = 0.75 (Obergrenze der Gesamteingabe als Anteil)

Layer 2: Überlauferkennung und Bereinigung der Nachrichtenhistorie

Auslösezeitpunkt: Wird passiv ausgelöst, wenn das LLM einen Kontextüberlauf-Fehler zurückgibt.

Strategie ③ — Bereinigung der Nachrichtenhistorie

Entfernt mittlere Verlaufsnachrichten und behält Schlüsselnachrichten:

Nachrichtenhistorie │ ├── System Prompt ← immer beibehalten ├── Erste Benutzernachricht ← immer beibehalten ├── Nachrichten mit _pin: true ← immer beibehalten ├── ........ mittlere Historie ........ ← entfernt (durch Benachrichtigung ersetzt) ├── [context compacted: X earlier messages removed] ├── Die letzten N Nachrichten ← beibehalten (N = min(6, ⌊Gesamtzahl/3⌋)) └── Aktuelle Nachricht ← beibehalten
                      
                      Nachrichtenhistorie
│
├── System Prompt                    ← immer beibehalten
├── Erste Benutzernachricht          ← immer beibehalten
├── Nachrichten mit _pin: true       ← immer beibehalten
├── ........ mittlere Historie ........       ← entfernt (durch Benachrichtigung ersetzt)
├── [context compacted: X earlier messages removed]
├── Die letzten N Nachrichten        ← beibehalten (N = min(6, ⌊Gesamtzahl/3⌋))
└── Aktuelle Nachricht               ← beibehalten

                    
Dieser Codeblock im schwebenden Fenster

Nach der Bereinigung werden verwaiste Tool-Paare automatisch repariert (tool_use ohne zugehöriges tool_result oder umgekehrt), um ein gültiges Nachrichtenformat sicherzustellen.


Layer 3: Intelligente LLM-Zusammenfassung

Auslösezeitpunkt: Wird ausgelöst, wenn die Bereinigung in Layer 2 zur Entlastung des Kontextdrucks noch nicht ausreicht.

Strategie ④ — Vollständige Zusammenfassung

Verwendet einen separaten LLM-Aufruf, um die Verlaufsnachrichten strukturiert zusammenzufassen:

Zusammenfassungsformat mit 9 Abschnitten:

  1. Benutzerabsicht und Ziele
  2. Schlüsselkonzepte und Terminologie
  3. Betroffene Dateien und Pfade
  4. Aufgetretene Fehler und Lösungen
  5. Lösungsansatz für Probleme
  6. Wichtige Benutzernachrichten
  7. Ausstehende Aufgaben
  8. Aktueller Arbeitsfortschritt
  9. Plan für die nächsten Schritte

Blockstrategie: Wenn die Nachrichten 50.000 Zeichen überschreiten, werden sie in maximal 4 Blöcke aufgeteilt, die jeweils separat zusammengefasst und anschließend zu einer finalen Zusammenfassung zusammengeführt werden.

Strategie ⑤ — Herabstufung der Teilzusammenfassung

Wenn die vollständige Zusammenfassung fehlschlägt, wird eine dreistufige Herabstufung durchgeführt:

Herabstufungsstufe Verarbeitungsweise
Level 1 Übergroße Nachrichten (>50.000 Zeichen) ausschließen und die Zusammenfassung für die restlichen Nachrichten erneut versuchen
Level 2 Anmerkung hinzufügen [Note: X oversized message(s) were excluded]
Level 3 Reine Textbenachrichtigung zurückgeben [Summary unavailable — X messages could not be summarized]

Zusammenfassung der Schlüsselkonstanten

Konstante Wert Beschreibung
CONTEXT_INPUT_HEADROOM_RATIO 0.75 Layer 1 Obergrenze der Gesamteingabe als Anteil
SINGLE_TOOL_RESULT_CONTEXT_SHARE 0.5 Layer 1 Obergrenze für ein einzelnes Tool als Anteil
MAX_OVERFLOW_COMPACTION_ATTEMPTS 5 Maximale Anzahl an Komprimierungsversuchen
COMPACT_MAX_OUTPUT_TOKENS 20,000 Ausgabeobergrenze für den Zusammenfassungs-LLM-Aufruf
COMPACT_BUFFER_TOKENS 13,000 Puffer für den Verdichtungsschwellenwert
CHARS_PER_TOKEN 4 Zeichen pro Token bei normalem Text
TOOL_RESULT_CHARS_PER_TOKEN 2 Zeichen pro Token bei Tool-Ergebnissen (dichter)

EMA-Token-Kalibrierung

Das System verwendet einen exponentiell gleitenden Durchschnitt, um die Schätzung der Chars-per-Token dynamisch zu kalibrieren:

Phase Kalibrierungsweise
Initial 3.0 chars/token (konservativ, angepasst an Chinesisch + Code)
Erste 3 LLM-Aufrufe Konvergenz zum Mittelwert
Nachfolgend EMA α=0.15 für geglättete Nachverfolgung
Ausreißerfilterung Werte außerhalb des Bereichs 0.5 < observed < 8 werden ignoriert

Ablaufdiagramm der Komprimierung

Vor jedem LLM-Aufruf │ ├── Layer 1: enforceToolResultBudget() │ ├── Kürzung einzelner Tools (>50 % Kontext) │ └── Verdichtung alter Tools (Gesamteingabe >75 % Kontext) │ ├── shouldPreemptiveCompact() ? │ └── Ja → compact() (Layer 2 Bereinigung) │ └── LLM-Aufruf │ ├── Erfolg → weiter └── Überlauffehler → getRetryStrategy() │ ├── compact() (Layer 2) │ │ │ └── Immer noch unzureichend → compactWithSummary() (Layer 3) │ ├── summarizeMessagesFull() (Strategie ④) │ ├── Fehlgeschlagen → summarizeMessagesPartial() (Strategie ⑤ Level 1-2) │ └── Vollständig fehlgeschlagen → bare notice (Strategie ⑤ Level 3) │ └── LLM-Aufruf erneut versuchen (maximal 5 Mal)
                      
                      Vor jedem LLM-Aufruf
    │
    ├── Layer 1: enforceToolResultBudget()
    │   ├── Kürzung einzelner Tools (>50 % Kontext)
    │   └── Verdichtung alter Tools (Gesamteingabe >75 % Kontext)
    │
    ├── shouldPreemptiveCompact() ?
    │   └── Ja → compact() (Layer 2 Bereinigung)
    │
    └── LLM-Aufruf
        │
        ├── Erfolg → weiter
        └── Überlauffehler → getRetryStrategy()
            │
            ├── compact() (Layer 2)
            │   │
            │   └── Immer noch unzureichend → compactWithSummary() (Layer 3)
            │       ├── summarizeMessagesFull() (Strategie ④)
            │       ├── Fehlgeschlagen → summarizeMessagesPartial() (Strategie ⑤ Level 1-2)
            │       └── Vollständig fehlgeschlagen → bare notice (Strategie ⑤ Level 3)
            │
            └── LLM-Aufruf erneut versuchen (maximal 5 Mal)

                    
Dieser Codeblock im schwebenden Fenster


Was das für dich bedeutet

Die Kontextkomprimierung ist der Grund für das Phänomen, dass „der Agent frühere Inhalte vergisst", das du in langen Konversationen möglicherweise bemerkst. Es handelt sich nicht um einen Bug, sondern um einen Mechanismus, mit dem das System Informationen innerhalb des begrenzten Kontextfensters intelligent verwaltet.

Phänomene, die du beobachten könntest:

  • In langen Konversationen „erinnert" sich der Agent plötzlich nicht mehr an die Anforderung, die du am Anfang genannt hast → dies liegt daran, dass Layer 2/3 frühe Nachrichten komprimiert hat
  • Der Agent sagt „laut der vorherigen Diskussion...", aber die Details sind möglicherweise nicht vollständig korrekt → nach der Komprimierung bleibt nur die Zusammenfassung erhalten
  • Die Verlaufsergebnisse von Tool-Aufrufen werden zu [compacted] → dies liegt daran, dass Layer 1 die alten Tool-Ausgaben verdichtet hat

So kannst du damit umgehen:

  • Sage bei wichtigen Informationen „bitte merken": löst die Speicherung im Memory-System aus, die nicht von der Kontextkomprimierung betroffen ist
  • Wiederhole wichtige Anforderungen: Wiederhole in langen Konversationen regelmäßig deine zentralen Anforderungen
  • Wähle ein Modell mit großem Kontext: GPT-4.1 (1M) oder Claude (200K) kann mehr Kontext bewahren als DeepSeek (64K)
  • Beginne eine neue Konversation: Wenn die Konversation bereits sehr lang und unübersichtlich ist, kann das Beginnen einer neuen Konversation effizienter sein als das Fortführen

Verwandte Dokumente