読者が抱える課題
GitHub CopilotやChatGPTなどのコード生成AIを開発実務に導入したものの、「一度指摘して修正させたはずのバグや、プロジェクトのコーディング規約違反が、別の箇所や翌日のセッションで再発する」という現象に悩まされるケースが少なくありません。AIに何度も同じ修正指示を繰り返すことは、開発効率を低下させる要因になります。
この記事で分かること
- AIが同じバグや不適切なコードを繰り返し出力する技術的な原因
- コンテキスト(文脈)の汚染を防ぎ、AIの出力を安定させるためのプロンプト設計
- 実務でそのまま使える「システムプロンプト用テンプレート」および「バグ修正指示テンプレート」
- 開発プロセスに組み込むためのチェックリスト
対象読者・前提条件
- 業務でLLM(大規模言語モデル)やAIコードアシスタント日常的に使用しているエンジニア
- プロジェクト全体のコード品質や開発規約の維持を担当するテックリード・PM
- 特定のプログラミング言語に依存しない、汎用的なAI活用の知見を求めている方
なぜAIは同じバグを繰り返すのか?
AIが同じ誤りを繰り返す主な原因は、**「コンテキストウィンドウの制限と汚染」および「学習データのバイアス」**にあります。
1. コンテキストの汚染(Bad Codeの学習)
チャットセッション内で「バグを含むコード」と「それを修正するやり取り」を繰り返すと、AIのコンテキスト(会話履歴)の中に「誤ったコードのパターン」が蓄積されます。LLMは直近のやり取りや、コンテキスト内に出現頻度の高いトークンに強く影響を受けるため、修正前の古いコードの書き方を再度参照して出力してしまうことがあります。
2. ステートレスな性質
一般的なAIチャットツールは、セッション(スレッド)が変わると過去のやり取りを完全に忘れます。昨日解決したバグであっても、新しいスレッドでは再度同じバグを含んだコードを出力する可能性が高くなります。
3. プロジェクト固有ルールの欠落
AIは一般的なオープンソースのコードを大量に学習していますが、開発対象のプロジェクト固有の制約(特定のライブラリのバージョン制限、社内共通ユーティリティの使用義務、セキュリティ要件など)は知りません。そのため、一般的な(しかし現在のプロジェクトではバグとなる)コードを提案し続けます。
改善アプローチ:コンテキストの整理とプロンプトの構造化
この問題を解決するには、AIに渡す「コンテキスト(文脈)」を整理し、制約事項を明確に定義したプロンプトを提示する必要があります。
良い例と悪い例の比較
| 項目 | 悪い例(バグが再発しやすい) | 良い例(バグを防ぎやすい) |
|---|---|---|
| 指示の出し方 | 「さっきのバグ、また出てるから直して」 | 「[ルールA]に違反しています。修正版コードと、違反箇所の解説を出力してください」 |
| コンテキスト管理 | 1つのスレッドで何日も会話を続け、コードの修正を繰り返す | 修正が完了したらスレッドを分ける。または、システムプロンプト(.github/copilot-instructions.md等)にルールを明文化する |
| コードの提示 | エラーが出ている関数だけを断片的に渡す | 依存関係や型定義、使用可能な共通ユーティリティのインターフェースを合わせて渡す |
実務用テンプレート
AIの出力を安定させるために有効な、2つのテンプレートを提供します。
1. システムプロンプト / プロジェクト定義テンプレート
GitHub Copilotのカスタム指示機能(.github/copilot-instructions.mdなど)や、ChatGPTの「Custom Instructions(Custom GPTs)」に設定して使用します。
# プロジェクトコンテキスト
あなたは以下の環境で動作する堅牢なコードを生成するエキスパートです。
## 技術スタックと制約
- 主要言語/フレームワーク: [例: TypeScript / Next.js v14 (App Router)]
- 状態管理: [例: Zustand]
- 禁止事項:
- [例: 外部API呼び出しに直接 fetch を使用せず、共通の apiClient ユーティリティを使用すること]
- [例: クライアントコンポーネント内での機密情報の保持]
## 頻出するバグと回避ルール
1. [例: 非同期処理のメモリリーク]
- 対策: useEffect内での非同期処理には必ずクリーンアップ関数(AbortController等)を実装すること。
2. [例: 日時操作のタイムゾーンずれ]
- 対策: 標準の Date オブジェクトの直接操作は避け、プロジェクト共通の `formatDate` ヘルパーを使用すること。
## 出力フォーマット
- コードを提示する際は、型安全性を担保し、例外処理(try-catch等)を省略せずに記述してください。
- 既存コードを修正する場合は、変更前と変更後の差分が明確に分かるように提示してください。
2. バグ修正・再発防止指示テンプレート
開発中にバグが発生し、AIに修正を依頼する際に使用するプロンプトです。単に「直して」と伝えるのではなく、**「なぜダメなのか(制約)」と「どう直すべきか(基準)」**を明示します。
# 状況
以下のコードにおいて、[バグの内容やエラーメッセージ] が発生しています。
# 対象コード
```[言語名]
[ここにソースコードを貼り付け]
修正における制約条件
- 原因分析: なぜこのバグが発生したのか、根本原因を1行で説明してください。
- 修正方針: [例: 既存のインターフェースを変更せず、内部ロジックのみで解決する]
- 再発防止: 今後同様のバグを発生させないために、コード内でどのようなガード節や型定義を追加すべきか提案してください。
出力要求
修正後のコード全体と、修正箇所の解説を出力してください。
---
## 開発プロセス導入時のチェックリスト
AIとの協働において、同じバグを繰り返さないための運用チェックリストです。
- [ ] **スレッドの定期的なリセット**
- 1つの機能実装やバグ修正が完了したら、チャットスレッドを新しく作成しているか(古いバグコードをコンテキストから排除するため)。
- [ ] **共通ルールのドキュメント化**
- プロジェクト固有の「やってはいけない実装パターン」が、AI用の設定ファイル(`.cursorrules` や `.github/copilot-instructions.md` など)に反映されているか。
- [ ] **生成コードの差分レビュー**
- AIが生成したコードをそのままコミットせず、人間が意図しないデグレード(先祖返り)が発生していないかGitの差分で確認しているか。
- [ ] **テストコードの同時生成**
- バグ修正を依頼する際、そのバグを再現するテストケース(Unit Test)も同時にAIに作成させているか。
---
## 注意点と運用上の判断基準
* **ツールの仕様変更に注意する**
AIツール(GitHub Copilot、Cursor、ChatGPTなど)のシステムプロンプトの読み込み仕様や設定ファイルの配置パスは、アップデートによって変更される可能性があります。導入時には必ず各ツールの最新の公式ドキュメントを確認してください。
* **AIに「完璧な記憶」を期待しない**
プロンプトを最適化しても、LLMの確率的な性質上、誤ったコードを出力する可能性はゼロにはなりません。最終的なコードの品質担保は、静的解析ツール(ESLint、SonarQube等)の静的チェックや、CI/CDプロセスにおける自動テスト、そして人間によるコードレビューと組み合わせることで実現してください。
## まとめ
AIが同じバグを繰り返すのは、AIの能力不足だけではなく、コンテキストの汚染やプロジェクト固有の制約情報の不足が原因です。システムプロンプトを活用してプロジェクトの「防ぐべきバグ」を事前にインプットし、適切な粒度でスレッドをリセットする運用を徹底することで、AIアシスタントの出力精度を実用的なレベルに維持することができます。