この記事は、連載「追わない技術」の第 3 回です。うまくいかない症状と、その対処を一つずつ並べています。各回はファイルやスクリプトを一つ置けば完結します。その仕組みがなぜ要るのかは、置いたあとに解説を読めば分かります。連載の全体像と各回の一覧は序論にあります。

今回は、AI に頼んだ仕事が通らなかったときに、より強いモデルや新しいモデルへ乗り換えたくなる話です。私は先に、題を否定しておきます。新しいモデルは、使うべきです。あなたも、出たらまず使ってください。乗り換えなくてよいのは、落ちた原因が、渡していないパターンのほうにあって、モデルの差には無いときです。どちらなのかは、乗り換える前に確かめることができます。

まず一つ思い出してみてください。

直近であなたが「これは強いほうでないと無理だ」と判断したとき、何と何を比べましたか。

両方に同じものを渡して、落ちた箇所を並べましたか。

それとも、片方が失敗した時点で、強いほうへ乗り換えましたか。

この回では、比べる 2 つのモデルを、名前の代わりに「高い側」と「安い側」と呼びます。

CC BY 4.0

同じ課題を、高い側と安い側のサブエージェントに 12 回渡しました

私は、会話を引き継がないサブエージェントを 12 回起動して、同じ課題を渡しました。課題は「未公開の記事を 1 本書く」です。条件は 2 つあります。1 つは仕組みの条件で、書き方のパターンを、言語化した文で渡すか、渡さないかです(どちらの条件でも、実例として既存の記事を 2 本渡します)。もう 1 つはモデルの条件で、高い側か、安い側かです。

この連載の記事では、書き方のパターン(導入の 1 段落目の書き出し・次回予告の形・検証手順の 6 ラベル・本文の分量)を、すでに自動テストが確かめています。私はその自動テストを、そのまま採点表に流用しました。合否を決めるのは、最初から最後までその自動テストで、私の判断は 1 度も入りません。

[observed] 1 回目(12 本・11 点満点)
パターンを渡さない  高い側 8.0 / 安い側 6.3
パターンを渡した    高い側 11.0 / 安い側 9.0
仕組みの差 +2.8 / モデルの差 1.8

大きく出たのは、モデルの差(1.8)より、仕組みの差(+2.8)のほうです。

安い側にパターンを渡したほう(9.0)が、高い側にパターンを渡さなかったとき(8.0)を上回りました。

パターンを渡さなかったとき、高い側が落とした項目(導入の書き出し・次回予告の形・本文の分量)は、どれも安い側も落としていました。

パターンを渡さないとき、最低点を出したのは高い側でした

私は 2 回目を、別の題材と別の実例で回しました。12 本で最低点を出したのは、パターンを渡さなかった高い側の 1 本でした。

その 1 本は、13 点満点の 2 点です(2 回目の採点は 13 項目です)。このサブエージェントは、見出しの階層を 1 つ間違え、検証手順の節を丸ごと書き落としました。1 箇所を外したために、その見出しや節を前提にしている項目が、まとめて落ちています。

パターンを言語化して渡さないと、サブエージェントは、点を少し下げるのではなく、節を丸ごと書き落とすことがあります。

この 1 本の点だけで、2 回目のモデルの差は符号が反転しました。パターンを渡さなかったとき、高い側と安い側は、違う形で落ちました。

パターンを渡しても、安い側が外したものがありました

パターンを渡しても外れた項目に、本文の分量があります。1 回目は 6 本のうち 2 本、2 回目は 4 本のうち 1 本が範囲から外れ、どれも安い側で、どれも下限を割っていました。渡した文には、分量の範囲が数字で書いてありました。高い側は、2 回とも範囲に収まっています。

パターンを言語化して渡しても、安い側だけが外したものがあります。そこには、モデルの差が残っています。

どのモデルを使うかを、何で決めるか

試しに、手元のリポジトリの決まりに沿って文書を書く仕事を、既定のモデルに頼んだとします。決まり(見出しの立て方や、どの文書にも必ず置く節)は文にしておらず、AI には、決まりに沿った既存の文書を 2 本、手本として渡しました。返ってきた文書は、必ず置く節が 1 つ抜けていました。次にどうするかを、あなたなら次のどちらで決めますか。

  • 既定のモデルが落としたのを見た時点で、より強いモデルに替える
  • 両方のモデルに同じものを渡し、何が違うのかを見てから選ぶ

答えは、両方に同じものを渡して、何が違うのかを見てから選ぶほうです。既定のモデルが落としたことだけでは、原因が、モデルの差なのか、渡していない決まりなのかが分かりません。抜けた節は、あなたのリポジトリの中でだけ決まっている書き方で、AI に届いていたのは手本の 2 本だけでした。この回の 1 回目の実験では、パターンを渡さなかったとき、高い側が落とした項目は、どれも安い側も落としていました。2 回目には、高い側が検証手順の節を丸ごと書き落としています。強いモデルでも落ちていたのが、こういう項目です。決まりを文にして渡すと、安い側(9.0)が、渡さなかった高い側(8.0)を上回りました。一方で、本文の分量は、パターンを渡しても安い側だけが外しました。こちらは、強いモデルのほうが合っていた項目です。どちらなのかは、両方に同じものを渡して初めて見分けられます。

理解したことは一文にできます。

