AI agents

How to Calibrate an LLM Judge Against Human Labels

Antonio Evans9 min read

A split-screen scene: on the left, a human evaluator in a simple office setting marks a checklist on a printed document; on the right.
Key points

Key points

  1. 1Calibrate a judge by sampling a few hundred examples per task, labeling them independently with two or more people, and measuring how well the judged scores match the human consensus.
  2. 2Percent agreement alone hides the problem: a judge that always returns the majority label can look accurate while agreeing no better than chance, which is why Cohen's kappa matters.
  3. 3Set a kappa threshold by the cost of being wrong, roughly 0.6 for exploratory use and 0.8 before a judge gates high-stakes decisions.
  4. 4Calibration is not a one-time task: keep human labels flowing on a schedule and chart judge agreement so you notice drift instead of discovering it in production.

Why a judge needs a calibration set

An LLM judge is a classifier with a prompt instead of training weights, and like any classifier it has to be validated before you trust its output. The usual failure is not a judge that reads text badly but a judge whose notion of "good" drifts from the product team's. LangChain's guide to LLM judges describes the fix as a systematic alignment loop: collect human corrections, turn them into few-shot examples, and track agreement over time rather than guessing at the rubric.

The evidence for doing this is not hypothetical. Judging the Judges tested nine judge models against human annotations on TriviaQA and found that percent agreement and kappa can tell completely different stories. Strong judges reached kappa values of 79 and 84 against human labels, below the human-to-human agreement of 96, while other judges looked acceptable by raw agreement yet assigned very different score distributions. Selectivity, not just accuracy, is what calibration measures.

That distinction matters because the judge decides what ships. A model that passes everything will pass your CI pipeline while real regressions reach users. DeepEval's guide to LLM-as-a-judge reports that judges agree with human reviewers roughly 85% of the time, about the level humans reach with each other, which is good news but only for a judge someone bothered to check.

Build a stratified calibration sample

Start from the population the judge will actually score. If the judge runs on production traces, pull from production traces; do not write tidy examples from imagination. Langfuse's guide to golden datasets treats this fixed set of test cases as the thing every meaningful change runs against, and it has to be versioned the same way.

Size and composition

A few hundred examples per judge task is a reasonable target. Raters with fewer than about 10 annotations per label cannot produce a kappa you should act on, and a confidence interval on kappa computed from a handful of rows is wider than any threshold you would set. For a three-label rubric, plan on at least 20 to 30 examples per label, then add volume where the business risk is highest.

Stratify on three axes:

  • Rarity and risk. Over-sample the outputs that cause incidents (refunds, medical or legal claims, prompt-injection attempts) even if they are rare in traffic.
  • Boundary cases. Include outputs that sit close to the rubric line, because this is where judge disagreement concentrates.
  • Known edge cases. Every past bugfix should contribute a row, so the set grows as failures are found.

Google Cloud's framework for agent evaluation recommends starting with success criteria written as measurable statements, such as "grounded in known documents and free of claims outside them," so that the rubric you hand raters is the rubric the judge receives.

Keep prompt-tuning examples out

Never calibrate on the examples you used to write the judge prompt. OneUptime's walkthrough of kappa calibration is explicit about keeping the calibration set separate from the examples used to write or tune the judge prompt, and about freezing the judge itself: pin the model, the full prompt, the supplied references, the output schema and decoding settings.

Store each row with enough metadata to audit later. A minimal record looks like this:

{
  "case_id": "policy-018",
  "input": "...",
  "response": "...",
  "human_label": "fail",
  "human_reason": "Claims a refund is guaranteed after the policy deadline",
  "rubric_version": "policy-correctness/4"
}

Collect independent human labels and resolve disagreements

Two raters per example is the floor. One rater cannot reveal ambiguity, and ambiguity in the human labels is exactly what an LLM judge will amplify. Innodata's overview of golden datasets frames these human-validated labels as ground truth against which model output is measured, and notes that quality of the label set caps the quality of everything downstream.

Give raters the same package: label definitions, authoritative references, boundary examples, and one decision per case. Ask them to label independently, without seeing each other's votes or the judge's output, and note a reason for every failing label. Do not change past labels once the judge's results are visible.

Then adjudicate. Where the two humans disagree, a third senior reviewer decides against the written requirement, and you keep all three votes in the record. Treat repeated disagreements as signal that the rubric is underspecified, not that one rater is careless. A judge cannot be calibrated to a rubric that two experts apply differently.

Worked example

Suppose you build a 300-case set for a support-response judge with three labels: pass, needs edit, fail.

StagePassNeeds editFailTotal
Rater A1907040300
Rater B1827444300
Both agree1786138277
One-off disagreements1213631
Adjudicated consensus1857243300

Human-to-human percent agreement here is 277/300, or 92.3%. Exchangeable raters at that level are a workable calibration target for the judge.

