ホーム チュートリアル カテゴリ Skills サイトについて
ZH EN JA KO
上級テクニック

OpenClaw コンテキスト剪定とキャッシュTTL戦略

· 12 分で読了

はじめに

AI モデルのコンテキストウィンドウには限りがあります。最も先進的なモデルでも、コンテキストウィンドウは数十万トークン程度です。会話が続きメッセージが蓄積されるにつれ、コンテキスト管理が重要な課題となります。OpenClaw は洗練されたコンテキスト剪定メカニズムを提供し、TTL(Time-To-Live)ベースのキャッシュ戦略と組み合わせることで、会話品質を維持しつつトークン消費を最大限に削減します。

本記事ではこのメカニズムの設計と設定オプションを詳しく解説します。

コンテキスト管理の課題

長い会話で、メッセージ履歴全体をコンテキストとしてモデルに送信すると、いくつかの問題が発生します:

  1. トークンコストの高騰:API 呼び出しのたびに全履歴を送信するため、入力トークンコストが線形に増加
  2. コンテキストオーバーフロー:モデルのウィンドウ制限を超えると、リクエストが完全に失敗
  3. ノイズ干渉:古いメッセージが現在のトピックに無関係で、実際にはモデルの判断を妨げる可能性
  4. レイテンシの増加:入力トークンが多いほど、モデルが最初の応答を生成するまでに時間がかかる

OpenClaw はこれらの問題を多層剪定戦略で体系的に対処します。

剪定戦略のレイヤー

OpenClaw のコンテキスト剪定は4つのレイヤーで動作し、粗いものから細かいものへ適用されます:

元のメッセージ履歴
    ↓
レイヤー1:メッセージ数制限(maxMessages)
    ↓
レイヤー2:トークン数制限(maxTokens)
    ↓
レイヤー3:TTL 時間減衰(cache TTL)
    ↓
レイヤー4:スマート圧縮
    ↓
最終コンテキスト → モデルに送信

レイヤー1:メッセージ数制限

最も基本的な戦略 — 保持するメッセージの最大数を制限:

{
  agents: {
    "my-agent": {
      context: {
        // 最大50メッセージを保持
        maxMessages: 50,
        // チャンネルタイプ別に差別化
        channelOverrides: {
          dm: { maxMessages: 80 },
          group: { maxMessages: 20 }
        }
      }
    }
  }
}

制限を超えると、最も古いメッセージが破棄されます(ただし JSONL ファイルには保存されており、物理的には削除されません)。

レイヤー2:トークン数制限

実際のトークン数に基づくより精密な制御:

{
  agents: {
    "my-agent": {
      context: {
        // 最大コンテキストトークン数(システムプロンプトを除く)
        maxTokens: 16000,
        // モデル出力用の予約トークン数
        reservedOutputTokens: 4000,
        // トークンカウント方式
        tokenCounter: "tiktoken"  // 精密計算
      }
    }
  }
}

OpenClaw は最新のメッセージから逆方向にトークンを数えます。累計が maxTokens を超えると停止し、それより古いメッセージを破棄します。

レイヤー3:TTL 時間減衰(コア機能)

これは OpenClaw 最も特徴的なコンテキスト管理戦略です。メッセージのタイムスタンプに基づき、異なる「経過時間」のメッセージに異なる保持ポリシーを適用します:

{
  agents: {
    "my-agent": {
      context: {
        ttl: {
          enabled: true,
          // TTL ルール(新しいものから古いものへ)
          rules: [
            {
              // 直近5分以内のメッセージ:すべて保持
              maxAge: "5m",
              keep: "all"
            },
            {
              // 5分〜1時間前のメッセージ:直近20件を保持
              maxAge: "1h",
              keep: 20
            },
            {
              // 1〜6時間前のメッセージ:直近10件を保持
              maxAge: "6h",
              keep: 10
            },
            {
              // 6〜24時間前のメッセージ:要約のみ保持
              maxAge: "24h",
              keep: "summary"
            },
            {
              // 24時間以上前のメッセージ:コンテキストに含めない
              maxAge: "inf",
              keep: "none"
            }
          ]
        }
      }
    }
  }
}

TTL 戦略の設計思想

人間の会話には自然な時間減衰の特性があります:5分前のメッセージはほぼ確実に関連性がありますが、1時間前のメッセージは部分的にしか関連しない可能性があり、昨日の会話はすでに別のトピックに移っている可能性が高いです。TTL 戦略はこの自然な減衰をモデル化しています。

Keep オプションリファレンス

意味
"all" この時間ウィンドウ内のすべてのメッセージを保持
数値 この時間ウィンドウ内の直近 N 件のメッセージを保持
"summary" この時間ウィンドウ内のメッセージを要約に圧縮
"none" この時間ウィンドウのメッセージを含めない

