Dev Study
← AIを部品として組み込む仕組み
レッスン 4 / 12·約 9 分·第20期 AIを部品として組み込む仕組み

1回通っても、それは率ではない — pass@k と pass^k

リクエストがアプリケーションに届くまで
  1. ブラウザURL入力
  2. DNS名前→IP
  3. ルータ経路選択
  4. ロードバランサ振り分け
  5. Nginx受け口
  6. アプリ処理今ここ
  7. DB保存

アプリの中に、呼ぶたびに分布から引く部品が入っています。その部品を評価で測るとき、1回の合格が何を言い、何を言っていないかを見ます。区間や対応のある比較の一般形は、CS 領域のコース『評価のための統計』で扱います。

まず結論

呼ぶたびに分布から引く部品では、評価で1回通ったことが示すのは「通ることがある」までです。通る率は分かりません。

率が分かっても、問うべき量は置き場所で変わります。1回あたり0.8で通る課題を8回走らせると、「1回でも通る」はほぼ1、「8回とも通る」は0.168です。そして率そのものも、10件では幅でしか言えません。

? 読む前に予測

1回あたり0.8の確率で成功する課題を、独立に8回走らせます。8回とも成功する確率はおよそいくつでしょうか。

当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。

抽象原理

1回の合格は、1本引いただけ

LLM を呼ぶ部品は、呼ぶたびに分布から1つを引いてきます。評価で1回通ったなら、分かるのは「この課題で通る出力が引かれることがある」までです。同じ課題をもう一度走らせたら通るかどうかは、その1回からは分かりません。

では何回か走らせればよいとして、何を数えるのか。量は2つあります。

  • pass@k — 同じ課題を k 回試して、少なくとも1回成功する確率。コード生成の評価で使われてきた指標で、Chen らはこれを Kulal らのものとして紹介しています。
  • pass^k — 同じ課題を k 回試して、k 回とも成功する確率。τ-bench が提案しました。

τ-bench はこの対を1つの段落で書いています。

the community has defined the pass@k (pass at k) metric as the chance that at least one out of k i.i.d. task trials is successful, … we propose a new metric – pass^k (pass hat k), defined as the chance that all k i.i.d. task trials are successful, averaged across tasks.

段落は、単体テストのような検証手段がある課題には pass@k が使われてきたとし、顧客対応のように reliability and consistency が要る課題のために pass^k を提案しています。どちらの量を見るかは、部品を置く場所が決めます。

同じ1回あたりの率から、2つの量が逆向きに離れていく(p = 0.8、独立な試行)
1回あたり成功確率 p = 0.8同じ課題を独立に k 回走らせる
k を 1 → 2 → 4 → 8 と増やす
pass@k(1回でも)0.8 → 0.96 → 0.9984 → 0.99999744
pass^k(k回とも)0.8 → 0.64 → 0.4096 → 0.16777216
  • ・k = 1 では両者は一致する(τ-bench: pass^1 = pass@1)
  • ・どちらも試行が i.i.d.(互いに独立で、同じ条件)であることが前提。課題ごとに p が違えば、課題間で平均する
具体実物

率0.8の課題を、8回走らせる

確率の算術だけを行う模型で確かめます。モデルは呼んでいません。 1回あたりの成功確率を0.8と置き、3行目で2つの量を計算します(後半は区間とシミュレーション)。

