0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【コンテキストエンジニアリングシリーズ】6)デバッグ駆動コンテキストエンジニアリング

Last updated at Posted at 2025-10-12

AIエージェントの「おかしな動作」を診断・修正・予防するための実践的トラブルシューティング


📚 この記事の位置づけ

本記事は、コンテキストエンジニアリングシリーズの続編です。

前提知識として、以下の記事を先にお読みいただくことをおすすめします:

本記事では、AIエージェントが期待通りに動かない時の診断と対処法に焦点を当てます。


目次

  1. なぜデバッグが必要なのか
  2. よくある失敗パターン30選
  3. 診断フレームワーク
  4. コンテキスト汚染の診断と対処
  5. パフォーマンス劣化の原因分析
  6. エージェントが「おかしくなった」時の復旧手順
  7. 予防的デバッグ戦略
  8. トラブルシューティングツールキット
  9. ケーススタディ
  10. チェックリストとチートシート

なぜデバッグが必要なのか

「昨日まで完璧だったのに、今日は全くおかしい」——AIエージェント開発で最も頻繁に遭遇する悪夢です。

AIエージェントは必ずしも期待通りに動作するとは限りません。不可解な動作の背景には、コンテキストの問題、プロンプトの曖昧さ、技術的な制約など、様々な要因があります。本セクションでは、デバッグの必要性と、体系的なトラブルシューティングアプローチの重要性を解説します。

多くの開発者が「エージェントのせい」だと思い込みますが、実際は90%以上が私たち人間側の問題です。コンテキストの曖昧さ、矛盾、古い情報——これらを体系的に診断し修正することで、エージェントは再び期待通りに動作します。

AIエージェントの「不可解な動作」

原因不明に見える問題も、実はパターン化できます。

典型的な症状

症状 影響度
出力品質の低下 突然コードの質が悪くなった 🔴 高
応答の遅延 以前は5秒、今は30秒 🟡 中
矛盾した提案 前回と違う実装を提案 🔴 高
コンテキスト無視 明示した規約を守らない 🔴 高
無限ループ 同じ質問を繰り返す 🔴 高
不完全な出力 コードが途中で切れる 🟡 中

デバッグの重要性

当てずっぽうではなく、科学的なアプローチで——これがプロフェッショナルとアマチュアの違いです。

デバッグなしの開発は、暗闇で手探りするようなものです。問題の根本原因を特定し、体系的に修正することで、同じ問題の再発を防ぎ、チーム全体の知見として蓄積できます。

// デバッグなしの開発
while (true) {
  const code = await agent.generate(prompt);
  if (isGood(code)) break;  // いつまで経っても break しない... 😱
  prompt = modifyRandomly(prompt);  // 当てずっぽう
}

// デバッグ駆動の開発
const diagnosis = await diagnoseAgent(agent);
const root_cause = diagnosis.findRootCause();
const fix = applySystematicFix(root_cause);
// ✅ 根本原因を特定して修正

デバッグすることで:

  • ✅ 問題の根本原因を特定
  • ✅ 再発防止策を講じる
  • ✅ 開発効率を維持
  • ✅ チーム全体の知見として蓄積

よくある失敗パターン30選

「失敗は成功の母」——他人の失敗から学ぶのが、最も効率的です。

AIエージェントの不具合は、パターン化できる典型的なものが多く存在します。コンテキスト設計、プロンプト設計、技術的問題、運用上の問題の4つのカテゴリに分類された30の失敗パターンを学ぶことで、問題の早期発見と予防が可能になります。

これらは実際のプロジェクトで何度も遭遇した問題を体系化したものです。あなたのプロジェクトでも、きっと当てはまるパターンがあるはずです。それぞれの失敗から学び、同じ轍を踏まないようにしましょう。

カテゴリ別の失敗パターン

まずは全体像を把握しましょう——4つのカテゴリ、30のパターン。

📋 コンテキスト設計(15パターン)

最も頻繁に遭遇するカテゴリです。コンテキストの質がエージェントの出力を決定します。

  • 曖昧な指示
  • 矛盾した情報
  • 情報過多
  • 情報不足
  • 優先順位不明
  • (他10パターン)

💬 プロンプト設計(7パターン)

プロンプトの書き方一つで、結果が劇的に変わります。

  • 指示が不明確
  • 例が不適切
  • 段階的指示の欠如
  • (他4パターン)

⚙️ 技術的問題(4パターン)

技術的な制約を理解せずに使うと、必ず壁に当たります。

  • トークン超過
  • レート制限
  • メモリリーク
  • キャッシュ未活用

🔧 運用問題(4パターン)

個人では問題なくても、チームやプロジェクトが成長すると顕在化します。

  • 更新忘れ
  • バージョン不整合
  • 権限管理ミス
  • ドキュメント分散

【カテゴリ1】コンテキスト設計の失敗(パターン1-15)

全体の60%を占める、最も重要なカテゴリです。

パターン1: 曖昧な指示

「基本的に」「なるべく」——こういった曖昧な言葉が、エージェントを混乱させます。

❌ Bad: 曖昧な表現
「基本的にTypeScriptを使ってください」
→ \"基本的に\"って何?例外は?

✅ Good: 明確な指示
「すべてのファイルはTypeScriptで記述する。
例外: 設定ファイル(.js, .json)のみJavaScript可」

症状: エージェントがTypeScriptとJavaScriptを混在させる

パターン2: 矛盾した情報

左手で与えて、右手で奪う——矛盾した指示は、エージェントを完全に混乱させます。

❌ Bad: 矛盾する指示
# ファイルA
「エラーは例外をthrowしてください」

# ファイルB
「エラーはResult型で返してください」

症状: ファイルごとに異なるエラーハンドリングが混在

パターン3: 情報過多(トークン浪費)

「全部読ませれば完璧」は間違い——情報過多は、かえって品質を下げます。

❌ Bad: 不要な詳細情報
# context.md (5000行)
- 使用していないライブラリの詳細
- 過去の議論の全ログ

症状: エージェントの応答が非常に遅い(30秒以上)

パターン4: 情報不足(推測による誤り)

情報が足りないと、エージェントは勝手に「推測」します——往々にして間違った推測を。

❌ Bad: 重要情報の欠如
「ユーザー認証を実装してください」

→ エージェントが勝手に判断:
- セッション? JWT? OAuth?

パターン5: 優先順位の不明確さ

「全部重要」は「何も重要でない」のと同じです。

❌ Bad: すべてが「重要」
- パフォーマンスが重要
- 可読性が重要
- テストが重要

→ すべて重要なら、何が最優先?

パターン6: コンテキストの古さ

❌ Bad: 3ヶ月前の情報
「Node.js 18を使用」
→ 実際はNode.js 20に移行済み

パターン7: ドメイン境界が不明確

❌ Bad: すべて混在
認証、決済、通知の情報が
1つのファイルに全部書かれている

パターン8: 例外ケースの記載漏れ

❌ Bad: 正常系のみ
「ユーザーを作成する関数を書いて」

