この記事は、連載「追わない技術」の第 3 回です。うまくいかない症状と、その対処を一つずつ並べています。各回はファイルやスクリプトを一つ置けば完結します。その仕組みがなぜ要るのかは、置いたあとに解説を読めば分かります。連載の全体像と各回の一覧は序論にあります。
今回は、強いモデルでないと通らなかった仕事が、通るようになった話です。先に、題を否定しておきます。新しいモデルは、使うべきです。出たらまず使ってください。使わなくてよくなるのは、その仕事のパターンを明文にできて、しかも「渡さないと落ちる」ことを確かめた場合だけです。この連載の 1 作目を書き始めた日、私は文章に強いとされるモデルに 8 割方を投げていました。いまは同じ仕事が、既定のモデルだけで出ています。その間に私がやったのは、モデルを選び直すことではありません。規約と自動テストを積んだだけです。強いモデルでないと通らなかったのは、仕組みが足りないぶんを、モデルの力で埋めていたからです。
もう 1 つ断っておきます。この回にはモデルの名前も、価格も、性能の数字も出てきません。半年で古くなるものは、この連載では書かないと決めています。書くのは「差がどこで生まれ、何を置くと消えるか」という形のほうです。以降、比べるものは「高い側」と「安い側」とだけ呼びます。
まず一つ思い出してみてください。
直近で「これは強いほうでないと無理だ」と判断したとき、何と何を比べましたか。
両方に同じものを渡して、落ちた場所を並べましたか。
それとも、片方が失敗した時点で乗り換えましたか。
CC BY 4.0
1 週間ぶんの内訳は、証拠になりませんでした
手元の記録から、記事を書いていた 1 週間ぶんの応答をモデル別に数えました。
| 日 | その日にやったこと | モデルの内訳 |
|---|---|---|
| 1 日目 | 1 作目のドラフト 17 本(規約 0 / 自動テスト 0) | ⭐ 文章に強い側 83% / 既定 17% |
| 3 日目 | 3 作目の本文 9 本 + 規約を 76 コミットぶん積んだ | 既定 78% / 特化 22% |
| 6 日目 | 本文 2 本 + 書き方の自動テスト 3 本 | ⭐ 既定 100% |
同じ種類の仕事(記事本文を書く)だけを並べると、特化 83% 既定 78% 既定 100% です。その間に積んだのは規約 29 条と、書き方を見る自動テスト 6 本でした。
それでも、この表は証拠になりません。理由が 3 つあります。
- 抜いた日がある。4 日目・5 日目は記事ではなく本の付録を作っていて、仕事の種類が違います。同じ列に並べれば、その日の内訳が「積んだ効果」に見えてしまいます
- 文章に強い側の新版が、ちょうど 1 日目の前後に出ています。「使えるものが増えた」時期と重なっているので、内訳の動きをどちらの理由にも読めます
- いちばん重いのはこれです —— この数字が示しているのは「何を使ったか」であって、「何で足りたか」ではありません。切り替えたのは私の手なので、このままでは私の主観の記録です
3 つとも、後から統計で落とせるものではありません。記録は既に取られてしまっていて、条件は私が選んでいます。だから、統制した側を別に用意しました。
同じ課題を、高い側と安い側の 12 体に渡しました
会話を引き継がない作業者を 12 体、同時に起動して、同じ課題を渡しました。課題は「未公開の記事を 1 本書く」です。条件は 2 つあります。
- 仕組みの条件 —— 書き方のパターンを言語化した文で渡すか、渡さないか
- モデルの条件 —— 高い側か、安い側か
採点は人がやりません。この連載の記事は、書き方のパターンを自動テストが既に見ています(導入の主題文・次回予告の形・検証手順の 6 ラベル・本文の分量)。その自動テストをそのまま採点表に流用したので、合否に私の判断が 1 度も入りません。
[observed] 1 回目(12 体・11 点満点)
パターンを渡さない 高い側 8.0 / 安い側 6.3
パターンを渡した 高い側 11.0 / 安い側 9.0
仕組みの差 +2.8 / モデルの差 1.8
仕組みの差(+2.8)のほうが、モデルの差(1.8)より大きく出ました。そして、いちばん効く 1 行はここです ——
⭐⭐⭐ 安い側にパターンを渡したほう(9.0)が、高い側にパターンを渡さなかったとき(8.0)を上回りました。
ただし、この 1 回ではまだ言えていないことがあります。パターンを渡した側は、渡した文のぶんだけ入力が長いのです。効いたのが「パターン」なのか「渡した量」なのか、この形では分けられません。
効いたのは、渡した量ではなくパターンのほうでした
そこで 2 回目は、条件を 1 つ増やしました。パターンの話が 1 つも書いていない、同じ長さの文を渡す条件です。量だけをパターンと同じだけ増やして、中身を抜いたわけです。
[observed] 2 回目(12 体・1 回目と同じ 11 項目に換算)
パターンを渡さない 7.0
同じ長さの無関係な文 7.5
パターンを渡した 10.2
同じ長さの無関係な文(7.5)は、何も渡さないとき(7.0)の隣に落ちました。パターンを渡した側だけが、そこから +2.7 離れています。効いたのは量ではなく、パターンのほうでした。
そして、この回でいちばん強いのは平均そのものではありません。別の題材・別の実例・別の並びで回したのに、1 回目とほとんど同じ幅が出たことです(7.2 10.0 と 7.0 10.2)。1 回の差はノイズですが、幅が再現したなら、それは形です。
ここも割り切れていないところを 1 つ残します。無関係な文が効かなかったことは、「量は効かない」とも「関係ないと見て読み飛ばした」とも読めます。この形では分けられません。
パターンを言語化しても、守れないものがありました
落ちた項目を並べたとき、1 位はずっと同じでした。本文の分量です。12 体のうち 7 体、次の回は 8 体が外れました。
分量の範囲は、規約に数字で書いてあります。それでも外れます。理由ははっきりしていて、書いている側が自分の書いた文字数を数えられないからです。
⭐⭐ パターンを言語化しても守れないものがある —— 自分で数えないと分からないパターンです。
これは「規約に書くか、自動テストにするか」という選び方に、線を 1 本引きます。読めば守れるパターンは、文で足ります。数えないと決まらないパターンは、文では届きません。後者は最初から自動テストの側に置くしかありません。
この結果は「パターンを言語化すれば安い側でも通る」を否定していません。言語化の形が「文」では足りないパターンがある、という線の引き直しです。
パターンを渡さないと、高い側のほうが大きく崩れました
平均だけを見ていると消えるものがあります。12 体で最低点を出したのは、高い側でした。
その 1 体は、換算前の 13 点満点の 2 点です(この回の採点は 13 項目で、上の平均はそれを 1 回目と同じ 11 項目へ換算した数です)。見出しの階層を 1 つ間違え、検証の節を 1 つも置きませんでした。1 か所を外した結果、そこにぶら下がる項目がまとめて落ちています。
⭐⭐ パターンが言語化されていないときの落ち方は、「少し下がる」ではなく「丸ごと外す」ことがあります。
この 1 体だけで、その回のモデルの差は符号が反転しました。だから私は「安い側のほうが良い」とは書けません。書けるのは、平均ではなく落ち方の幅のほうです。パターンを渡さないと、どちらの側も同じようには落ちない。
渡さなくても守られるパターンに、仕組みを置く意味はありません
回を重ねるうちに、逆側の数字も出ました。知見を何も渡さない条件を足したときです。
[observed] 5 回目(12 体・11 点満点)
何も渡さない 10.75 / 実例を渡す 10.75 / パターンを渡す 11.00
11 項目のうち、この 12 体が一度も落とさなかった項目: 10
何も渡さなくても、11 項目のうち 10 項目は両方の側が守りました。差が出たのは 1 項目だけです。
⭐⭐ 渡さなくても守られるパターンに、仕組みを置く意味はありません。
これは主題の反証ではなく、手順の順番の話です。仕組みを置く前に見るべきなのは「置いたら守られるか」ではなく、「置かないと落ちるか」のほうでした。落ちない項目に規約を 1 条足すと、規約だけが増えます。
費用: 仕組みを置くと、置いたぶんだけ何かが塞がります
ここは主題に正面から当たる副作用なので、隠さずに書きます。パターンを明文で渡すと、渡したことによる失点が出ました。
- 明文を渡した側だけ、手元の自動テストから見えない書き方が増えました。何も渡さない 10 体では 0 件、パターンを渡した 10 体では 5 件です(どちらも、2 度の実験を合わせた体数です)。パターンは守られ、同時に、そのパターンを見張っている自動テストの目が塞がれます
- 明文を渡したことが、明文を渡した項目そのものを落としました。落ちた 3 体は、いずれも落ちた行がコメントだけでした。渡した知見を守るだけでなく、守っている理由を書き残し、その 1 行が当の自動テストに引っかかった形です
どちらも「差は仕組みで埋まる」の費用の側です。仕組みは無料ではありません。置いた数だけ、置いたことに由来する落ち方が増えます。
原理: モデルの差は、仕組みの抜け穴の在処を指しています
ここまでの数字を 1 つにまとめます。
⭐⭐⭐ モデルの能力で埋めていた差は、仕組みを置くと埋まります。だから「もっと強いモデルが要る」は、たいてい「仕組みが足りない」でした。
大事なのは、差そのものを消すことが目的ではないところです。差が出た箇所は、仕組みが足りていない場所を指しています。高い側は、足りていない仕組みを能力で埋めてしまうので、抜け穴が見えません。安い側は、同じ抜け穴でそのまま落ちます。
だから、両方に渡すこと自体が検出器になります。高い側が通り、安い側が落ちた箇所 —— そこだけが、仕組みで埋められる差です。
逆に、落ちた理由を自動テストに落とせない差が残ることもあります。その差は仕組みの抜け穴ではなく、能力の差のほうです。判定は「自動テストにできたかどうか」で付きます。
flowchart TD
A["同じ課題を両方へ渡す"] --> B{"落ちたのは<br/>安い側だけか"}
B -- "両方通った" --> C["⚠️ 仕組みは要らない<br/>置いても守られるパターンが増えるだけ"]
B -- "安い側だけ落ちた" --> D{"落ちた理由を<br/>自動テストにできるか"}
D -- "できる" --> E["⭐ 仕組みが 1 つ増える<br/>差はここで埋まる"]
D -- "できない" --> F["⚠️ ここは能力の差<br/>高い側に残す"]
払うのは 1 度です。両方に渡すぶん、その場では高くつきます。差が消えた項目については、以後を安い側で回せます。
検証手順: 両方に渡して、落ちた差だけを仕組みにする
前提
- 会話を引き継がない作業者を、同じ課題へ同時に起動できること(1 体ずつ順に回すと、その時々の混み具合が条件の差に化けます)
- 合否が自動で決まる課題であること。人が採点する課題では、この手順は費用が跳ねます(体の数だけ人の判定が要ります)
- 題材は未公開のものにすること。公開済みのものを書き直させると、正がどこにあるかが濁ります
所要時間: 30 分(採点する自動テストが既にある場合。無いなら、まず自動テストを 1 本書くところから)
手順
- 同じ課題を用意します。両方へ渡す中身は 1 バイトも同じにします
- 高い側と安い側の両方に、同じものを渡します。1 回の差はノイズなので、同じ課題を複数回回します
- 高い側が通り、安い側が落ちた箇所だけを並べます。ここが仕組みの足りない場所です
- 並べた 1 つずつに「渡さないと落ちるか」を先に当てます。両方が守っている項目は、ここで捨てます
- 残った差を、規約か自動テストにして置きます。数えないと決まらないパターンは、規約ではなく自動テストの側に置きます
- もう一度、両方へ同じものを渡します
合格条件(すべて満たすこと)
- 手順 3 で並べた差が、1 つ以上ある(0 件なら、その課題では仕組みの抜け穴が見えていません)
- 手順 5 で置いたものが、人の判定を 1 度も要求しない(要求するなら、それは仕組みではなく運用です)
- 手順 6 で、安い側の落ちた箇所が減っている
- 高い側の点が下がっていない(= 置いた仕組みが、通っていた側を壊していない)
合格しなかったとき
- 差が 0 件だった —— 課題が易しすぎます。題材の側を難しくしてください(物差しを厳しくすると、次は全員が同じ 1 か所で落ちて、やはり差が測れません)
- 差はあるが、自動テストにできない —— そこは能力の差です。その項目だけ高い側に残すのが正解で、無理に規約へ書くと守られない条文が 1 つ増えます
- 手順 6 で高い側が下がった —— 置いた仕組みが、通っていた書き方まで禁じています。条文の範囲を、落ちた現物 1 件ぶんまで狭めてください
- 落ち方が体ごとにばらばら —— 回数が足りません。1 体の極端な結果で平均の符号が変わります(実際に、最低点の 1 体だけでモデルの差が反転しました)
後始末
- 作業者が書いた現物と採点表を削除します。採点表も一緒に消してください —— 残すと、題材を作り直したつもりのまま古い採点で比べることになります
- 手順 5 で置いた規約・自動テストは残します。消してよいのは測定の跡だけです
注意: この実験が言えないこと
「安い側を既定にしてよい」とは、まだ言えません。条件ひとつあたりの回数が少なく、モデルの差は 1 体の極端な結果で符号が変わる程度しかありませんでした。言えているのは仕組みの差のほうが大きく出たことと、その幅が別の題材で再現したことまでです。
もう 1 つ。難しさは、物差しではなく材料で決まっていました。同じ物差し・同じ課題のまま、材料の言い回しを変えただけで、ある項目の落ちた体は 4 12 0 と往復しています。合否で測るかぎり、難度は材料の 1 行で反転します。だから、この形の実測は絶対の点数ではなく、同じ材料の中での条件差としてだけ読めます。
そして冒頭の内訳表は、最後まで証拠になりません。統制された側で言えるのは「パターンを渡すと差が縮む」までで、「私が乗り換えなかった理由」はそこには含まれていません。
CC BY 4.0 はここまで
乗り換えなくなったもの
- 失敗を見たときに、上のモデルへ替えるのをやめました。先に、同じものを両方へ渡します。片方だけが落ちた箇所が無いなら、替えても直りません
- 「守られていないパターン」を規約に足すのをやめました。足す前に、渡さなくても守られるかを見ます。守られるなら条文は増やしません
- 数えないと決まらないパターンを、文で書くのをやめました。分量・個数・並びの数は、最初から自動テストの側に置きます
- 新版が出た日に、組み方のほうを入れ替えるのをやめました。新しいものは使います。入れ替えるかどうかの材料が発表ではなく、手元で落ちている箇所の一覧だ、という話です
強いモデルが要る、という判断は、たいてい正しく見えます。落ちたところを見たうえでの判断だからです。ただ、その落ちたところが「仕組みで埋まる側」なのかは、両方に渡してみるまで分かりません。
次回は「サブエージェントを使わない技術」。私は、本体で終わる仕事をサブエージェントへ投げるのをやめました。任せた 1 体が返してくるまでの間に、こちらが読み直している前提の量を数えたからです。