l4-d4.py(全文)設定ファイル
import math, random
p=0.8
for k in (1,2,4,8): print(f"k={k}: pass@k={1-(1-p)**k:.4f} pass^k={p**k:.4f}")
# heterogeneous tasks, same mean 0.8: half 1.0, half 0.6
ps=[1.0]*50+[0.6]*50
for k in (1,8): print(f"hetero k={k}: pass@k={sum(1-(1-q)**k for q in ps)/100:.4f} pass^k={sum(q**k for q in ps)/100:.4f}")
def wilson(c,n,z=1.96):
ph=c/n; d=1+z*z/n; c0=(ph+z*z/(2*n))/d; h=z*math.sqrt(ph*(1-ph)/n+z*z/(4*n*n))/d; return c0-h,c0+h
for c,n in ((8,10),(40,50),(160,200),(800,1000)): lo,hi=wilson(c,n); print(f"{c}/{n}: 95% Wilson [{lo:.3f},{hi:.3f}]")
# two prompts with the SAME true rate 0.8 evaluated on 20 cases: how often does one look >=10 points better?
rng=random.Random(0); T=20000; big=0
for _ in range(T):
a=sum(rng.random()<0.8 for _ in range(20)); b=sum(rng.random()<0.8 for _ in range(20))
big+= abs(a-b)>=2
print(f"same true rate, n=20 each: |diff|>=10pt in {big/T:.1%} of runs")
$ python3 l4-d4.py(macOS arm64 / Python 3.14.6、2026-09-24。2回実行して同一)コマンド出力
k=1: pass@k=0.8000 pass^k=0.8000
k=2: pass@k=0.9600 pass^k=0.6400
k=4: pass@k=0.9984 pass^k=0.4096
k=8: pass@k=1.0000 pass^k=0.1678
hetero k=1: pass@k=0.8000 pass^k=0.8000
hetero k=8: pass@k=0.9997 pass^k=0.5084
8/10: 95% Wilson [0.490,0.943]
40/50: 95% Wilson [0.670,0.888]
160/200: 95% Wilson [0.739,0.850]
800/1000: 95% Wilson [0.774,0.824]
same true rate, n=20 each: |diff|>=10pt in 55.0% of runs

4行目の pass@k=1.0000 は4桁に丸めた表示です。分数で厳密に計算すると 390624/390625 = 0.99999744 で、1ではありません。「8回やれば必ず通る」とは言っていません。

同じ4行目で pass^k=0.1678。1回あたり0.8という、単独で見れば悪くない率が、「8回とも」を要求すると6回に1回程度しか満たされません。

✓ ここまでの確認

1回あたり0.8で成功する課題について、pass@8 は 0.99999744 です。この値が言っていることはどれですか。

抽象原理

率を k 乗すれば済む、わけではない

上の出力の6行目を見てください。課題の半分が必ず通り(1.0)、半分が0.6で通る課題集です。平均はやはり0.8ですが、pass^8 は 0.5 + 0.5 × 0.6^8 = 0.508 になります。全課題が0.8のときの0.168の約3倍です。

τ-bench の定義の末尾 averaged across tasks がここに効きます。pass^k は課題ごとの成功確率を k 乗してから平均します。平均の率を k 乗した値ではありません。同じ平均でも、課題ごとのばらつきで pass^k は大きく変わります。

推定の仕方も同じ罠を抱えます。Chen らは pass@k を 1 − (1 − p̂)^k で推定したくなるが偏る、と書き(we show that it is biased in Appendix A)、n ≥ k 回走らせて成功数 c から計算する不偏推定量(平均すると真の値に一致する推定)を示しました。τ-bench の pass^k の推定式も c と n から作ります。n = 10、c = 8 にその式を当てると pass^8 は 1/45 ≈ 0.022 で、0.8^8 = 0.168 とは別の値です。

そもそも1回あたりの率も、件数が少なければ点では言えません。率は件数に応じた幅を持ちます。 95% 区間とは、同じ手順で区間を作り続けたとき、およそ95%の割合で真の率を含むように作った幅のことです。成功数と件数から付ける区間の1つが Wilson 区間で、計算式は上のコードの wilson 関数です。Brown らは n が小さいときについてこう勧めます。

for small n (40 or less), we recommend that either the Wilson or the Jeffreys prior interval should be used.

l4-recalc.py の出力から区間の行だけ抜粋(z = 1.95996、Wald は正規分布で近似した区間)コマンド出力
8/10: Wilson [0.4902,0.9433] Wald [0.5521,1.0479]
10/10: Wilson [0.7225,1.0000] Wald [1.0000,1.0000]
40/50: Wilson [0.6696,0.8876] Wald [0.6891,0.9109]
160/200: Wilson [0.7391,0.8495] Wald [0.7446,0.8554]
800/1000: Wilson [0.7741,0.8236] Wald [0.7752,0.8248]

8/10 は、真の率が0.49でも0.94でも起こりうる結果です。Wald 区間は上端が1を超え、10/10 では幅が0になって「必ず通る」と言い出します。件数を100倍にして、ようやく幅が約0.05まで縮みます。

具体実物

リトライで通るのは、どちらの量か

