コンテンツにスキップ

コンテキストウィンドウ(Context Window)

📁 docs/it-learning/artifact/20260309_1030_コンテキストウィンドウ.md

1. コンテキストウィンドウとは

コンテキストウィンドウとは、LLM(大規模言語モデル)が1回の処理で「見ることができる」テキストの最大量のこと。

ユーザーの質問 + 過去の会話 + 参考資料 + AIの回答
  → これらすべてを合わせた長さがコンテキストウィンドウの上限以内に収まる必要がある
  • 単位は トークン(文字数ではなく意味のまとまり)
  • ウィンドウの外に出た情報はAIから「見えなくなる」
  • 人間でいえば「一度に頭に入れられる情報量の上限」に相当する

2. トークンとは

トークンとは、LLMがテキストを処理する際の最小単位。文字でも単語でもなく、その中間くらいのまとまり。

テキスト例 おおよそのトークン数
英単語1つ("hello") 約1トークン
日本語1文字 約1〜2トークン
日本語の文章400字 約200〜400トークン
英語の文章1,000語 約750トークン
原稿用紙1枚(400字) 約300〜500トークン

目安: 日本語テキストでは「文字数 ÷ 1〜2」くらいがトークン数の概算。

なぜ「トークン」という単位なのか

LLMは文章を「Byte Pair Encoding(BPE)」などの手法で細かく分割して処理する。 例えば "unhappiness" → ["un", "happi", "ness"] のように分割される。 日本語でも「東京都」→「東京」「都」のように分割されることがある。

3. コンテキストウィンドウが重要な理由

制約として働く場面

  • 長い会話: やりとりが増えるほどトークンを消費する。上限を超えると古い会話が「忘れられる」
  • 大きなファイルの処理: ソースコード・長い文書を丸ごと渡せないことがある
  • 複数ドキュメントの参照: 複数の資料を同時に参照したい場合に収まりきらないことがある
  • エージェントの動作: ツールの実行ログや中間結果が積み重なり、コンテキストを圧迫する

具体的な問題

長い会話の例:
  会話1(500トークン)
  会話2(500トークン)
  ...
  会話40(500トークン)
  → 合計 20,000トークン → 上限を超えると会話1〜数件が消える

4. 主要モデルのコンテキストウィンドウ比較(2025年時点)

モデル コンテキストウィンドウ 特記事項
GPT-4o 128,000トークン OpenAI、マルチモーダル対応
GPT-4 Turbo 128,000トークン OpenAI
Claude 3.5 Sonnet 200,000トークン Anthropic、現時点で最大級のひとつ
Claude 3 Opus 200,000トークン Anthropic
Gemini 1.5 Pro 1,000,000トークン Google、実験的機能では200万トークンも
Gemini 1.5 Flash 1,000,000トークン Google、高速・低コスト版
Llama 3 (Meta) 8,000〜128,000トークン オープンソース、バリアントによって異なる
Mistral Large 32,000トークン Mistral AI

参考: 200,000トークン ≒ 日本語で約10〜20万文字 ≒ 文庫本2〜4冊分

5. コンテキストウィンドウが大きいことのメリット・デメリット

メリット

  • 長い文書をそのまま渡せる: 長い契約書、大きなソースコードファイルを一括処理できる
  • 長い会話を維持できる: 複数ターンのやりとりでも文脈を失わない
  • 複数資料を同時参照: 多くのドキュメントを一度に与えて横断的な分析ができる
  • エージェント処理が安定: ツール呼び出しの履歴が多くなっても文脈が保たれる

デメリット

  • コストが高くなる: 課金はトークン数に比例するため、長いコンテキストは費用がかさむ
  • 処理速度が遅くなる: コンテキストが長いほど推論に時間がかかる
  • "Lost in the Middle" 問題: コンテキストが長すぎると、中間部分の情報を見落としやすくなる傾向がある(重要な情報は先頭か末尾に置くとよい)
  • 必ずしも精度が上がるわけではない: 関係のない情報が多すぎると回答の質が下がることもある

6. 実務での対処法

コンテキスト不足への対応

要約(Summarization)

