30回やりとりした頃に「さっき言ったこと」が消えている
Claude と長くやりとりしていると、ある瞬間から前半の指示が反映されなくなります。「最初に頼んだフォーマットと違う」「さっき共有したデータを参照してくれない」——この現象に心当たりがあるなら、それは Claude の不具合ではなく、コンテキストウィンドウという仕組み上の制約が原因です。
Claude はチャットの「履歴」を人間のように記憶しているわけではありません。会話のたびに、これまでのやりとり全体をひとつのテキストとしてモデルに渡しています。このテキストの上限がコンテキストウィンドウで、Claude Sonnet 4.6 では約200Kトークン(日本語で概算15万文字程度)です。上限を超えると古いメッセージから順に切り落とされ、Claude は文字通り「見えなくなった部分」を参照できなくなります。
問題は、上限に達する前からパフォーマンスが落ちるという点にあります。実運用では、コンテキストの60〜70%を超えたあたりから、初期の指示への忠実度が下がり始める。これは注意機構(Attention)が長い入力の中で情報の優先度を判断する際、新しい情報に重みが偏るためです。
「忘れている」のか「見えていない」のかを切り分ける
対策を打つ前に、まず状況を正しく診断したい。Claude が文脈を失っているように見えるとき、原因は大きく3つに分かれます。
パターン1: コンテキストウィンドウの圧迫。会話が長すぎて、古いメッセージが切り落とされているケース。Claude の Web アプリでは、会話が長くなると自動的に古い部分が要約・省略されます。API 利用の場合はトークン数の管理が開発者に委ねられるため、意識しないと突然品質が落ちる。
パターン2: 指示の埋没。コンテキスト自体は残っているが、大量のやりとりの中で重要な指示が「薄まっている」ケース。100行の会話の中に1行だけ書いたルールは、モデルにとって見つけにくい。
パターン3: 矛盾する指示。会話の途中で前の指示と矛盾する依頼をしたケース。Claude は最新の指示を優先する傾向があるため、意図せず上書きしてしまうことがあります。
それぞれ対策が異なるので、まずどのパターンに該当するかを確認しよう。簡単な診断方法は、Claude に「この会話で私が最初にお願いしたことを要約してください」と聞くことです。正確に要約できれば指示の埋没か矛盾、要約できなければコンテキストの圧迫が原因と判断できます。
対策1: 重要な指示はシステムプロンプトかプロジェクトに置く
会話本文に書いた指示は、やりとりが進むほど埋もれていく。一方、システムプロンプト(API の system パラメータ)や Claude Projects のプロジェクト指示は、毎回のリクエストで最優先の位置に配置されます。
# API利用時: システムプロンプトに恒久的な指示を配置する
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-4-6-20260312",
max_tokens=1024,
system="あなたはテクニカルライターです。回答は必ず以下のルールに従ってください:\n"
"1. 見出しは## を使い、### 以下は使わない\n"
"2. コード例には必ずコメントを付ける\n"
"3. 1つの回答は500文字以内に収める",
messages=[
{"role": "user", "content": "Pythonのリスト内包表記について教えてください"}
]
)
print(response.content[0].text)
# → システムプロンプトのルール通りにフォーマットされた回答が返るWeb 版の Claude を使っているなら、Projects 機能を活用するのが最も手軽です。プロジェクトの「カスタム指示」欄に書いた内容は、そのプロジェクト内のすべての会話で自動的に適用されます。
対策2: 会話を「章」に分けて新しいチャットを始める
これは最もシンプルだが、最も効果的な方法です。1つの会話で何でも済ませようとせず、テーマや工程が変わるタイミングで新しい会話を始める。
たとえばコードレビューを依頼する場合、「設計の相談」「実装のレビュー」「テストの作成」を3つの会話に分ける。前の会話の結論を次の会話の冒頭に数行で要約して渡せば、文脈は十分に引き継げる。
私の経験では、1つの会話は 20〜30回のやりとり を目安に区切るのがバランスがよい。コードを多くペーストする会話ではもっと早く——10回程度で区切ることもあります。
対策3: 「リマインド」を会話の途中で挟む
長い会話を続けざるを得ない場合、10〜15回のやりとりごとに重要なルールを再提示するテクニックが有効です。
[通常のやりとりを10回ほど続けた後]
ユーザー: 続きの作業に入る前に、この会話のルールを確認させてください。
- 出力フォーマット: Markdown、見出しは##のみ
- 文字数制限: 500文字以内
- コード例には必ずコメントを付ける
これを踏まえて、次のタスクに進みましょう。[次の依頼内容]
ポイントは、リマインドを独立したメッセージにせず、次の依頼と一緒に送ること。こうすることで Claude は「ルールの再確認」と「新しいタスク」をセットで処理するため、指示の反映率が大幅に上がる。
対策4: API利用時はトークン数を監視して会話を自動分割する
API で Claude を使っている場合、usage フィールドでトークン消費量を追跡できます。閾値を設けて自動的に会話をリセットする仕組みを入れておくと、品質劣化を未然に防げる。
# 会話のトークン数を監視し、閾値で自動リセット
MAX_CONTEXT_RATIO = 0.6 # コンテキストの60%を超えたらリセット
MAX_TOKENS = 200000 # Claude Sonnet 4.6のコンテキスト上限
THRESHOLD = int(MAX_TOKENS * MAX_CONTEXT_RATIO)
conversation_history = []
def chat(user_message: str) -> str:
conversation_history.append({"role": "user", "content": user_message})
response = client.messages.create(
model="claude-sonnet-4-6-20260312",
max_tokens=1024,
system="あなたのシステムプロンプト",
messages=conversation_history
)
assistant_message = response.content[0].text
conversation_history.append({"role": "assistant", "content": assistant_message})
# トークン使用量をチェック
total_tokens = response.usage.input_tokens + response.usage.output_tokens
if total_tokens > THRESHOLD:
# 会話の要約を生成してリセット
summary = summarize_conversation(conversation_history)
conversation_history.clear()
conversation_history.append({
"role": "user",
"content": f"前の会話の要約: {summary}\n\n続きをお願いします。"
})
print(f"⚠ コンテキスト {total_tokens}/{MAX_TOKENS} トークン — 会話をリセットしました")
return assistant_messageこのパターンでは input_tokens の値が重要です。output_tokens はレスポンス分なので、実際にコンテキストを圧迫するのは input_tokens の方です。閾値は控えめに60%としているが、用途に応じて調整してほしい。Prompt Caching を併用すれば、リセット後も頻出コンテンツのキャッシュが効くためコストも抑えられます。詳しくはPrompt Caching によるコスト最適化ガイドを参照してほしい。
対策5: Claude Code ユーザーは CLAUDE.md を活用する
Claude Code を使っている場合、プロジェクトルートの CLAUDE.md ファイルが自動的にコンテキストに含まれます。ここにプロジェクト固有のルール——コーディング規約、ディレクトリ構成、禁止事項などを書いておけば、セッションをまたいでも一貫した応答が得られます。
# CLAUDE.md の実践的な書き方の例
## コーディング規約
- TypeScript strict モードを使用
- エラーは try-catch で必ずハンドリングする
- console.log はデバッグ後に削除する
## このプロジェクトの構成
- src/api/ — APIルート(Hono.js)
- src/lib/ — 共通ユーティリティ
- src/components/ — React コンポーネント
## 禁止事項
- any 型の使用禁止
- 既存のテストを削除しないCLAUDE.md に書いた内容はセッションが変わっても毎回読み込まれるため、「前のセッションで決めたルールが反映されない」という問題を根本的に解消できます。詳しい設計パターンはCLAUDE.md 設計パターンガイドで解説しています。
次のアクション: まず「診断」から始める
Claude が文脈を忘れているように感じたら、すぐに対策を講じる前に「この会話で最初にお願いしたことを要約して」と聞いてみてほしい。原因がわかれば、5つの対策のうちどれが効くかは自然と見えてくる。
プログラミングにおけるデバッグと同じで、「何が起きているか」を正確に把握することが、最も早い解決への近道です。