✅ Good: 例外ケースも明記
「ユーザーを作成する関数を書いて
- メールアドレス重複時は409エラー
- バリデーション失敗時は400エラー」

パターン9: バージョン情報の欠如

❌ Bad: 
「Reactを使用」

✅ Good:
「React 18.2(App Routerは使用しない)」

パターン10: 暗黙の前提

❌ Bad: 
「認証済みユーザーの情報を取得」
→ どうやって認証済みと判断?

✅ Good:
「JWTトークンから認証済みユーザーの情報を取得
トークンはAuthorizationヘッダーから取得」

パターン11: ネガティブケースの不足

❌ Bad: 
「こうしてください」のみ

✅ Good:
「こうしてください」
「これはしないでください」の両方

パターン12: 依存関係の記載漏れ

❌ Bad:
「決済処理を実装」

✅ Good:
「決済処理を実装
前提: UserServiceで認証済み
必要: PaymentProviderServiceのインジェクション」

パターン13: テスト要件の欠如

❌ Bad:
「機能を実装してください」

✅ Good:
「機能を実装してください
テストカバレッジ80%以上
エッジケースのテスト必須」

パターン14: パフォーマンス要件の曖昧さ

❌ Bad:
「速く動くようにしてください」

✅ Good:
「APIレスポンス95%ile < 200ms
N+1クエリは禁止」

パターン15: セキュリティ要件の不足

❌ Bad:
「ログイン機能を実装」

✅ Good:
「ログイン機能を実装
- パスワードはbcryptでハッシュ化
- 失敗5回でアカウントロック
- ログイン履歴の記録必須」

【カテゴリ2】プロンプト設計の失敗(パターン16-22)

コンテキストが完璧でも、プロンプトが悪ければ台無しです。

プロンプトは、エージェントへの「指示書」です。明確で、具体的で、段階的な指示が、期待通りの結果を生みます。

パターン16: 一度に複数の要求

「あれもこれも」は、「どれもダメ」になります。

❌ Bad:
「ユーザー管理とチーム管理と権限管理を実装してください」

✅ Good:
「まずユーザー管理から実装してください」
(完了後)「次にチーム管理を...」

パターン17: 出力形式の指定漏れ

❌ Bad:
「プロジェクト構造を説明して」

✅ Good:
「プロジェクト構造をMarkdownのツリー形式で説明して」

パターン18: コンテキストの参照指示がない

❌ Bad:
「ユーザーサービスを実装して」

✅ Good:
「@.ai/team/context.md を参照して、
既存の UserRepository パターンに従って
UserService を実装してください」

パターン19: 成功条件が不明確

❌ Bad:
「テストを書いて」

✅ Good:
「以下を満たすテストを書いて
- 正常系3ケース
- 異常系2ケース
- すべてのテストがパス」

パターン20: フィードバックループの欠如

❌ Bad:
一度に完全な実装を要求

✅ Good:
「まずインターフェースを定義してください」
→ レビュー
→ 「では実装してください」

パターン21: 既存コードへの言及なし

❌ Bad:
「認証機能を追加して」

✅ Good:
「既存の src/modules/auth/ を確認して、
同じパターンで新しい認証方式を追加してください」

パターン22: エラーハンドリングの指示なし

❌ Bad:
「データを保存する関数を書いて」

✅ Good:
「データを保存する関数を書いて
DB接続エラー、制約違反、タイムアウトを
それぞれ適切な例外クラスで処理してください」

【カテゴリ3】技術的問題(パターン23-26)

技術的な制約を無視すると、必ず痛い目に遭います。

AIモデルには物理的な限界があります。トークン数、レート制限、メモリ——これらの制約を理解し、適切に管理することが重要です。

パターン23: トークン超過を考慮していない

「入るだけ入れよう」は危険——トークン上限は厳格です。

❌ Bad:
すべてのファイルを一度に読み込む

✅ Good:
必要なファイルのみを選択的に読み込む

パターン24: APIレート制限を無視

❌ Bad:
連続で100回リクエスト

✅ Good:
適切な間隔を設けてリクエスト

パターン25: キャッシュの未活用

❌ Bad:
毎回同じコンテキストを読み込む

✅ Good:
変更がなければキャッシュを使用

パターン26: セッション管理の不備

❌ Bad:
1日中同じセッションで作業

✅ Good:
2-3時間ごとにセッションをリフレッシュ

【カテゴリ4】運用問題(パターン27-30)

個人では気づかないが、チームでは致命的になる問題群です。

プロジェクトが成長し、チームが拡大すると、運用上の問題が顕在化します。バージョン管理、チーム共有、継続的改善——これらを怠ると、カオスに陥ります。

パターン27: バージョン管理していない

「コンテキストもコードです」——同じように扱いましょう。

❌ Bad:
コンテキストファイルが.gitignore

✅ Good:
コンテキストもGitで管理

パターン28: チームへの共有不足

❌ Bad:
個人のローカルだけに良いコンテキスト

✅ Good:
チーム全体で共有して全員が活用

パターン29: ドキュメントの分散

❌ Bad:
情報がSlack、Notion、Confluenceに分散

✅ Good:
重要な情報はコンテキストファイルに集約

パターン30: 改善サイクルの欠如

❌ Bad:
問題が起きても放置

✅ Good:
問題を記録して改善策を実装
定期的にコンテキストをレビュー

診断フレームワーク

パニックにならないで——体系的なアプローチに従えば、どんな問題も解決できます。

問題が発生したとき、闇雲に対処するのではなく、体系的なアプローチに従うことで、効率的に根本原因を特定できます。このセクションでは、症状の分類から修正までの一連の流れを示す診断フレームワークを紹介します。このフレームワークを使えば、どんな問題でも段階的に解決できるようになります。

医者が患者を診察するように、エージェントの「病気」も診断できます。症状を観察し、検査を行い、原因を特定し、治療する——このプロセスは、人間の医療とまったく同じです。

体系的な診断アプローチ

最初に症状を正確に分類——これが診断成功の鍵です。

AIエージェントの問題は、大きく「出力品質」「パフォーマンス」「動作異常」の3つのカテゴリに分類できます。まずは症状を正確に分類し、それぞれに適した診断手法を適用することが重要です。間違った診断手法を適用すると、時間を浪費するだけでなく、問題を悪化させることもあります。

診断チェックリスト

診断を効率的に進めるために、問題の深刻度に応じて3つのレベルのチェックリストを用意しました。まずは5分でできる基本診断から始め、問題が解決しない場合は段階的に詳細な診断へと進めていきます。各レベルで具体的なコマンドと確認項目を示しているので、迷わず診断を進められます。


コンテキスト汚染の診断と対処

最も厄介で、最も頻繁に遭遇する問題——しかし、理解すれば対処は簡単です。

AIエージェントの最も厄介な問題の一つが「コンテキスト汚染」です。複数のタスクを連続して実行すると、前のタスクの情報が次のタスクに混入し、不適切な提案を引き起こします。このセクションでは、コンテキスト汚染の本質を理解し、早期発見と効果的な対処法を学びます。

