Post
JA EN

AIの「考えすぎ」問題:Claude Codeを使う際の落とし穴と実践的対策

AIの「考えすぎ」問題:Claude Codeを使う際の落とし穴と実践的対策
  • 想定読者: AIアシスタント(Claude Code、GitHub Copilot、Cursor等)を業務で使用するITエンジニア
  • 前提知識: AIコーディングツールの基本的な使用経験
  • 所要時間: 12分

概要

Claude CodeやGitHub Copilotなど、AIコーディングアシスタントを使ったシステム開発が普及する中、これらのツールが持つ根本的な弱点が2024〜2025年の研究で明らかになっています。本記事では、AIが「考えすぎ」て誤った結論に至る「overthinking」問題と、ルールを理解しているのに正しく実行できない「理解と実行のギャップ」について解説し、開発者が取るべき実践的な対策を提示します。

Chain-of-Thought推論とその限界

Chain-of-Thought(CoT)とは

Chain-of-Thought(CoT)は、AIが複雑な問題を解く際に「思考の連鎖」を明示的に生成する手法です1。例えば、数学の問題を解く際に、いきなり答えを出すのではなく、ステップバイステップで推論過程を示すことで、より正確な回答を得ることができます。

Claude、GPT-4、Geminiなどの最新モデルは、このCoT推論を内部で活用しており、特に「推論モデル」と呼ばれるDeepSeek-R1やo1などは、この手法を中心に設計されています。

問題1:Overthinking(考えすぎ)

しかし、2025年の研究では、このCoT推論に根本的な問題があることが指摘されています。

Amazon Scienceの研究チームは、推論モデルが過度に詳細で不必要に長い推論ステップを生成する「overthinking」現象を報告しています2。この問題は以下のような形で現れます:

シンプルな問題での過剰推論: 「0.9と0.11、どちらが大きい?」という単純な比較問題で、推論モデルは以下のような挙動を示しました3

  • QwQ-32B: 正解まで19秒
  • DeepSeek-R1: 正解まで42秒

人間なら1秒で答えられる問題に、AIは膨大な「思考」を費やしています。

リソースの浪費: IEEE Spectrumの報告によると、推論モデルは単純なタスクで非推論モデルの7〜10倍のトークンを消費し、同じ精度を達成するために大幅なコスト増を招いています3

正しいヒントの無視: さらに深刻なのは、実験で正解を推論過程に明示的に注入しても、モデルがそのヒントを無視して誤った推論を続けるケースが確認されていることです2。これは、モデルが自身の推論パスに過度に固執する傾向を示しています。

問題2:Comprehension-Competence Gap(理解と実行のギャップ)

2025年7月に発表された論文「Comprehension Without Competence」4は、LLMのもう一つの根本的な問題を指摘しています。

「分かっているのにできない」現象: LLMは正しい原則を言語化(説明)できるにもかかわらず、その原則を実際のタスクで適用することに失敗するケースがあります。研究者はこれを「計算的スプリットブレイン症候群」と呼び、指示の理解と行動の実行が機能的に分離していると分析しています。

flowchart TB
    subgraph LLM["LLMの内部"]
        A["理解<br/>(ルールの把握)"]
        B["実行<br/>(タスクの遂行)"]
    end

    Input["入力"] --> A
    A -.->|"分離"| B
    B --> Output["出力"]

    classDef gapStyle stroke:#d29922,stroke-width:3px,stroke-dasharray: 5 5
    linkStyle 1 stroke:#d29922,stroke-width:2px,stroke-dasharray: 5 5

アーキテクチャ上の限界: 研究者らは、LLMは強力な「パターン補完エンジン」として機能するものの、原理的・構成的な推論のためのアーキテクチャ的な土台が欠如していると結論づけています4。これは、数学的演算、関係推論、論理的一貫性を必要とするタスクで一貫して問題を引き起こします。

実務で遭遇する具体的な問題

これらの研究知見は、Claude Codeなどのツールを使った日常の開発作業でどのように現れるのでしょうか?

パターン1:シンプルな修正への過剰対応

1
2
3
4
5
6
7
8
9
10
11
12
13
# 開発者の依頼
「この変数名をuserIdからuserIdentifierに変更して」

# AIの過剰な対応(overthinkingの例)
- 変数名を変更
- さらに関連する全てのメソッド名も「より良い命名」に変更
- コメントを追加
- 型定義を拡張
- 関連するテストケースを追加
- ドキュメントを更新

# 期待していた対応
- 変数名を変更(1行の変更)

パターン2:ルールを説明できるが適用できない

1
2
3
4
5
6
7
8
9
10
11
# 開発者の依頼
「このプロジェクトではシングルクォートを使う規約です。
 コードをその規約に従って修正して」

# AIの理解(正しい)
「シングルクォートを使用する規約ですね。
 文字列リテラルはすべて' 'で囲みます」

# AIの出力(理解と実行のギャップ)
const message = "Hello, World";  // ダブルクォートのまま
const name = "user";             // ダブルクォートのまま

パターン3:複雑な推論での迷走

1
2
3
4
5
6
7
8
9
10
11
# 開発者の依頼
「このAPIのレスポンスをパースして、エラーがあれば
 適切にハンドリングするコードを書いて」

# AIの問題ある推論
1. まずエラーの種類を網羅的に分類しよう
2. 各エラーに対応するカスタム例外クラスを作成
3. リトライロジックも必要だろう
4. ログ出力のフォーマットも統一すべき
5. 設定ファイルで挙動を変更可能にしよう
6. ...(本来の要件から大きく逸脱)

開発者が取るべき実践的対策

これらの問題に対して、現時点で開発者が取れる対策を整理します。

対策1:タスクの明確な境界設定

AIに依頼する際は、やるべきことやるべきでないことを明示します。

