learn-model-evaluation-with-phoebe / Practitioner session 7 of 10
Learn Model Evaluation with Phoebe · Practitioner track · Session 7 of 10

The grader problem

b6 gave you LLM quality metrics - faithfulness, groundedness, relevance. Tonight's uncomfortable question: who grades the grader? Every LLM metric is only as good as the thing computing it, and the most popular grader - another LLM - has four documented failure modes. You will meet the three grader types, the four judge biases from Zheng et al. 2023, the one number to demand with every judge score, and then you will calibrate a biased judge yourself: watch it climb from 58% agreement with humans to 88% because you controlled one variable. That loop is the whole craft.

🟠 Practitioner track DS · analysts · ML + AI engineers Python · live evaluator on key pages 45 min
0-3 · Welcome 3-18 · The three graders + four biases 18-42 · Build-along: calibrate the judge 42-45 · Q&A
Part 1 · covers Anthropic develop-tests, OpenAI evals + graders guides

Three ways to grade, one budget to spend 7 min live

Every LLM metric is only as good as its grader. Faithfulness 0.92 sounds precise - but something read the answer and produced that number, and that something has strengths, blind spots, and a price. Anthropic's and OpenAI's taxonomies agree on the lineup: code-based graders, model-based graders (the LLM judge), and human graders. The craft is not picking one - it is spending each where it is strong.

★ What you walk out with today The three grader types and when each earns its keep, the four documented judge biases with their mitigations, the one question to ask of any judge score ("what is its agreement with humans?"), and a calibration loop you ran with your own hands: anchor set, measure, find the bias, fix it, re-measure.
Grader typeStrengthsWeaknessesUse for
Code-based
exact match, string check, schema checks, text similarity (BLEU / ROUGE / METEOR / cosine)
Fast, cheap, objective, perfectly repeatable Brittle - misses paraphrase, rewards surface overlap Format checks, exact answers, regression gates that must never flake
Model-based
an LLM judge scoring with a rubric
Flexible, handles nuance and open-ended answers Non-deterministic, biased in documented ways, costs per call Quality, tone, faithfulness - anywhere "correct" has many shapes
Human
expert or crowd labels
The gold standard - the definition of correct Slow, expensive, does not scale Spend it CALIBRATING the other two, not grading everything
Volume over quality - and the budget that makes it safe Eval scores are noisy estimates, so more verdicts pin down behaviour better than fewer perfect ones. Automated 500 automated verdicts Hand-graded 30 artisanal ones Code graders thousands of checks, every commit zero marginal cost regression gates that never flake The LLM judge hundreds of answers per run costs per call quality, tone, faithfulness Humans ~25 anchor labels, once slow and expensive spend it calibrating the rest Human effort is not for grading everything - it is for calibrating the graders that do. Volume only works if the automated grader is trustworthy on average, which is what calibration buys.
🔍 Click to zoom - spend humans on calibration, not on grading the bulk
LiveAnthropic's volume doctrine4 min▶

Anthropic's develop-tests guidance is blunt: "prioritize volume over quality" - a larger set of questions with automated grading beats a small set graded by hand. The reasoning is statistical: eval scores are noisy estimates, and 500 automated verdicts pin down a model's behavior better than 30 artisanal ones, even if each automated verdict is individually less trustworthy.

That doctrine only works if the automated grader is trustworthy ON AVERAGE - which is exactly why the human budget goes to calibration. The division of labor:

  • Code graders run on every commit - thousands of checks, zero marginal cost.
  • The LLM judge grades the open-ended bulk - hundreds of answers per run.
  • Humans label a small fixed anchor set once, and the judge is measured against it. The demo below makes this concrete.
LiveThe taxonomy outlives the product3 min▶

OpenAI's graders guide names the same families from the other direction: string check, text similarity (BLEU / ROUGE / METEOR / cosine and friends), score model (the judge), and python (arbitrary code). Two vendors, one shape: deterministic checks, model judgment, custom code, humans above them all.

Flag before you bookmark OpenAI's Evals PLATFORM is deprecated as of Nov 30, 2026 - the buttons and dashboards are going away. This course teaches the taxonomy, not the product, because the taxonomy is what transfers: every eval framework you will ever meet is these same three grader types wearing different UI.
Part 2 · covers Zheng et al. 2023, "Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena"

The four documented judge failures 8 min live

LLM judges were not benchmarked on vibes. Zheng et al. 2023 (the MT-Bench paper, NeurIPS 2023) measured judge verdicts against human preferences and documented exactly four failure modes. Learn them as a checklist - every judge you ever deploy should be audited against all four.