「なんで決済APIの実装に認証のコードが混入してるの?」——この疑問に覚えがあるなら、あなたはコンテキスト汚染の被害者です。しかし安心してください。原因を理解し、適切に対処すれば、問題は解決します。

コンテキスト汚染とは?

エージェントの「記憶の混濁」——前のタスクを忘れられない状態です。

長時間のセッションや複数タスクの連続実行により、異なる文脈の情報が混ざり合ってしまう現象です。人間でいえば、前の会議の内容を引きずって次の会議で見当違いな発言をしてしまうようなものです。エージェントは、明示的にリセットしない限り、すべての過去の対話を「覚えて」います。

定義: 異なるコンテキストが混在し、エージェントが不適切な判断をする状態

症状の例

コンテキスト汚染が発生すると、エージェントは現在のタスクとは無関係なコードや概念を混入させます。以下は典型的な症状で、認証機能の文脈が決済APIに混入してしまった例です。

// 症状1: 前のタスクの文脈を引きずる
// タスク: 決済APIの実装

// ❌ エージェントの出力(汚染)
export class PaymentService {
  async processPayment(paymentData: PaymentData) {
    // なぜか認証チェックが混入(決済APIには不要)
    const token = extractToken(request);
    const user = await verifyToken(token);  // 不要!
    
    // 本来の決済処理
    // ...
  }
}

診断ツール

目視では見逃しがち——自動検出ツールで早期発見しましょう。

コンテキスト汚染を早期に発見するために、自動検出ツールを活用しましょう。このツールは生成されたコードを分析し、期待されるドメインとは異なるキーワードやパターンを検出します。人間の目では見逃してしまう微妙な混入も、ツールなら確実に捕捉できます。

// .ai/scripts/detect-context-pollution.ts

interface PollutionIndicator {
  type: string;
  confidence: number;
  evidence: string[];
}

function detectContextPollution(
  generatedCode: string,
  expectedContext: Context
): PollutionIndicator[] {
  const indicators: PollutionIndicator[] = [];
  
  // 1. キーワード分析
  const unexpectedKeywords = findUnexpectedKeywords(
    generatedCode,
    expectedContext.domain
  );
  
  if (unexpectedKeywords.length > 0) {
    indicators.push({
      type: 'unexpected_keywords',
      confidence: 0.8,
      evidence: unexpectedKeywords
    });
  }
  
  // 2. パターン分析
  const unexpectedPatterns = detectUnexpectedPatterns(
    generatedCode,
    expectedContext.patterns
  );
  
  if (unexpectedPatterns.length > 0) {
    indicators.push({
      type: 'pattern_mismatch',
      confidence: 0.9,
      evidence: unexpectedPatterns
    });
  }
  
  return indicators;
}

対処法

コンテキスト汚染を解決するには、3つの主要なアプローチがあります。状況に応じて適切な方法を選択しましょう。最も簡単なのはセッションのリセットですが、予防的な対策も重要です。

方法1: セッションのクリーンリスタート

最も確実で即効性のある方法です。セッションを完全にリセットすることで、汚染されたコンテキストをクリアし、クリーンな状態から再開できます。

# 完全なリセット
claude-code --new-session --clear-cache

# 新しいセッションでコンテキストを再読み込み
claude-code @.ai/team/context.md @.ai/domains/payment/context.md

方法2: 明示的なコンテキスト境界

セッションをリセットせずに続ける場合は、明示的に「前のコンテキストを忘れる」よう指示します。これにより、同じセッション内でも境界を設定できます。

---
🚫 前のタスクのコンテキストは忘れてください
---

# 新しいタスク: 決済API実装

## このタスクで参照すべきコンテキスト
- .ai/team/context.md
- .ai/domains/payment/context.md

## このタスクで参照すべきでないもの
- 認証関連のコンテキスト(別タスク)
- GraphQL関連のパターン(使用しない)

方法3: コンテキスト分離戦略

根本的な解決策として、タスクごとに独立したセッションを使用する戦略です。これにより、タスク間のコンテキスト汚染を完全に防げます。

# タスクごとにセッション名を付ける
claude-code --session \"task-payment-api\"
claude-code --session \"task-auth-system\"
claude-code --session \"task-notification\"

# セッションの切り替え
claude-code --switch-session \"task-auth-system\"

パフォーマンス劣化の原因分析

「遅い」には必ず理由がある——測定し、分析し、最適化しましょう。

エージェントの応答が遅くなった、タイムアウトが頻発するようになった──こうしたパフォーマンスの問題は、開発効率を著しく低下させます。このセクションでは、パフォーマンス劣化の原因を科学的に分析し、データに基づいた最適化を実現する方法を解説します。

「最初は5秒だったのに、今は30秒かかる」——これは偶然ではありません。プロジェクトの成長とともに、コンテキストも肥大化します。しかし、適切な最適化により、パフォーマンスは必ず回復します。

パフォーマンス劣化のパターン

原因を正確に特定——闇雲な最適化は時間の無駄です。

パフォーマンス問題の原因は多岐にわたりますが、主に4つのパターンに分類できます。原因を正確に特定することが、効果的な最適化の第一歩です。「なんとなく遅い」ではなく、「トークン数が多すぎて遅い」のか「ネットワークが遅い」のかを明確にしましょう。

測定ツール

「測定できないものは改善できない」という原則に従い、まずはパフォーマンスを定量的に測定します。このプロファイラーは、トークン数、コンテキストサイズ、応答時間などの重要な指標を自動収集し、ボトルネックを特定します。

// .ai/scripts/performance-profiler.ts

interface PerformanceMetrics {
  requestTime: number;
  tokenCount: number;
  contextSize: number;
  responseTime: number;
}

class PerformanceProfiler {
  private metrics: PerformanceMetrics[] = [];
  
  async profileRequest(
    prompt: string,
    contextFiles: string[]
  ): Promise<PerformanceMetrics> {
    const startTime = Date.now();
    
    // コンテキストサイズ計測
    const contextSize = await this.measureContextSize(contextFiles);
    
    // トークン数計測
    const tokenCount = await this.countTokens(prompt, contextFiles);
    
    // リクエスト実行
    const requestStartTime = Date.now();
    await this.executeRequest(prompt);
    const requestTime = Date.now() - requestStartTime;
    
    const responseTime = Date.now() - startTime;
    
    const metrics = {
      requestTime,
      tokenCount,
      contextSize,
      responseTime
    };
    
    this.metrics.push(metrics);
    return metrics;
  }
  
  analyzePerformance(): PerformanceAnalysis {
    const avg = this.calculateAverage(this.metrics);
    const trend = this.detectTrend(this.metrics);
    
    return {
      average: avg,
      trend,
      bottlenecks: this.identifyBottlenecks(this.metrics),
      recommendations: this.generateRecommendations(avg, trend)
    };
  }
}

最適化戦略

測定なき最適化は、ただの当てずっぽう——データに基づいて戦略を選びましょう。

測定結果に基づいて、具体的な最適化戦略を実施します。ここでは、実践的で即効性のある2つの戦略を紹介します。どちらも多くのプロジェクトで実証された、効果の高い手法です。

