Skip to content

Pass@k와 Pass^k, 슬라이더로 직접 만져 보기 ​

모델 발표 자료를 보다 보면 "Pass@1", "Pass@10" 같은 숫자가 꼭 나온다. 솔직히 나도 처음엔 대충 "정답률이겠지" 하고 넘겼다. 그러다 에이전트 평가 쪽 자료에서 pass^k라는 표기를 보고 나서야, 이게 비슷하게 생긴 전혀 다른 숫자라는 걸 알았다.

한 줄로 정리하면 이렇다.

  • Pass@k: AI에게 같은 문제를 k번 풀게 했을 때, 그중 한 번이라도 맞힐 확률
  • Pass^k: k번 시도(또는 k개 단계)가 전부 성공할 확률

설명보다 만져 보는 게 빠르다. 아래 슬라이더를 움직여 보자.

직접 조작해 보기
Pass@6 하나라도 성공
99.99%
1 − (1 − 0.80)6
Pass^6 모두 성공
26.21%
0.806
k=1Pass@k Pass^kk=20

각 시도의 성공 확률이 같고, 서로 독립이라고 가정한 이론값이다.

1회 성공률 80%에 6번 시도하면 Pass@6은 99.99%, 거의 확실하다. 그런데 같은 조건에서 Pass^6은 26.21%밖에 안 된다. 같은 80%짜리 AI인데 숫자가 이렇게 갈린다.

AI에게 코딩 문제를 시킨다고 해 보자 ​

개발자 관점에서 예를 들어 보면 이해가 쉽다. AI가 코드를 한 번 생성했을 때 테스트를 통과할 확률이 60%라고 가정하자.

  • Pass@1: 한 번 생성해서 성공할 확률 → 60%
  • Pass@3: 세 번 생성해서 하나라도 성공할 확률 → 1 − 0.4³ = 93.6%
  • Pass@10: 열 번 생성해서 하나라도 성공할 확률 → 1 − 0.4¹⁰ ≈ 99.99%

각 시도가 독립이라고 가정하면 계산은 간단하다. "전부 실패할 확률"을 구해서 1에서 빼면 된다. 위 위젯의 성공률을 60%로 내려 놓고 k를 1, 3, 10으로 옮겨 보면 같은 숫자가 나온다.

이상하게 들릴 수 있는데, 60%짜리 모델도 열 번 돌리면 거의 100%가 된다. 여기까지만 보면 "그럼 그냥 여러 번 돌리면 되겠네?" 싶다. 나도 그렇게 생각했다. 이 생각이 어디서 틀리는지는 조금 뒤에서 다시 얘기하겠다.

왜 둘은 반대로 움직일까 ​

Pass@k는 기회가 많을수록 유리하다. 같은 문제를 10번 풀게 하고 그중 맞는 거 하나만 골라 쓰면 되니까. 시도가 늘수록 "적어도 하나는 맞는다" 쪽으로 확률이 쌓인다.

Pass^k는 반대다. 단계가 늘어날수록 불리하다. 하나만 틀려도 전체가 실패니까, 곱할 때마다 확률이 깎인다.

AI 에이전트가 이런 보험 업무를 처리한다고 생각해 보자.

  1. 보험 청구서 분석
  2. 약관 검색
  3. 지급 여부 판단
  4. 결과 통보

각 단계 성공률이 95%면 꽤 잘하는 것처럼 들린다. 그런데 모든 단계가 성공해야 하고 단계끼리 독립이라면, 전체 업무를 오류 없이 끝낼 확률은 0.95⁴ = **81.45%**다. 다섯 건 중 한 건 가까이는 어딘가에서 틀린다.

에이전트 단계 수 늘려 보기
Pass@4 하나라도 성공
99.99%
1 − (1 − 0.95)4
Pass^4 모두 성공
81.45%
0.954
k=1Pass@k Pass^kk=20

각 단계의 성공 확률이 같고, 서로 독립이라고 가정한 이론값이다.

단계를 10개로 늘리면 59.9%, 20개면 35.8%까지 떨어진다. 각 단계를 99%로 끌어올려도 20단계면 81.8%다. 에이전트 데모가 그럴듯하게 돌아가는데 막상 운영에 올리면 이상하게 자주 깨지는 이유가 여기 있다고 본다. 데모는 한 번 성공하면 끝이지만, 운영은 매번 전 단계가 성공해야 하니까.