THE JUDGE, ON A SCALE THE FOUR BIAS WEIGHTS THE CALIBRATION COUNTERWEIGHTS POSITION BIAS verdicts flip with answer order VERBOSITY BIAS longer answers rated better SELF-ENHANCEMENT BIAS favors its own family's outputs LIMITED REASONING grades math it cannot do ORDER SWAP run both orders, keep consistent LENGTH CONTROL stop paying the judge per word CROSS-FAMILY JUDGE never let a model judge itself HUMAN ANCHOR SET ~25 labels, agreement measured Uncalibrated, the weights win: 58% agreement. Counterweights on: 88%. The build-along runs this exact loop.
🔍 Click to zoom - the four biases from Zheng et al. 2023 and the counterweight for each
LiveThe 80% bar, read correctly4 min▶

Zheng et al. also measured the ceiling: GPT-4-class judges reach "over 80% agreement" with human preferences. Two readings of that number, one wrong and one right:

  • Wrong reading: "the judge is 20% wrong - humans would do better."
  • Right reading: 80% EQUALS the agreement rate between two humans. The judge has hit the ceiling of the thing it approximates - a judge cannot beat the humans it is calibrated against, because human preference IS the target, disagreements and all.

The habit this buys you: demand the agreement number with every judge score. "Faithfulness 0.92" alone is a model output. "Faithfulness 0.92, and this judge agrees with our human labels 85% of the time on the anchor set" is a measurement.

Real world

The judge that loved its own answers. A team A/B-tested two assistants and let a judge from the same model family as assistant A pick winners. A won decisively. A month later a cross-family judge and a small human panel both reversed the result - self-enhancement bias had picked the winner, not quality. The fix cost nothing: a judge from a different family, plus order-swapping. The un-fix cost a month of building on the wrong model.

The 80% bar is a ceiling, not a shortfall Two trained humans grading the same answers agree about four times in five. GPT-4-class judges land here agreement a judge can reach noise in the task 0% 80% 100% ✗ The wrong reading the judge is 20% wrong, so humans would do better here ✓ The right reading 80% is also the human-human rate, so the judge has hit the ceiling of the thing it approximates Demand the agreement number with every score: without it, 0.92 is an output, not a measurement A judge cannot beat the humans it is calibrated against - human preference is the target itself. In tonight's build-along the judge goes 58% to 88% - already at the human-human bar.
🔍 Click to zoom - the last 20% is disagreement between humans, not judge error
Build-along · the centerpiece

Calibrate the judge: 58% to 88% ★ 20 min · everyone runs it

Below: 24 answers, each with a human label (good / bad) and a judge verdict. The judge has a scripted verbosity bias - it is a simulation of the Zheng et al. failure, so you can catch it red-handed. Your job is the full calibration loop, the same one you will run on real judges at work.

Run the raw judge: 58% agreement with the human labels, and 10 bad-but-long answers rated good. Read the individual rows - do not just take the number. Every miss has the same shape: wordy, empty, approved.

Name the pattern out loud before clicking anything: the judge is paying per word. That is verbosity bias - bias number two on tonight's checklist, found by reading rows, not by intuition.

Switch to the length-controlled judge: 88% agreement, 1 residual miss plus a few borderline calls no grader escapes. One systematic bias corrected, thirty points of agreement recovered.

Say the method, because the method IS the lesson: fixed human-labeled anchor set -> measure agreement -> find the systematic bias -> correct or constrain it -> re-measure. That loop, repeated whenever the judge or the task changes, is judge calibration in its entirety.

Price it: the anchor set is ~25 labels of human effort - an afternoon, once. It is the cheapest insurance in LLM evaluation, and it is the difference between a judge score you can defend and one you just hope about.

How to read the evaluator Each row is one answer: human label, judge verdict, answer length. The agreement tile is judge-vs-human over all 24. Honesty rail: the judge here is a scripted simulation of the Zheng et al. verbosity bias (0.009/word), so the failure is guaranteed to be findable - real judges fail in the same shapes but less cooperatively. The loop you practiced transfers unchanged.
Self-studyMeasure agreement yourself, 15 lines3 min read▶

The loop from the demo, as the code you would actually run. No framework required - agreement is a mean of matches:

import json

anchors = json.load(open("anchor_set.json"))   # ~25 human-labeled answers

def agreement(judge_fn, anchors):
    verdicts = [judge_fn(a["question"], a["answer"]) for a in anchors]
    hits = [v == a["label"] for v, a in zip(verdicts, anchors)]
    misses = [a for a, h in zip(anchors, hits) if not h]
    return sum(hits) / len(hits), misses

