프롬프트 20개 중 하나만 좋아 보인다면: AI 평가의 다중 비교와 Holm 보정

프롬프트를 여러 개 시험한 뒤 p값이 0.05보다 작은 결과만 고르면, 우연한 차이를 개선으로 받아들일 위험이 커진다. 비교할 후보와 지표를 먼저 정하고, 한 묶음의 검정 전체에 오류 기준을 적용해야 한다. Holm 보정은 그때 사용할 수 있는 방법이다. 보정을 통과해도 개선 폭이나 배포 안전성이 자동으로 확보되는 것은 아니다.

앞선 글에서는 같은 문제를 두 버전으로 풀었을 때 성공과 실패가 어떻게 바뀌었는지 비교했다. 이번에는 기준 버전 하나에 후보가 여러 개 붙는 경우를 살핀다. 아래 숫자는 계산을 설명하기 위해 만든 합성 예시다. 실제 모델의 성능이나 실험 결과가 아니다.

한 번의 5%와 스무 번의 5%는 다르다

차이가 없다는 귀무가설이 모두 참이고, 검정들이 서로 독립이며, 각 검정의 거짓 양성 확률이 정확히 0.05라고 가정하자. 스무 번 모두 거짓 양성이 나오지 않을 확률은 0.95의 20제곱이다. 적어도 한 번 거짓 양성이 나올 확률은 그 여집합인 1 - 0.95 ** 20, 약 64.2%다.

이는 ‘프롬프트 스무 개를 비교하면 64.2%가 틀린다’는 뜻이 아니다. 가정한 조건에서 실험 묶음 전체에 거짓 양성이 한 번 이상 생길 확률이다. 같은 평가 문제와 기준 모델을 공유하는 실제 검정들은 서로 의존할 수 있고, 이산적인 검정의 실제 오류율은 5%보다 작을 수 있다. 따라서 64.2%를 실제 평가의 오류율로 붙이면 안 된다.

이처럼 한 묶음에서 참인 귀무가설을 하나 이상 잘못 기각할 확률을 family-wise error rate, 줄여서 FWER라고 한다. 여기서는 이를 ‘검정 묶음의 거짓 양성 위험’으로 읽으면 된다.

무엇을 한 묶음으로 셀 것인가

가상의 문서 분류 에이전트에서 기존 프롬프트와 후보 A·B·C·D를 비교한다고 하자. 최종적으로 ‘어떤 후보가 기존보다 다르다고 볼 근거가 있는가’를 판단하려면 네 비교를 한 묶음으로 다룰 수 있다. 이는 설계 예시이며 모든 평가에 동일한 묶음을 강제하는 규칙은 아니다.

  • 기준 버전: 고정된 기존 프롬프트 하나
  • 후보: 평가 전에 정한 A·B·C·D
  • 주 지표: 문제별 성공·실패
  • 검정: 같은 문제의 짝을 유지한 양측 정확 McNemar 검정
  • 묶음 오류 기준: 0.05
  • 보정: 네 p값 전체에 Holm 적용

지표를 성공률·인용 정확성·지연으로 늘리거나, 결과를 보고 일부 문서 유형만 골라 다시 비교하면 판단의 범위가 넓어진다. 어떤 결론을 확증하려는지에 맞춰 비교군을 사전에 정하고 탐색 분석은 따로 표시한다. 좋은 결과 네 개만 추려서 ‘네 번 비교했다’고 기록해서는 안 된다.

Holm 보정은 작은 p값부터 순서대로 확인한다

네 후보의 유효한 원래 p값이 다음과 같다고 가정하자. 실제 McNemar 결과를 재현한 숫자가 아니라 보정 절차를 보여 주기 위해 입력한 값이다.

후보원래 p값정렬 후 확인 기준Holm 보정 p값0.05 기준 결과
A0.0080.05 / 4 = 0.01250.032기각
B0.0180.05 / 3 ≈ 0.01670.054기각 못 함
C0.030앞 단계에서 멈춤0.060기각 못 함
D0.200앞 단계에서 멈춤0.200기각 못 함

보정하지 않으면 A·B·C가 모두 0.05보다 작다. Holm의 순차 판정에서는 A가 첫 기준을 통과하지만 B가 두 번째 기준을 넘으므로 거기서 멈춘다. C와 D를 뒤에서 따로 통과시키지 않는다. 보정 p값을 사용하는 방식에서는 각 보정값을 0.05와 비교하면 같은 결론을 얻는다.

정렬한 p값에 남은 비교 수를 곱한 뒤, 앞에서 계산한 값보다 작아지지 않도록 누적 최댓값을 취한다. 마지막으로 1을 넘지 않게 제한하고 원래 후보 순서로 돌려놓는다. R의 공식 p.adjust 문서는 Holm 방법이 검정 사이의 임의의 의존 구조에서도 FWER를 제어한다고 설명한다. 단, 각각의 원래 p값 자체가 타당해야 한다. 데이터 누출이나 잘못된 독립성 가정으로 만든 p값을 보정이 고쳐 주지는 않는다. 예를 들어 같은 문서를 조금씩 바꾼 문제들을 독립 표본으로 취급한 오류는 검정들 사이의 의존성을 허용한다는 설명과 별개다.