Compute agreement statistics and read them correctly

Three numbers belong in every calibration report.

Percent agreement

The share of cases where the judge's label equals the human consensus label. It is intuitive and worth report, but it flatters judges whenever one label dominates. The AWS sample on Cohen's kappa for LLM judges gives the standard example: if 80% of responses are correct, a judge that always says "correct" scores 80% accuracy while contributing nothing.

Cohen's kappa

Kappa corrects observed agreement for the agreement expected from each rater's label frequencies. Formally, kappa = (Po - Pe) / (1 - Pe), where Po is observed agreement and Pe is the chance agreement implied by the marginals, as defined in the kappa guide. Use unweighted kappa for nominal labels, and weighted kappa when the labels are genuinely ordered.

from sklearn.metrics import cohen_kappa_score, confusion_matrix

ALLOWED = {"pass", "needs_edit", "fail"}
LABELS = ["pass", "needs_edit", "fail", "judge_error"]

def normalize(value: str) -> str:
    label = (value or "").strip().lower()
    return label if label in ALLOWED else "judge_error"

human = [normalize(x) for x in human_consensus]
judge = [normalize(x) for x in judge_outputs]

raw_agreement = sum(a == b for a, b in zip(human, judge)) / len(human)
kappa = cohen_kappa_score(human, judge, labels=LABELS)
print(raw_agreement, kappa)
print(confusion_matrix(human, judge, labels=LABELS))

Keep parse failures and refusals in the denominator as their own label. A judge that answers correctly on 90% of cases and errors on the rest has 90% conditional accuracy and 81% end-to-end agreement.

That arithmetic matters more than it looks. At 300 cases, a judge with 81% agreement has a standard error of about 2.3 percentage points, so its 95% interval runs roughly 76.5% to 85.5%. If your release threshold is 85%, the run cannot prove the judge clears it. Budget for 500 or more cases when the threshold sits close to your measured result.

Correlation

When the judge outputs a score rather than a label (1 to 5, or 0 to 100), report Pearson correlation if you care about the linear relationship and Spearman if you care that the rank order matches. Correlation catches a judge that ranks outputs sensibly while sitting systematically high or low, which kappa on a binarized score can hide. Report both the correlation and the mean offset.

Read the confusion matrix, not just the headline

For every calibration run, inspect four cells: human-pass and judge-fail, human-fail and judge-pass, and the two agreement cells. In practice, judge-pass on a human-fail case is the costly cell, because it lets defects through. If that cell is populated, tighten the failing definitions and add the cases to the few-shot examples before re-running. MLflow's LLM-as-a-judge documentation notes that its evaluation tooling supports aligning judges with human feedback so automated scores stay tied to the team's quality standards, which is the same inspect-and-repair loop.

Set thresholds by decision risk

A single kappa number is not a quality grade; it is an input to a decision about how much autonomy the judge gets. The widely used interpretation bands come from medical and social-science agreement research, and the common engineering reading is that 0.61 to 0.79 is substantial while 0.80 and above is near-perfect, per the kappa guide for LLM judges.

Judge kappaWhat it supportsOperating rule
Below 0.40Nothing automatedRubric revision; treat scores as noise
0.41 to 0.60Dashboards and trend watchingRoute every failing case to a human
0.61 to 0.79Low-stakes gating, prompt experimentsShip on judge pass; sample 10% of passes for audit
0.80 and aboveCI gates and release decisionsFull automated gating, monthly re-check

Pick your threshold before you see the first kappa, or you will negotiate with yourself. Then buy margin: if the lower bound of your confidence interval sits below the threshold, add labels rather than declaring victory. For experiments where you only need relative comparisons between two prompts, 0.6 is usually enough because systematic judge bias cancels; for decisions about refunds or safety, the judge needs the higher band.

Monitor the judge after you ship it

The judge is a model in production and drifts for the same reasons your product does: prompts change, model versions get retired, traffic shifts, and the rubric's boundary cases get more common. LangChain's evaluation framework guide describes the production flywheel where real failures flow into annotation queues, get expert review, and return as regression tests, which is also how you keep a judge calibrated.

A practical monitoring loop:

  1. Re-label on a schedule. Pull a fresh stratified sample of 50 to 100 production cases every month, or every two weeks while the product is changing fast, and have humans label them with the same rubric.
  2. Compute kappa against consensus on each pull. Chart it on a control chart with the calibration baseline as the center line and limits at roughly plus or minus two standard errors.
  3. Add alarms for the error cells. A rise in judge-pass on human-fail, or a sudden jump in judge errors and refusals, is an incident even if kappa looks stable.
  4. Promote every confirmed miss to the permanent set. Regressions belong in the calibration set so they are re-tested on the next judge change.
  5. Re-calibrate after any edit. Any change to the judge prompt, model or schema resets the clock and requires a fresh run on the untouched set.