別コースの「リトライは意味を変える」で、HTTP の POST は再送すると重複という副作用に変わりうる、と見ました。TCP の再送が安全なのは、データが一意な番号に結び付いていて受信側が重複を判別できるからで、POST にはこの結び付けがありません。

ここでは副作用ではなく、リトライが何を測っているかを見ます。

「失敗したらもう一度呼ぶ」を組み込むと、利用者から見えるのは「何回かのうち1回でも通る」確率、つまり pass@k 型の量です。失敗を正しく判定できるなら、1回あたり0.8の部品でも、再試行を重ねれば全体の成功はほぼ1に近づきます。

ただしそれが成り立つのは、失敗が見分けられ、再試行しても害がないときだけです。例外を投げる失敗なら再試行できます。しかし LLM の出力は、誤っていても正常な応答として返る普通の文字列です。リトライで変わるのは部品1回あたりの率 p ではありません。 上がるのは、外側で判定してやり直す仕組みまで含めた全体の率で(r 回まで許せば 1 − (1 − p)^r)、判定手段を外側に書いた場合に限ります。判定できなければやり直しの引き金が引けず、全体の率は p のまま、利用者の k 回がすべて通る確率は p^k にとどまります。

✓ ここまでの確認

ある課題集で10件中8件が通りました。95% Wilson 区間で言えることとして適切なのはどれですか。

⇄ 2つを見比べる
具体例 A

同じ課題を k 回走らせる評価

1回あたり0.8なら、k = 8 で1回でも通る確率は0.99999744、8回とも通る確率は0.168。単体テストで正誤を判定できる課題なら前者で足り、毎回の応答がそのまま利用者に届く課題では後者が要る。

p = 0.8 のときの2つの量(厳密値)表
k pass@k pass^k
1 0.8 0.8
2 0.96 0.64
4 0.9984 0.4096
8 0.99999744 0.16777216
具体例 B

失敗したら再送する呼び出し

再送を組み込むと、利用者から見えるのは何回かのうち1回通る確率になる。ただし失敗が見分けられることと、再送しても副作用が重ならないことが前提。POST のように副作用が重なるなら、再送そのものが別の問題を生む。

評価のやり直しと、呼び出しの再送。見た目は違いますが、共通する構造は何でしょうか。

「やり直しを許すと、どの確率を測っていることになるか」と「やり直しを許す前提は何か」を、両方で探してください。

この章のまとめ

  • 評価で1回通ったことが示すのは 「通ることがある」まで。率ではない。
  • pass@k は k 回のうち1回でも、pass^k は k 回とも。p = 0.8、k = 8 で 0.99999744 と 0.168。
  • どちらが要るかは 部品の置き場所 が決める。リトライで率を上げられるのは、失敗を外側で判定できるときだけ。部品1回あたりの率は変わらない。
  • pass^k は 課題ごとに k 乗してから平均。平均が同じ0.8でも 0.168 と 0.508 に分かれる。
  • 率そのものも 件数に応じた幅 を持つ。8/10 の 95% Wilson 区間は [0.490, 0.943]。
  • 2案の比較は 同じ課題での対応のある差 で見る。差の無い2案でも、20件ずつなら半分以上の確率で10ポイント離れて見える。

自分の現場で確かめる

読んだだけでは身につきません。手元の環境で実際に見てみてください。

理解度チェック

読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。

問題 1 / 3正解: 0

平均成功率がどちらも0.8の課題集が2つあります。Aは全課題が0.8、Bは半分が1.0で半分が0.6です。pass^8 はどうなりますか。

用語集(3語)
pass@k
同じ課題を独立に k 回試して、少なくとも1回成功する確率。Chen らによれば Kulal らが使った指標で、Chen らは件数 n・成功数 c からの不偏推定量(平均すると真の値に一致する推定)を示した。
pass^k (pass hat k)
同じ課題を独立に k 回試して、k 回とも成功する確率を課題間で平均したもの。τ-bench(arXiv:2406.12045)が提案。pass^1 は pass@1 と等しい。
Wilson 区間
成功数と件数から比率に付ける信頼区間の1つ。Brown らは n が40以下なら Wilson か Jeffreys を勧める。Wald 区間と違い [0, 1] の外に出ない。