Benchmarks and their limits
What leaderboards measure, and what they miss.
Create a free account Try part of it here
Why it matters
Every new AI model comes out with a table of test scores, called benchmark results. Teams pick models, set budgets and write headlines from those tables. Benchmarks are useful. But a two-point lead can be luck. A model can score well on questions it saw during training. And the tests rarely look like your work. This lesson teaches you to read those tables like an analyst.
What you'll be able to do
- Describe what major benchmarks measure, from multiple-choice exams to real software tasks
- Work out how big a score difference has to be before it means anything
- Recognize contamination, saturation and benchmark gaming
- Read leaderboards critically and know when to build your own evaluation
What it covers
- What gets measured
- Is a difference real?
- Worked example: how sure is 80% on 100 questions?
- Simulating two close models
- When scores stop meaning what they say
- Reading a benchmark table
What gets measured
A benchmark is a standard exam for AI models. Every model gets the same questions, so the scores can be compared. Think of a school entrance exam: one test, many students, one number each. Here are five well-known benchmarks.
| Benchmark | What it tests | Notes |
|---|---|---|
| MMLU (2020) | Multiple-choice questions in 57 subjects, from law to physics | Top models now score around 90%, so it's saturated. Studies found a few percent of its answer keys are wrong |
| GPQA (2023) | Graduate-level science questions written to be "Google-proof" | PhD experts in the field score about 65%; skilled non-experts with web access about 34% |
| SWE-bench (2023) | Fix real GitHub issues in Python projects; graded by running the projects' tests | Tests real work end to end; "Verified" is a 500-task subset checked by engineers |
| Humanity's Last Exam (2025) | About 2,500 expert-written questions at the frontier of many fields | Built to stay unsolved for a while |
| LMArena | People vote between two anonymous models' answers to their own prompts | Bradley-Terry ratings (from the preference-data lesson); measures what people prefer |
A benchmark is saturated when top models score so close to full marks that it can no longer tell them apart. More on that below.
Benchmarks have been moving away from multiple choice. Newer ones use tasks with checkable outcomes. Code must pass the project's tests: a task like SWE-bench requires producing working changes to real projects, checked by running those tests, which is why it says more than a multiple-choice score. An agent must reach a set goal. Others gather human preference at scale: many people voting on which answer they like better. Each kind answers a different question. None of them answers the one you care about most: which model is best for my job?
Show the answer
People voting on their own prompts tended to prefer A's answers
LMArena turns votes on which answer people liked better into ratings. A liked answer can still be wrong, so it measures preference, not correctness.
Is a difference real?
Picture a basketball player who makes 80% of her free throws over her whole career. Give her 10 shots tonight. She might make 7, or 9, or even all 10. Her skill hasn't changed. Ten shots is a small sample, so luck moves the number.
A benchmark score works the same way. The questions are a sample of all the questions that could have been asked. Swap in a slightly different set and the score would move. The real question is how far.
Two numbers decide that. The first is , the number of questions. The second is , the model's accuracy, written as a share between 0 and 1. So 80% becomes 0.8. Together they give the standard error, the typical size of the wobble. You met it in the sampling lesson in Phase 2.
The standard error is .
In plain words: multiply the share it got right by the share it got wrong. Divide by the number of questions. Then take the square root. More questions means a smaller wobble.
print(round((0.9 * 0.1 / 100) ** 0.5, 3))
Show the answer
0.03
0.9 × 0.1 / 100 is 0.0009, and its square root is 0.03. That's three points of typical wobble, so a 2-point lead on this test doesn't tell you much.
Scores are usually given with a 95% margin of error. That's about 1.96 standard errors on each side of the score. Since 1.96 is close to 2, "two standard errors" is a fine rule of thumb. The range from the score minus the margin to the score plus the margin is the confidence interval. Think of a score as that whole range, not a single point.
Go deeper Where the formula comes from
Each question is like one coin toss that lands "right" with chance . One right-or-wrong result like that has a variance of . Averaging independent results divides the variance by . The square root turns variance back into a spread, in the same units as the score.
Where does 1.96 come from? Averages of many results follow a bell curve, close enough. On a bell curve, 95% of values land within 1.96 standard errors of the middle. The bell-curve picture is an approximation. It works well unless is small or is very close to 0 or 1.
Comparing two models adds one more step. The gap between two independent scores wobbles more than either score alone. When both have similar accuracy, it wobbles about times as much, roughly 1.4 times. The two-proportion test in the exercise is built on exactly this.
import math p, n = 0.5, 100 print(round(1.96 * math.sqrt(p * (1 - p) / n), 3))
Show the answer
0.098
0.5 × 0.5 / 100 is 0.0025, its square root is 0.05, and 1.96 × 0.05 is 0.098. With only 100 questions, the margin is almost ±10 points. Small gaps there mean nothing.
Two models a couple of points apart on 200 questions aren't really different. Quadrupling the questions only halves the margin.
Worked example: how sure is 80% on 100 questions?
A model gets 80 of 100 questions right, so and . By hand: 0.8 × 0.2 = 0.16. Divide by 100 to get 0.0016. The square root of 0.0016 is 0.04. That's the standard error, 4 points. Times 1.96, it gives 0.078, a margin of about ±8 points. Now check it in Python.
import math p, n = 0.80, 100 # 80 right out of 100 questions se = math.sqrt(p * (1 - p) / n) # standard error: the typical wobble margin = 1.96 * se # 95% margin of error print(round(se, 3), round(margin, 3)) print(f"{p - margin:.1%} to {p + margin:.1%}")
It prints 0.04 and 0.078, then 72.2% to 87.8%. So a score of 80% here really means "somewhere from about 72% to 88%". A second model scoring 75% on the same test sits inside that range. On 100 questions, you can't tell those two models apart.
Simulating two close models
The code below makes the wobble visible. Two imaginary models have true accuracies of 82% and 80%. Each one sits a benchmark 10,000 times, with fresh luck every time. The code tries four benchmark sizes. For each size, it prints the 95% margin on one score. It also prints how often the worse model came out ahead.
rng.binomial(n, better, 10_000)counts how many ofnquestions the better model gets right, in each of 10,000 runs.- Dividing by
nturns those counts into accuracies.
import numpy as np rng = np.random.default_rng(0) better, worse = 0.82, 0.80 # true accuracies of two models print(f"{'questions':>9} {'± (95%) on one score':>21} {'worse model scores higher':>26}") for n in [100, 500, 2_000, 10_000]: a = rng.binomial(n, better, 10_000) / n # 10,000 imaginary benchmark runs b = rng.binomial(n, worse, 10_000) / n margin = 1.96 * np.sqrt(better * (1 - better) / n) print(f"{n:>9,} {margin:>20.1%} {(b > a).mean():>25.0%}")
Read the table row by row. On a 100-question test, each score is only good to about ±7.5 points. The worse model comes out ahead about a third of the time (32%). At 2,000 questions, the margin shrinks to ±1.7 points, and the worse model wins only 5% of the time. At 10,000 questions, that share rounds to 0%.
Many headline benchmarks have a few hundred questions. So do the slices of them that make the news. On tests that size, a gap of one or two points is often noise. When you see a score table, ask three things. How many questions were there? Are there confidence intervals? Were the results averaged over several runs? Your own evaluation sets from Phase 1 follow exactly the same arithmetic.
Show the answer
The difference is within the noise for 200 questions; it doesn't show A is better
With 200 questions, each score is uncertain by roughly ±6 points. A 2-point gap is well inside that, so it isn't evidence that A is better.
When scores stop meaning what they say
A score can be precise and still misleading. Here are four common reasons.
1. Contamination
Imagine a student who found last year's exam, with the answers, a week before the test. A top grade then says little about what they know. Models face the same problem. Benchmarks are published on the web, and the web is training data. A model that saw the test questions, or their answers, during training can score well without the skill the test is meant to measure. This is called contamination.
One way researchers check: compare scores on the original questions with scores on reworded or freshly written versions of the same problems. Real skill carries over to new wording. Memory doesn't.
The code below fakes this. The model's true skill is 60%. But 30% of the questions leaked into its training, and it gets every leaked question right.
import numpy as np rng = np.random.default_rng(1) n, skill, leaked = 1_000, 0.60, 0.30 # true skill 60%; 30% of questions leaked into training is_leaked = rng.random(n) < leaked original = np.where(is_leaked, True, rng.random(n) < skill).mean() # memorized questions: always right reworded = (rng.random(n) < skill).mean() # same problems, new wording print(f"original questions: {original:.0%} reworded versions: {reworded:.0%}")
The original questions score 73% and the reworded ones 63%. The reworded score sits near the true 60%; the rest is ordinary sampling noise. The gap of about ten points comes from memory. A gap like that is a red flag.
Newer benchmarks fight contamination in three ways. They keep test sets private. They write new questions all the time. Or they use problems created after the model's training cutoff, the date its training data ends.
Show the answer
About 80%
Half the questions are memorized, so they're all right: 50 points. The other half are right 60% of the time: 0.6 × 50 = 30 points. That's about 80% in total, while the reworded score stays near 60%.
2. Saturation
When nearly every student scores 98% on a test, the test can't pick out the best student. The same happens to benchmarks. Once top models score near the ceiling, the benchmark is saturated. It no longer separates them. Many of the remaining errors are mistakes in the answer key, not in the models. Benchmarks used to stay useful for years. Now it's often months.
3. Optimizing for the leaderboard
Goodhart's law says that when a number becomes a target, it stops being a good measure. Labs compete on leaderboard numbers, so they tune their models for them. Here are some ways to lift a score without making the model more useful:
- answering in the exact format a grader rewards;
- tuning the prompt separately for each benchmark;
- running the model many times and reporting the best run.
Preference leaderboards have their own version. Longer answers with more headings and bullet points win more votes. That's why LMArena added a "style control" view. It adjusts ratings for length and formatting.
4. Distance from your task
A model that's best at graduate physics may not be best at your work. Your work might be writing product descriptions in your brand's voice. It might be following your support policy, or handling your data formats. A public benchmark rarely tests things like these.
Reading a benchmark table
Ask these five questions every time.
- What exactly was tested? How many items were there, and is the test set public?
- Is the gap larger than the noise? Are there confidence intervals, or several runs?
- Were all models run the same way: same prompt, same number of attempts, same tools?
- Who ran it: the model's maker, or an independent group?
- How close is the task to yours, and what does your own evaluation say?
For marketers: use leaderboards to build a shortlist. Then decide with a test set of 100 to 300 examples from your own work, scored the same way for every model. On a set that size, trust only clear gaps. Expect the ranking to change.
Show the answer
The models weren't run the same way, so the lead may come from the extra attempts, not skill
Best of 5 gives a model five chances to get lucky. A fair table gives every model the same prompt, the same number of attempts and the same tools.
Practice what you just read
- 3 code examples you can edit and run
- a practice exercise that checks your code
- a 5-question quiz
- 5 review cards for spaced repetition
Try a quiz question
A model scores 15 points higher on a benchmark's original questions than on reworded versions of the same problems. What's the likeliest explanation?