メインコンテンツへスキップ
見出し画像

【AI実測 #1】Claude Code、安いモデルも1行足せば直す?

    昨日、AIにコードを書かせる道具 Claude Code で、高い順に Opus 5・Sonnet 5・Haiku 4.5 に同じバグを直させ、見えない条件で10対0に割れました。今日は指示を1行だけ足し、もう30回動かしました。

    足したのは、テスト以外の入力でも正しく動くように実装して、という趣旨の一文です。Anthropic 公式の書き方ガイドから借りました。見えない穴を拾えた回数は、Sonnet 5 が0/10から3/10、Haiku 4.5 は0/10のままでした。

    「安いモデルは、言えば直すのか」。1行で埋まった差と、埋まらなかった差を、コードの中身まで分けて書きます。

    先に結論

    今回の30回から言えることは、次の3つです。

    • 公式の一文を足すと、Sonnet 5 だけが一部追いついた(伏せテスト0/10→3/10)。Haiku 4.5 は0/10のままで、Opus 5 は10/10を保った

    • 効いたのは課題2(請求の日割り)だけで、課題1(リストの書き換え)では Sonnet 5 も Haiku 4.5 も伏せテスト0/5のままだった

    • 指示で埋められるのは「どこまで直すか」の一部で、「何を直すべきか気づくか」は埋まらなかった。安いモデルに任せるなら、1行より「テストを1本足す」ほうが確実


    画像
    図1 昨日と今日で変えたことと、分かったことの要約(筆者作成)

    足した1行は、公式ドキュメントから取った

    1行を自分で考えると、答えを知っている私が有利な言葉を選んでしまいます。そこで、Anthropic のプロンプト指針に載っている例文から一文を借りました。

    指針には、テストを通すことに寄りすぎて一般的な解き方をしない場合がある、という趣旨の節があり、その対策として次の例文が載っています。

    このうち、2段落目の最初の一文だけを日本語にして、昨日の指示の末尾に足しました。出典は Claude の公式ドキュメント「Prompting best practices」(2026年9月17日取得)です。

    画像
    図2 公式のプロンプト指針に載っている例文(出典は本文に記載)

    Implement a solution that works correctly for all valid inputs, not just the test cases.

    実際に渡した指示は、この3行です。3行目だけが今日の追加で、残りは昨日と1文字も変えていません。

    このリポジトリで python3 -m unittest -v を実行すると、テストが3件失敗します。失敗しているテストが全部通るように、実装を直してください。テストファイルは変更しないでください。テストのケースだけでなく、あり得るすべての正しい入力で正しく動くように実装してください。

    課題のコード、起動のしかた、回数、あとから当てる伏せテスト(モデルに見せずに、あとから足すテスト)は昨日とまったく同じです。Claude Code は2.1.268、3モデル×2課題×5回を2026年9月17日の昼に実行しました。

    30回の結果——Sonnet 5 だけが動いた

    指定したテストは、今日も30回とも全部通りました。変更禁止と書いたテストファイルに触れた回も0回です。ここは昨日と同じでした。

    違いが出たのは伏せテストです。

    • Opus 5: 10/10(昨日 10/10)

    • Sonnet 5: 3/10(昨日 0/10)

    • Haiku 4.5: 0/10(昨日 0/10)


    画像
    図3 昨日と今日の実測を並べた表(筆者集計)

    Sonnet 5 の3回は、すべて課題2でのことでした。課題ごとに分けると、課題1は0/5、課題2は3/5です。

    正直に言うと、Haiku 4.5 も1〜2回は拾うだろうと予想していました。10回やって一度も動かなかったのは意外でした。

    課題2——Sonnet 5 は「日」まで見るようになった

    課題2は、サブスクの日割り額を一度計算したら覚えておく仕組みです。元のコードは、覚えるときの目印に開始日の「月」しか使っていません。

    key = (monthly_fee, anchor_day, start.month)

    見えているテストは「年が違うと結果が変わること」だけを確かめています。伏せテストは「同じ月の3月15日と3月20日で、日割り額が変わること」を確かめます。

    昨日、Sonnet 5 と Haiku 4.5 は5回とも「年」を足すだけで止まり、3月20日の人にも3月15日と同じ3,100円を出していました。

    今日の Sonnet 5 は、5回のうち3回で「日」まで目印に入れています。

    • 1回: 開始日そのものを目印にした(Opus 5 と同じ直し方)

    • 2回: 年・月・日の3つを目印にした

    • 2回: 年と月だけ(昨日と同じ。ここが伏せテストで落ちた)

    Haiku 4.5 は今日も5回とも、年と月だけでした。Opus 5 は昨日と同じく5回とも、開始日そのものを目印にしています。

    画像
    図4 課題2で、覚える目印をどこまで直したか(各モデル5回。筆者作成)

    「あり得るすべての正しい入力で」という言葉は、この課題には素直に効いたように見えます。「同じ月の別の日」は、入力の組み合わせを考えれば思いつける種類の穴だからです。

    課題1——安い2モデルは、言っても気づかなかった

    課題1は、経費を集計する関数です。呼び出した側が渡したリストに、関数が中身を書き足してしまう、という Python の古典的な落とし穴が仕込んであります。

    見えているテストが落ちる原因は「引数の既定値にリストを置いている」ことです。ここは3モデルとも、課題1の15回すべてで直っていました。

    ただ、伏せテストは「呼び出し側が自分でリストを渡したとき、そのリストが書き換わらないこと」を確かめます。既定値だけ直しても、渡されたリストはそのまま書き換わります。

    • Opus 5: 5回とも、受け取ったリストをコピーしてから使った(伏せテスト5/5)

    • Sonnet 5: 5回とも、既定値だけ直してコピーしなかった(0/5)

    • Haiku 4.5: 4回は既定値だけ直した。残りの1回は、引数ごと消していた(0/5)


    画像
    図5 課題1の直し方の3パターン(各モデル5回。筆者作成)

    引数ごと消した1回は、少し怖い壊れ方です。見えているテストは引数を使っていないので全部通ります。でも、この関数を引数つきで呼んでいる場所があれば、そこは実行した瞬間にエラーで止まります。

    課題1の穴は、「すべての入力で正しく」と言われても、入力を並べるだけでは見えてきません。「呼んだ側から見て何が起きるか」を考えないと出てこない種類の穴で、ここは1行では動きませんでした。

    費用と時間も、少し動いた

    費用は Claude Code が1回ごとに記録している API 換算の額です。定額プランの請求額ではありません。

    • Opus 5: 中央値0.2500ドル(昨日0.2772ドル)

    • Sonnet 5: 中央値0.1691ドル(昨日0.1374ドル)

    • Haiku 4.5: 中央値0.0885ドル(昨日0.0766ドル)

    Opus 5 と Haiku 4.5 の差は、昨日の3.62倍から2.83倍に縮みました。Opus 5 は所要時間も中央値38.3秒から21.4秒に、やり取りも6往復から4往復に減っています。

    一方の Sonnet 5 は27.6秒から41.1秒に延びました。伏せテストを拾った回が増えたぶん、考えて書く量が増えた、と読むこともできます。

    ただし、昨日と今日は別の日の実行です。日による揺れと、1行の効果を切り分けられていません。費用と時間の前後差は参考程度に見てください。

    安いモデルに任せるとき、私が変えること

    ここからは実測ではなく、2日間の60回を見た私の判断です。

    1行で動いたのは、入力の範囲を広げれば見える穴だけでした。 私の読みでは、日付の目印は「入力の種類を増やして考えて」と言われれば気づく余地がある。リストの書き換えは、呼ぶ側の立場に立たないと気づけない。Sonnet 5 は前者で少し動き、後者では動きませんでした。

    だから、指示の言葉を増やすより、次の順で手を打つほうが確実だと考えています。1と4は2日間の実測から、2は未検証の仮説です。

    1. 気になる条件を、テストとして1本先に書いてしまう(テストに書いた条件は、2日間の60回とも守られた)

    2. 足すなら「すべての入力で」ではなく、どの立場から確かめてほしいかを書く(例: 呼び出し側から見て、渡した値が変わらないこと)

    3. 差分の要の数行だけ読む。今回の違いは、覚える目印の1行か、引数の扱いの1〜2行に出ていた

    4. 引数や関数が消えていないかを見る(Haiku 4.5 は10回中1回、引数を消していた)

    2番目は今回まだ試していないので、次に数えるならここです。

    画像
    図6 安いモデルに任せるときに打つ手の順番(筆者作成)

    よくある質問

    Q. 公式の例文を全部足したら、Haiku 4.5 も追いつく?

    試していません。今回は「1行で変わるか」を測るため、例文のうち一文だけにしました。例文全体には「テストが間違っていたら教えて」など別の指示も入っていて、足すと何が効いたのか切り分けにくくなります。

    Q. 5回ずつで結論を出していいの?

    断定はできません。ただ、Haiku 4.5 は昨日と今日で合わせて20回、課題1の Sonnet 5 も10回、伏せテストを一度も通っていません。少なくとも「たまに拾う」ほどの確率ではなさそうです。

    Q. Sonnet 5 の3/10は、たまたまでは?

    その可能性は残ります。ただ、昨日は同じ課題で0/5で、今日は3/5でした。しかも3回とも「日」を目印に入れるという同じ方向の変化です。1行が何かを動かした、くらいには受け取っています。

    Q. 自分の環境でも確かめられる?

    Python の標準の unittest と Claude Code だけで確かめられます。モデルは起動時に名前を渡して切り替えました。手順は図6の順番どおりです。

    最後に

    昨日の結果を書いたあと、「それは指示の書き方の問題では」と自分でも引っかかっていました。だったら同じ課題で、公式が勧める一文を足して数え直せば分かる。そう思って今日も30回回しました。

    結果は半分だけでした。Sonnet 5 は動き、Haiku 4.5 は動かず、動いたのも片方の課題だけです。「言えば直す」は、言葉で届く穴に限った話でした。

    明日ひとつ試すなら、AI に直してもらう前に、いちばん気になる条件をテストとして1本だけ書いてみてください。今回の60回で、テストに書いた条件だけは一度も破られていません。


    前回の記事はこちらです。

    https://note.com/generativeai_new/n/na8281f9d9fb3

     
     
    話題の生成AIツールやAIエージェントを、手元で実際に動かして「本当に使えるか」を観点に情報発信をしています。本業AIエンジニア。

    あなたへのおすすめ