Index Ai Academy
Phase 6 · Modern LLM engineering · Systems & safety

Benchmarks and their limits

What leaderboards measure, and what they miss.

About 30 minutes · A free account opens the whole lesson

Create a free account Try part of it here

Already have an account? Sign in to open this lesson

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

  1. What gets measured
  2. Is a difference real?
  3. Worked example: how sure is 80% on 100 questions?
  4. Simulating two close models
  5. When scores stop meaning what they say
  6. 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.

BenchmarkWhat it testsNotes
MMLU (2020)Multiple-choice questions in 57 subjects, from law to physicsTop 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' testsTests 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 fieldsBuilt to stay unsolved for a while
LMArenaPeople vote between two anonymous models' answers to their own promptsBradley-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?

Quick check
LMArena ranks model A above model B. What does that tell you?
  1. People voting on their own prompts tended to prefer A's answers
  2. A gives correct answers more often than B
  3. A scored higher on a fixed multiple-choice exam
  4. A was trained on more data than B
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 nn, the number of questions. The second is pp, 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 p(1−p)/n\sqrt{p(1-p)/n}.

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.

Quick check
A model scores 90% on 100 questions. What is the standard error?
print(round((0.9 * 0.1 / 100) ** 0.5, 3))
  1. 0.09
  2. 0.9
  3. 0.003
  4. 0.03
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 pp. One right-or-wrong result like that has a variance of p(1−p)p(1-p). Averaging nn independent results divides the variance by nn. 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 nn is small or pp 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 2\sqrt{2} times as much, roughly 1.4 times. The two-proportion test in the exercise is built on exactly this.

Quick check
What does this print?
import math
p, n = 0.5, 100
print(round(1.96 * math.sqrt(p * (1 - p) / n), 3))
  1. 0.05
  2. 0.098
  3. 0.5
  4. 1.96
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.

Try it now

Two models a couple of points apart on 200 questions aren't really different. Quadrupling the questions only halves the margin.

Worked example

Worked example: how sure is 80% on 100 questions?

A model gets 80 of 100 questions right, so p=0.8p = 0.8 and n=100n = 100. 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 runs right here in your browser, with nothing to install.

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 of n questions the better model gets right, in each of 10,000 runs.
  • Dividing by n turns 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.

Quick check
Model A scores 71% and model B scores 69% on a 200-question benchmark. What's the best conclusion?
  1. A is clearly better
  2. Both models are identical
  3. B is better because lower scores mean harder reasoning
  4. The difference is within the noise for 200 questions; it doesn't show A is better
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.

Quick check
In the code above, change leaked to 0.50 and keep skill at 0.60. Roughly what score would you expect on the original questions?
  1. About 60%
  2. About 50%
  3. About 80%
  4. About 110%
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.

  1. What exactly was tested? How many items were there, and is the test set public?
  2. Is the gap larger than the noise? Are there confidence intervals, or several runs?
  3. Were all models run the same way: same prompt, same number of attempts, same tools?
  4. Who ran it: the model's maker, or an independent group?
  5. 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.

Quick check
A launch post shows a new model winning a coding benchmark. The small print says it got the best of 5 attempts per task, while rival models got 1 attempt. What's wrong with the comparison?
  1. The rivals should have had zero attempts
  2. Coding benchmarks can never be compared
  3. The models weren't run the same way, so the lead may come from the extra attempts, not skill
  4. Nothing: more attempts is a fair advantage
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

Create a free account

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?

  1. Contamination: the original questions or answers were in its training data
  2. The reworded questions are written in another language, which it reads less well
  3. The model is better at long questions, and the reworded ones came out much shorter
  4. Benchmarks are always noisy by about 15 points, so a gap this size tells you nothing

Answer it at the end of the lesson to see if you're right, and why.

Before this lesson