片方のモデルが落とした項目だけでは、原因がモデルの差か、渡していない決まりかは分からない。だから、乗り換える前に、両方に同じものを渡して何が違うのかを確かめ、その仕事に合うモデルと渡し方を選ぶ。

なぜ、落ちた項目だけでは、原因が分からないのか

この連載の書き方のパターン(導入の 1 段落目の書き出し・次回予告の形・検証手順の 6 ラベル・本文の分量)は、この連載の中でだけ決まったものです。パターンを渡さない条件でも、私はサブエージェントに、実例として既存の記事を 2 本渡していました。パターンは、その 2 本の形の中に、言語化されないまま入っていただけです。

Claude Code のサブエージェントのページによると、サブエージェントに載るのは、起動のときに渡されるもの(依頼の文や指示ファイルなど)で、それまでの会話は載りません。この実験で、パターンがサブエージェントに届く道は、手本の 2 本の形だけでした。2 回目に最低点を出した高い側の 1 本が外したのは、見出しの階層と検証手順の節です。どちらも、手本の 2 本が言語化せずに示していたパターンでした。

本文の分量は、パターンを渡しても外れました。Claude Code のベストプラクティスのページによると、Claude は、仕事が終わったように見えたところで止まります。走らせることのできる確かめ方が無ければ、Claude が止まる手がかりは、終わったように見えることだけです。この実験で、私は採点に使った自動テストをサブエージェントに渡していません。渡した文は分量を数字で決めていましたが、サブエージェントの手元には、書いた本文がその数字に収まっているかを、走らせて確かめる方法がありませんでした。分量で外れた本文は、どれも下限を割っていました。

検証手順: 同じ課題を高い側と安い側に渡して、安い側だけが落ちた項目を仕組みにする

前提

会話を引き継がないサブエージェントを、同じ課題へ同時に起動する手段が要ります(1 体ずつ順に回すと、その時々の混み具合の違いが、条件の差として点に混ざります)。課題は、合否が自動で決まるものにします。人が採点する課題では、サブエージェントの数だけ人の判定が要り、この手順の費用が大きく増えるからです。題材は未公開のものにしてください。公開済みのものを書き直させると、どれを正解とするのかが、はっきりしなくなります。

所要時間: 30 分(採点する自動テストが既にある場合。無いなら、まず自動テストを 1 本書くところから)

手順

  1. 同じ課題を用意します。両方へ渡す中身は、1 バイトまで同じにします
  2. 高い側と安い側の両方に、同じものを渡します。1 回だけで出た差はノイズと区別がつかないので、同じ課題を何回か回します
  3. 高い側が通り、安い側が落ちた項目だけを並べます。並べた項目が、仕組みの足りない箇所です
  4. 並べた項目の 1 つずつについて、「渡さないと落ちるか」を先に確かめます。何も渡さなくても両方が守っている項目は、ここで捨てます
  5. 残った項目を、規約か自動テストにして置きます。数えないと決まらないパターンは、規約にせず、自動テストにして置きます
  6. もう一度、両方へ同じものを渡します

合格条件(すべて満たすこと)

合格の条件は 4 つです。1 つ目は、手順 3 で並べた項目が 1 つ以上あることで、0 件なら、その課題では、仕組みの足りない箇所がまだ見つかっていません。2 つ目は、手順 5 で置いたものが、人の判定を 1 度も必要としないことです。必要とするなら、それは運用で、仕組みには数えません。3 つ目は、手順 6 で、安い側の落ちた項目が減っていることです。4 つ目は、高い側の点が下がっていないことで、置いた仕組みのせいで、高い側が通っていた項目が落ちていないことを確かめます。

合格しなかったとき

  • 手順 3 で並べた項目が 0 件だった —— 課題が易しすぎます。題材を難しくしてください(採点の項目を厳しくすると、次はどのサブエージェントも同じ 1 項目で落ちて、やはり差を測ることができません)
  • 並べた項目はあるが、自動テストにできない —— そこは能力の差です。その項目だけは高い側に任せ続けるのが正解です。無理に規約へ書いても、守られない条文が 1 つ増えるだけです
  • 手順 6 で高い側の点が下がった —— 置いた仕組みが、通っていた書き方まで禁じています。条文の範囲を、実際に落ちた 1 件ぶんまで狭めてください
  • 落ち方がサブエージェントごとにばらばら —— 回数が足りません。1 体の極端な結果だけで、モデルの差の符号が変わります(実際に 2 回目は、最低点の 1 体だけで、モデルの差の符号が反転しました)

後始末

サブエージェントが書いたものと採点表を削除します。採点表も一緒に消すのは、残すと、題材を作り直したつもりで、古い採点表のまま比べることになるからです。手順 5 で置いた規約と自動テストは残し、消すのは、測定のために作ったものだけにします。

CC BY 4.0 はここまで

乗り換えなくなったもの

  • 片方のモデルが失敗した時点で、より強いモデルへ替えるのを、私はやめました。両方に同じものを渡し、何が違うのかを見てから選びます
  • 続けていることもあります —— 新しいモデルを使うことです

次回は「サブエージェントを使わない技術」。私は、本体で終わる仕事をサブエージェントへ投げるのをやめました。 任せた相手が、こちらがすでに読んだ前提を、もう一度読み込む量を数えたからです。