戦略1: コンテキストの段階的読み込み

「全部一度に」ではなく「必要な分だけ」——シンプルだが強力な戦略です。

一度にすべてのコンテキストを読み込むのではなく、必要最小限から始めて段階的に追加する戦略です。これにより、トークン数を大幅に削減し、応答時間を短縮できます。多くの場合、これだけで50%以上の高速化が達成できます。

❌ Before: すべてを一度に読み込む
@.ai/team/context.md
@.ai/team/architecture.md
@.ai/team/conventions.md
@.ai/domains/**/*.md
→ 合計180,000トークン、応答30秒

✅ After: 段階的に読み込む
# ステップ1: 最小限のコンテキスト
@.ai/team/context.md  # 基本情報のみ
「ユーザー管理機能の概要を教えてください」

# ステップ2: 必要に応じて詳細を追加
@.ai/domains/users/context.md
「では、実装を開始してください」

→ 合計60,000トークン、応答10秒

戦略2: コンテキストのキャッシング

同じものを何度も読むのは無駄——キャッシュで劇的に高速化します。

同じコンテキストファイルを繰り返し読み込むのは非効率です。キャッシング機構を導入することで、ファイルシステムへのアクセスを減らし、パフォーマンスを向上させます。特に、頻繁にエージェントを起動する場合、キャッシュの効果は絶大です。

// .ai/scripts/context-cache.ts

import { createHash } from 'crypto';

class ContextCache {
  private cacheDir = '.ai/.cache';
  
  async getCachedContext(files: string[]): Promise<string | null> {
    const hash = this.hashFiles(files);
    const cachePath = `${this.cacheDir}/${hash}.json`;
    
    try {
      const cached = await readFile(cachePath, 'utf-8');
      const data = JSON.parse(cached);
      
      // キャッシュの有効期限チェック(24時間)
      if (Date.now() - data.timestamp < 86400000) {
        console.log('✅ キャッシュヒット');
        return data.content;
      }
    } catch {
      // キャッシュなし
    }
    
    return null;
  }
  
  async cacheContext(files: string[], content: string): Promise<void> {
    const hash = this.hashFiles(files);
    const cachePath = `${this.cacheDir}/${hash}.json`;
    
    await writeFile(cachePath, JSON.stringify({
      content,
      timestamp: Date.now(),
      files
    }));
  }
}

エージェントが「おかしくなった」時の復旧手順

パニックは禁物——冷静に、体系的に対処しましょう。

「エージェントがおかしくなった」と感じる瞬間は誰にでもあります。無限ループ、矛盾した提案、応答の遅延──こうした緊急事態に冷静に対処するための手順書です。症状別の対処フローと、段階的な復旧手順を用意しています。

緊急事態こそ、落ち着くことが重要です。このフローチャートをブックマークしておいて、問題が発生したらすぐに参照できるようにしましょう。ほとんどの問題は、適切な手順に従えば短時間で解決します。

緊急復旧フローチャート

まず深呼吸——そしてこのフローチャートに従ってください。

パニックにならず、このフローチャートに従って症状を分類し、適切な復旧手順を選択しましょう。ほとんどの問題は5〜15分で解決できます。時間がかかっているように感じても、体系的なアプローチに従うことが、結果的には最速の解決につながります。

復旧手順書

レベル分けで効率的に——軽い問題に重い対処は無駄、重い問題に軽い対処は危険です。

症状の深刻度に応じて、3つのレベルの復旧手順を用意しました。軽度の問題なら5分、重度の問題でも30分あれば復旧できます。各レベルで具体的なコマンドと検証方法を記載しています。まずはレベル1から試し、解決しなければレベル2、レベル3と進みます。


予防的デバッグ戦略

「火消し」ではなく「防火」——問題が起きる前に対処することが、真のプロフェッショナルです。

「治療より予防」という原則は、デバッグにも当てはまります。問題が発生してから対処するのではなく、問題が起きにくいシステムを構築することで、デバッグの労力を大幅に削減できます。このセクションでは、自動化とモニタリングによる予防的アプローチを解説します。

デバッグに時間を取られるのは非生産的です。その時間を、本来の開発に使うべきです。予防的デバッグに投資することで、長期的には大幅な時間節約につながります。

デバッグを減らすための設計

3本の柱で、問題を未然に防ぎます。

予防的デバッグの3本柱は、自動検証、定期メンテナンス、継続的モニタリングです。これらを組み合わせることで、問題を早期に発見し、大きな障害になる前に対処できます。それぞれ独立した効果を持ちますが、組み合わせることで相乗効果が生まれます。

自動検証パイプライン

人間は忘れる、でも機械は忘れない——CIで品質を自動保証しましょう。

GitHub ActionsなどのCI/CDツールを使って、コンテキストの品質を自動的にチェックします。PRのたびに検証が走るので、問題のあるコンテキストがマージされるのを防げます。「レビューで見落とした」という言い訳は、もう通用しません。

# .github/workflows/context-validation.yml

name: Context Quality Check

on:
  pull_request:
    paths:
      - '.ai/**'
  push:
    branches:
      - main
  schedule:
    - cron: '0 0 * * 1'  # 毎週月曜0時

jobs:
  validate:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '20'
      
      - name: Install dependencies
        run: npm ci
      
      - name: Check for contradictions
        run: npm run ai:detect-contradictions
      
      - name: Check token counts
        run: npm run ai:estimate-tokens
      
      - name: Check context staleness
        run: npm run ai:check-staleness
      
      - name: Validate context schema
        run: npm run ai:validate-schema
      
      - name: Generate report
        if: always()
        run: npm run ai:generate-report
      
      - name: Comment on PR
        if: github.event_name == 'pull_request'
        uses: actions/github-script@v6
        with:
          script: |
            const report = require('./ai-validation-report.json');
            let body = '## AI Context Validation Results';
            
            if (report.errors.length > 0) {
              body += '### ❌ Errors';
              report.errors.forEach(e => {
                body += `- ${e}`;
              });
            }
            
            if (report.warnings.length > 0) {
              body += '### ⚠️ Warnings';
              report.warnings.forEach(w => {
                body += `- ${w}`;
              });
            }
            
            if (report.info.length > 0) {
              body += '### ℹ️ Info';
              report.info.forEach(i => {
                body += `- ${i}`;
              });
            }
            
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: body
            });

定期メンテナンスチェックリスト

週に一度の健康診断——小さな問題を見逃さないことが、大きな問題を防ぎます。

週に一度、コンテキストの健全性をチェックする習慣をつけましょう。このチェックリストに従えば、情報の鮮度、品質、最適性を維持できます。「毎週月曜日の朝」のように、ルーティン化すると忘れません。

# コンテキスト定期メンテナンス(週次)

## 情報の新鮮度チェック
- [ ] 技術スタックのバージョンが最新か
- [ ] アーキテクチャ図が現状と一致しているか
- [ ] ADRに最近の決定が反映されているか

## 品質チェック
- [ ] 曖昧な表現がないか
- [ ] 矛盾した情報がないか
- [ ] 不要な情報が残っていないか

