실패가 0이라고 리스크가 0인 것은 아니다: 평가(Evals)를 위한 '3의 법칙'
요약
AI 에이전트 평가 시 '실패 0회'가 실제 실패율 0%를 의미하지 않음을 수학적으로 설명합니다. '3의 법칙'을 통해 N번의 실행 중 실패가 없을 때의 실제 실패율 상한선을 계산하는 법을 제시합니다.
핵심 포인트
- 실패 0회는 관찰된 횟수일 뿐, 실제 실패율이 0임을 보장하지 않음
- '3의 법칙(3/N)'을 통해 95% 신뢰 수준의 실패율 상한선을 근사 가능
- 충분한 신뢰도를 확보하려면 실행 횟수(N)를 대폭 늘려야 함
- 실행 간 상관관계가 있을 경우 유효 N이 감소하여 리스크가 급증함
평가(Evals)를 위한 '3의 법칙(rule of three)'은 N번의 실행 중 실패가 0번이라는 것은 단순한 횟수이지, 비율이 아니라고 말합니다. N번의 독립적인 실행에서 실패가 0번일 때, 실제 실패율(failure rate)에 대한 정확한 95% 상한선(upper bound)은 1 - 0.05^(1/N)이며, 이는 3/N으로 근사할 수 있습니다. 100번의 깨끗한 실행 후에도 여전히 2.95%의 실패율(약 34번 중 1번 꼴)을 배제할 수 없습니다.
여기에 당신을 괴롭힐 해석의 오류가 있습니다. 당신의 평가 하네스(eval harness)가 에이전트(agent)를 100번 실행하고 "실패 0회"를 출력하면, 타일은 초록색으로 변합니다. 누군가 이를 캡처하여 출시 스레드(launch thread)에 올립니다. 여기서 암묵적으로 번역되는 내용은 "실패율이 0이다"라는 것입니다. 하지만 이는 데이터가 말하는 바가 아닙니다.
저는 이 격차를 구체화하기 위해 작은 스크립트를 작성했습니다. 그래서 먼저 200번의 결정론적 에이전트(deterministic agent) 실행에 대해 실제 게이트(gate)를 실행하고 정직하게 계산하여, 모두가 신뢰하는 대시보드를 얻었습니다:
gate: spend<=budget over 200 deterministic agent runs
observed failures: 0 (distinct scenarios: 200)
naive point rate : 0.00% binomial SE: 0.00 pp
...
표준 오차(standard error)를 보십시오. 실패 횟수가 0일 때 이항 표준 오차(binomial SE)는 sqrt(0*1/200)이며, 이는 정확히 0입니다. 따라서 단순한(naive) 95% 신뢰 구간은 [0.00%, 0.00%]로 수렴합니다. 폭이 0인 신뢰 구간(zero-width confidence interval)입니다. 수학은 200개의 샘플을 통해 실제 비율이 정확히 0이라고 완전히 확신하고 있다고 말하고 있습니다. 이는 분명히 틀린 것이며, 제가 지금까지 너무 과하게 신뢰해 왔던 모든 "전부 초록색(all green)"인 보드들의 전형적인 모습입니다.
요약(TL;DR)
- "N회 실행 중 실패 0회"는 관찰된 횟수(observed count)이지, 비율(rate)이 아닙니다. 0회라는 수치에 대한 단순 이항 표준 오차(binomial SE)는 0이며, 이것이 바로 초록색 보드가 증거처럼 보이지만 실제로는 그렇지 않은 이유입니다.
- 정직한 수치는 단측 상한선(one-sided upper bound)입니다. N회 실행 중 실패가 0회일 때, 실제 실패율에 대한 95% 상한 신뢰 한계(upper confidence limit)는
1 - 0.05^(1/N)입니다. '3의 법칙(rule of three)', 즉3/N은 이를 근사하며 리스크를 약간 높게 반올림합니다. - N=30일 때 상한선은 9.50%(약 11회 중 1회)입니다. N=100일 때 2.95%(34회 중 1회)입니다. N=1000일 때 0.30%(334회 중 1회)입니다. 30회 실행 중 실패가 0회라는 것은 실제 실패율이 11회 중 1회인 상황과도 양립할 수 있습니다.
- 95% 신뢰 수준에서 0.1%의 실패율을 배제하려면 약 2995회의 깨끗한 실행이 필요하며, 50회로는 부족합니다. "50번 실행해 봤다"와 "99.9% 확신한다"는 서로 다른 문장입니다.
- 상관관계가 있는 실행(Correlated runs)은 상황을 더 악화시킵니다. 실제로는 20개의 시나리오를 10번씩 반복한 200회의 실행이라면, 유효한 N은 20이 되며, 상한선은 1.49%에서 13.91%로 급등합니다.
이것이 무엇이며 무엇이 아닌가. 스크립트의 게이트(gate)는 구조적으로 무해합니다. 저는 실패가 0인 경우를 관찰하도록 설계했는데, 왜냐하면 깨끗한 평가(clean eval)야말로 제가 이야기하고자 하는 바로 그 사례이기 때문입니다. 해당 횟수에 대한 상한선은 정리(theorem)이지, 피팅된 효과(fitted effect)가 아닙니다. 제가 값을 조금 조정한다고 해서 결론이 뒤집힐 만한 튜닝된 상수(tuned constant)는 어디에도 존재하지 않습니다. 입력값은 오직 횟수(0), 실행 횟수(N), 그리고 신뢰 수준(confidence level)뿐입니다. 저는 실행의 6절에서 이를 명시적으로 보여줍니다. 왜냐하면 "수치가 내가 선택한 고정 장치(fixture)에 따라 결정된다"는 점은 제가 이런 종류의 글에서 가장 불신하는 실패 모드(failure mode)이기 때문입니다.
관찰된 실패가 0회라고 해서 실패율이 0인 것은 아닌 이유
계수(Counting)는 추정(estimating)이 아닙니다. 동전을 두 번 던졌는데 모두 앞면이 나왔다면, 당신은 100% 앞면이 나오는 비율을 관찰한 것이지만, 제정신인 사람이라면 뒷면이 존재하지 않는다고 결론 내리지 않습니다. 두 번의 실행으로는 많은 것을 배제하기에 충분하지 않습니다. 관찰된 횟수가 0이고 표본이 30, 100, 또는 1000일 때도 동일한 논리가 적용됩니다. 드문 실패는 깨끗한 실행이 이어지는 그 어떤 유한한 연속성 뒤에도 숨어 있을 수 있으며, 질문은 "실패했는가"가 아니라 "내가 본 것과 여전히 일치하는 비율은 무엇인가"가 되어야 합니다.
단순한 대시보드는 더 다르고 쉬운 질문에 답합니다. 그것은 점 추정치(point estimate)인 0/N = 0%와, 카운트가 0일 때 표준 오차(standard error) 또한 0이라는 점을 보고합니다. 따라서 구간의 너비는 0이 되고, 대시보드는 아무런 주의 사항 없이 초록색으로 표시됩니다. 이는 3주 동안 조용히 죽어 있었던 모니터의 통계적 버전입니다. 즉, 항상
'3의 법칙'은 요약된 버전입니다. 진정한 상수는 -ln(0.05) = 2.9957이며, 3/N은 이를 머릿속으로 계산할 수 있는 숫자로 반올림한 것입니다. 관찰된 실패가 0이라고 가정할 때, N에 따른 '3의 법칙'과 정확한 경계값(exact bound)은 다음과 같습니다.
N | 정확한 95% 상한 | 3/N | ~ K당 1회 | 정확한-3/N (pp)
------------------------------------------------------------------
10 | 25.89% | 30.00% | 4 | -4.113
...
N=30 행을 읽어보십시오. 30번의 성공적인 실행(green runs)과 0번의 실패가 있었음에도, 평가(eval)가 전혀 운이 나쁘지 않았음에도 불구하고 실제 실패율(failure rate)은 여전히 9.50%(약 11회 중 1회의 실패)일 수 있습니다. 3/N 열은 모든 행에서 정확한 경계값보다 아주 약간 높게 위치합니다(정확한 값에서 3/N을 뺀 값이 작고 음수이므로 차이는 음수로 표시됩니다). 따라서 이 암기법(mnemonic)은 리스크를 약간 과장합니다. 하지만 바로 그런 방향으로 지름길(shortcut)이 틀려주기를 바라는 것입니다. 1,000번의 실행에 이르면 두 열은 소수점 둘째 자리까지 동일하게 읽히며(0.30%와 0.30%), '3의 법칙'은 더 이상 구분할 가치가 있는 근사치가 아니게 됩니다.
이 숫자들은 임의로 입력된 것이 아닙니다. 스크립트 내의 1 - 0.05^(1/N) 식에서 도출된 것이며, 제가 직접 실행하지 않은 경계값을 인용하는 것은 그 자체로 일종의 거짓말이 될 수 있기에, 인용하기 전에 독립적인 재계산을 통해 행의 값들을 교차 검증했습니다.
얼마나 많은 성공적인 실행이 실제로 목표를 보장하는가?
질문을 뒤집어 봅시다. 특정 실패율을 배제(rule out)하고 싶다면, 얼마나 많은 성공적인 실행이 필요할까요? 경계식을 역산하면, 1 - 0.05^(1/N) <= target이 되어 N >= ln(0.05)/ln(1-target)을 얻게 됩니다.
target = 95% 신뢰 수준에서 배제하고자 하는 실패율.
경계 <= 5.00% 필요한 N = 59회의 성공적 실행 (정확히 58.4)
경계 <= 1.00% 필요한 N = 299회의 성공적 실행 (정확히 298.1)
...
이 섹션은 제가 평가 (Eval) 예산을 계획하는 방식을 바꾸는 부분입니다. 1%의 실패율을 배제하려면 299회의 깨끗한 실행 (clean runs)이 필요합니다. 돈을 옮기거나 데이터를 삭제할 수 있는 에이전트 (Agent)를 실제로 안심하고 배포할 수 있는 영역인 0.1%의 실패율을 배제하려면 약 2995회의 실행이 필요합니다. 평가 항목당 판사 모델 (Judge model) 비용을 지불하는 사람에게 이러한 N값은 곧 청구서로 직결되며, "안전함을 증명하라"는 말의 솔직한 버전은 초록색 타일(green tile)이 숨기고 있는 방식으로 매우 비쌉니다. 만약 드물지만 치명적인 동작이 50회의 깨끗한 실행을 기록했다면, 95% 신뢰 수준에서 주장할 수 있는 최대치는 실패율이 아마도 6% 미만이라는 것입니다. 이는 제가 "운영 데이터베이스 (Production database) 삭제"라는 문구 옆에 두고 싶은 숫자가 아닙니다.
신뢰 수준 (Confidence level) 또한 조절 가능한 노브 (Knob)이며, "3"이라는 숫자가 신성불패한 것은 아니라는 점을 확인해 볼 가치가 있습니다.
conf | -ln(alpha) | name | upper@N=100
----------------------------------------------------
90% | 2.3026 | rule of 2.3 | 2.28%
...
'3의 법칙 (Rule of three)'은 구체적으로 95% 케이스를 의미하는데, 이는 -ln(0.05)가 3으로 반올림되기 때문입니다. 상한선 (Upper bound)에 대해 99%의 신뢰도를 원하시나요? 그것은 '4.6의 법칙'입니다. 고정된 N에서 이는 더 느슨한 경계값(N=100일 때 2.95% 대비 4.50%)을 제공하는데, 이는 동일한 데이터에 대해 더 높은 신뢰도를 얻으려면 정밀도 (Sharpness)를 희생해야 하기 때문입니다. 통계 수업에서 사용했다는 이유만으로 95%를 관습적으로 따르지 말고, 신뢰 수준을 의도적으로 선택하십시오.
숫자의 함정: 상관관계가 있는 실행은 N을 축소시킨다
위의 모든 내용은 실행들이 독립적이라는 가정하에 성립합니다. 에이전트 평가 (Agent evals)에서는 그렇지 않은 경우가 매우 빈번하며, 실패는 조용히 일어납니다. 동일한 20개의 시나리오를 각각 10개의 시드 (Seed)로 실행하고 이를 200회의 실행이라고 부를 수 있습니다. 대시보드에는 200이라고 표시되지만, 정보가 담긴 실제 횟수는 20회입니다. 공통 모드 입력 (Common-mode inputs), 동일한 프롬프트의 반복, 동일한 픽스처 (Fixture), 동일한 상위 데이터 (Upstream data) 등은 대시보드상의 N을 부풀리고, 실제 경계값은 별개의 케이스들이 결정하는 수준에 머물게 합니다.
명목상 실행 횟수 (Nominal runs): 200 별개 시나리오 (Distinct scenarios): 20 관찰된 실패 (Observed failures): 0
명목상 N=200으로 계산할 경우의 경계: 1.49% (~67회 중 1회)
유효 N=20일 때의 경계: 13.91% (~7회 중 1회)
똑같이 0건의 실패입니다. 로그에는 여전히 200줄이 있습니다. 하지만 당신이 가질 수 있는 경계는 1.49%가 아니라, 약 7회 중 1회인 13.91%입니다. 이 내용은 안심시키는 방향과는 반대되는 것이기에 제가 여기에 넣은 것입니다: 리플레이(replays)와 공유 입력값(shared inputs)은 당신의 유효 N을 축소시키고, N이 작아지면 경계는 절대 타이트해지지 않고 느슨해질 뿐입니다. 왜냐하면 1 - 0.05^(1/N)은 N이 커짐에 따라 감소하기 때문입니다. 리플레이를 독립적인 실행으로 간주하는 하네스(harness)는 당신이 가지고 있지 않은 안전성을 조용히 보고하고 있습니다. 만약 당신의 실행들이 당신이 중요하게 생각하는 분포에서 독립적으로 추출되었다고 주장할 수 없다면, 실행 횟수 대신 고유한 케이스(distinct cases) 수를 사용하십시오.
경계가 말해주지 않는 것들
세 가지 정직한 한계점입니다. 그 이유는 숫자가 의도적으로 좁기 때문입니다.
이것은 정체성(identity)에 관한 것이 아니라 빈도(frequency)에 관한 것입니다. 1 - 0.05^(1/N)은 실패가 얼마나 자주 발생할 수 있는지 경계합니다. 어떤 종류의 실패인지, 또는 얼마나 심각한지는 전혀 말해주지 않습니다.
저는 저 자신의 초안을 수없이 폐기해 본 경험이 있기에, 결론(punchline)이 저자가 임의로 선택한 상수(constant) 안에 들어있는 게시물은 의심부터 하게 됩니다. 그래서 저는 그러한 상수가 없는 이번 글을 작성했습니다. 결론은 오직 세 가지 입력값, 즉 관찰된 횟수(observed count), $N$, 그리고 신뢰 수준(confidence level)에만 의존합니다. 실행 결과의 섹션 6은 무차별 대입(brute force)을 통해 이 점을 증명합니다:
게이트(gate) 재실행: 실패 여전히 200건 중 0건 -> 경계값(bound) 1.49%
게이트가 처음 마주하는 시나리오를 섞고, 두 번 실행하고, 전체 고정 장치(fixture)의 순서를 바꿔도: 횟수는 0으로 유지되므로, 경계값은 비트 단위까지(byte-for-byte) 동일합니다. 치환할 효과 크기(effect size)도 없고, 분모가 몰래 일을 하고 있는 비율(ratio)도 없습니다. 이는 '발견'이라고 주장하는 것이 사실은 위장된 고정 장치 설정(fixture setting)에 불과하여 폐기되는 부류의 평가(eval) 게시물과는 정반대되는 방식입니다. 여기서 제가 관찰하는 유일한 것은 횟수이며, 제가 그 횟수에 수행하는 유일한 작업은 경계를 정하는 것뿐입니다. 만약 당신이 이 경계값을 신뢰하지 못한다면, 그것은 이항 분포(binomial)를 신뢰하지 못하는 것이며, 이는
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기