コンテキストウィンドウ
コンテキストウィンドウを理解する
「コンテキストウィンドウ」とは、言語モデルが新しいテキストを生成する際に参照できるテキストの総量と、生成する新しいテキストの合計を指します。これは言語モデルが訓練された大規模なデータコーパスとは異なり、モデルの「作業メモリ」を表します。より大きなコンテキストウィンドウにより、モデルはより複雑で長いプロンプトを理解し応答することができますが、小さなコンテキストウィンドウでは、より長いプロンプトを処理したり、長い会話全体で一貫性を維持したりする能力が制限される可能性があります。
以下の図は、APIリクエストの標準的なコンテキストウィンドウの動作を示しています1:
1claude.aiなどのチャットインターフェースでは、コンテキストウィンドウは「先入れ先出し」の循環システムとして設定することもできます。
- 段階的なトークン蓄積: 会話がターンを重ねるにつれて、各ユーザーメッセージとアシスタントの応答がコンテキストウィンドウ内に蓄積されます。以前のターンは完全に保存されます。
- 線形成長パターン: コンテキストの使用量は各ターンで線形的に増加し、以前のターンは完全に保存されます。
- 20万トークンの容量: 利用可能な総コンテキストウィンドウ(200,000トークン)は、会話履歴を保存し、Claudeから新しい出力を生成するための最大容量を表します。
- 入出力フロー: 各ターンは以下で構成されます:
- 入力フェーズ: すべての以前の会話履歴と現在のユーザーメッセージを含みます
- 出力フェーズ: 将来の入力の一部となるテキスト応答を生成します
拡張思考を使用したコンテキストウィンドウ
拡張思考を使用する場合、思考に使用されるトークンを含むすべての入力および出力トークンがコンテキストウィンドウの制限にカウントされますが、複数ターンの状況ではいくつかのニュアンスがあります。
思考予算トークンはmax_tokens
パラメータのサブセットであり、出力トークンとして課金され、レート制限にカウントされます。
ただし、以前の思考ブロックはAnthropic APIによってコンテキストウィンドウの計算から自動的に除外され、後続のターンでモデルが「見る」会話履歴の一部ではなくなり、実際の会話内容のためのトークン容量が確保されます。
以下の図は、拡張思考が有効な場合の特殊なトークン管理を示しています:
- 拡張思考の除外: 拡張思考ブロック(濃いグレーで表示)は各ターンの出力フェーズで生成されますが、後続のターンの入力トークンとして引き継がれません。思考ブロックを自分で除外する必要はありません。Anthropic APIは、それらを返送すると自動的にこれを行います。
- 技術的な実装の詳細:
- APIは、会話履歴の一部として返送すると、以前のターンからの思考ブロックを自動的に除外します。
- 拡張思考トークンは、生成時に一度だけ出力トークンとして課金されます。
- 有効なコンテキストウィンドウの計算は次のようになります:
context_window = (input_tokens - previous_thinking_tokens) + current_turn_tokens
- 思考トークンには、
thinking
ブロックとredacted_thinking
ブロックの両方が含まれます。
このアーキテクチャはトークン効率が良く、思考ブロックは長さが相当なものになる可能性があるため、トークンの無駄なく広範な推論を可能にします。
コンテキストウィンドウと拡張思考についての詳細は、拡張思考ガイドで読むことができます。
拡張思考とツール使用を伴うコンテキストウィンドウ
以下の図は、拡張思考とツール使用を組み合わせた場合のコンテキストウィンドウのトークン管理を示しています:
最初のターンのアーキテクチャ
- 入力コンポーネント: ツール設定とユーザーメッセージ
- 出力コンポーネント: 拡張思考 + テキスト応答 + ツール使用リクエスト
- トークン計算: すべての入力および出力コンポーネントがコンテキストウィンドウにカウントされ、すべての出力コンポーネントは出力トークンとして課金されます。
ツール結果の処理(ターン2)
- 入力コンポーネント: 最初のターンのすべてのブロックと
tool_result
。拡張思考ブロックは対応するツール結果と一緒に必ず返送する必要があります。これは思考ブロックを返送しなければならない唯一のケースです。 - 出力コンポーネント: ツール結果がClaudeに返送された後、Claudeはテキストのみで応答します(次の
user
メッセージまで追加の拡張思考はありません)。 - トークン計算: すべての入力および出力コンポーネントがコンテキストウィンドウにカウントされ、すべての出力コンポーネントは出力トークンとして課金されます。
第3ステップ
- 入力コンポーネント: 思考ブロックを除くすべての入力と前のターンからの出力が引き継がれます。思考ブロックはClaudeがツール使用サイクル全体を完了したため、この時点で削除できます。APIは思考ブロックを返送すると自動的に除外しますが、この段階で自分で除外しても問題ありません。ここで次の
User
ターンを追加することもできます。 - 出力コンポーネント: ツール使用サイクル外に新しい
User
ターンがあるため、Claudeは新しい拡張思考ブロックを生成し、そこから続行します。 - トークン計算: 以前の思考トークンはコンテキストウィンドウの計算から自動的に除外されます。他のすべての以前のブロックはトークンウィンドウの一部としてカウントされ、現在の
Assistant
ターンの思考ブロックはコンテキストウィンドウの一部としてカウントされます。
- 拡張思考を伴うツール使用の考慮事項:
- ツール結果を投稿する際、その特定のツールリクエストに付随する未修正の思考ブロック全体(署名/編集済み部分を含む)を含める必要があります。
- 拡張思考を伴うツール使用の有効なコンテキストウィンドウの計算は次のようになります:
context_window = input_tokens + current_turn_tokens
- システムは暗号署名を使用して思考ブロックの信頼性を検証します。ツール使用中に思考ブロックを保存しないと、Claudeの推論の連続性が損なわれる可能性があります。したがって、思考ブロックを変更すると、APIはエラーを返します。
新しいClaudeモデルでのコンテキストウィンドウ管理
新しいClaudeモデル(Claude Sonnet 3.7以降)では、プロンプトトークンと出力トークンの合計がモデルのコンテキストウィンドウを超える場合、システムはコンテキストを暗黙的に切り詰めるのではなく、検証エラーを返します。この変更により、より予測可能な動作が提供されますが、より慎重なトークン管理が必要になります。
トークン使用量を計画し、コンテキストウィンドウの制限内に収まるようにするには、トークンカウントAPIを使用して、メッセージをClaudeに送信する前に使用するトークン数を見積もることができます。
モデル別のコンテキストウィンドウサイズのリストについては、モデル比較表を参照してください。