## トークン最適化
- [ ] 合計トークン数が適切か
- [ ] 使用頻度の低いコンテキストをアーカイブ

## チーム同期
- [ ] 新メンバーがコンテキストを理解できているか
- [ ] よくある質問を追加すべきか

モニタリングダッシュボード

見える化で、問題を早期発見——ダッシュボードは健康のバロメーターです。

コンテキストの健全性を可視化し、チーム全体で共有するダッシュボードです。トークン数、矛盾の数、古いファイルの数などの指標を自動収集し、Slackなどに通知します。数字が語る真実を、見逃さないようにしましょう。

// .ai/scripts/monitoring-dashboard.ts

interface ContextMetrics {
  totalTokens: number;
  fileCount: number;
  lastUpdate: Date;
  contradictions: number;
  staleFiles: number;
}

class ContextMonitor {
  async collectMetrics(): Promise<ContextMetrics> {
    return {
      totalTokens: await this.countTotalTokens(),
      fileCount: await this.countFiles(),
      lastUpdate: await this.getLastUpdateTime(),
      contradictions: await this.detectContradictions(),
      staleFiles: await this.findStaleFiles()
    };
  }
  
  generateReport(metrics: ContextMetrics): string {
    return `
# AI Context Health Report
Generated: ${new Date().toISOString()}

## Overview
- Total Files: ${metrics.fileCount}
- Total Tokens: ${metrics.totalTokens.toLocaleString()}
- Last Update: ${metrics.lastUpdate.toLocaleDateString()}

## Issues
- Contradictions: ${metrics.contradictions}
- Stale Files: ${metrics.staleFiles}

## Status
${this.getHealthStatus(metrics)}

## Recommendations
${this.generateRecommendations(metrics)}
    `;
  }
  
  private getHealthStatus(metrics: ContextMetrics): string {
    if (metrics.contradictions > 0 || metrics.staleFiles > 3) {
      return '🔴 Action Required';
    } else if (metrics.totalTokens > 180000) {
      return '🟡 Warning: Token count high';
    }
    return '🟢 Healthy';
  }
}

// 使用例
const monitor = new ContextMonitor();
const metrics = await monitor.collectMetrics();
const report = monitor.generateReport(metrics);

// Slackに通知
await postToSlack('#ai-context-health', report);

トラブルシューティングツールキット

良い職人は道具を選ぶ——適切なツールが、デバッグ効率を10倍にします。

効果的なデバッグには、適切なツールが不可欠です。このセクションでは、コンテキストの検証、矛盾検出、自動修正などの実用的なスクリプト集を提供します。すぐにプロジェクトに導入でき、デバッグ効率を劇的に向上させます。

これらのツールは、実際のプロジェクトで磨かれた、実戦投入可能なものです。そのままコピー&ペーストしても動作します。あなたのプロジェクトに合わせてカスタマイズすれば、さらに強力になります。

必須ツール集

まずはこの9つのツールを揃えましょう——デバッグの武器庫です。

これらのスクリプトをpackage.jsonに登録しておくことで、いつでも簡単に実行できます。日常的に使うコマンドなので、エイリアスを設定しておくと便利です。npm run ai:と入力してTabキーを押せば、使用可能なコマンド一覧が表示されます。

// package.json

{
  "scripts": {
    "ai:validate": "tsx .ai/scripts/validate-context.ts",
    "ai:detect-contradictions": "tsx .ai/scripts/detect-contradictions.ts",
    "ai:estimate-tokens": "tsx .ai/scripts/estimate-tokens.ts",
    "ai:check-staleness": "tsx .ai/scripts/check-staleness.ts",
    "ai:profile-performance": "tsx .ai/scripts/performance-profiler.ts",
    "ai:detect-pollution": "tsx .ai/scripts/detect-pollution.ts",
    "ai:generate-report": "tsx .ai/scripts/generate-report.ts",
    "ai:health-check": "tsx .ai/scripts/health-check.ts",
    "ai:fix-common-issues": "tsx .ai/scripts/auto-fix.ts"
  }
}

ツール1: コンテキスト検証スクリプト

品質のゲートキーパー——基準を満たさないコンテキストは通しません。

コンテキストファイルの基本的な品質をチェックするスクリプトです。バージョン情報の有無、曖昧な表現、不完全なコード例、リンク切れなどを自動検出します。CIに組み込めば、品質の低いコンテキストがマージされるのを防げます。このツールは、チーム全体のコンテキスト品質の最低ラインを保証します。

// .ai/scripts/validate-context.ts

import { readFileSync } from 'fs';
import { glob } from 'glob';

interface ValidationResult {
  file: string;
  errors: string[];
  warnings: string[];
}

class ContextValidator {
  async validateAll(): Promise<ValidationResult[]> {
    const files = await glob('.ai/**/*.md');
    const results: ValidationResult[] = [];
    
    for (const file of files) {
      const content = readFileSync(file, 'utf-8');
      const result = this.validateFile(file, content);
      results.push(result);
    }
    
    return results;
  }
  
  private validateFile(file: string, content: string): ValidationResult {
    const errors: string[] = [];
    const warnings: string[] = [];
    
    // チェック1: バージョン情報
    if (!content.includes('バージョン:') && !content.includes('Version:')) {
      errors.push('バージョン情報が見つかりません');
    }
    
    // チェック2: 最終更新日
    if (!content.includes('最終更新:') && !content.includes('Last updated:')) {
      errors.push('最終更新日が見つかりません');
    }
    
    // チェック3: 曖昧な表現
    const vaguePatterns = [
      '基本的に', 'なるべく', 'できれば', 'たぶん', 'おそらく'
    ];
    
    vaguePatterns.forEach(pattern => {
      if (content.includes(pattern)) {
        warnings.push(`曖昧な表現が含まれています: \"${pattern}\"`);
      }
    });
    
    // チェック4: コード例の動作確認
    const codeBlocks = this.extractCodeBlocks(content);
    codeBlocks.forEach((block, index) => {
      if (block.includes('TODO') || block.includes('...')) {
        warnings.push(`コードブロック${index + 1}が不完全です`);
      }
    });
    
    // チェック5: リンク切れ
    const links = this.extractLinks(content);
    links.forEach(link => {
      if (link.startsWith('./') || link.startsWith('../')) {
        // 内部リンクの存在確認
        // 実装省略
      }
    });
    
    return { file, errors, warnings };
  }
  
  private extractCodeBlocks(content: string): string[] {
    const regex = /[sS]*?/g;
    return content.match(regex) || [];
  }
  
  private extractLinks(content: string): string[] {
    const regex = /[.*?]((.*?))/g;
    const matches = content.matchAll(regex);
    return Array.from(matches).map(m => m[1]);
  }
}

// 実行
const validator = new ContextValidator();
const results = await validator.validateAll();

let hasErrors = false;

results.forEach(result => {
  if (result.errors.length > 0) {
    hasErrors = true;
    console.error(`
❌ ${result.file}`);
    result.errors.forEach(e => console.error(`  Error: ${e}`));
  }
  
  if (result.warnings.length > 0) {
    console.warn(`
⚠️  ${result.file}`);
    result.warnings.forEach(w => console.warn(`  Warning: ${w}`));
  }
});

