Kontext-Shifting
Kontext-Shifting passt das zusammengesetzte Gespräch in das Token-Budget des Modells ein, indem der am wenigsten wichtige Kontext entfernt oder komprimiert wird, während alles erhalten bleibt, was bleiben muss.
Schritte vor der Anfrage
Bevor eine Anfrage gesendet wird, folgt die Pipeline diesen Schritten:
- Tokenizer-Profil und Kontextlimit des Modells bestimmen.
- Platz für die Antwort reservieren.
- System-Prompt, Charakter, erforderliche Lorebook-Einträge und angeheftete Nachrichten behalten.
- Älteste nicht angeheftete Blöcke zuerst entfernen oder komprimieren.
- Tool-Call- und Tool-Result-Nachrichten nur paarweise entfernen.
- Token nach jeder Änderung neu zählen.
- Dem Benutzer zeigen, was ausgeschlossen oder zusammengefasst wurde.
Wenn allein der geschützte Kontext das Budget überschreitet, endet die
Generierung mit dem stabilen TOKEN_BUDGET_EXCEEDED-Fehler, statt eine
überbudgetierte Anfrage an den Anbieter zu senden.
Wie das Shifting funktioniert
shiftContext(messages, countTokens, budget) passt den Dialog an das
Token-Budget an. Es gibt drei Listen zurück:
kept— die Nachrichten, die passen;excluded— die entfernten Nachrichten, dem Benutzer angezeigt;truncated— Blöcke, die komprimiert statt verworfen wurden.
Systemnachrichten und angeheftete Nachrichten sind immer geschützt. Die
ältesten nicht angehefteten Blöcke werden zuerst entfernt. Tool-Calls und
ihre Ergebnisse werden über toolCallId, tool_call_id oder callId
verknüpft und als eine Gruppe entfernt, auch wenn sie nicht benachbart
sind.
Integrierte Strategien
Die Strategie wird durch die Einstellung contextStrategy gewählt und über
das ContextStrategyRegistry angewendet:
- truncate — entfernt die ältesten nicht angehefteten Gruppen.
- summarize — erstellt eine lokale extraktive Zusammenfassung der ausgeschlossenen Historie und hält sie vor der aktuellen Benutzereingabe.
- vector-recall — verwirft Lorebook- und Gedächtnisblöcke mit geringer Relevanz vor denen mit hoher Relevanz und kürzt dann alte Historie.
- manual — schließt zuerst Nachrichten aus, die mit
meta.manualExcluded: truemarkiert sind (einschließlich ihrer gepaarten Tool-Calls und Tool-Results), und fährt dann mit normaler Reduktion fort, wenn mehr Platz benötigt wird.
Plugins und das Budget
Plugins können zusätzliche Strategien registrieren; die Registrierung gibt eine Bereinigungsfunktion zurück. Eine Plugin-Strategie kann das Budget nicht umgehen:
- der Host stellt erforderliche Nachrichten wieder her und lehnt eine Strategie ab, die geschützten Kontext entfernt hat;
- der Host zählt das reale Budget unabhängig neu;
- Zählung und Shifting laufen vor den Plugin-Interceptors, und eine Pflicht-Neuzählung mit einem finalen Shifting läuft nach ihnen — ein Plugin kann nicht spät Nachrichten hinzufügen, um sich an der Grenze vorbeizuschummeln.
Das Kontext-Audit
Jede Generierung erstellt ein PromptContextAudit vor dem Netzwerkaufruf
und schließt es mit einem terminalen Status ab: completed, failed oder
cancelled. Das Audit zeichnet auf:
- die Generierungs-ID, den Anbieter und das Modell;
- jeden Prompt-Block in tatsächlicher Reihenfolge, mit Tokenzahlen und dem stabilen Grund für Aufnahme oder Ausschluss;
- das Kontextlimit, die Antwortreserve und die endgültige Prompt-Token-Zahl;
- das Tokenizer-Profil und ob es Näherung ist;
- die endgültigen Anbieter-Nachrichten und die Plugin-Interceptor-Diagnosen;
- einen normalisierten Anbieter-Fehlercode, ohne Upstream-Antwortkörper.
Nur das letzte vollständige Audit pro Chat wird in der Datenbank
aufbewahrt; eine neue Anfrage ersetzt das alte atomar, und das Löschen des
Chats löscht das Audit. Die Oberfläche liest es über
GET /api/v2/chats/:id/context-audit.
Ein Live-Vorschau-Endpunkt, POST /api/v2/context-preview, führt dieselben
Persona-, Lorebook-, Gedächtnis-, Vorlagen-, Tokenizer- und
Shifting-Stufen aus, ohne Nachrichten, Branches oder Audits zu erstellen.
Siehe auch
- Pipeline-Stufen, wo das Shifting in der Stufenreihenfolge sitzt.
- Tokenisierung, wie Token gezählt werden.
- Daten & Speicherung, wo Audits gespeichert werden.