Anthropic's guide to evals for agents makes the broader case: without evaluation infrastructure, teams catch issues only in production, where fixing one failure often creates another. A judge with a monitored kappa is what lets you stop firefighting.

Extend calibration to trajectory and agentic judges

If your judge scores a multi-step transcript rather than a single response, the same calibration mechanics apply with two changes. First, the human label must be attached to the same object the judge sees. Google's methodical approach separates agent success from process and trajectory, and points out that an agent can produce a correct output through an inefficient or wrong path, a silent failure. Second, sample traces, not final answers, so the judge and the humans are grading the same thing.

Because agents are non-deterministic, run the judge more than once per case and report both single-run agreement and label stability. Majority voting over three passes is a different judge configuration with its own kappa, a higher cost and often a different disagreement pattern, so calibrate the variant you intend to deploy rather than the one that flatters you. The Rise of Agent-as-a-Judge surveys this space and is clear on the boundary: agent-based judging complements human oversight, it does not replace it, and meta-evaluation of the judge is still an open problem.

The practical rule is the one that keeps teams out of trouble. Spend the annotation budget on the cases where a wrong judge verdict is expensive, and let the cheap deterministic checks (schema validity, length, required disclaimers) carry everything they can. Evidently's guide to LLM-as-a-judge is a useful reference for choosing between pairwise comparison, criteria scoring and reference-based scoring, because the calibration statistic has to match the judge's output type.

If you would rather run the judge on traces and scores that already sit in one place, Quanta Inference gives you one OpenAI-compatible endpoint for the judge model and any generation models you are comparing, so calibration runs and production scoring use the same path.

FAQ

FAQ

How many examples do I need to calibrate a judge?

Plan on a few hundred per judge task, with at least 20 to 30 examples per label for a categorical rubric. Fewer than about 10 per label produces a kappa whose confidence interval is too wide to support any deployment decision. If your release threshold sits close to your measured kappa, add cases until the interval's lower bound clears it.

Should I use percent agreement or Cohen's kappa?

Report both and decide on kappa. Percent agreement is intuitive but inflated whenever one label dominates the data, and a judge that always returns the majority label can reach high agreement while learning nothing. Kappa corrects for chance agreement using each rater's label frequencies, so it separates judges that discriminate from judges that rubber-stamp.

What do I do when the two human raters disagree?

Adjudicate with a third, senior reviewer against the written requirement, and keep the original votes in the record. Repeated disagreement on the same kind of case is a signal that the rubric is underspecified rather than that a rater is wrong. Clarify the rubric and re-label those cases before you compare the judge to anything.

Does a good kappa mean the judge can gate releases automatically?

Only above your pre-agreed threshold, typically 0.80 for high-stakes decisions, and only with monitoring in place. A judge is a model in production and drifts when prompts, model versions or traffic change. Schedule fresh human labels on a regular cadence, chart kappa on a control chart, and re-calibrate after any change to the judge.

How do I calibrate a judge that scores full agent trajectories?

Sample complete traces rather than final answers, and label the same object the judge receives: the tool calls, intermediate reasoning and outcome. Run the judge more than once per case because agents are non-deterministic, and report label stability alongside agreement. Calibrate the exact configuration you will deploy, including any majority voting, since voting changes both cost and agreement.

Sources

Sources

  1. How to Calibrate LLM-as-Judge with Human Corrections
  2. Evaluating Alignment and Vulnerabilities in LLMs-as-Judges
  3. LLM-as-a-Judge Simply Explained: The Complete Guide ... - Confident AI
  4. Golden dataset evaluation: build and maintain LLM test sets - Langfuse
  5. A methodical approach to agent evaluation | Google Cloud Blog
  6. How to Calibrate an LLM-as-a-Judge Against Human ...
  7. What are Golden Datasets? LLM & AI Evaluation Guide - Innodata
  8. cohens-kappa-for-llm-judges.md - sample-GEDD
  9. LLM-as-a-Judge Evaluation for LLMs & Agents - MLflow
  10. LLM Evaluation Framework: Trajectories vs. Outputs - LangChain
  11. Demystifying evals for AI agents - Anthropic
  12. The Rise of Agent-as-a-Judge Evaluation for LLMs - arXiv
  13. LLM-as-a-judge: a complete guide to using LLMs for evaluations
About the author

About the author

Antonio Evans
Antonio Evans

Antonio Evans is the founder of Quanta Intelligence and a fractional CTO who builds HIPAA-ready AI systems for health and life-science companies. Before that he was technical co-founder of FriendsEAT for twenty years, CEO of Socialdraft, and a data engineer at IBM. Antonio lives with his dog Santino in Lisbon, Portugal.

All articles