if (hasErrors) {
  console.error('
❌ コンテキスト検証に失敗しました');
  process.exit(1);
}

console.log('
✅ すべてのコンテキストが有効です');

ツール2: 矛盾検出スクリプト

矛盾の探偵——人間の目では見逃す矛盾も、アルゴリズムで確実に発見します。

複数のコンテキストファイル間で矛盾する記述を自動検出するスクリプトです。同じカテゴリ内で相反する指示がないかをチェックし、問題箇所を特定します。チーム開発で特に重要なツールです。複数人が異なる時期に書いたコンテキストでは、矛盾は避けられません——このツールがそれを捕捉します。

// .ai/scripts/detect-contradictions.ts

interface Rule {
  file: string;
  category: string;
  statement: string;
  lineNumber: number;
}

class ContradictionDetector {
  async detectAll(): Promise<Contradiction[]> {
    const rules = await this.extractRules();
    return this.findContradictions(rules);
  }
  
  private async extractRules(): Promise<Rule[]> {
    const files = await glob('.ai/**/*.md');
    const rules: Rule[] = [];
    
    for (const file of files) {
      const content = readFileSync(file, 'utf-8');
      const fileRules = this.parseRules(file, content);
      rules.push(...fileRules);
    }
    
    return rules;
  }
  
  private parseRules(file: string, content: string): Rule[] {
    const rules: Rule[] = [];
    const lines = content.split('\
');
    
    // ルールの抽出ロジック
    lines.forEach((line, index) => {
      // \"✅\" または \"❌\" で始まる行をルールとして抽出
      if (line.trim().startsWith('') || line.trim().startsWith('')) {
        const category = this.inferCategory(line);
        rules.push({
          file,
          category,
          statement: line.trim(),
          lineNumber: index + 1
        });
      }
      
      // \"- [ ]\" で始まる行もチェック
      if (line.trim().startsWith('- [ ]') || line.trim().startsWith('- [x]')) {
        const category = this.inferCategory(line);
        rules.push({
          file,
          category,
          statement: line.trim(),
          lineNumber: index + 1
        });
      }
    });
    
    return rules;
  }
  
  private findContradictions(rules: Rule[]): Contradiction[] {
    const contradictions: Contradiction[] = [];
    const grouped = this.groupByCategory(rules);
    
    for (const [category, categoryRules] of Object.entries(grouped)) {
      // 同じカテゴリ内で矛盾をチェック
      for (let i = 0; i < categoryRules.length; i++) {
        for (let j = i + 1; j < categoryRules.length; j++) {
          const rule1 = categoryRules[i];
          const rule2 = categoryRules[j];
          
          if (this.areContradicting(rule1, rule2)) {
            contradictions.push({
              category,
              rule1,
              rule2,
              severity: this.calculateSeverity(rule1, rule2)
            });
          }
        }
      }
    }
    
    return contradictions;
  }
  
  private areContradicting(rule1: Rule, rule2: Rule): boolean {
    // 簡易的な矛盾検出
    const positive1 = rule1.statement.includes('');
    const positive2 = rule2.statement.includes('');
    
    if (positive1 !== positive2) {
      // 一方が推奨、もう一方が非推奨
      const keywords1 = this.extractKeywords(rule1.statement);
      const keywords2 = this.extractKeywords(rule2.statement);
      
      // 同じキーワードが含まれていたら矛盾の可能性
      const overlap = keywords1.filter(k => keywords2.includes(k));
      return overlap.length > 0;
    }
    
    return false;
  }
}

ツール3: 自動修正スクリプト

検出だけでなく、修正まで——自動化の極致です。

検出した問題を自動的に修正するスクリプトです。古いファイルへの警告追加、曖昧な表現の具体化、不完全なコード例の補完などを自動化します。手動で修正する手間を大幅に削減できます。ただし、自動修正は慎重に——必ずレビューしてからコミットしましょう。

// .ai/scripts/auto-fix.ts

class AutoFixer {
  async fixCommonIssues(): Promise<FixReport> {
    const report: FixReport = {
      fixed: [],
      skipped: [],
      failed: []
    };
    
    // 修正1: 古いコンテキストに警告を追加
    await this.addStalenessWarnings(report);
    
    // 修正2: 曖昧な表現を具体的に
    await this.clarifyVagueStatements(report);
    
    // 修正3: コード例を完全なものに
    await this.completeCodeExamples(report);
    
    return report;
  }
  
  private async addStalenessWarnings(report: FixReport): Promise<void> {
    const files = await glob('.ai/**/*.md');
    
    for (const file of files) {
      const stats = statSync(file);
      const daysSinceUpdate = (Date.now() - stats.mtime.getTime()) / (1000 * 60 * 60 * 24);
      
      if (daysSinceUpdate > 90) {
        let content = readFileSync(file, 'utf-8');
        
        if (!content.includes('⚠️ このファイルは更新が必要です')) {
          content = `> ⚠️ このファイルは${Math.floor(daysSinceUpdate)}日間更新されていません。内容を確認してください。
` + content;
          
          writeFileSync(file, content);
          report.fixed.push({
            file,
            fix: '古いファイルに警告を追加'
          });
        }
      }
    }
  }
}

ケーススタディ

理論は頭に入った——では、実戦ではどうするのか?リアルな事例から学びましょう。

理論だけでなく、実際の問題とその解決プロセスを見ることで、より深い理解が得られます。このセクションでは、実際のプロジェクトで発生した3つの典型的な問題を取り上げ、診断から解決、そして予防策までの全プロセスを詳しく解説します。

これらは実際に起きた問題です。あなたのプロジェクトでも、似たような状況に遭遇する可能性が高いでしょう。先人の経験から学び、同じ失敗を避けましょう。

ケース1: 突然のパフォーマンス劣化

「徐々に遅くなる」問題——気づいたときには手遅れ...ではありません。

プロジェクトが成長するにつれて、コンテキストも肥大化します。気づいたときにはエージェントの応答が激遅に──よくあるシナリオです。このケースでは、トークン数の管理とコンテキストの最適化により、パフォーマンスを劇的に改善しました。

多くのチームが経験する「茹でガエル」現象です。毎日少しずつ遅くなるため、気づきにくいのです。しかし、測定ツールを使えば一目瞭然——そして解決策も明確です。

背景:
プロジェクト開始から3ヶ月、エージェントの応答時間が5秒→30秒に悪化

症状:

  • 応答が非常に遅い
  • 時々タイムアウト
  • トークン超過エラー

診断:

# ステップ1: トークン数の確認
$ npm run ai:estimate-tokens

Results:
- .ai/team/context.md: 45,000 tokens
- .ai/team/architecture.md: 38,000 tokens
- .ai/domains/*: 120,000 tokens
Total: 203,000 tokens ⚠️

# ステップ2: コンテキストの成長履歴
$ git log --oneline --all .ai/ | head -20

# 判明: 3ヶ月で3倍に成長

原因:

  • コンテキストファイルが無秩序に成長
  • 古い情報が削除されずに残っている
  • すべてのドメインコンテキストを毎回読み込んでいた

解決策:

対策1: コンテキストのリファクタリング

Before:
.ai/team/context.md (45,000 tokens)

After:
.ai/team/
├── context.md (8,000 tokens) - エッセンスのみ
├── architecture-detail.md (20,000 tokens)
└── historical/ - アーカイブ

対策2: 選択的読み込み

Before:
すべてのコンテキストを常に読み込む

After:
```typescript
function selectContext(task: Task): string[] {
  const base = ['.ai/team/context.md'];
  
  if (task.domain) {
    base.push(`.ai/domains/${task.domain}/context.md`);
  }
  
  return base;
}
```

対策3: 自動クリーンアップ

# 毎月実行
npm run ai:archive-old-content
npm run ai:optimize-context

結果:

  • 応答時間: 30秒 → 8秒に改善
  • トークン数: 203,000 → 75,000に削減
  • エラー率: 15% → 2%に低下

ケース2: チーム拡大に伴うコンテキスト汚染

成長の痛み——5人から15人になったとき、何が起きたか。

チームが成長すると、各メンバーが独自にコンテキストを追加し始めます。その結果、矛盾が頻発し、統一性が失われる──典型的な組織の問題です。このケースでは、ガバナンスプロセスの確立により、品質と一貫性を取り戻しました。

「個人では問題なかったのに」——チームでの開発は、個人とは全く異なるダイナミクスが働きます。組織的な問題には、組織的な解決策が必要です。

背景:
チーム5人→15人に拡大、各メンバーが独自にコンテキストを追加

症状:

  • メンバーによって異なる実装パターン
  • コンテキストの矛盾が頻発
  • 新メンバーが混乱

診断:

$ npm run ai:detect-contradictions

Found 12 contradictions:

1. Error Handling
   - auth/context.md: "エラーは例外をthrow"
   - payment/context.md: "エラーはResult型で返す"

2. Naming Convention
   - team/context.md: "camelCase使用"
   - users/context.md: "snake_case使用"

...

原因:

  • コンテキスト追加のガイドラインがない
  • レビュープロセスの欠如
  • オーナーシップの不明確さ

解決策:

対策1: コンテキストガバナンス確立

ルール

  1. 新しいコンテキストは必ずPRでレビュー
  2. team/context.md と矛盾しないことを確認
  3. CODEOWNERS ファイルでオーナー指定
# .github/CODEOWNERS
.ai/team/* @tech-lead
.ai/domains/auth/* @auth-team-lead
.ai/domains/payment/* @payment-team-lead

対策2: 自動検証の導入

# CI で矛盾を自動検出
- name: Detect contradictions
  run: npm run ai:detect-contradictions
  
- name: Block if contradictions found
  if: failure()
  run: exit 1

対策3: 統一作業

  1. 矛盾をすべて洗い出し
  2. チーム全体で議論
  3. team/context.md に統一ルールを明記
  4. ドメインコンテキストを修正

結果:

  • 矛盾: 12件 → 0件
  • 実装パターンの統一
  • 新メンバーのオンボーディング時間: 2週間 → 3日

ケース3: エージェントの「おかしな」挙動

長時間労働の副作用——エージェントにも休憩が必要です。

長時間のセッションは、コンテキスト汚染の温床です。朝は正常だったエージェントが、夕方には別人のように──誰もが経験する現象です。このケースでは、セッション管理のベストプラクティスを確立し、安定した動作を実現しました。

「8時間ぶっ通しで使っている」——人間でさえ集中力が続かないのに、エージェントが大丈夫なはずがありません。定期的なリセットが、安定した出力の秘訣です。

背景:
1日中同じセッションで作業、夕方から急におかしくなった

症状:

  • 認証機能の実装中なのに決済関連のコードを提案
  • 前回と全く異なる実装パターン
  • 存在しないライブラリをimport

診断:

# セッション情報確認
$ claude-code status

Session info:
- Duration: 8 hours 23 minutes
- Messages: 487
- Context switches: 23
- Memory usage: 2.3 GB

⚠️ Long session detected

原因:

  • コンテキスト汚染(複数タスクの混在)
  • セッションの長時間稼働
  • メモリ肥大化

解決策:

即座の対応

  1. セッションリセット
claude-code --new-session
  1. 明示的なコンテキスト境界設定
---
前のタスクのコンテキストは忘れてください
---
新しいタスク: 認証機能の実装

参照すべきコンテキスト:
- @.ai/team/context.md
- @.ai/domains/auth/context.md

参照すべきでないもの:
- 決済関連のコンテキスト
- 通知関連のコンテキスト

予防策

  1. 2時間ごとにセッションリフレッシュ
  2. タスク切り替え時は必ずリセット
  3. セッション名でタスクを管理
claude-code --session \"auth-implementation\"
claude-code --session \"payment-integration\"

結果:

  • 正常な動作に復旧
  • タスクごとのセッション分離を習慣化
  • 問題の再発なし

まとめ:デバッグを「日常」に組み込む

問題は起きる——だから備える。デバッグ駆動コンテキストエンジニアリングは、AIエージェント開発の新しい標準です。

この記事では、AIエージェントのデバッグを体系的に解説してきました。4段階の診断フレームワーク、自動化ツール、予防的コンテキスト戦略、そして実際のケーススタディを通じて、問題の診断から解決、予防までの全プロセスを学びました。

重要なポイントの振り返り

  1. 診断は体系的に

    • 症状の観察 → 仮説構築 → 検証 → 修正のサイクル
    • 勘に頼らず、測定可能なデータで判断
  2. 自動化で効率化

    • ヘルスチェック、トークン推定、矛盾検出を自動化
    • CI/CDに組み込んで、問題の早期発見
  3. 予防が最善の治療

    • コンテキストレビュー、定期的な最適化、セッション管理
    • 問題が起きる前に対処する文化を作る
  4. 実践から学ぶ

    • ケーススタディで見たように、多くの問題には共通パターンがある
    • 先人の経験を活かして、同じ失敗を繰り返さない

明日から始められること

まずは小さく始めましょう:

  • 今日: トークン数を測定して現状を把握
  • 今週: 毎日2分のデバッグチェックリストを習慣化
  • 今月: 自動化ツールをCI/CDに統合

デバッグ駆動コンテキストエンジニアリングは、特別なスキルではありません。日々の習慣です。毎日少しずつ実践することで、AIエージェントの品質が着実に向上し、開発効率も大幅に改善されます。

問題が起きたときに慌てないために——この記事で紹介したツールとチェックリストを、ぜひブックマークして活用してください。


付録:チェックリストとチートシート

ここまでお読みいただき、ありがとうございました。

この記事は約9万文字にわたり、デバッグの診断フレームワークから予防的戦略まで詳しく解説してきました。「問題が起きたときに、この記事のどこを見ればいいの?」という疑問をお持ちの方のために、すぐに使えるチェックリストとコマンド集を用意しました。

このセクションの使い方

  • トラブル発生時: 症状から該当するチェックリストを選んで、順番に確認
  • 日常の予防: 毎日2分のデバッグチェックリストを習慣化
  • 緊急対応: コマンドクイックリファレンスからコピペして即実行
  • オフライン活用: 印刷して机の横に貼っておくと、緊急時に便利

ブックマーク必須——問題発生時の救命ガイドです。

印刷して机の横に貼っておくのもおすすめです。デジタルよりアナログの方が、緊急時は早い場合もあります。このページのURLをSlackの個人メモに保存しておくのも良いでしょう。

日常デバッグチェックリスト

毎日2分の投資が、数時間のデバッグを防ぎます。

毎日の開発開始時と問題発生時に使うチェックリストです。習慣化することで、多くの問題を未然に防げます。朝のコーヒーを飲みながら、このチェックリストを確認——それだけで、その日の開発がスムーズになります。

# 毎日の開発前チェック(2分)

## 基本確認
- [ ] `git pull` して最新のコンテキストを取得
- [ ] セッションが新鮮(2時間以内)
- [ ] 前日の作業で問題なかったか確認

## 新しいタスク開始時
- [ ] 必要なコンテキストファイルを特定
- [ ] トークン数が適切か確認(目安: 100,000以下)
- [ ] 明示的にタスクの境界を設定

## 問題発生時
- [ ] まずセッションリセットを試す
- [ ] コンテキストの矛盾をチェック
- [ ] 問題を記録(後で分析)

トラブルシューティングチートシート

症状から対処法へ、最短距離で——緊急時のクイックリファレンスです。

症状別に素早く対処法を見つけられるリファレンスです。このページをブックマークしておくと、緊急時に役立ちます。「エージェントがおかしい!」と思ったら、まずこのチートシートを開きましょう。

# AIエージェント トラブルシューティング クイックリファレンス

## 🔴 応答が遅い(20秒以上)

### 確認
```bash
npm run ai:estimate-tokens

対処

  • トークン数 > 150,000: コンテキスト削減
  • トークン数 < 150,000: ネットワーク確認

🔴 矛盾した出力

確認

npm run ai:detect-contradictions

対処

  • 矛盾あり: コンテキスト修正
  • 矛盾なし: セッションリセット

🔴 コンテキストを無視

確認

  • コンテキストが明示的に読み込まれているか
  • 曖昧な表現がないか

対処

@.ai/team/context.md を必ず参照して、
明示されたコーディング規約に厳密に従ってください

🔴 無限ループ

対処

  1. Ctrl+C で停止
  2. セッション削除
  3. クリーンスタート

🟡 出力が不完全

原因

  • トークン上限に達した
  • 複雑すぎるタスク

対処

  1. タスクを分割
  2. 段階的に実装依頼
  3. トークン数削減

🟡 前回と違う提案

原因

  • コンテキスト汚染
  • セッションが古い

対処

  1. セッションリセット
  2. 明示的にコンテキスト指定
  3. 前回の成功例を提示

### コマンドクイックリファレンス

**覚えなくていい、コピペすればいい——よく使うコマンド全集です。**

よく使うコマンドを一覧にまとめました。コピー&ペーストですぐに使えます。ターミナルの近くに貼っておくと便利です。またはシェルのエイリアスに登録してしまえば、さらに楽になります。

```bash
# === 診断コマンド ===

# 総合ヘルスチェック
npm run ai:health-check

# トークン数確認
npm run ai:estimate-tokens

# 矛盾検出
npm run ai:detect-contradictions

# 古いファイル確認
npm run ai:check-staleness

# パフォーマンスプロファイル
npm run ai:profile-performance

# === 修正コマンド ===

# 自動修正実行
npm run ai:fix-common-issues

# コンテキスト最適化
npm run ai:optimize-context

# 古いコンテンツをアーカイブ
npm run ai:archive-old-content

# === セッション管理 ===

# 新しいセッション開始
claude-code --new-session

# セッション情報表示
claude-code status

# セッションリセット
claude-code --reset-session

# 名前付きセッション
claude-code --session \"task-name\"

# === レポート生成 ===

# 週次レポート
npm run ai:generate-weekly-report

# 問題サマリー
npm run ai:summarize-issues

デバッグは地味に見えますが、AIエージェント開発の成否を分ける重要なスキルです。本記事で紹介したテクニックを実践することで、あなたの開発効率は大きく向上するはずです。

「デバッグは面倒だ」——確かにそうです。しかし、適切なアプローチを知っていれば、デバッグは「面倒なパズル」から「興味深い謎解き」に変わります。

この記事の核心

この4つを覚えておけば、デバッグで迷うことはありません。

  1. 問題は必ず起きる - 完璧なコンテキストは存在しない。それを受け入れることが第一歩
  2. 体系的に対処 - 当てずっぽうではなく、フレームワークに従う。医者のように診断する
  3. 予防が最善 - 自動化と定期メンテナンスで問題を減らす。治療より予防
  4. 知見を共有 - チーム全体で学習し、改善する。あなたの失敗は、他人の成功の素

今日から始められること

「完璧な準備」を待たない——今すぐ始めましょう。

まずは小さく始めて、徐々に習慣化していきましょう:

# 1. ツールのセットアップ(10分)
npm install
npm run ai:setup-tools

# 2. 初回診断実行(10分)
npm run ai:health-check

# 3. 問題があれば修正(10分)
npm run ai:fix-common-issues

これだけで多くの問題を予防できます。

次のステップ

デバッグをマスターしたあなたは、もはや初心者ではありません——さらなる高みを目指しましょう。

デバッグの基礎を身につけたら、さらに広い視点でコンテキストエンジニアリングを学びましょう。このシリーズの他の記事では、個人開発からチーム開発、マルチエージェント環境まで、幅広いトピックをカバーしています。

関連記事(コンテキストエンジニアリングシリーズ)

📚 シリーズトップページ

  1. プロンプトエンジニアリング2.0 - コンテキストを制する者がAIを制する - コンテキスト管理の基礎
  2. コーディングエージェントのメモリ設計 - 長期記憶システムの実装 - 外部化したコンテキストの管理
  3. チーム開発のためのコンテキスト共有戦略 - チーム活用
  4. コンテキスト駆動開発(CDD) - AIファーストな開発手法 - 開発手法の体系化
  5. マルチエージェント時代のコンテキストオーケストレーション - 複数エージェントの協調

推奨リソース

継続的な学習のために、以下のリソースも活用してください:


最後に

デバッグを恐れるな、楽しめ。

AIエージェントは強力なツールですが、適切なデバッグ能力があって初めてその価値を最大化できます。問題が発生したとき、この記事を思い出してください。体系的なアプローチに従えば、どんな問題も必ず解決できます。

本記事で紹介したテクニックを実践し、継続的に改善することで、あなたとあなたのチームはAI時代の開発をリードできるでしょう。

デバッグを恐れず、むしろ楽しんでください。問題を解決するたびに、あなたのスキルは確実に向上しています。

あなたは今、デバッグ駆動コンテキストエンジニアリングの世界の入り口に立っています。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?