Evaluation · Evaluation · урок 2 · 13 мин

Статистика: pass@k, pass^k, разброс, правило трёх

Statistics: pass@k, pass^k, variance, the rule of three

ТемыEvalsСтатистикаPython

Зачем

После урока ты сможешь посчитать pass@k и pass^k, оценить, насколько балл eval «гуляет» от случайности, и сказать, что на самом деле значит «ноль утечек в 1 500 попытках». Эти цифры отличают инженера от «запустили, вроде работает»; на собеседовании их спрашивают как follow-up к любому рассказу об evals.

Один прогон — не измерение

Агент случаен: одну и ту же задачу он может проходить 9 раз из 10 или 3 из 10. Один прогон говорит только «прошло» или «не прошло». Поэтому каждую задачу гоняют несколько раз — несколько trials (попыток). Попытки независимы: каждая начинается с чистого состояния и ничего не наследует от предыдущей.

pass@k и pass^k

Пусть задача проходит с вероятностью p = 0,8 в каждой попытке, независимо от других.

С ростом k первое стремится к 100%, второе — к нулю. Какое важнее, решает продукт. Для генерации кода, где человек выберет лучший из четырёх вариантов, важен pass@k. Для агента поддержки банка, который говорит с тысячами клиентов, важен pass^k: клиенту всё равно, что агент «умеет», если ошибся он именно с ним. Метрику pass^k ввёл τ-bench (Yao и соавторы, 2024): у сильных агентов того времени pass^8 в домене retail был ниже 25%.

По набору задач обе метрики считают для каждой задачи отдельно и потом усредняют. Это не то же самое, что подставить средний p в формулу. Пусть половина задач проходит всегда (p = 1), а половина — с p = 0,6. Средний pass@1 = 80%, но pass^4 = (1 + 0,6⁴)/2 = (1 + 0,13)/2 ≈ 56%, а не 41%. Важно, как распределены провалы по задачам.

Что значит разрыв между ними

pass@1 = 92% и pass^4 = 61% — агент flaky (плавающий): одни и те же задачи то проходят, то нет. Причина не в том, что попытки влияют друг на друга, — они не влияют. Исправление начинается с поиска плавающих задач: кладёшь рядом проходящую и проваленную траекторию одной задачи и ищешь шаг, где они расходятся. У агента с supervisor (маршрутизатором между специализированными агентами) это часто шаг маршрутизации; его делают детерминированным или добавляют уточняющий вопрос.

Проверка здравого смысла: для любой задачи p^k ≥ 1 − k(1 − p) (неравенство Бернулли). Значит, при pass@1 = 92% ожидаемый pass^4 не ниже 1 − 4 × 0,08 = 68%. Если намерил заметно меньше, одной «плавучестью» это не объяснить: проверь, сбрасывает ли стенд состояние между попытками, посчитаны ли обе цифры на одних и тех же попытках и хватает ли задач.

Насколько гуляет балл

100 задач, по одной попытке, успех около 50%. Стандартная ошибка доли — √(p(1 − p)/n) = √(0,25/100) = 0,05, то есть 5 пунктов. 95% confidence interval (доверительный интервал — пределы, в которых результат гуляет от случайности) — примерно ±1,96 × 5 ≈ ±10 пунктов. Улучшение на 3 пункта — шум; даже 8 может оказаться шумом.

Сравнивать две версии надо на одних и тех же задачах, глядя, какие задачи изменились (paired comparison, парное сравнение). Пример: версия B на тех же 100 задачах исправила 7 задач и сломала 4, итог +3 пункта. Если бы изменения были чистой случайностью, каждая из 11 «перевернувшихся» задач с равной вероятностью ушла бы в любую сторону; перевес 7 к 4 или сильнее тогда случается примерно в 55% случаев (двусторонний sign test). Значит, улучшение не доказано. Зато ты видишь 4 сломанные задачи и можешь их прочитать. Anthropic называет парное сравнение «бесплатным» снижением разброса.

Когда каждая задача гоняется k раз, n в формуле — число задач, а не задач × k: сначала усредни попытки внутри задачи, потом считай ошибку по задачам. 100 задач по 8 попыток — не 800 независимых наблюдений. Если задачи сгруппированы (несколько вопросов к одному документу), нужны clustered standard errors (кластерные стандартные ошибки): по данным Anthropic, на популярных evals они бывают больше наивных в три с лишним раза.

Правило трёх

Как мерить редкие события — утечку или нарушение политики. Если событие случилось ноль раз в n независимых попытках, с 95% уверенностью его истинная частота ниже примерно 3/n.

Откуда: при частоте p шанс не увидеть ни одного события за n попыток — (1 − p)^n. Ищем p, при котором этот шанс равен 5%: n · ln(1 − p) = ln 0,05 ≈ −3, а при малом p ln(1 − p) ≈ −p. Отсюда p ≈ 3/n. Приближение хорошее при n больше примерно 30.