レイヤー4:スマート圧縮

TTL ルールで keep: "summary" が指定された場合、OpenClaw はその時間ウィンドウのメッセージを自動的に圧縮します:

{
  agents: {
    "my-agent": {
      context: {
        compaction: {
          enabled: true,
          // 圧縮に使用するモデル(安価なモデルで十分)
          model: "gpt-4o-mini",
          // 要約の最大トークン数
          summaryMaxTokens: 512,
          // 圧縮プロンプト
          summaryPrompt: "Please compress the following conversation content into a concise summary, preserving key information and user preferences:",
          // 圧縮結果のキャッシュ
          cacheSummary: true,
          // 要約キャッシュの TTL
          summaryCacheTTL: "1h"
        }
      }
    }
  }
}

キャッシュメカニズムの詳細

コンテキストキャッシュ

OpenClaw は以前に構築したコンテキストをキャッシュし、毎回再計算することを回避します:

{
  agents: {
    "my-agent": {
      context: {
        cache: {
          enabled: true,
          // キャッシュ無効化条件
          invalidateOn: [
            "new_message",     // 新しいメッセージが到着したら無効化
            "config_change"    // 設定が変更されたら無効化
          ],
          // キャッシュ保存方式
          storage: "memory",   // memory / redis
          // 最大キャッシュエントリ数
          maxEntries: 1000
        }
      }
    }
  }
}

プロンプトキャッシュ(プロバイダーレベル)

一部の AI プロバイダーはプロンプトキャッシュをサポート(Anthropic や OpenAI など)しており、OpenClaw はこの機能を自動的に活用します:

{
  agents: {
    "my-agent": {
      context: {
        providerCache: {
          enabled: true,
          // システムプロンプトをキャッシュ可能としてマーク(変更頻度が低いため)
          cacheSystemPrompt: true,
          // 直近 N 件のメッセージをキャッシュ可能なプレフィックスとしてマーク
          cacheableMessageCount: 10
        }
      }
    }
  }
}

プロンプトキャッシュにより、繰り返しのコンテキストプレフィックスのコストを最大90%削減でき、長いシステムプロンプトを持つシナリオに最適です。

実践的な設定例

パーソナルアシスタント(長い会話、深い記憶)

{
  context: {
    maxMessages: 100,
    maxTokens: 32000,
    ttl: {
      enabled: true,
      rules: [
        { maxAge: "30m", keep: "all" },
        { maxAge: "4h", keep: 30 },
        { maxAge: "24h", keep: "summary" },
        { maxAge: "inf", keep: "none" }
      ]
    },
    compaction: { enabled: true, summaryMaxTokens: 1024 }
  }
}

カスタマーサービスボット(短い会話、高速レスポンス)

{
  context: {
    maxMessages: 30,
    maxTokens: 8000,
    ttl: {
      enabled: true,
      rules: [
        { maxAge: "10m", keep: "all" },
        { maxAge: "1h", keep: 10 },
        { maxAge: "inf", keep: "none" }
      ]
    }
  }
}

グループチャットボット(高メッセージ頻度、低コンテキスト需要)

{
  context: {
    maxMessages: 15,
    maxTokens: 4000,
    ttl: {
      enabled: true,
      rules: [
        { maxAge: "5m", keep: "all" },
        { maxAge: "30m", keep: 5 },
        { maxAge: "inf", keep: "none" }
      ]
    }
  }
}

モニタリングとチューニング

コンテキスト使用状況の確認

# 特定Agentのコンテキスト統計を表示
openclaw agent stats my-agent --context

# 出力例:
# Active sessions: 45
# Average context tokens: 8,234
# Max context tokens: 28,102
# Compaction executions: 12
# Cache hit rate: 73%

コンテキスト使用量アラート

{
  monitoring: {
    alerts: [{
      name: "context-overflow-warning",
      condition: "context_tokens > maxTokens * 0.9",
      action: "log_warning"
    }]
  }
}

まとめ

コンテキスト管理は AI Agent の運用においてコストと品質の両方に影響する最も重要な要素の1つです。OpenClaw の4層剪定戦略 — メッセージ数制限、トークン制限、TTL 時間減衰、スマート圧縮 — は粗いものから細かいものまで精密な制御を提供します。TTL 時間減衰戦略は OpenClaw 独自の設計で、人間の会話の自然な時間的減衰をモデル化し、最近のコンテキストの完全性を保ちながら、古いメッセージのトークン消費を大幅に削減します。プロンプトキャッシュとコンテキストキャッシュのメカニズムと組み合わせることで、会話品質を犠牲にすることなく、意味のあるトークンコスト最適化を実現できます。

OpenClawは無料のオープンソースAIアシスタント。WhatsApp、Telegram、Discordなど多数のプラットフォームに対応