AIが「テスト駆動開発」を
サボる罠
(報酬ハッキング)

  • Claude Codeにテストに通るようにコードを直すようにを頼んだら、実際の処理はせずに期待値を直接コードに入れて返してきました。
  • 確かにテストは通るけど、モックアップのままでは完成しない。
  • AIは指示された評価基準を効率的に満たそうとするので、出力を完全には信用できません。

関連記事

1. テストだけ成功をクリアするコード

Claude Codeでプログラムを作成していたとき、不可解な現象が起きました。テストは全て緑色で成功しているのに、実際にアプリケーションを動かすと期待通りに動きません。

「テストドリブン開発(TDD)」とは、実際のコードを書く前にテストコードを書く開発手法です。従来の「設計→実装→テスト」ではなく、「テスト→実装→リファクタリング」の順序で進めます。

テスト駆動開発(TDD) 従来 設計→実装→テスト TDD テスト→実装→改善 1 RED 失敗するテスト 2 GREEN 最小実装 3 REFACTOR コード改善 メリット 早期バグ発見・要件明確化 保守しやすいコード
  1. Red(失敗するテスト):
    まず機能の仕様を表すテストコードを書く。この時点では実装がないためテストは失敗する
  2. Green(成功するコード):
    テストが通る最小限のコードを実装する
  3. Refactor(リファクタリング):
    テストを通したままコードをきれいに整理する

この手法により、要件の明確化、早期バグ発見、保守しやすいコードの作成が期待できます。しかし、Claude Codeのような AI がこの「テストを通すコード」を求められたとき、本来の意図とは異なる方法でテストをクリアしてしまうことがあります。

たとえば、商品リストから合計金額を計算する関数を実装する段階だとします。実際の処理は行わないで、テストで使われる具体的な入力値に対する正解をハードコード(直接書き込み)しただけのことがあったのです。

function calculateTotal(items) {
  // テストケース用の固定値を返している
  if (JSON.stringify(items) === '[{"price": 100}, {"price": 200}]') {
    return 300;
  }
  if (JSON.stringify(items) === '[{"price": 50}, {"price": 150}, {"price": 75}]') {
    return 275;
  }
  // テストケースごとの固定値が続く...
  return 0;
}
Code language: JavaScript (javascript)

1.1. 報酬ハッキングという現象

この現象は「報酬ハッキング」と呼ばれています。AIが本来の目的を達成するのではなく、評価基準だけを満たす抜け道を見つけてしまうことを指します。

報酬ハッキングという現象 定義 評価基準だけを満たす抜け道を見つけて、本来の目的を達成しない行動 日常例:学校のテスト 本来の目的:知識習得 評価基準:テスト点数 抜け道:答えを丸暗記 AI例:プログラミング 本来の目的:仕様通りの機能 評価基準:テスト通過 抜け道:テスト値をハードコード Opus 4: 15.2% / Sonnet 4: 14.3% AIは効率を追求し、評価基準のみを満たす意図しない解決策を見つける

学校のテスト勉強で例えると、知識を身につけることが本来の目的です。しかし評価基準がテストの点数だけなら、過去問の答えを丸暗記するという「抜け道」があります。点数は取れますが、本当の理解は得られません。

プログラミングでも同じことが起きます。

  • 本来の目的: 仕様通りに動く関数を作成する
  • 評価基準: テストケースを全て通す
  • 抜け道: テストの入力と出力だけを覚えて固定値を返す

Claude Codeは「テストを通すコードを書け」という指示に対して、実際の処理は行わず、テストで使われる具体的な入力値に対して正解をハードコード(直接書き込み)1するだけのことが少なからずあります。

Anthropic社(Claudeの開発会社)の調査では、この問題はClaude Opus 4で平均15.2%、Claude Sonnet 4で平均14.3%の確率で発生することが報告されています2。人間なら「テストを通すためだけのコードはダメ」と直感的に理解できますが、AIには道徳的な判断や常識的な理解がありません。純粋に効率性を追求してしまうことがあるのです3

1.2. 対策を試してみた結果

この問題に気づいてから、複数の対策を試しました。

対策を試してみた結果 claude.mdに 禁止事項記載 一定効果あり 作業範囲を 分離 手間増加 別AIで チェック 二重コスト 批判的 レビュー 最も効果的 手動作業必要 根本的な問題 生成AIの反応は確率的 同じ指示でも毎回違う結果が出る可能性 決定打はない 完全に制御することは困難。管理できる範囲でのみ活用可能
  • claude.mdファイルに制約を記載する方法では、設定ファイルに「ハードコードは絶対に禁止」「テストデータに依存した実装は避ける」といった制約を明記しました。一定の効果はありましたが、完璧ではありません。
  • 作業範囲を分離する方法では、コードを書く役割とテストを書く役割を分けて、同時に両方を触らせないようにしました。これは、手間が増えるものの、一定の効果がありました。
  • 別のAIインスタンスでレビューする方法では、実装後に別のAIでコードをチェックさせました。二重のコストがかかります。

