LLM-as-Judge
Phase 12 · Document 02 · Evaluation Prev: 01 — Golden Datasets · Up: Phase 12 Index
Table of Contents
- Why This Matters
- Core Concept
- Mental Model
- Hitchhiker's Guide
- Warmup Readings
- Deep Readings and External References
- Key Terms
- Important Facts
- Observations from Real Systems
- Common Misconceptions
- Engineering Decision Framework
- Hands-On Lab
- Verification Questions
- Takeaways
- Artifact Checklist
1. Why This Matters
Most things you want to measure about an LLM are subjective and open-ended — helpfulness, faithfulness, tone, reasoning quality — where exact-match scoring fails and human grading doesn't scale. LLM-as-judge (using a strong model to grade outputs against a rubric) is the dominant scalable scorer for those dimensions, powering Ragas, TruLens, LangSmith, and most production eval (00). But it's also subtly dangerous: judges are biased and noisy (they favor longer answers, the first option, their own style, the "reference"), so an uncalibrated judge can confidently rank the worse system higher — invalidating your eval. Knowing how to use a judge well — rubrics, pairwise+position-swap, ensembles, and calibration against human labels — is what makes subjective eval trustworthy instead of a fancy vibe check.
2. Core Concept
Plain-English primer: a model grades the output
LLM-as-judge = prompt a strong model with the input, the output to grade, and a rubric/criteria, and have it return a score (or a winner). It's used when the quality dimension is subjective (no programmatic check) — faithfulness, helpfulness, coherence, tone, instruction-following (00). When a programmatic check exists (tests pass, JSON-valid, exact match), prefer it — it's objective and free of judge bias (Phase 11.08).
def judge(question, answer, rubric, reference=None):
ref = f"\nReference: {reference}" if reference else ""
prompt = f"""Score the answer on a 1–5 scale using this rubric.
Rubric: {rubric}
Question: {question}
Answer: {answer}{ref}
Respond as JSON: {{"reasoning": "...", "score": N}}""" # reasoning BEFORE score
r = client.chat.completions.create(model=JUDGE, temperature=0,
messages=[{"role":"user","content":prompt}], response_format={"type":"json_object"})
return json.loads(r.choices[0].message.content)
Three judging modes
- Single-output scoring (pointwise) — score one output 1–5 / 0–1 against a rubric. Simple; but absolute scores are noisy and poorly calibrated (what's a "4"?).
- Pairwise comparison — show two outputs (A vs B), ask which is better. More reliable than absolute scores (relative judgments are easier) — the basis of arenas/preference data. But subject to position bias (fix by swapping order, below).
- Reference-based — grade against a known-good answer. Helps for factual/closed tasks; risks anchoring to the reference's wording.
Pairwise is usually the most reliable for ranking systems; pointwise-with-rubric is fine for tracking a single system over time.
The biases (this is the crux)
Judges have systematic biases that, unmitigated, corrupt your eval (00):
- Position bias — in pairwise, the first (or a specific position) wins more often, regardless of content.
- Verbosity/length bias — longer, more elaborate answers score higher even when not better.
- Self-preference bias — a judge favors outputs from its own model family / its own style (a real problem when judging competitors with the same model).
- Sycophancy / authority bias — favors confident tone, agreeable answers, or the "reference."
- Style/format bias — Markdown, bullet points, hedging language sway scores.
- Limited reasoning — judges miss subtle factual errors, especially in domains they're weak at.
Mitigations (how to judge well)
- Use a rubric, not open-ended judgment — concrete criteria + a scale anchor reduce noise and bias (00).
- Reasoning before score — have the judge explain then score (chain-of-thought improves judgments and is auditable).
- Pairwise + swap positions — run A-vs-B and B-vs-A; only count a win if consistent across orders (kills position bias).
- Ensemble / multiple samples — average several judge runs (or multiple judge models) to reduce variance.
- Control for length — normalize or instruct "ignore length"; watch the verbosity correlation.
- Avoid self-preference — use a different model family as judge than the one you're evaluating where possible.
- Constrain output — structured score JSON (reasoning + score) for reliable parsing (Phase 10.02).
Calibration: the non-negotiable step
The biases mean you must validate the judge against human labels. Take a sample of your golden set, have humans label it, run the judge on the same items, and measure agreement (correlation / accuracy vs human). If agreement is poor, fix the rubric/judge model/mode until the judge tracks humans — then trust it for scale. Treat judge scores as directional (great for regressions/ranking) and recalibrate periodically. An uncalibrated judge is a vibe check with extra steps.
When to use what
programmatic check exists (tests/exact/JSON/recall) → USE IT (objective, free) [11.08]
subjective quality, need scale → LLM-JUDGE (rubric + pairwise+swap + calibrated)
high-stakes / nuance / calibration → HUMAN (gold standard; also calibrates the judge)
LLM-judge is the scalable middle between cheap-but-limited programmatic checks and expensive-but-gold human eval. It's also how RAG faithfulness/relevancy (03), agent outcomes (04), and subjective code quality (05) get scored at scale.
3. Mental Model
subjective quality (helpful/faithful/tone) → no exact match → LLM-JUDGE grades vs a RUBRIC
(prefer PROGRAMMATIC checks when they exist [11.08]; HUMAN is gold + calibrates)
MODES: pointwise (noisy absolute) · PAIRWISE A-vs-B (more reliable; +swap) · reference-based (anchoring risk)
★ BIASES corrupt eval: POSITION · VERBOSITY/length · SELF-PREFERENCE (own family) · sycophancy/authority · style · weak-reasoning
MITIGATE: rubric · reasoning-before-score · PAIRWISE + POSITION-SWAP (count only consistent wins) ·
ensemble/multi-sample · control length · judge with a DIFFERENT model family · structured output [10.02]
★ CALIBRATE vs HUMAN labels on a sample (agreement) → trust as DIRECTIONAL; recalibrate periodically
Mnemonic: a strong model grades subjective quality against a rubric — but it's biased (position/verbosity/self-preference). Prefer programmatic; for judges use rubric + pairwise+swap + ensembles, and ALWAYS calibrate against human labels. Treat scores as directional.
4. Hitchhiker's Guide
What to look for first: is there a programmatic check you could use instead (prefer it)? If not, is the judge calibrated against humans and using a rubric? Those decide whether the judge is trustworthy.
What to ignore at first: elaborate multi-judge ensembles. Start with a rubric + reasoning-before-score + a calibration sample; add pairwise/swap/ensembles where bias bites.
What misleads beginners:
- Trusting the judge as ground truth. It's biased/noisy — calibrate against humans, treat as directional (00).
- Pointwise absolute scores. Noisy and poorly anchored — pairwise is more reliable for ranking.
- Ignoring position bias. Pairwise without order-swap systematically favors a position.
- Self-judging. Using the same model family to judge its own outputs inflates them (self-preference) — use a different judge.
- Open-ended "is this good?". Use a rubric with a scale anchor.
- Ignoring length. Verbosity bias makes longer answers win — control for it.
How experts reason: they prefer programmatic scoring, and when using a judge they apply a rubric + reasoning-before-score + pairwise with position-swap + ensembling, judge with a different model family, constrain output, and — critically — calibrate against human labels on a sample before trusting scores, recalibrating periodically. They use the judge for regressions/ranking (directional), not as absolute truth.
What matters in production: judge-human agreement (the validity check), bias controls (position/verbosity/self-preference), score stability (variance), and cost (judging is extra LLM calls). For online eval, sampled judging keeps cost bounded (Phase 7.08).
How to debug/verify: if eval rankings feel wrong, check judge-human agreement on a sample; test for position bias (does swapping order change the winner?), verbosity (do longer answers win?), and self-preference (does the judge favor its own family?). Fix the rubric/mode/judge model.
Questions to ask: could a programmatic check work instead? is the judge calibrated vs humans? rubric-based? pairwise + position-swap? different model family than the evaluatee? length controlled?
What silently gets expensive/unreliable: uncalibrated judges (wrong rankings shipped), position/verbosity/self-preference bias (systematic error), pointwise noise (unstable scores), and judging cost at scale (unsampled online judging).
5. Warmup Readings
| Title | Why to read it | What to extract | Difficulty | Time |
|---|---|---|---|---|
| 00 — Evaluation Overview | Scorer choices | programmatic > judge > human | Beginner | 15 min |
| 01 — Golden Datasets | What the judge scores | rubric labels | Beginner | 15 min |
| Phase 10.02 — Structured Output | Reliable judge output | constrained JSON | Beginner | 15 min |
| Phase 9.09 — RAG Evaluation | Judge for faithfulness/relevancy | calibration | Beginner | 20 min |
6. Deep Readings and External References
| Title | URL | Why it matters | Read first | Lab connection |
|---|---|---|---|---|
| Judging LLM-as-a-Judge (Zheng et al.) | https://arxiv.org/abs/2306.05685 | The biases + MT-Bench/Chatbot Arena | position/verbosity bias | This lab |
| Chatbot Arena (LMSYS) | https://lmarena.ai/ | Pairwise human + judge ranking | pairwise, Elo | Pairwise |
| Ragas / TruLens | https://docs.ragas.io/ · https://www.trulens.org/ | Judge-based metrics | faithfulness | 03 |
| G-Eval | https://arxiv.org/abs/2303.16634 | CoT rubric-based judging | reasoning-before-score | Rubric judge |
| Anthropic — eval/judge guidance | https://docs.anthropic.com/en/docs/test-and-evaluate | Practical judging | rubrics, calibration | Whole doc |
7. Key Terms
| Term | Simple meaning | Technical meaning | Why it matters | Where it appears | How to use it |
|---|---|---|---|---|---|
| LLM-as-judge | Model grades output | Strong model + rubric → score | Scalable subjective eval | everywhere | Calibrate it |
| Pointwise | Score one output | Absolute 1–5/0–1 | Track one system | mode | Rubric-anchored |
| Pairwise | A vs B | Pick the better output | Reliable ranking | mode | +position-swap |
| Rubric | Scoring criteria | Concrete dimensions + scale | Reduces noise/bias | judge prompt | Always use |
| Position bias | Order favoritism | First/position wins more | Corrupts pairwise | bias | Swap + require consistency |
| Verbosity bias | Longer wins | Length correlates with score | Inflates verbose | bias | Control length |
| Self-preference | Favors own family | Judge prefers its model's style | Unfair comparisons | bias | Different judge family |
| Calibration | Validate vs humans | Judge-human agreement | The validity check | required | Sample + measure |
8. Important Facts
- LLM-as-judge is the dominant scalable scorer for subjective quality — but prefer a programmatic check whenever one exists (Phase 11.08).
- Pairwise (A vs B) is more reliable than pointwise absolute scores for ranking systems.
- Judges are systematically biased: position, verbosity/length, self-preference (own model family), sycophancy/authority, style — unmitigated, they corrupt eval.
- Mitigate with: rubric · reasoning-before-score · pairwise + position-swap (consistent wins only) · ensembling · length control · a different judge model family · structured output (Phase 10.02).
- Calibration against human labels is non-negotiable — measure judge-human agreement on a sample before trusting scores; treat scores as directional.
- Don't self-judge — judging your own model family with that family inflates scores.
- Judging costs extra LLM calls — sample for online eval (Phase 7.08).
- It scores RAG faithfulness/relevancy (03), agent outcomes (04), and subjective code quality (05) at scale.
9. Observations from Real Systems
- Ragas, TruLens, LangSmith, Braintrust are built on LLM-as-judge for subjective metrics — the production standard (00).
- Chatbot Arena (LMSYS) uses pairwise human (and judge) comparisons → Elo rankings — pairwise's reliability at scale.
- The biases are documented and real — the "LLM-as-a-Judge" paper quantified position/verbosity bias; teams mitigate via swap/rubric/ensembles.
- Self-preference is a live concern — judging competitor models with one vendor's model can unfairly favor that vendor's style.
- Teams that calibrate (judge vs human sample) catch mis-rankings before shipping; those that don't sometimes ship the worse system (00).
10. Common Misconceptions
| Misconception | Reality |
|---|---|
| "The judge is ground truth" | Biased/noisy — calibrate vs humans; directional only |
| "Absolute 1–5 scores are reliable" | Pairwise is more reliable for ranking |
| "Order doesn't matter in pairwise" | Position bias — swap and require consistency |
| "Use the same model to judge itself" | Self-preference inflates — use a different family |
| "Just ask 'is this good?'" | Use a rubric + reasoning-before-score |
| "Longer answers are better (per the judge)" | Verbosity bias — control for length |
11. Engineering Decision Framework
SCORE A SUBJECTIVE DIMENSION:
1. PROGRAMMATIC check possible (tests/exact/JSON/recall)? → USE IT (objective, free) [11.08]. Else ↓
2. JUDGE setup:
- RUBRIC + scale anchor; REASONING before score; STRUCTURED output [10.02].
- ranking systems → PAIRWISE + POSITION-SWAP (count only consistent wins).
- reduce variance → ensemble / multiple samples; control LENGTH.
- JUDGE with a DIFFERENT model family than the evaluatee (avoid self-preference).
3. CALIBRATE: human-label a sample → measure judge-human AGREEMENT → fix rubric/mode/model until it tracks humans.
4. USE as DIRECTIONAL (regressions/ranking); recalibrate periodically; SAMPLE for online (cost) [7.08].
| Need | Choice |
|---|---|
| Objective check exists | Programmatic (not judge) [11.08] |
| Rank systems | Pairwise + swap + ensemble |
| Track one system over time | Pointwise + rubric (calibrated) |
| High-stakes / nuance | Human (gold) + calibrate judge |
| Online at scale | Sampled judge (cost-bounded) [7.08] |
12. Hands-On Lab
Goal
Build an LLM-judge, measure its biases, mitigate them, and calibrate against human labels — turning a vibe-check judge into a trustworthy scorer.
Prerequisites
- The golden set from 01;
pip install openai; two systems/outputs to compare; ~10 human labels.
Steps
- Pointwise judge: score outputs 1–5 with a rubric and reasoning-before-score (structured JSON, Phase 10.02). Note score variance across reruns (temperature 0 still varies, what-happens §7).
- Position-bias test (pairwise): compare A vs B and B vs A; measure how often the winner flips with order — that's position bias.
- Mitigate position bias: count a win only if consistent across both orders; re-measure.
- Verbosity-bias test: add a verbose-but-not-better variant; check if the judge prefers it; add an "ignore length" instruction or normalize and re-check.
- Calibrate: have a human label ~10 examples; run the judge on the same; compute agreement (e.g., correlation / pairwise-accuracy). If poor, improve the rubric/mode/judge model until it tracks humans.
- Self-preference (stretch): if you can, judge two model families with each as judge; see if each favors its own — then judge with a neutral third family.
Expected output
A judge with a rubric + structured output, measurements of position and verbosity bias (and their mitigations), and a judge-human agreement number establishing how much to trust it.
Debugging tips
- Winner flips on order → position bias; require consistency across swaps.
- Judge disagrees with humans → weak rubric or weak judge model; strengthen both; prefer programmatic where possible.
Extension task
Build a 3-model ensemble judge (majority/average) and show reduced variance vs a single judge; compare cost.
Production extension
Use the calibrated judge for online sampled scoring + offline regression gating (00, Phase 7.08); recalibrate on a fresh human-labeled sample periodically.
What to measure
Pointwise variance, position-bias flip rate (before/after swap), verbosity preference, judge-human agreement, ensemble variance reduction, judge cost.
Deliverables
- A rubric-based judge (reasoning-before-score, structured output).
- Bias measurements (position, verbosity) + mitigations.
- A judge-human calibration result (agreement) establishing trust level.
13. Verification Questions
Basic
- When do you use LLM-as-judge vs a programmatic check vs a human?
- Why is pairwise often more reliable than pointwise?
- Name four judge biases.
Applied 4. How do you neutralize position bias in pairwise judging? 5. Why must you calibrate the judge against humans, and how?
Debugging 6. Your eval ranks system B above A, but users prefer A. What judge problem might explain it? 7. The judge consistently prefers your own model's family. What's happening, and the fix?
System design 8. Design a trustworthy judge: rubric, mode, bias mitigations, calibration, online sampling.
Startup / product 9. Why is a calibrated judge (vs a naive one) the difference between trustworthy eval and an automated vibe check?
14. Takeaways
- LLM-as-judge is the scalable scorer for subjective quality — but prefer programmatic checks when they exist.
- Pairwise + position-swap beats noisy pointwise for ranking systems.
- Judges are biased (position, verbosity, self-preference, sycophancy, style) — mitigate with rubric, reasoning-before-score, swap, ensembling, length control, and a different judge family.
- Calibrate against human labels — measure agreement before trusting; treat scores as directional; recalibrate periodically.
- Sample for online judging (cost); judges score RAG/agent/code subjective dimensions (03/04/05).
15. Artifact Checklist
- A rubric-based judge (reasoning-before-score, structured output).
- Bias tests (position via swap, verbosity) + mitigations.
- A judge-human calibration (agreement) result.
- A pairwise ranking with position-swap consistency.
- A decision: where to use programmatic vs judge vs human.
Up: Phase 12 Index · Next: 03 — RAG Evals