1
2
3
4
5
6
7
8
9
10
# 効果的なプロンプト例

## やること
- getUserById関数のnullチェックを追加

## やらないこと
- 他の関数の修正
- 命名規則の変更
- コメントの追加
- リファクタリング

対策2:段階的なタスク分割

複雑なタスクは、AIが「考えすぎ」ないよう小さな単位に分割します。

flowchart TD
    A["大きなタスク<br/>「認証システムを実装」"] --> B["タスク分割"]
    B --> C1["1. ユーザーモデル定義"]
    B --> C2["2. パスワードハッシュ関数"]
    B --> C3["3. JWTトークン生成"]
    B --> C4["4. 認証ミドルウェア"]
    B --> C5["5. エンドポイント実装"]

    C1 --> D1["✅ レビュー・確認"]
    D1 --> C2
    C2 --> D2["✅ レビュー・確認"]
    D2 --> C3

    classDef taskStyle stroke:#2ea44f,stroke-width:2px
    class C1,C2,C3,C4,C5 taskStyle

対策3:出力の即時検証

AIの出力を盲目的に信頼せず、特に「理解と実行のギャップ」が起きやすい領域では必ず検証します。

検証が特に重要な領域:

  • 算術計算・数値処理
  • 正規表現パターン
  • エッジケースのハンドリング
  • セキュリティ関連のロジック
  • データ型の変換
1
2
3
4
5
6
7
8
# 例:AIが生成したコードの自動テスト
npm test -- --coverage

# 型チェック
npx tsc --noEmit

# リンター
npx eslint . --fix

対策4:Custom Instructionsの活用

Claude CodeのCLAUDE.mdやCursorの.cursorrules等で、プロジェクト固有のルールを明示します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# CLAUDE.md の例

## コーディング規約
- 文字列はシングルクォートを使用
- インデントは2スペース
- 型アノテーションは必須

## 変更時のルール
- 依頼された変更のみを行う
- 関連するコードの「改善」は提案のみに留める
- 大規模な変更は事前に確認を求める

## 避けるべきこと
- 過度な抽象化
- 未使用のユーティリティ関数の追加
- 依頼されていないリファクタリング

対策5:推論の「中断」と「再開」

AIが長い推論を始めた場合、適切なタイミングで中断し、方向修正を行います。

1
2
3
4
5
# AIが過度に複雑な方向に進み始めた場合

User: ストップ。もっとシンプルに考えて。
      要件は「nullの場合にデフォルト値を返す」だけです。
      1つのif文で実装してください。

将来の改善:研究が示す方向性

現在の問題に対し、研究コミュニティでは以下のような改善手法が提案されています。

Mixture of Reasonings(MoR)

2025年7月に発表されたMoR5は、AIがタスクに応じて異なる推論スタイルを自動的に選択する仕組みを提案しています。

  • 演繹的推論、帰納的推論、類推的推論など多様な推論パターンをモデルに埋め込む
  • 手動のプロンプトエンジニアリングなしで、タスクに最適な推論方法を自動選択
  • 実験では、CoTプロンプトと比較して2.2%の精度向上を達成

Critical Representation Fine-Tuning(CRFT)

ACL 2025で発表されたCRFT6は、モデルの内部表現の重要な部分のみを精密に調整する手法です。

  • 情報フロー分析により「クリティカルな表現」を特定
  • わずか0.016%のパラメータ調整で大幅な改善を実現
  • GSM8K(数学ベンチマーク)で18.2ポイントの精度向上
  • ワンショット(1例のみの学習)でも16.4%の改善

これらの研究は、将来のAIモデルがより効率的で信頼性の高い推論を行える可能性を示唆しています。

まとめ

Claude Codeなどのコーディングアシスタントは強力なツールですが、現在のAI推論には根本的な限界があることを認識しておく必要があります。

主な問題:

  1. Overthinking: シンプルな問題でも過剰に推論し、リソースを浪費したり誤った方向に進んだりする
  2. 理解と実行のギャップ: ルールを正しく説明できても、実際のタスクで適用に失敗する

実践的な対策:

  1. タスクの境界を明確に設定する
  2. 複雑なタスクは小さな単位に分割する
  3. 特に数値処理やエッジケースでは出力を必ず検証する
  4. プロジェクト固有のルールをCustom Instructionsで明示する
  5. 必要に応じて推論を中断し、方向修正を行う

AIは「考える」ことが得意なように見えますが、いつ・どれだけ考えるべきかを判断するメタ認知能力はまだ発展途上です。開発者として、AIの出力を批判的に評価し、適切に活用する姿勢が重要です。

参考資料

本文中の引用番号に対応する参考資料を番号順に記載しています。

その他参考資料(本文中で番号引用なし)

  1. Chain of Thought Prompting in AI: A Comprehensive Guide - orq.ai (2025). 【信頼性: 中〜高】 ↩︎

  2. The overthinking problem in AI - Amazon Science (2025). 【信頼性: 高】 ↩︎ ↩︎2

  3. AI Developers Look Beyond Chain-of-Thought Prompting - IEEE Spectrum (2025). 【信頼性: 高】 ↩︎ ↩︎2

  4. Comprehension Without Competence: Architectural Limits of LLMs in Symbolic Computation and Reasoning - arXiv (2025). 【信頼性: 中〜高(プレプリント)】 ↩︎ ↩︎2

  5. Mixture of Reasonings: Teach Large Language Models to Reason with Adaptive Strategies - arXiv (2025). 【信頼性: 中〜高(プレプリント)】 ↩︎

  6. Enhancing Chain-of-Thought Reasoning with Critical Representation Fine-tuning - ACL 2025. 【信頼性: 高(査読済み)】 ↩︎

This post is licensed under CC BY 4.0 by the author.