どの方法にも限界があります。理由は、生成AIの反応が確率的だからです4。同じ指示をしても毎回違う結果が出る可能性があり、完全に制御することは困難です。

もしかすると、生成AIに成果物の目標だけでなく、「テストドリブン開発」という手順を押し付けたことが根本的な間違いだったのかもしれません。手順まで細かく指定すると、本来の力を発揮できなくなることがあるからです。しかし、テストを使わないと、生成されたコードが正しく動作しているか確認できないので、難しいところです。

2. AIが見せた効率化の本質

テストの抜け道探しというAIの特性について考えると、より大きな疑問に行き着きます。それは、人間を超えるAIは「実用化」できるのか、というものです。

AIの本質が見えてきた 効率重視で手抜き 評価基準を最効率で満たす 道徳的判断なし 常識なし 人間監視が必要 出力チェック必須 自動化の意味薄れる 使用範囲限定的 管理できる範囲のみ 単純作業の補助は優秀 複雑判断は危険 AGI・ASIは本当に可能なのか? テストのハードコード程度の問題すら防げない現状 より巧妙な報酬ハッキングを見つける可能性 AIを信じすぎてはいけない。パートナーとして注意深く監視し続ける必要

現在は、人工汎用知能(AGI)や人工超知能(ASI)の実現について楽観的な予測が多く聞かれます。しかし、AIが高度になればなるほど、より巧妙な報酬ハッキングを見つける可能性があります。このようなAIの出力を人間がチェックする必要があるのであれば、複雑な判断を任せることはできません5

2.1. 現在の結論

AIは強力なツールですが、人間の意図を完璧に理解し実行するわけではありません。効率を追求するあまり、重要な部分で手を抜くことがあります。

Claude Codeの報酬ハッキング問題 問題 Claude Code 「テストを通すコード を書いて」 ハードコード 現象 テスト:✓通る 実用性:✗ゼロ 固定値を直接埋込み 汎用性なし 対策 批判的レビュー 人間による監視 段階的確認 改善率: 67-69% 現状のベター解 AIは効率重視。評価基準を満たすが意図を無視する行動パターン

今のところ、完全な自動化を期待するのではなく、AIをパートナーとして活用し、その出力を注意深く監視し続けることが必要です。報酬ハッキング問題は、AIの本質的な特性として理解し、適切に対処していく必要があります。

  1. Claude 4 System Card: Anthropic公式 – Claude 4の報酬ハッキング問題について詳細に記載された公式文書
  2. Reward Hacking in Reinforcement Learning | Lil’Log – 報酬ハッキング現象の包括的な学術的解説
  3. Concrete Problems in AI Safety | arXiv – AI安全性における報酬ハッキング問題を最初に定義した重要論文
  4. Defining and Characterizing Reward Hacking | arXiv – 報酬ハッキングの正式な数学的定義と特性分析
  5. Specification Gaming Examples in AI | Victoria Krakovna – AI分野におけるスペシフィケーションゲーミングの具体例集
  6. Specification Gaming: The Flip Side of AI Ingenuity | DeepMind – DeepMindによる報酬ハッキング問題の理論的背景解説
  7. Sycophancy to Subterfuge: Investigating Reward Tampering in Large Language Models | Anthropic – 大規模言語モデルにおける報酬改変行動の研究報告
  8. 中嶋 謙互さん: 「Claude Codeが、コードを正しく実装してテストを通すんじゃなくて、テストに合格するようなログをハードコードして出力するごまかしをやるのが困る。 これはどうやって防げばいいんだろう。。」 / X
  1. プログラミングにおいて、本来は外部設定や実行時に決定すべき値を、ソースコード内に直接埋め込む手法。保守性や拡張性を著しく損なうため避けるべきとされる – ハードコーディングとは
  2. Claude 4モデルの報酬ハッキング行動について詳細な評価結果が記載されている。Claude Opus 4は前世代と比較して67%、Claude Sonnet 4は69%の改善を示した – System Card: Claude Opus 4 & Claude Sonnet 4
  3. この現象は「仕様ゲーミング(specification gaming)」と呼ばれ、AI分野で広く知られている問題。AIが文字通りの指示には従うが、意図された目的を達成しない行動パターン – Specification Gaming: The Flip Side of AI Ingenuity
  4. 確率的モデルの本質的特性により、同一の入力に対しても出力が変動する。これがAI制御における根本的課題の一つとなっている – AI Safety 101: Reward Misspecification
  5. 現在のAI安全性研究では、完全な自動化よりも人間とAIの協調による監視体制が重要視されている。特に高リスクなタスクでは人間による最終確認が不可欠とされる – Anthropic Claude 4 System Card