Judge Biases & How to Calibrate
Introduction
You can write a beautiful rubric (L168 (Writing Judge Prompts & Rubrics)) and still be fooled — because the judge applying it has its own thumb on the scale. This is the lesson that answers the uncomfortable question hanging over the whole section: who validates the validator?
The critical insight: an LLM judge's errors are directional, not random. It doesn't just add noise — it systematically prefers the first answer, the longer answer, the more confident answer, its own family's answer. That makes a biased judge worse than no judge: it hands you thousands of scores that are confidently, consistently wrong in a knowable direction, and your leaderboard quietly rewards verbosity and formatting instead of quality. The good news is that directional means measurable — and what you can measure, you can mitigate and calibrate. This lesson is the engineering that turns a judge from a hopeful vibe into an instrument you've actually checked against humans.

The Judge's Biases Are Directional, Not Random
Researchers have catalogued a dozen-plus judge biases (Justice or Prejudice?, 2024). The ones that bite hardest in practice:
- Position bias — favors whichever answer is shown first (or second). Strong judges flip their verdict on ~⅓ of cases when you swap the order (you met this in L167 (Pointwise vs Pairwise / Comparative Judging)).
- Verbosity / length bias — rates longer answers higher even at equal quality. Automatic leaderboards showed a strong, reproducible preference for length regardless of content.
- Self-preference (self-enhancement) — rates outputs from its own model family higher. A judge grading its own kin is not neutral.
- Sycophancy — agrees with a stated preference (“I think B is better”) even when the other answer is more accurate — typically a 5–10 point swing.
- Authority / bandwagon / formatting / refinement-aware — swayed by a confident tone, citations (even fabricated), claims that “most people prefer this,” pretty Markdown, or simply being told an answer was “refined.”
The dangerous part is that these compound. Position + length + formatting bias together are far larger than any one alone — so a genuinely worse answer can win on style and verbosity while you congratulate yourself on a rising score. A judge isn't a neutral oracle; it's a rater with a personality you have to account for.
Measure Before You Mitigate
You cannot fix a bias you haven't quantified — and you quantify it with a controlled perturbation: change exactly one thing the answer's quality doesn't depend on, and see if the verdict moves. The cleanest is the position audit — judge every pair in both orders; a fair judge gives the same winner, so the flip rate is your position bias:
# MEASURE the bias before you trust the judge. Position-bias audit: judge each pair in
# BOTH orders. If the winner changes when you only swapped the slots, POSITION caused it.
def position_bias(pairs, judge): # judge(q, x, y) -> "x" | "y" (the winning TEXT)
flips = sum(judge(q, a, b) != judge(q, b, a) for q, a, b in pairs)
rate = flips / len(pairs)
print(f"position-bias flip rate: {rate:.0%} (a fair judge ≈ 0%)")
return rate
# Same idea, other biases — change ONE thing and watch the verdict move:
# verbosity -> pad answer B with filler, measure how much "B wins" rises
# self-pref -> reveal vs hide that B is the judge's own model family
# sycophancy -> add "(I personally prefer B)" and see if B's score jumps
# The judge here is a Claude call (claude-opus-4-8); the audit just wraps it.The same trick exposes the rest: pad answer B with filler and measure how much “B wins” rises (verbosity); reveal vs hide that B is the judge's own family (self-preference); inject “(I prefer B)” and watch B's score jump (sycophancy). This is the bias-audit protocol: run AB and BA orderings, analyze response length, and report a position-flip rate and a verbosity preference as standing numbers — not a one-time check, an instrument you watch.
See It: Probe & Correct a Bias
Here's a judge grading two answers of equal quality — a fair judge should call it a tie. Pick a bias, drive its control (swap the order · pad answer B longer · make B the judge's own family), and watch the “favors B” meter tilt off 50% while agreement-with-humans craters. Then flip the mitigation and watch it snap back to fair.

