<p><meta_llm_draft_enhanced_cot_debugging_20240524>
本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</meta_llm_draft_enhanced_cot_debugging_20240524></p>
<h1 class="wp-block-heading">CoT(思考の連鎖)を用いた複雑なロジックバグの特定と修正プロンプトの設計</h1>
<h2 class="wp-block-heading">【ユースケース定義と課題】</h2>
<p>複雑な非同期処理や状態遷移が絡むコードのバグを特定し、副作用を抑えた修正案を提示させる。LLMが「思考を飛ばして即修正」することによる、デグレや浅い解決を防ぐ。</p>
<ul class="wp-block-list">
<li><p><strong>入力:</strong> ソースコード、エラーログ(または期待する挙動と実際の挙動の差異)</p></li>
<li><p><strong>出力:</strong> 思考プロセス(Markdown)、修正コード(Markdown)、テストコード(Markdown)</p></li>
</ul>
<h2 class="wp-block-heading">【プロンプト設計のループ】</h2>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
graph TD
A["設計: 思考ステップの構造化"] --> B["実行: バグ解析と修正案生成"]
B --> C["評価: 修正の妥当性と副作用の検証"]
C -->|改善: 思考の深掘りが不足| A
</pre></div>
<ul class="wp-block-list">
<li><p><strong>設計</strong>:解決プロセスを「現状分析」「仮説立案」「検証」「実装」の4段階に分割するよう指示。</p></li>
<li><p><strong>実行</strong>:Gemini 1.5 Pro等の長文コンテキストを活用し、関連ファイルをすべて読み込ませる。</p></li>
<li><p><strong>評価</strong>:LLM-as-a-Judgeを用い、修正が根本原因を解決しているかをスコアリング。</p></li>
</ul>
<h2 class="wp-block-heading">【プロンプトの実装案】</h2>
<div class="codehilite">
<pre data-enlighter-language="generic"># Role
あなたはシニア・ソフトウェアエンジニアです。提供されたコードのバグを特定し、修正案を提示してください。
# Task
以下の手順(Chain-of-Thought)に従って、思考プロセスを明文化しながら進めてください。
## Step 1: コードとエラーの現状分析
- 現在のコードの処理フローをステップバイステップで説明してください。
- 発生しているエラーログ、または意図しない挙動の根本原因(Root Cause)を特定してください。
## Step 2: 修正仮説の立案
- バグを修正するためのアプローチを複数検討し、最も副作用の少ないものを選択してください。
- その修正が他のモジュールに与える影響(破壊的変更の有無)を列挙してください。
## Step 3: 実装案の提示
- 修正後のコード全体、または差分(diff)を提示してください。
- 修正のポイントを簡潔に説明してください。
## Step 4: 検証コードの作成
- この修正が正しく機能することを証明するためのユニットテスト、または再現スクリプトを提示してください。
# Input Data
- Code:
{{CODE_HERE}}
- Error Log / Issue:
{{ERROR_LOG_HERE}}
# Output Format
Markdown形式で出力してください。思考プロセス(Step 1-2)を必ず含めること。
</pre>
</div>
<h2 class="wp-block-heading">【評価指標と誤り分析】</h2>
<figure class="wp-block-table"><table>
<thead>
<tr>
<th style="text-align:left;">評価項目</th>
<th style="text-align:left;">期待される挙動</th>
<th style="text-align:left;">失敗パターン(誤り分析)</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left;"><strong>原因特定の正確性</strong></td>
<td style="text-align:left;">コードの論理的欠陥を正確に指し示す</td>
<td style="text-align:left;">表面的なエラーメッセージの言い換えに留まる</td>
</tr>
<tr>
<td style="text-align:left;"><strong>副作用の予見</strong></td>
<td style="text-align:left;">修正による他箇所への影響を指摘できる</td>
<td style="text-align:left;">依存関係を見落とし、別の場所でエラーを誘発する</td>
</tr>
<tr>
<td style="text-align:left;"><strong>様式遵守</strong></td>
<td style="text-align:left;">指定したStep 1-4の構成で出力する</td>
<td style="text-align:left;">思考プロセスを飛ばして修正コードだけ出力する</td>
</tr>
<tr>
<td style="text-align:left;"><strong>コードの動作性</strong></td>
<td style="text-align:left;">提示されたコードがシンタックスエラーなく動く</td>
<td style="text-align:left;">存在しないライブラリ関数の捏造(幻覚)</td>
</tr>
</tbody>
</table></figure>
<h2 class="wp-block-heading">【改良後の最適プロンプト】</h2>
<p>分析結果に基づき、<strong>「セルフ・デバッギング(自己批判)」</strong>のステップを追加した最強のプロンプトです。</p>
<div class="codehilite">
<pre data-enlighter-language="generic"># System
あなたはプログラミングのデバッグに特化したAIエージェントです。
複雑なバグに対し、論理的な推論(Chain-of-Thought)を用いて解決策を導き出します。
# Instruction
以下の形式で回答してください。
1. <Thinking>:
- コードのデータフローをトレースする。
- 「なぜこのバグが起きるのか」という仮説を立て、それが正しいかコードから検証する。
- 修正案を考えた後、あえて「その修正が失敗する可能性」を自問自答してください。
2. <Action>:
- 修正済みコードを提示。
3. <Test>:
- 再現・検証用コードを提示。
# Constraints
- コードの修正は「最小限」に留めること。
- マジックナンバーやハードコーディングを避け、既存のコーディング規約に従うこと。
- Gemini 1.5 Proのコンテキスト能力を活かし、前後の関数との整合性を重視すること。
# Input
Target Code: {{CODE}}
Issue: {{ISSUE}}
</pre>
</div>
<h2 class="wp-block-heading">【まとめ】</h2>
<ol class="wp-block-list">
<li><p><strong>思考を言語化させる</strong>:<code>Thinking</code>タグ等で、LLMに「答えを出す前に書かせる」ことで論理の飛躍を防ぐ。</p></li>
<li><p><strong>否定的な視点を与える</strong>:自身の修正案に対する「反論」をステップに組み込むことで、境界条件の考慮漏れ(オフバイワンエラー等)を激減させる。</p></li>
<li><p><strong>検証までをセットにする</strong>:修正コードだけでなくテストコードを強制出力させることで、LLM自身の出力に対する「責任」をプロンプトレベルで持たせる。</p></li>
</ol>
本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
CoT(思考の連鎖)を用いた複雑なロジックバグの特定と修正プロンプトの設計
【ユースケース定義と課題】
複雑な非同期処理や状態遷移が絡むコードのバグを特定し、副作用を抑えた修正案を提示させる。LLMが「思考を飛ばして即修正」することによる、デグレや浅い解決を防ぐ。
【プロンプト設計のループ】
graph TD
A["設計: 思考ステップの構造化"] --> B["実行: バグ解析と修正案生成"]
B --> C["評価: 修正の妥当性と副作用の検証"]
C -->|改善: 思考の深掘りが不足| A
設計:解決プロセスを「現状分析」「仮説立案」「検証」「実装」の4段階に分割するよう指示。
実行:Gemini 1.5 Pro等の長文コンテキストを活用し、関連ファイルをすべて読み込ませる。
評価:LLM-as-a-Judgeを用い、修正が根本原因を解決しているかをスコアリング。
【プロンプトの実装案】
# Role
あなたはシニア・ソフトウェアエンジニアです。提供されたコードのバグを特定し、修正案を提示してください。
# Task
以下の手順(Chain-of-Thought)に従って、思考プロセスを明文化しながら進めてください。
## Step 1: コードとエラーの現状分析
- 現在のコードの処理フローをステップバイステップで説明してください。
- 発生しているエラーログ、または意図しない挙動の根本原因(Root Cause)を特定してください。
## Step 2: 修正仮説の立案
- バグを修正するためのアプローチを複数検討し、最も副作用の少ないものを選択してください。
- その修正が他のモジュールに与える影響(破壊的変更の有無)を列挙してください。
## Step 3: 実装案の提示
- 修正後のコード全体、または差分(diff)を提示してください。
- 修正のポイントを簡潔に説明してください。
## Step 4: 検証コードの作成
- この修正が正しく機能することを証明するためのユニットテスト、または再現スクリプトを提示してください。
# Input Data
- Code:
{{CODE_HERE}}
- Error Log / Issue:
{{ERROR_LOG_HERE}}
# Output Format
Markdown形式で出力してください。思考プロセス(Step 1-2)を必ず含めること。
【評価指標と誤り分析】
| 評価項目 |
期待される挙動 |
失敗パターン(誤り分析) |
| 原因特定の正確性 |
コードの論理的欠陥を正確に指し示す |
表面的なエラーメッセージの言い換えに留まる |
| 副作用の予見 |
修正による他箇所への影響を指摘できる |
依存関係を見落とし、別の場所でエラーを誘発する |
| 様式遵守 |
指定したStep 1-4の構成で出力する |
思考プロセスを飛ばして修正コードだけ出力する |
| コードの動作性 |
提示されたコードがシンタックスエラーなく動く |
存在しないライブラリ関数の捏造(幻覚) |
【改良後の最適プロンプト】
分析結果に基づき、「セルフ・デバッギング(自己批判)」のステップを追加した最強のプロンプトです。
# System
あなたはプログラミングのデバッグに特化したAIエージェントです。
複雑なバグに対し、論理的な推論(Chain-of-Thought)を用いて解決策を導き出します。
# Instruction
以下の形式で回答してください。
1. <Thinking>:
- コードのデータフローをトレースする。
- 「なぜこのバグが起きるのか」という仮説を立て、それが正しいかコードから検証する。
- 修正案を考えた後、あえて「その修正が失敗する可能性」を自問自答してください。
2. <Action>:
- 修正済みコードを提示。
3. <Test>:
- 再現・検証用コードを提示。
# Constraints
- コードの修正は「最小限」に留めること。
- マジックナンバーやハードコーディングを避け、既存のコーディング規約に従うこと。
- Gemini 1.5 Proのコンテキスト能力を活かし、前後の関数との整合性を重視すること。
# Input
Target Code: {{CODE}}
Issue: {{ISSUE}}
【まとめ】
思考を言語化させる:Thinkingタグ等で、LLMに「答えを出す前に書かせる」ことで論理の飛躍を防ぐ。
否定的な視点を与える:自身の修正案に対する「反論」をステップに組み込むことで、境界条件の考慮漏れ(オフバイワンエラー等)を激減させる。
検証までをセットにする:修正コードだけでなくテストコードを強制出力させることで、LLM自身の出力に対する「責任」をプロンプトレベルで持たせる。
ライセンス:本記事のテキスト/コードは特記なき限り
CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。
コメント