コンテキストウィンドウの理解

「コンテキストウィンドウ」とは、言語モデルが新しいテキストを生成する際に参照できるテキストの総量と、生成する新しいテキストの合計を指します。これは、言語モデルが学習した大規模なデータコーパスとは異なり、モデルの「作業メモリ」を表します。大きなコンテキストウィンドウにより、モデルはより複雑で長いプロンプトを理解し応答することができますが、小さなコンテキストウィンドウでは、長いプロンプトを処理したり、長期的な会話の一貫性を維持したりする能力が制限される可能性があります。

以下の図は、APIリクエストの標準的なコンテキストウィンドウの動作を示しています1

1claude.aiなどのチャットインターフェースでは、コンテキストウィンドウは「先入れ先出し」システムで設定することもできます。

  • 段階的なトークンの蓄積: 会話が進むにつれて、各ユーザーメッセージとアシスタントの応答がコンテキストウィンドウ内に蓄積されます。以前のターンは完全に保持されます。
  • 線形成長パターン: コンテキストの使用量は各ターンで線形的に増加し、以前のターンは完全に保持されます。
  • 20万トークンの容量: 利用可能な総コンテキストウィンドウ(200,000トークン)は、会話履歴の保存とClaudeからの新しい出力の生成のための最大容量を表します。
  • 入出力フロー: 各ターンは以下で構成されています:
    • 入力フェーズ: すべての過去の会話履歴と現在のユーザーメッセージを含む
    • 出力フェーズ: 将来の入力の一部となるテキスト応答を生成する

拡張思考を伴うコンテキストウィンドウ

拡張思考を使用する場合、思考に使用されるトークンを含むすべての入出力トークンがコンテキストウィンドウの制限にカウントされますが、複数ターンの状況では若干のニュアンスがあります。

思考予算のトークンはmax_tokensパラメータのサブセットであり、出力トークンとして課金され、レート制限にカウントされます。

ただし、以前の思考ブロックはAnthropic APIによって自動的にコンテキストウィンドウの計算から除外され、後続のターンでモデルが「見る」会話履歴の一部とはならず、実際の会話コンテンツのためのトークン容量が保持されます。

以下の図は、拡張思考が有効な場合の特殊なトークン管理を示しています:

  • 拡張思考の除外: 拡張思考ブロック(濃いグレーで表示)は各ターンの出力フェーズで生成されますが、後続のターンの入力トークンとしては引き継がれません。思考ブロックを自分で除外する必要はありません。Anthropic APIが自動的にこれを行います。
  • 技術的な実装の詳細:
    • APIは、会話履歴の一部として戻される際に、以前のターンの思考ブロックを自動的に除外します。
    • 拡張思考トークンは、生成時に1回だけ出力トークンとして課金されます。
    • 有効なコンテキストウィンドウの計算は:context_window = (input_tokens - previous_thinking_tokens) + current_turn_tokensとなります。
    • 思考トークンにはthinkingブロックとredacted_thinkingブロックの両方が含まれます。

このアーキテクチャはトークン効率が良く、思考ブロックは長さが大きくなる可能性があるため、トークンの無駄なく広範な推論を可能にします。

コンテキストウィンドウと拡張思考についての詳細は、拡張思考ガイドをご覧ください。

拡張思考とツール使用を伴うコンテキストウィンドウ

以下の図は、拡張思考とツール使用を組み合わせた場合のコンテキストウィンドウのトークン管理を示しています:

1

最初のターンのアーキテクチャ

  • 入力コンポーネント: ツール設定とユーザーメッセージ
  • 出力コンポーネント: 拡張思考 + テキスト応答 + ツール使用リクエスト
  • トークン計算: すべての入出力コンポーネントがコンテキストウィンドウにカウントされ、すべての出力コンポーネントは出力トークンとして課金されます。
2

ツール結果の処理(ターン2)

  • 入力コンポーネント: 最初のターンのすべてのブロックとtool_result。拡張思考ブロックは対応するツール結果とともに必ず返す必要があります。これは思考ブロックを返す必要がある唯一のケースです。
  • 出力コンポーネント: ツール結果がClaudeに渡された後、Claudeはテキストのみで応答します(次のuserメッセージまで追加の拡張思考はありません)。
  • トークン計算: すべての入出力コンポーネントがコンテキストウィンドウにカウントされ、すべての出力コンポーネントは出力トークンとして課金されます。
3

ステップ3

  • 入力コンポーネント: すべての入力と前のターンの出力が、思考ブロックを除いて引き継がれます。思考ブロックは、Claudeがツール使用サイクル全体を完了したため、この時点で削除できます。APIは思考ブロックを自動的に除外しますが、この段階で自分で除外することもできます。ここで次のUserターンを追加することになります。
  • 出力コンポーネント: ツール使用サイクル外の新しいUserターンがあるため、Claudeは新しい拡張思考ブロックを生成し、そこから続行します。
  • トークン計算: 以前の思考トークンはコンテキストウィンドウの計算から自動的に除外されます。他のすべての以前のブロックはトークンウィンドウの一部としてカウントされ続け、現在のAssistantターンの思考ブロックはコンテキストウィンドウの一部としてカウントされます。
  • 拡張思考を伴うツール使用に関する考慮事項:
    • ツール結果を投稿する際は、そのツールリクエストに付随する完全な未修正の思考ブロック(署名/編集済み部分を含む)を含める必要があります。
    • システムは暗号署名を使用して思考ブロックの真正性を確認します。ツール使用中に思考ブロックを保持しないと、Claudeの推論の連続性が損なわれる可能性があります。したがって、思考ブロックを修正すると、APIはエラーを返します。

拡張思考とツール呼び出しの組み合わせはありません - tool_result以外のユーザーターンがない限り、拡張思考、次にツール呼び出し、次に拡張思考という順序は見られません。また、拡張思考ブロック内でのツール使用は現在サポートされていませんが、Claudeは思考ブロック内で使用するツールとその呼び出し方について推論することができます。

拡張思考を伴うツール使用については、拡張思考ガイドで詳しく説明しています。

新しいClaudeモデルでのコンテキストウィンドウ管理

新しいClaudeモデル(Claude 3.7 Sonnet以降)では、プロンプトトークンと出力トークンの合計がモデルのコンテキストウィンドウを超える場合、システムはコンテキストを暗黙的に切り詰めるのではなく、検証エラーを返します。この変更により、より予測可能な動作が提供されますが、より慎重なトークン管理が必要になります。

トークン使用量を計画し、コンテキストウィンドウの制限内に収まることを確認するには、トークンカウントAPIを使用して、メッセージをClaudeに送信する前にトークン数を見積もることができます。

モデル別のコンテキストウィンドウサイズの一覧については、モデル比較表をご覧ください。

次のステップ