Notice what each control proves. Position: the same two answers, but the winner is just whoever's in slot 1 — swap it and the verdict flips. Verbosity: identical advice, padded longer, and the judge reads length as quality. Self-preference: reveal that B is its own kin and it tilts toward B. In every case the mitigation does the same thing — it removes the thing the quality didn't depend on, and the judge returns the tie the humans gave.
Calibrate to Humans (Cohen's κ)
Measuring bias tells you the judge is skewed; calibration tells you whether, after your fixes, it actually agrees with people. This is the step teams skip and regret. The protocol:
- Sample 100–300 real traces (from production — see L158 (Building Your First Eval Set)).
- Have 2–3 humans label them on your rubric, and compute their inter-annotator agreement — that's your ceiling. No judge can beat the humans who disagree with each other.
- Score the same traces with the judge and compute judge↔human agreement on the same scale.
The right metric isn't raw % — it's Cohen's κ, which corrects for agreement that happens by chance:
# CALIBRATE: a judge you never checked against humans is a vibe, not a metric. Score a
# human-labeled sample, then compute Cohen's kappa — agreement BEYOND chance, -1..1.
from sklearn.metrics import cohen_kappa_score
def calibrate(judge, labeled): # labeled: [(input, output, human_label), ...]
human = [h for _, _, h in labeled]
machine = [judge(inp, out) for inp, out, _ in labeled] # judge = claude-opus-4-8
k = cohen_kappa_score(human, machine) # 0 = chance, 1 = perfect
print(f"judge↔human kappa = {k:.2f} → {'ship it' if k >= 0.6 else 'rework the rubric'}")
return k
# Sample 100-300 real traces · 2-3 annotators (their inter-rater kappa is your CEILING,
# aim > 0.6) · judge↔human < 0.5 means the rubric is broken · re-check after every change
# and track it over time to catch drift.Read the bands: inter-annotator κ > 0.6 is acceptable and > 0.8 is strong (your ceiling); a judge↔human κ below 0.5 means the rubric is broken, not the judge — go back to L168 (Writing Judge Prompts & Rubrics). And calibration isn't one-and-done: re-check κ after every rubric or model change (a tiny rubric edit can silently shift preferences), and track it over time to catch drift. A judge shipped without an agreement number is an unvalidated validator. (And remember κ is itself a noisy estimate on a finite sample — put a confidence interval on it, L165 (Statistical Rigor: Sample Size & Confidence).)
Mitigate Each Bias
With the biases measured and a calibration number in hand, apply the targeted fix — each bias has a known counter:
- Position → swap and average. Judge every pair in both orders and combine; the slot advantage cancels. (The discipline from L167 (Pointwise vs Pairwise / Comparative Judging).)
- Verbosity → length-neutral rubric + length-controlled win rate. State “concise scores ≥ verbose at equal correctness” in the rubric (L168), and statistically regress length out of the win rate. Length-Controlled AlpacaEval did exactly this and lifted correlation with Chatbot Arena from 0.94 → 0.98.
- Self-preference → blind the identities + change the judge. Strip model names from the prompt, and don't let a model grade its own family — use a different judge.
- General-purpose → randomize, reference-guide, and few-shot. Randomize answer order, pass a gold reference in for grounded criteria, and add a calibrated example.
The honest caveat: these reduce bias, they don't eliminate it. You're driving the skew down to where your calibration number says you can trust it — not to zero.
Panels & Escalation: When Judges Disagree
The most powerful mitigation isn't a clever prompt — it's more than one judge. A panel (jury) of diverse models (Replacing Judges with Juries, 2024) beats a single large judge: because different model families have different biases, their skews partially cancel in the aggregate — and a panel of smaller models can do it at ~7× lower cost than one GPT-4-class judge.
The panel buys you something even better than a fairer score: disagreement as a signal. When three uncorrelated judges agree, the joint error is tiny and you can trust the verdict automatically. When they disagree, you've detected a hard case — exactly the one to escalate to a human. That's the basis of cascaded / selective evaluation: judge cheaply by default, and route only the uncertain cases to a stronger judge or a person (Trust or Escalate, ICLR 2025) — which can guarantee >80% human agreement at high coverage, even with cheap models. One more reason this matters: LLM judges are overconfident, reporting more certainty than their accuracy earns, so you can't take a lone confident verdict at face value. Calibrate the confidence, trust the easy cases, and hand the rest to humans — which is precisely L170 (Human-in-the-Loop Spot Checks).
🧪 Try It Yourself
Run a 10-minute bias audit on a judge you actually use — it almost always finds something:
- Position probe. Take 10 pairs of answers. Ask
claude-opus-4-8to pick the better one A-first, then ask again B-first (identical otherwise). Count how often the winner changed — that's your position-flip rate. If it's not near zero, you've been scoring slots. - Verbosity probe. Take one good answer; make a padded copy that says the same thing in 2× the words. Ask the judge which is better. If it picks the longer one, your rubric is rewarding length.
- Apply the fix and re-measure. Add “judge both orders and average” and a “concise ≥ verbose” clause, and run the probes again. Watch the flip rate and the length preference drop.
- Get a κ. Hand-label those 10–20 yourself, score them with the judge, and compute agreement. If it's low, the problem is the rubric, not the model.
You'll never look at a bare judge score the same way — you'll want to see its flip rate and its κ first.
Mental-Model Corrections
- “The judge is an objective oracle.” It's a rater with biases — position, verbosity, self-preference, sycophancy — that push the same direction every time. Account for them or your score measures style, not quality.
- “Bias is random noise that averages out.” It's directional and it compounds. Averaging more samples doesn't remove a systematic tilt; a controlled probe measures it and a targeted fix removes it.
- “High agreement % means it's calibrated.” Use Cohen's κ (chance-corrected). Two raters guessing the majority class agree 80% by luck; κ catches that. Compare to the inter-annotator κ — your ceiling.
- “A confident judge is a correct judge.” Judges are overconfident. Calibrate confidence; trust the easy cases, escalate the uncertain ones to a stronger judge or a human.
- “One judge is enough.” A diverse panel cancels individual biases, costs less, and — most valuable — its disagreement flags the hard cases to send to humans.
- “Calibrate once, then trust forever.” κ drifts as rubrics, models, and traffic change. Re-measure after every change and track it over time.
Key Takeaways
- A judge's errors are directional, not random — position (~⅓ flip on swap), verbosity, self-preference, sycophancy (5–10pp), authority/bandwagon/formatting — and they compound, so style + length can beat substance.
- Measure before you mitigate: a controlled perturbation (swap order, pad length, reveal identity) gives a flip rate / preference shift — run an AB+BA bias audit as a standing number.
- Calibrate to humans with Cohen's κ: label 100–300 traces with 2–3 annotators (their inter-rater κ is your ceiling, aim > 0.6); a judge↔human κ < 0.5 means rework the rubric; re-check after every change to catch drift.
- Mitigate per bias: position → swap & average (L167); verbosity → length-neutral rubric (L168) + length-controlled win rate (0.94 → 0.98); self-preference → blind + a different judge; general → randomize, reference-guide, few-shot. Reduces, doesn't eliminate.
- Use a panel + escalate: a diverse jury of judges cancels biases at ~7× lower cost, and its disagreement flags hard cases for humans; cascade cheap → strong → human and abstain under uncertainty (L170 (Human-in-the-Loop Spot Checks)).
- The rule: never trust a bare judge score — demand its flip rate and its κ first.