長い会話 → 要約して圧縮 → 要約を新しいコンテキストの冒頭に入れる
- 古い会話を都度要約し、コンテキストを圧縮して継続する手法 - Claude Codeなどのエージェントツールでも採用されている

RAG(Retrieval-Augmented Generation)

大量のドキュメント → ベクトルDB → 質問に関連する部分だけを検索 → コンテキストに注入
- ドキュメント全体をコンテキストに入れる代わりに、関連箇所だけを動的に抽出する手法 - 大規模なナレッジベースを扱う際の定番アプローチ

チャンク分割(Chunking)

大きなファイル → 小さな塊(チャンク)に分割 → 各チャンクを順番に処理 → 結果を統合
- 長いソースコードや文書を分割して処理する手法 - 分割点の設計(意味的な境界で切る)が品質に影響する

スライディングウィンドウ(Sliding Window)

[チャンク1 | チャンク2] → [チャンク2 | チャンク3] → [チャンク3 | チャンク4]
- ウィンドウをずらしながら処理し、前後の文脈をある程度保持する手法 - 翻訳や校正など順序が重要なタスクに有効

キャッシュ(Prompt Caching)

  • AnthropicやOpenAIが提供する機能で、同じプロンプトプレフィックスを繰り返す場合にコストと速度を改善できる
  • 大きなシステムプロンプトを毎回送信するコストを削減できる

7. コンテキストウィンドウの使われ方(構造)

実際のコンテキストウィンドウは以下のように構成される:

┌─────────────────────────────────────────┐
│         コンテキストウィンドウ全体            │
├─────────────────────────────────────────┤
│  システムプロンプト                          │
│  (AIの役割・指示・制約)                    │
├─────────────────────────────────────────┤
│  参考資料・ドキュメント                       │
│  (RAGで取得した情報、コードファイル等)        │
├─────────────────────────────────────────┤
│  会話履歴                                 │
│  ユーザー: ○○してください                   │
│  AI: 了解です。〜                          │
│  ユーザー: では次に〜                        │
│  AI: 〜                                  │
├─────────────────────────────────────────┤
│  現在の質問(最新のユーザー入力)              │
└─────────────────────────────────────────┘

8. コンテキストウィンドウが「いっぱい」になったときの挙動

モデルやツールによって対応が異なる:

挙動 説明 採用例
古い会話を切り捨て 先頭から削除してウィンドウを維持 多くのチャットUI
エラーを返す 上限超過時にリクエスト自体を拒否 API直接利用時
自動要約 古い部分を自動で要約して圧縮 一部のエージェントフレームワーク
ユーザーに警告 残りのトークン数を表示・警告 Claude.ai等のUI

9. 関連用語

用語 説明
トークン(Token) LLMがテキストを処理する最小単位
プロンプト(Prompt) LLMへの入力テキスト全体(指示・質問・文脈を含む)
システムプロンプト(System Prompt) AIの振る舞いや役割を定義する特別なプロンプト
RAG(Retrieval-Augmented Generation) 外部の知識ベースから関連情報を検索してコンテキストに注入する手法
埋め込み(Embedding) テキストを数値ベクトルに変換したもの。RAGでの類似検索に使う
ベクトルDB(Vector Database) Embeddingを格納・検索するためのデータベース。RAGの基盤
Attention(注意機構) Transformerの核心技術。コンテキスト内の各トークン間の関連度を計算する
KVキャッシュ(Key-Value Cache) Attentionの中間計算結果をキャッシュする仕組み。コンテキストが長いほどメモリを消費
インコンテキスト学習(In-Context Learning) コンテキスト内に例示(Few-Shot)を含めてAIの振る舞いを誘導する手法

まとめ

コンテキストウィンドウ = LLMが一度に「見られる」テキストの上限

  単位: トークン(文字数ではない)
  規模: 数千〜100万トークン(モデルにより大幅に異なる)

  上限を超えると:
    → 古い情報が「見えなくなる」
    → エラーになる

  対処法:
    要約         → 古い会話を圧縮して再利用
    RAG          → 必要な情報だけを動的に注入
    チャンク分割  → 大きなデータを小さく分けて処理

  大きいほど便利だが、コスト・速度・"Lost in the Middle"問題に注意

関連 issue: #88 コンテキストウィンドウ 作成日: 2026-03-09