はじめに
AIモデルのコンテキストウィンドウには限りがあり、会話履歴はやり取りを重ねるごとに増大します。限られたコンテキスト内で最も関連性の高い情報を保持しつつ、API呼び出しコストを制御する方法は、あらゆるAIゲートウェイが解決すべき課題です。OpenClaw は柔軟な履歴長制御と自動圧縮メカニズムを提供し、会話品質とリソース消費のバランスを取ることができます。
なぜ履歴長の制御が必要なのか
履歴長を制御しないと以下の問題が発生します。
- コストの暴走:毎回のAPI呼び出しで完全なコンテキスト履歴が送信され、履歴が長いほどToken消費が増大
- 応答の遅延:モデルがより長いコンテキストを処理するのに時間がかかる
- 情報ノイズ:古すぎる会話内容が現在のトピックと無関係で、モデルの判断を阻害する可能性
- 制限超過:モデルのコンテキストウィンドウを直接超過し、APIエラーが発生
基本設定
openclaw.json の sessions セクションで履歴長の制限を設定します。
{
"sessions": {
"maxHistoryMessages": 50,
"maxHistoryTokens": 8000
}
}
二重制限メカニズム
OpenClaw はメッセージ数とToken数の二重制限を採用し、先に到達した条件が適用されます。
maxHistoryMessages:コンテキストに保持する最大メッセージ数。各メッセージにはユーザー入力とAI返信が含まれますmaxHistoryTokens:コンテキストに保持する最大Token数。OpenClaw はモデル対応のTokenizerで正確に計算します
例えば、maxHistoryMessages: 50 と maxHistoryTokens: 8000 を設定した場合、30件のメッセージでToken数が8000に達すると、メッセージ数の上限に達していなくても切り詰めや圧縮が開始されます。
チャンネルタイプ別の差異化設定
プライベートチャットとグループチャットの利用パターンは大きく異なります。プライベートチャットは通常、継続的な長い会話であり、より多くのコンテキストを保持する必要があります。グループチャットは断片的な短いやり取りであり、履歴の価値は相対的に低くなります。OpenClaw はチャンネルタイプ別に異なる制限を設定できます。
{
"sessions": {
"maxHistoryMessages": 50,
"maxHistoryTokens": 8000,
"channelOverrides": {
"dm": {
"maxHistoryMessages": 100,
"maxHistoryTokens": 16000
},
"group": {
"maxHistoryMessages": 20,
"maxHistoryTokens": 4000
}
}
}
}
サポートされるチャンネルタイプ
| タイプ識別子 | 説明 | 推奨設定 |
|---|---|---|
dm |
プライベートチャット / 1対1会話 | 長い履歴(50-100件) |
group |
グループチャット / 複数人会話 | 短い履歴(10-30件) |
channel |
チャンネルメッセージ(Discordチャンネルなど) | 中程度の履歴(20-50件) |
thread |
トピック / スレッド | 中程度の履歴(20-50件) |
プラットフォーム別の設定
特定のメッセージングプラットフォームに対して個別の制限を設定することも可能です。
{
"sessions": {
"channelOverrides": {
"dm": {
"maxHistoryMessages": 100
},
"group": {
"maxHistoryMessages": 20
}
},
"platformOverrides": {
"telegram": {
"maxHistoryMessages": 80,
"maxHistoryTokens": 12000
},
"discord": {
"maxHistoryMessages": 30,
"maxHistoryTokens": 6000
}
}
}
}
優先順位は platformOverrides > channelOverrides > グローバルデフォルト値です。
自動圧縮メカニズム
会話履歴が制限に近づいた時、OpenClaw は2つの処理戦略を提供します:シンプルな切り詰めとスマート圧縮。
切り詰め戦略(truncate)
{
"sessions": {
"autoCompaction": true,
"compactionStrategy": "truncate"
}
}
最も古いメッセージを直接削除し、最新のN件のみを保持します。シンプルで効率的で追加のAPI呼び出しは発生しませんが、初期の会話情報は完全に失われます。
処理フロー:
元の履歴: [msg1, msg2, msg3, ..., msg50, msg51]
切り詰め後: [msg21, msg22, ..., msg50, msg51] (最新30件を保持)
要約戦略(summary)
{
"sessions": {
"autoCompaction": true,
"compactionStrategy": "summary",
"compactionThreshold": 0.8,
"summaryMaxTokens": 500
}
}
コンテキストの使用量が compactionThreshold(デフォルト80%)に達すると、OpenClaw は自動的に古い会話履歴をモデルに送信して要約を生成します。要約結果はシステムメッセージとしてコンテキストの先頭に挿入され、元の履歴メッセージを置き換えます。
処理フロー:
ステップ1:コンテキスト使用量が80%に到達したことを検出
ステップ2:先頭30件のメッセージをモデルに送信し、要約の生成を要求
ステップ3:モデルが要約テキストを返却
ステップ4:要約で元の30件のメッセージを置換
最終コンテキスト:[要約メッセージ, msg31, msg32, ..., msg51]
要約設定の詳細
{
"sessions": {
"compaction": {
"strategy": "summary",
"threshold": 0.8,
"summaryMaxTokens": 500,
"summaryModel": "default",
"summaryPrompt": "以下の会話履歴を簡潔な要約に圧縮し、重要な情報とユーザーの好みを保持してください:",
"preserveSystemMessages": true,
"preserveLastN": 10
}
}
}
| パラメータ | 説明 |
|---|---|
threshold |
圧縮をトリガーするコンテキスト使用率の閾値 |
summaryMaxTokens |
要約テキストの最大Token数 |
summaryModel |
要約生成に使用するモデル。"default" は現在のモデルを使用 |
summaryPrompt |
カスタム要約指示 |
preserveSystemMessages |
元のシステムメッセージを圧縮から保護するかどうか |
preserveLastN |
常に最新N件のメッセージを圧縮から除外 |
ローリング圧縮
超長い会話では、圧縮が複数回トリガーされる場合があります。各圧縮では前回の要約と新しい古いメッセージを統合して更新された要約を生成します。このプロセスを「ローリング圧縮」と呼びます。
第1回圧縮:[msg1-30] → 要約A
第2回圧縮:[要約A, msg31-50] → 要約B
第3回圧縮:[要約B, msg51-70] → 要約C
圧縮回数が増えるにつれ、最も古い情報は徐々に概括・凝縮されますが、重要な情報は通常保持されます。
コスト見積もり
異なる履歴制限戦略はAPIコストに大きな影響を与えます。以下は概算です。
| 設定 | リクエストあたり平均Token | 月間コスト(日100メッセージ) |
|---|---|---|
| maxHistoryMessages: 10 | 約2,000 | 低め |
| maxHistoryMessages: 50 | 約8,000 | 中程度 |
| maxHistoryMessages: 100 | 約15,000 | 高め |
| summary圧縮 | 約3,000 + 圧縮オーバーヘッド | やや低め |
実際のコストはモデルの料金設定、メッセージの平均長、使用頻度によって異なります。
手動の履歴管理
自動メカニズムに加え、コマンドラインで手動でセッション履歴を管理することもできます。
# 特定セッションの履歴統計を確認
openclaw session stats --session telegram_123456
# 手動で圧縮をトリガー
openclaw session compact --session telegram_123456
# 履歴をクリアしてセッションは保持
openclaw session trim --session telegram_123456 --keep 10
# セッションを完全にクリア
openclaw session clear --session telegram_123456
ユーザーもチャット内の組み込みコマンドで自分の履歴を管理できます。
/clear - 現在の会話履歴をクリア
/compact - 手動で会話圧縮をトリガー
/history - 現在の履歴件数とToken使用量を確認
推奨設定
個人利用(コスト優先)
{
"sessions": {
"maxHistoryMessages": 20,
"maxHistoryTokens": 4000,
"autoCompaction": true,
"compactionStrategy": "truncate"
}
}
日常利用(バランス型)
{
"sessions": {
"maxHistoryMessages": 50,
"maxHistoryTokens": 8000,
"autoCompaction": true,
"compactionStrategy": "summary",
"channelOverrides": {
"dm": { "maxHistoryMessages": 80 },
"group": { "maxHistoryMessages": 20 }
}
}
}
深い対話(品質優先)
{
"sessions": {
"maxHistoryMessages": 150,
"maxHistoryTokens": 32000,
"autoCompaction": true,
"compactionStrategy": "summary",
"compaction": {
"summaryMaxTokens": 1000,
"preserveLastN": 30
}
}
}
まとめ
会話履歴の長さ制御は、OpenClaw のコスト管理と会話品質最適化の中核的な手段です。チャンネルタイプ別に差異化された履歴制限を設定し、要約圧縮やシンプルな切り詰め戦略を組み合わせることで、さまざまなシーンで最適なバランスポイントを見つけることができます。中程度の設定から始めて、実際のToken使用量と会話品質のフィードバックに基づいて段階的にチューニングすることをお勧めします。