← 목록

2위와 0.05점 차이도 1위일까: 허깅페이스 보드 44곳에서 자사 1위 11개의 두께를 재 봤습니다

devto 2026-10-22 원문 보기 ↗


TL;DR

무엇을 어떻게 쟀나요?

허깅페이스는 benchmark:official 태그가 붙은 데이터셋을 공인 벤치마크로 부릅니다. 각 벤치마크의 순위표는 모델 저장소의 .eval_results/*.yaml 파일에서 자동으로 모입니다. 모델 제작자가 직접 올릴 수도 있고, 누구나 풀 리퀘스트로 제출할 수도 있습니다. 이 구조는 허깅페이스 문서(Evaluation Results)에 적혀 있습니다.

순위표 데이터는 REST API로 받을 수 있습니다(Accessing Benchmark Leaderboard Data). 저희는 두 개의 엔드포인트만 썼습니다.

49개 중 5개는 아직 순위표가 비어 있어서 분석 대상은 44개 보드, 1,108행, 조직 102곳입니다. 값은 2026-10-22 한국시간 오전에 한 번에 내려받았고, 같은 날 두 번 받아 행 수가 같음을 확인했습니다. 순위표는 계속 바뀌므로 이 글의 모든 숫자는 "그날 값"입니다.

"자사 1위"는 1위 행의 모델 ID가 FINAL-Bench/로 시작하는 보드로 정의했습니다. "격차"는 그 1위와, 같은 보드에서 FINAL-Bench가 아닌 조직의 가장 높은 행의 점수 차입니다. 같은 조직의 모델끼리는 비교하지 않았습니다.

verified가 0개라는 건 무슨 뜻인가요?

허깅페이스 문서에 따르면 verified 배지는 verifyToken이 유효할 때만 붙습니다. 평가가 허깅페이스 Jobs에서 inspect-ai로 실행됐다는 암호학적 증명이 있어야 한다는 뜻입니다. 1,108행 가운데 그런 행은 0개였습니다. 44개 보드의 1위 44개 중에도 0개입니다.

그러니 이 보드의 숫자는 전부 "제출된 값"입니다. 저희 1위 11개도 마찬가지입니다. 출처 칸을 보면 11개 중 7개는 저희 모델 카드를 가리키고 4개는 벤치마크 쪽 페이지 등 외부 링크를 가리킵니다. 다만 출처 링크가 외부라는 사실이 "제3자가 돌렸다"는 뜻은 아닙니다. API는 누가 평가를 실행했는지까지 알려 주지 않습니다. 그래서 이 값을 제3자 검증이라고 부르지 않습니다.

보드 1위 행에 평가 설정이 적힌 비율

verified가 없으면 남는 단서는 notes 칸입니다. 평가 설정(샘플 수, 온도, 집계 방식)을 적어 두는 칸인데 필수가 아닙니다. 44개 1위 행 중 notes가 있는 것은 28개입니다. 저희 1위 11개는 11개 모두, 타사 1위 33개는 17개가 적어 두었습니다. 타사 16곳은 어떻게 쟀는지 보드만으로는 알 수 없습니다.

1위와 2위의 격차는 얼마나 되나요?

보드 등재 수 저희 1위 타사 최고 격차
MDPBench 16 83.65 83.60 (Kimi-K3) 0.05
MMMU-Pro 11 79.48 79.40 (Kimi-K2.6) 0.08
MMLU-Pro 142 88.12 88.00 (MiniMax-M2.1) 0.12
ExtractBench 11 90.29 89.88 (Qwen3.8-Flash-Next) 0.41
GPQA 115 94.44 93.50 (Kimi-K3) 0.94
AIME 2026 27 100 97.70 (Beam-1.0-501B-A23B) 2.30
LEXam-hard 12 45.72 40.82 (Inkling) 4.90
IFStruct 6 98.95 93.25 (Agents-A1) 5.70
HMMT Feb 2026 20 100 92.70 (Kimi-K2.6) 7.30
Typed Decisions 8 81.2 73.7 (aplomb-1) 7.5
LEXam 10 68.94 52.41 (DeepSeek-R1) 16.53

Typed Decisions는 보드가 0에서 1 사이 값을 쓰기 때문에 100을 곱해 표시했습니다. 이 보드의 1위(0.812)는 학습 분할로 미세조정한 모델이라고 저희 notes에 적혀 있습니다. 같은 notes에는 미세조정하지 않은 제로샷 모델(0.743)이 따로 올라 있고, 그 모델과 타사 최고(0.737)의 차이는 0.6점입니다. 1위 표시가 어떤 조건에서 나왔는지를 알려면 이 칸을 읽어야 합니다.

자사 1위 11개의 2위와의 격차

전체 보드로 넓혀 보면 이 현상은 저희만의 것이 아닙니다. 점수가 숫자인 42개 보드에서 1위와 2위의 상대 격차는 중앙값이 5.54%였고, 9개 보드는 1% 미만이었습니다. 순위표의 1위라는 말은 대개 "맨 위에 놓였다"는 뜻이지 "확실히 앞섰다"는 뜻이 아닙니다.

0.12점 격차는 통계적으로 의미가 있나요?

보드 점수는 정답률이라서 이항분포로 대충 어림할 수 있습니다. 시험 문항 수가 notes에 적힌 두 보드로 계산했습니다. 두 모델이 같은 문항 수를 풀고 정답이 서로 독립이라는 보수적 가정입니다.

import math

def gap_report(n, p1, p2):
    se = math.sqrt(p1*(1-p1)/n + p2*(1-p2)/n)
    d = p1 - p2
    pbar = (p1 + p2) / 2
    need = 2 * pbar * (1 - pbar) * (1.96 / d) ** 2
    return d*100, se*100, (d-1.96*se)*100, (d+1.96*se)*100, need

print(gap_report(12032, .8812, .8800))   # MMLU-Pro
print(gap_report(198,   .9444, .9350))   # GPQA Diamond
보드 문항 수 격차 격차의 표준오차 격차의 95% 구간 가르는 데 필요한 문항 수
MMLU-Pro 12,032 0.12점 0.42점 -0.70 ~ +0.94 약 561,000
GPQA Diamond 198 0.94점 2.39점 -3.75 ~ +5.63 약 4,927

격차를 가르는 데 필요한 문항 수

두 보드 모두 95% 구간이 0을 포함합니다. 즉 이 점수만으로는 순위가 뒤집혀도 이상하지 않습니다. 이 계산에는 한계가 두 가지 있습니다. 첫째, 같은 문항을 푼 두 모델의 결과는 독립이 아니라서 짝을 지은 검정(McNemar 등)을 쓰면 구간이 훨씬 좁아질 수 있습니다. 하지만 그러려면 문항별 정오답이 필요한데 보드는 총점만 공개합니다. 둘째, GPQA의 저희 점수는 다수결 값이라 이항 근사가 엄밀하지 않습니다. 그래서 위 표는 "이 정도 격차는 총점만으로 구분하기 어렵다"는 감각을 주는 용도이고, 판정은 아닙니다.

문항이 적은 보드는 더 거칩니다. AIME 2026은 30문제, HMMT 2026은 33문제입니다. 다수결 점수에서는 한 문제가 각각 3.33점, 3.03점이라서 100점과 97.7점의 차이는 한 문제 이하 수준입니다.

점수는 같은 방식으로 집계된 값인가요?

보드에 한 칸으로 들어오는 점수가 같은 방식으로 만들어졌다는 보장은 없습니다. 저희 1위 행의 notes에는 이렇게 적혀 있습니다.

보드 저희 notes에 적힌 집계 방식
MMLU-Pro 전체 12,032문항, 샘플 1개
GPQA Diamond 전체 198문항, 최대 16개 샘플 다수결
MMMU-Pro 전체 1,730문항, 샘플 3개 다수결
AIME 2026 30문제, maj@16 = 100.0, 16개 샘플 평균 정확도 = 98.75
HMMT Feb 2026 33문제, maj@16 = 100.0, 16개 샘플 평균 정확도 = 96.59
MDPBench 공개 세트 2,720쪽, 단일 실행, 빈 응답 17쪽은 사고 모드를 끄고 다시 읽음

다수결 점수는 평균 정확도보다 높게 나오는 경향이 있습니다. AIME에서 저희 값이 100.0인 것도 다수결 때문이고, 같은 모델의 샘플 평균은 98.75입니다. 보드 한 칸에 100을 걸어 두면 독자는 만점이라고 읽습니다. 그래서 notes를 적어 두었습니다.

그렇다면 비교 상대는 어떻게 집계했을까요? 이 질문에 저희는 답할 수 없습니다. 7개 보드의 2위 행을 확인하니 notes가 있는 곳은 ExtractBench 하나뿐이었고, 그것도 파이프라인 이름과 체크포인트 이름만 적혀 있었습니다. 상대가 단일 샘플이라고 단정할 근거는 없습니다. 그렇다고 같은 방식이라는 근거도 없습니다. 만약 AIME와 HMMT를 평균 정확도로 맞춰 읽는다면 격차는 AIME 1.05점(98.75 대 97.7), HMMT 3.89점(96.59 대 92.7)으로 줄어듭니다. 순위는 그대로이지만 "100점 대 97.7점"이라는 인상보다는 훨씬 조용한 격차입니다. 상대의 집계 방식이 같다는 가정이 붙은 계산이라는 점도 함께 기억해야 합니다.

보드의 두께는 모두 같은가요?

44개 보드의 등재 수 분포

44개 보드의 등재 수는 1개부터 142개까지이고 중앙값은 13.5개입니다. 등재가 3개 이하인 보드가 5개(actava/chi-bench 3, mteb/arguana 3, mercor/APEX-v1-extended 2, VLABench 1, mteb/BRIGHT 1)입니다. 등재가 1개인 보드에서 "1위"는 참가한 사람이 한 명이라는 뜻입니다. 이 5곳 중 저희 1위는 없습니다.

저희 1위 보드는 등재 수가 6개(IFStruct)부터 142개(MMLU-Pro)까지입니다. 등재가 6개인 보드의 1위와 142개인 보드의 1위는 같은 무게가 아닙니다. 142개 중 1위는 경쟁자가 많다는 점에서, 격차가 작더라도 의미가 있습니다. 반대로 11개나 12개짜리 보드에서의 5점 격차는 참가자가 적어 비교 대상 자체가 얇습니다. 두 방향의 해석이 다 가능하므로, 1위 개수를 세는 숫자 하나로 요약하면 정보가 사라집니다.

보드에서 1위를 읽을 때 무엇을 보면 되나요?

저희가 이 감사를 하며 정리한 체크리스트입니다. 남의 1위를 볼 때도, 저희 1위를 볼 때도 같이 적용하시면 됩니다.

  1. verified가 true인가. 아니라면 제출된 값입니다. 44개 보드 1위 중 true는 0개였습니다.
  2. notes에 샘플 수와 집계 방식이 있는가. 단일 샘플, 다수결, 평균을 구분합니다. 없으면 비교할 수 없다고 표시해 두세요.
  3. 격차를 문항 수와 견주었는가. 격차가 표준오차(문항 수 n에 대해 대략 0.5/√n)보다 작으면 순위는 정보가 아닙니다.
  4. 보드에 몇 개나 올라와 있는가. 등재가 한 자릿수면 1위는 "참가자 중 최고"입니다.
  5. 출처가 어디인가. 모델 카드는 제작자의 보고입니다. 외부 링크라도 누가 돌렸는지는 따로 확인해야 합니다.
  6. 최고 점수가 만점인가. 만점이면 변별력이 끝난 것이라서, 그 보드의 격차는 더 이상 정보를 주지 않습니다.

직접 재 보려면 어떻게 하나요?

아래 스크립트는 표준 라이브러리만 씁니다. 2026-10-22 실행 결과를 함께 적습니다. 보드가 바뀌면 값도 바뀝니다.

import json, urllib.request

def get(url):
    req = urllib.request.Request(url, headers={"User-Agent": "lb-audit/1.0"})
    return json.load(urllib.request.urlopen(req, timeout=40))

API = "https://huggingface.co/api"
boards = []
for d in get(API + "/datasets?filter=benchmark:official&limit=100"):
    rows = get(f"{API}/datasets/{d['id']}/leaderboard")
    rows = rows if isinstance(rows, list) else rows.get("rows", [])
    if rows:
        boards.append((d["id"], rows))

n_rows = sum(len(r) for _, r in boards)
n_verified = sum(1 for _, r in boards for x in r if x["verified"])
with_notes = sum(1 for _, r in boards if r[0].get("notes"))
print(len(boards), "boards", n_rows, "rows", n_verified, "verified", with_notes, "#1 rows with notes")
# 44 boards 1108 rows 0 verified 28 #1 rows with notes

for bid, rows in boards:
    top = rows[0]
    rival = next((x for x in rows[1:] if x["modelId"].split("/")[0] != top["modelId"].split("/")[0]), None)
    if rival and top["modelId"].startswith("FINAL-Bench/"):
        print(f"{bid:32s} n={len(rows):4d} #1={top['value']:<7} next other org={rival['value']:<7} gap={top['value']-rival['value']:.2f}")

FINAL-Bench/ 자리에 다른 조직 이름을 넣으면 그 조직의 1위를 같은 방식으로 감사할 수 있습니다. 응답 필드는 rank, modelId, value, verified, source, notes이고, lower_is_better가 true인 보드(음성 인식 계열 2개)는 점수가 낮을수록 위입니다. 위 스크립트는 API가 정렬해 준 rows[0]을 1위로 쓰기 때문에 순위는 맞지만, 이런 보드에서는 격차의 부호가 음수로 나옵니다.

이 감사의 한계는 무엇인가요?

FAQ

Q. 허깅페이스 공인 벤치마크란 무엇인가요?
benchmark:official 태그가 붙은 데이터셋입니다. 모델 저장소의 .eval_results/*.yaml에 적힌 점수가 순위표로 자동 집계됩니다. 2026-10-22 기준 49개이고 44개에 순위표가 채워져 있습니다.

Q. verified 배지는 어떻게 받나요?
허깅페이스 문서에 따르면 verifyToken이 유효해야 합니다. 평가가 허깅페이스 Jobs에서 inspect-ai로 실행됐다는 증명입니다. 이 글에서 확인한 1,108행 가운데 해당 행은 없었습니다.

Q. 순위표 1위는 믿을 수 있나요?
1위라는 사실은 그날의 값으로 믿을 수 있습니다. 하지만 "그 모델이 더 낫다"는 주장은 격차, 문항 수, 집계 방식, 출처를 같이 봐야 합니다. 격차가 0.1점 안팎이면 대개 순위가 정보를 주지 못합니다.

Q. 다수결(maj@16) 점수와 평균 정확도는 무엇이 다른가요?
다수결은 한 문제에 대해 샘플 16개의 답 중 가장 많이 나온 답으로 채점합니다. 평균 정확도는 16개 샘플을 각각 채점해 평균을 냅니다. 같은 모델이라도 다수결 쪽이 대개 높습니다. 저희 AIME 값은 100.0(다수결)과 98.75(평균)로 갈립니다.

Q. 이 감사를 다른 조직에도 적용할 수 있나요?
네. 위 스크립트의 조직 접두사만 바꾸면 됩니다. 응답이 공개 API라서 별도 키가 필요 없습니다.

Further reading