합성 p값 네 개의 Holm 보정: A는 첫 기준을 통과하고 B에서 순차 기각을 멈춘다. 개선 방향과 실제 이익은 별도로 확인한다.
네 후보의 합성 p값을 사용한 Holm 보정 흐름. 실제 모델 성능을 나타내지 않는다.

직접 계산해 보기

다음은 표준 라이브러리만 사용하는 교육용 계산이다. 범용 통계 패키지를 대체하는 구현은 아니다. 이 예시는 누락값을 허용하지 않고 모든 p값이 0과 1 사이인지 검사한다.

import math

def holm_adjust(p_values):
    p = list(p_values)
    if any(not math.isfinite(x) or not 0 <= x <= 1 for x in p):
        raise ValueError("p-values must be finite and within [0, 1]")
    order = sorted(range(len(p)), key=lambda i: p[i])
    adjusted = [0.0] * len(p)
    running_max = 0.0
    for rank, i in enumerate(order):
        running_max = max(running_max, (len(p) - rank) * p[i])
        adjusted[i] = min(1.0, running_max)
    return adjusted

p = [0.008, 0.018, 0.030, 0.200]
print([round(x, 3) for x in holm_adjust(p)])
print(round(100 * (1 - 0.95 ** 20), 1))

계산 결과는 [0.032, 0.054, 0.06, 0.2]와 64.2다. 이 결과는 합성 입력의 산술 계산이며 실제 에이전트의 우수성을 시험한 결과가 아니다.

기각한 후보가 곧 배포 후보는 아니다

양측 검정의 기각은 차이의 근거를 뜻한다. 개선 방향인지 악화 방향인지는 실제 성공률 차이와 짝지은 결과를 별도로 봐야 한다. A가 기각되었다고 해서 A가 B·C·D보다 우수하다는 결론도 나오지 않는다. 여기서 수행한 비교는 각 후보 대 기존 버전이기 때문이다.

확인할 것왜 필요한가
성공률 차이와 불확실성p값만으로 개선 크기와 정밀도를 알 수 없다
새로 발생한 실패의 내용평균 개선이 심각한 새 실패를 가릴 수 있다
비용·지연·사람의 검토량통계적 차이가 실제 운영 이익과 같지 않다
평가에 쓰지 않은 확인 자료후보를 고르는 과정에 맞춰진 점수를 구분한다
기준선과 평가 조건의 동일성다른 모델·도구·데이터 변화가 섞였는지 확인한다

Holm으로 기각하지 못한 후보는 효과가 없다고 입증된 후보가 아니다. 표본이 작거나 효과가 작으면 차이를 포착하지 못할 수 있다. 반대로 보정 뒤에도 차이가 남더라도 업무상 무시할 만한 크기일 수 있다.

결과를 보며 후보를 계속 만들었다면

같은 평가 세트를 보고 프롬프트를 고치고, 점수가 잘 나온 후보만 남기고, 다시 테스트하는 과정은 고정된 네 후보의 비교와 다르다. 비교 횟수만 마지막에 세어 Holm을 붙였다고 해서 적응적인 선택과 데이터 누출이 모두 해결되지는 않는다.

개발용 자료에서 후보를 탐색한 뒤 최종 후보와 지표·검정·중단 규칙을 고정하고, 손대지 않은 자료로 확인하는 절차를 고려한다. 최종 자료도 결과를 보고 다시 튜닝하면 더는 손대지 않은 자료가 아니다. 이 경계는 평가 자료 누출과 held-out 세트에서 다뤘다.

다음 양식은 평가 전 설계 제안이다. 검정의 타당성을 자동으로 보장하는 양식은 아니다.

확인하려는 결론:
기준 버전 / 후보 목록:
주 지표 / 보조 지표:
한 검정 묶음에 포함할 비교:
문제의 추출 방법 / 짝과 의존 구조:
검정 방법 / 유의 수준 / 보정 방법:
최소한 의미 있는 개선 폭:
자료 수 / 종료 규칙:
개발 자료와 최종 확인 자료의 경계:
보류 또는 배포를 막는 실패 조건:

평가 보고서에는 가장 작은 p값 하나 대신 후보 목록, 원래 p값, 보정값, 개선 폭과 새 실패를 함께 남긴다. 무엇을 몇 번 비교했는지 보여야 독자가 그 차이를 판단할 수 있다.

출처와 적용 범위

확인일: 2026년 10월 13일. 통계 원리와 교육용 합성 예시를 설명한 글이며 특정 모델이나 서비스의 성능 평가가 아니다. 본문의 Python 예제는 Python 3.12.14에서 실행해 표시한 두 출력값을 확인했다. R은 이 글에서 실행하지 않았다.

  • R stats 공식 문서: p.adjust: Holm·Bonferroni 보정과 FWER. 확인한 개발판 문서의 표기는 stats 4.6.0이며, 설치된 R 버전을 뜻하지 않는다.
  • NIST/SEMATECH e-Handbook: Bonferroni’s method: 여러 비교를 함께 다룰 때의 확률 부등식. 해당 페이지의 구체적 적용은 ANOVA 대비이며, 이 글의 AI 평가 사례는 이를 직접 수행한 것이 아니다.

다른 글 보기 · 주제 탐색 · 작성자와 편집 기준 · 문의·정정 요청

RUDA DIRECTOR에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기