コンテキストシフティング
コンテキストシフティングは、最も重要でないコンテキストを削除または圧縮しながら、残すべきものをすべて保持することで、組み立てられた会話をモデルのトークン予算に収めます。
リクエスト前のステップ
リクエストが送信される前に、パイプラインは次のステップを実行します:
- モデルのトークナイザープロファイルとコンテキスト制限を決定します。
- 応答用の領域を予約します。
- システムプロンプト、キャラクター、必須のロアブックエントリ、ピン留めされたメッセージを保持します。
- 最も古いピン留めされていないブロックから先に削除または圧縮します。
- ツールコールとツール結果のメッセージはペアとしてのみ削除します。
- 変更のたびにトークンを数え直します。
- 除外または要約されたものをユーザーに表示します。
保護されたコンテキストだけでも予算を超える場合、生成は予算超過のリクエストをプロバイダーに送信する代わりに、安定した TOKEN_BUDGET_EXCEEDED エラーで終了します。
シフティングの仕組み
shiftContext(messages, countTokens, budget) はダイアログをトークン予算に調整します。3 つのリストを返します:
kept— 収まったメッセージ;excluded— 削除されたメッセージ。ユーザーに表示されます;truncated— 破棄ではなく圧縮されたブロック。
システムメッセージとピン留めされたメッセージは常に保護されます。最も古いピン留めされていないブロックが最初に削除されます。ツールコールとその結果は toolCallId、tool_call_id、または callId を通じてリンクされ、隣接していなくても 1 つのグループとして削除されます。
組み込み戦略
戦略は contextStrategy 設定で選択され、ContextStrategyRegistry を通じて適用されます:
- truncate — 最も古いピン留めされていないグループを削除します。
- summarize — 除外された履歴のローカルな抽出型要約を構築し、現在のユーザー入力の前に保持します。
- vector-recall — 関連度の低いロアブックとメモリのブロックを関連度の高いものより先に落とし、その後で古い履歴を短縮します。
- manual — まず
meta.manualExcluded: trueとフラグ付けされたメッセージ(ペアのツールコールとツール結果を含む)を除外し、さらに領域が必要なら通常の削減を続けます。
プラグインと予算
プラグインは追加の戦略を登録できます。登録はクリーンアップ関数を返します。プラグイン戦略は予算を回避できません:
- ホストは必須メッセージを復元し、保護されたコンテキストを削除した戦略を拒否します;
- ホストは実際の予算を独立して数え直します;
- カウントとシフティングはプラグインインターセプターの前に実行され、必須の再カウントと最終シフトがその後実行されます — プラグインは後からメッセージを追加して制限をすり抜けることはできません。
コンテキスト監査
すべての生成はネットワーク呼び出しの前に PromptContextAudit を作成し、completed、failed、cancelled のいずれかの終端ステータスで完了します。監査は以下を記録します:
- 生成 ID、プロバイダー、モデル;
- 実際の順序でのすべてのプロンプトブロック。トークン数と、包含または除外の安定した理由付き;
- コンテキスト制限、応答予約、最終的なプロンプトトークン数;
- トークナイザープロファイルと近似かどうか;
- 最終的なプロバイダーメッセージとプラグインインターセプター診断;
- 上流の応答ボディを含まない、正規化されたプロバイダーエラーコード。
チャットごとに最後の完全な監査だけがデータベースに保持されます。新しいリクエストは古いものをアトミックに置き換え、チャットを削除すると監査も削除されます。UI は GET /api/v2/chats/:id/context-audit を通じて読み取ります。
ライブプレビューエンドポイント POST /api/v2/context-preview は、同じペルソナ、ロアブック、メモリ、テンプレート、トークナイザー、シフティングのステージを、メッセージ、ブランチ、監査を作成せずに実行します。
関連情報
- シフティングがステージ順序のどこにあるかはパイプラインステージ。
- トークンのカウント方法はトークナイゼーション。
- 監査の保存場所はデータとストレージ。