score, misses = agreement(raw_judge, anchors)
print(f"agreement: {score:.0%}")               # 58% -> now READ the misses
for m in misses:
    print(len(m["answer"].split()), m["label"])  # every miss: long + bad

The last loop is the part teams skip: the misses are where the systematic bias lives. In the demo every miss was long-and-bad - once you SEE that, the fix names itself. The number tells you whether to trust the judge; the misses tell you how to improve it.

Part 3 · self-study

Judge prompt hygiene ◐ read after class

Calibration finds the bias; hygiene prevents half of them showing up at all. Five habits for any judge prompt you write:

Self-studyThe five habits5 min read▶
  • Rubric-anchored scales. Never ask for "a score 1-5" bare - define what a 2 and a 4 MEAN, with a short example of each. An unanchored scale drifts with the judge's mood; an anchored one is a checklist in disguise.
  • Pairwise over pointwise where possible. "Which of these two is better?" is a more reliable judgment than "score this one" - comparison is easier than absolute calibration, for models and humans alike.
  • Temperature 0. A grader that gives different verdicts on identical input is measurement noise you chose to add. Determinism first.
  • Version-pin the judge model. A judge upgrade silently moves every score on your dashboard - pin the exact version, treat changes as breaking.
  • Re-calibrate when it changes. New judge model, new rubric, new task distribution: re-run the anchor set and re-measure agreement before trusting a single new number. The ~25 labels keep paying rent.

Where this connects: learn-ai-evals-with-phoebe owns the harness that wires judges into pipelines and CI; tonight you learned what must be true about the judge before any of that machinery is worth running.

Homework

Try it yourself - this week ◐ 20-30 min total

Source material

Official sources covered

This session teaches the grader taxonomy both major vendors agree on and the judge-bias findings from the primary paper, with the calibration loop run live in your browser. This page covers:

✓Zheng et al. 2023 - "Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena"The four biases, mitigations, and the 80% = human-human bar · Part 2 + demo
✓Anthropic develop-tests - the three grading methods + volume doctrinePart 1 · "prioritize volume over quality" quoted
✓OpenAI evals + graders guides - string check, text similarity, score model, pythonTaxonomy taught; platform deprecates Nov 30, 2026 - concepts only, no buttons
✓evalml judge canon - 24 answers, 58% raw / 88% length-controlledThe build-along · scripted simulation of the Zheng verbosity bias
Check yourself

Three questions before you go 🎯 ◐ 90 seconds

1 · Your pairwise judge prefers answer A - until you swap the order, and then it prefers B. Which documented bias is this, and what is the paper's mitigation?

Verdicts that flip with answer order are position bias, the first of the four Zheng et al. failures. The paper's own mitigation: present both orderings and only trust verdicts that agree across them. The other two options are real biases - with the wrong symptoms.

2 · GPT-4-class judges reach "over 80% agreement" with humans. What does that number actually mean?

Two humans agree with each other about 80% of the time on these preferences - so a judge at 80% is not 20% short, it is at the ceiling. A judge cannot beat the humans it approximates. The takeaway habit: demand the agreement number with every judge score.

3 · Put the calibration loop in order.

The anchor set comes first - without human labels there is nothing to measure agreement against, and without measurement you cannot find the bias or prove your fix worked. In the demo that loop took the judge from 58% to 88%, and the anchor set cost ~25 labels.

Practitioner session 7 cheat sheet · pin this

Three gradersCode (fast, cheap, brittle) · model/LLM judge (flexible, biased, costs) · human (gold standard, does not scale). Anthropic and OpenAI taxonomies agree.
The human budgetSpend humans CALIBRATING the other two graders, not grading everything. Volume doctrine: "prioritize volume over quality" of graded items.
The four biasesPosition (order flips verdicts) · verbosity (longer wins) · self-enhancement (favors own family) · limited reasoning (cannot grade what it cannot do). Zheng et al. 2023.
The mitigationsOrder swap + consistent-only verdicts · length control · cross-family judge · human anchor set. One counterweight per bias.
The 80% barGPT-4-class judges: "over 80% agreement" with humans - which EQUALS human-human agreement. A judge cannot beat the humans it approximates.
The calibration loopAnchor set -> measure agreement -> find systematic bias -> correct or constrain -> re-measure. Demo: 58% raw -> 88% length-controlled.
~25 labelsThe anchor set's price - an afternoon of human effort, the cheapest insurance in LLM evaluation. Re-run it whenever the judge model or task changes.
Judge hygieneRubric-anchored scales (define 2 and 4) · pairwise over pointwise · temperature 0 · version-pin the judge · re-calibrate on change.