Три оговорки. Попытки должны быть разными атаками, а не одной, повторённой 1 500 раз. Правило оценивает частоту, а не доказывает, что дыры нет. И для банковского «никогда» цифры становятся невозможными: чтобы утверждать «реже 1 на миллион», нужно 3 миллиона чистых попыток. Поэтому «никогда» должно идти из дизайна (права из сессии, подтверждения), а тесты подтверждают дизайн и меряют остаточный риск.

Всё это в Python без пакетов

Когда попыток n больше k, используют несмещённые оценки из статьи τ-bench: из n попыток задачи успешны c.

from math import comb, sqrt

def pass_at_k(n, c, k):   # хотя бы одна из k успешна
    return 1 - comb(n - c, k) / comb(n, k)

def pass_hat_k(n, c, k):  # все k успешны
    return comb(c, k) / comb(n, k)

p = 0.8
print(1 - (1 - p)**4, p**4, p**8)   # 0.9984 0.4096 0.1678
print(pass_at_k(10, 8, 4), pass_hat_k(10, 8, 4))  # 1.0 0.333
print(1.96 * sqrt(0.5 * 0.5 / 100))  # 0.098 → ±10 пунктов
n = 1500
print(3 / n, 1 - 0.05 ** (1 / n))    # 0.002 и точное 0.001995

Схема

Термины · Key terms

trial
одна независимая попытка выполнить задачу
pass@k
хотя бы одна из k попыток успешна, потолок возможностей
pass^k
все k попыток успешны, нижняя граница надёжности
flaky
плавающий: одна задача то проходит, то нет
standard error
типичный разброс оценки от случайности
confidence interval
пределы, в которых результат гуляет от случайности
paired comparison
сравнение двух версий на одних и тех же задачах
sign test
проверка, не случаен ли перевес исправленных задач над сломанными
clustered standard errors
ошибки с учётом связанных задач
rule of three
0 событий в n попытках → частота ниже 3/n с 95% уверенностью

Сделай сам

Для p = 0,7 посчитай pass@4, pass^4 и pass^8 — на бумаге или в snippet выше. Потом правило трёх: ноль утечек в 600 разных попытках — какая верхняя граница частоты? Запиши четыре числа с вычислением.

Обсуди с тьютором: покажи числа и спроси, какую из двух метрик ты бы сделал условием выпуска агента поддержки и с каким порогом.

Проверь себя · ответ под вопросом

1pass@1 = 92%, pass^4 = 61%: что это говорит об агенте и с чего начать исправление?
Агент плавающий: одни и те же задачи то проходят, то нет, а попытки друг на друга не влияют. Начать с поиска таких задач и сравнить проходящую и проваленную траектории одной задачи, найти шаг расхождения и сделать его детерминированным. Заодно проверить стенд: по неравенству Бернулли при 92% ожидаемый pass^4 не ниже 68%.
2Почему разница в 3 пункта на 100 задачах — шум, и как сравнивать две версии правильно?
При 100 задачах и успехе около 50% 95% интервал — примерно ±10 пунктов, так что 3 пункта в него легко укладываются. Правильно — парное сравнение на тех же задачах: смотреть, сколько задач исправлено и сколько сломано, и проверять перевес sign test. Сломанные задачи читать глазами.
3Ноль утечек в 1 500 разных атаках: что можно утверждать и чего нельзя?
Можно: с 95% уверенностью частота утечек ниже примерно 3/1500, то есть 1 на 500, если атаки разные и независимые. Нельзя: что утечек не бывает вообще или что дыра закрыта. «Никогда» обеспечивает дизайн, а тест его подтверждает.

Interview questions · US / UK

1On your suite pass@1 is 92% but pass^4 is 61%. What does that gap tell you and where do you look first?
Strong answer: Runs are independent, so the gap means flaky tasks, not errors carried between runs; find the flaky tasks and diff a passing and a failing trajectory to locate the divergent step (often routing or tool choice), make it deterministic or add a clarifying question; sanity check — by Bernoulli pass^4 should be at least 68%, so verify the harness resets state; add the tasks to the regression suite.
2Version B scores 74% versus 71% for version A on your 100-task suite. Do you ship B?
Strong answer: Not on that evidence — the 95% interval is about ±9–10 points at n = 100; compare paired on the same tasks and count fixed versus broken tasks (sign or McNemar test); read the broken ones; run several trials per task and compute errors over tasks, not trials; decide the bar before running.
3We ran 1,500 different attacks and saw zero data leaks. Can we tell the risk team the agent never leaks?
Strong answer: No — the rule of three gives a 95% upper bound of about 3/1500 = 0.2%; only valid if the attacks are varied and independent; "never" is impossible to test (one in a million needs ~3 million clean tries); it must come from design — identity from the session, no exfiltration channel — with tests confirming the design.

Ключевые фразы · Say it aloud

Материалы