여담인데, 엄밀히 말하면 에이전트 평가에서 쓰는 pass^k는 "여러 단계"가 아니라 같은 작업을 k번 반복했을 때 k번 모두 성공할 확률이다. τ-bench가 이 지표를 내세웠는데, 매번 똑같이 잘 해내는지, 즉 일관성을 보려는 숫자다. 다단계 업무의 성공률과는 묻는 질문이 다르지만, "전부 성공해야 한다"는 구조라서 계산식은 똑같이 곱셈이 된다. 이 글에서는 둘을 같은 틀로 묶어서 설명했다.

핵심 차이 ​

Pass@kPass^k
성공 조건한 번만 성공해도 OK전부 성공해야 OK
횟수가 늘면성공 확률 증가성공 확률 감소
대표 사례코딩 문제 여러 번 생성에이전트 다단계 작업, 반복 일관성

Pass@k가 높다고 안심하면 안 되는 이유 ​

앞에서 "여러 번 돌리면 되겠네?"라는 생각이 틀린다고 했는데, 이유는 이거다.

Pass@k가 높다는 건 AI가 여러 번 시도하면 정답을 만들어낼 가능성이 높다는 뜻이지, 그중 어느 게 정답인지 AI가 스스로 구별할 수 있다는 뜻은 아니다. 코딩 문제는 테스트 코드라는 채점기가 있어서 10개 중 통과한 걸 기계적으로 고를 수 있다. 그래서 Pass@k가 실제로 쓸모가 있다.

보험 심사나 금융 판단은 다르다. "지급 가능"과 "지급 불가" 답변이 섞여 나왔을 때 어느 쪽이 맞는지 판정해 줄 테스트가 없다. 다수결을 하면 되지 않나 싶기도 한데, 모델이 같은 방향으로 틀리는 경우에는 다수결이 오히려 틀린 답을 굳혀 버린다. 실제로 시도들이 독립이 아닌 경우가 많다는 게 이 계산 전체의 약점이기도 하다.

실무에서 보는 순서

채점기가 있는 일(코드·형식 검증)은 여러 번 생성하는 전략이 통한다. 채점기가 없는 일(판단·심사)은 여러 번 생성하는 것보다, 잘못된 판단을 검증하고 차단하는 장치를 먼저 만드는 게 낫다.

계산으로만 봐도 그렇다. 단계 사이에 "이 결과가 다음 단계로 넘어가도 되는가"를 확인하는 검증을 끼워 넣고, 걸리면 그 단계만 다시 시키면 각 단계의 실질 성공률이 올라간다. 그게 곱셈으로 누적되니까 차이가 생각보다 크다. 위젯에서 95%를 99%로 올려 보면 무슨 말인지 바로 보인다. 모델을 더 좋은 걸로 바꾸는 것보다 이쪽이 싸게 먹히는 경우도 꽤 있을 것 같다.

벤치마크 숫자는 이 계산과 조금 다르다 ​

마지막으로 짚어 둘 것. 위 계산은 전부 "매 시도의 성공률이 같고 서로 독립"이라는 가정 위에 있다. 실제 LLM 벤치마크의 Pass@k는 이렇게 계산하지 않는 경우가 많다.

Codex 논문(HumanEval)에서 쓴 방식은 문제마다 n개(k보다 많이)를 생성하고 그중 c개가 맞았을 때, "n개 중 k개를 뽑았는데 전부 오답일 확률"을 조합으로 구해서 1에서 빼는 식이다.

text
pass@k = 1 − C(n−c, k) / C(n, k)

문제마다 난이도가 다르니까 문제별로 이 값을 구해서 평균을 낸다. 그래서 "평균 Pass@1이 60%인 모델"의 Pass@10을 1 − 0.4¹⁰로 계산하면 실제보다 꽤 높게 나온다. 어려운 문제는 열 번을 돌려도 계속 틀리기 때문이다. 위젯의 숫자는 감을 잡는 용도로 보고, 벤치마크 표의 숫자와 그대로 비교하지는 않는 게 좋겠다.

아직 정리가 안 된 부분도 있다. 에이전트 운영 지표로 pass^k를 쓴다면 k를 몇으로 잡아야 할까? 업무마다 다를 것 같은데, 아직 기준을 못 정했다. 이건 실제로 돌려 보면서 다시 정리해 보려고 한다.

참고자료 ​