Read our operating thesis — Machines work better in tandem
JOURNALEVALUATION · JULY 2026

Calibrating an LLM judge: inter-rater reliability for model-graded evals

An uncalibrated LLM judge is an opinion with a decimal point attached. Measure agreement with Cohen's κ before you trust it — and measure your humans against each other first, because that is the ceiling.

WRITTEN BYTandem Machines
Coordinated Intelligence
PUBLISHED
READING TIME18 minutes
SHARE
LinkedInX
KEY TAKEAWAYS
  • 01A judge score with no agreement measure is an opinion with a decimal point attached.
  • 02Measure human-human agreement first. It is the ceiling on what any judge can achieve, and if it is low your rubric is the problem.
  • 03Raw percentage agreement overstates reliability. Kappa corrects for the agreement chance alone would produce.
  • 04High agreement with near-zero kappa is the kappa paradox, and it means your eval set is imbalanced.
  • 05Judges have documented position, verbosity and self-enhancement biases. Test for them, don't assume them away.

The problem with a judge score

A model-graded eval returns a number — 78% pass, say. That number is uninterpretable on its own, because it conflates two things: how good the system is, and how good the judge is at recognising good. Without an agreement measure against human labels you cannot tell a real regression from a judge that changed its mind.

This is the position most teams are in. They have an eval suite, it produces a score, the score moves, and nobody can say whether the movement is signal. Worse, the judge is usually a model that gets silently updated, which means the measuring instrument drifts independently of the thing being measured.

“If the judge is unvalidated, your eval suite is not measuring your system. It is measuring the interaction between your system and an instrument of unknown accuracy.”

The fix is borrowed wholesale from a field that solved it decades ago. Content analysis, medical diagnosis and psychology all face the same problem — multiple fallible raters assigning labels — and the answer is an inter-rater reliability coefficient. The work is to apply it properly rather than to invent something.

Cohen’s kappa, and why not raw agreement

Kappa is observed agreement minus the agreement you would expect by chance, divided by the room left above chance: κ = (p_o − p_e) / (1 − p_e). It equals 1 for perfect agreement, 0 when raters do no better than chance, and goes negative when they agree less often than chance predicts.

Raw percentage agreement is the intuitive measure and it is misleading, because two raters who both mostly say “pass” will agree constantly without either of them discriminating anything.

Why raw agreement misleads
Two raters label 100 items. Both say "pass" 90% of the time, independently.

  observed agreement   p_o = 0.82        ← looks excellent
  expected by chance   p_e = (0.9 × 0.9) + (0.1 × 0.1) = 0.82

  κ = (0.82 − 0.82) / (1 − 0.82) = 0.00  ← they agree exactly as much as
                                            two coins weighted the same way

The 82% is entirely explained by both raters' preference for "pass".
It contains no evidence that either rater can tell pass from fail.
THIS IS WHY 'THE JUDGE AGREES WITH US 82% OF THE TIME' IS NOT A CALIBRATION CLAIM

Computing it is a one-liner in any standard toolkit, which removes the last excuse for reporting raw agreement instead.

Computing kappa
from sklearn.metrics import cohen_kappa_score

# Two label vectors over the SAME items, in the same order.
human  = ["pass", "fail", "pass", "pass", "fail", ...]
judge  = ["pass", "fail", "pass", "fail", "fail", ...]

kappa = cohen_kappa_score(human, judge)

# For an ordinal rubric (e.g. 1-5), near-misses should count partially:
kappa_w = cohen_kappa_score(human, judge, weights="quadratic")
USE WEIGHTED KAPPA FOR ORDINAL RUBRICS — UNWEIGHTED TREATS 1-vs-2 AS BADLY AS 1-vs-5
Interpretation bands
The conventional reading — roughly 0.21–0.40 fair, 0.41–0.60 moderate, 0.61–0.80 substantial, above 0.81 almost perfect — comes from a 1977 convention and is widely reproduced. Treat it as a shared vocabulary, not a law. For a judge, the meaningful target is not a band but your own human-human agreement on the same rubric.

Measure your humans first

Before comparing the judge to humans, compare humans to each other. That number is the ceiling: a judge cannot meaningfully agree with a standard that does not exist. If two careful annotators only reach κ = 0.45 on your rubric, the rubric is ambiguous — and no judge, however good, will rescue it.

This is the step almost everyone skips, and skipping it produces a specific and very common failure: a team concludes their judge is unreliable when in fact their task definition is unreliable, and they spend weeks tuning judge prompts against a target that was never achievable.

The canonical LLM-as-a-judge work makes exactly this point in the affirmative. Reporting on GPT-4 as a judge, Zheng et al. found it could match controlled and crowdsourced human preferences with over 80% agreement — which they note is the same level of agreement humans reach with each other. The claim is not that the judge is right; it is that the judge is as consistent as people are, which is the only standard available.

READING THE TWO NUMBERS TOGETHER
01Human κ high, judge κ highCalibrated. Report both and proceed
02Human κ high, judge κ lowThe judge is the problem. Tune the judge
03Human κ low, judge κ lowThe rubric is the problem. Fix the rubric first
04Human κ low, judge κ highSuspicious — the judge is probably matching one annotator's habits
THE DIAGNOSIS IS DIFFERENT IN EVERY CASE — AND ONLY ONE CALLS FOR PROMPT WORK

The fourth row is worth pausing on. A judge that agrees with humans more than humans agree with each other has usually learned a systematic quirk of whoever wrote the labels or the examples — which will look like excellent calibration right up to the point where the rubric is applied to something new.

The kappa paradox

When one label dominates, kappa collapses even though raw agreement is very high — because chance agreement is already near the observed rate. Two raters agreeing on 95 of 100 items can show a kappa near zero. This is a property of the statistic, not a bug in your data, and the fix is to change the evaluation set rather than the metric.

This bites hard in practice because real production traffic is imbalanced. If 97% of your agent’s responses are fine, an eval set sampled uniformly from traffic will be 97% “pass” — and kappa on that set will be unstable and pessimistic no matter how good your judge is.

Response to a low kappa on imbalanced dataVerdict
Stratify: oversample the rare class into the eval setCorrect. Kappa becomes informative again
Report per-class metrics as well as kappaCorrect. Recall on the rare class is what you actually care about
Drop kappa and go back to raw agreementWrong. You have removed the only correction for chance
THE FIRST TWO ARE THE RIGHT ANSWERS. THE THIRD IS WHAT PEOPLE DO INSTEAD

The practical consequence for an agent eval set: build it deliberately rather than by sampling. You want the failures over-represented, because the failures are the thing you are trying to detect — and a set that mirrors production will be dominated by the boring successes.

Which coefficient

Cohen’s kappa for exactly two raters on nominal labels. Fleiss’ kappa when more than two raters label every item. Weighted kappa when labels are ordinal and a near-miss should count partially. Krippendorff’s alpha when judgements are missing, rater counts vary, or the data is ordinal or interval.
CoefficientUse whenWatch for
Cohen’s κTwo raters, nominal labels, complete dataPrevalence sensitivity (the paradox above)
Fleiss’ κThree or more raters, every item ratedAssumes raters are interchangeable
Weighted κOrdinal rubric — 1-5, or severity bandsChoose linear vs quadratic weights deliberately
Krippendorff’s αMissing data, varying raters, ordinal/intervalLess familiar to readers; explain it

For agent evals the honest default is weighted kappa, because most useful agent rubrics are ordinal rather than binary — a response is not merely correct or wrong, it is excellent, acceptable, poor or harmful. Unweighted kappa treats “acceptable versus poor” as exactly as bad a disagreement as “excellent versus harmful”, which is obviously wrong and quietly distorts everything downstream.

Known judge biases, and how to test for them

The LLM-as-a-judge literature identifies position bias, verbosity bias and self-enhancement bias, plus limited reasoning ability on some task types. Each has a cheap test: permute the order, control for length, and include outputs from the judge’s own model family among the things being judged.
BiasWhat it doesThe test
PositionThe option presented first (or last) wins more oftenRun every pair twice, swapped. Disagreement rate is the bias
VerbosityLonger answers score higher regardless of qualityRegress score on token count; check the slope is flat
Self-enhancementA model favours outputs resembling its ownInclude same-family outputs; compare to human labels
Limited reasoningGrades poorly on tasks it cannot itself performCheck κ separately on your hardest task category
EACH TEST IS A FEW HOURS. NOT RUNNING THEM IS AN ASSUMPTION, NOT A SAVING
Position-bias test
# Present each pair in both orders. A consistent judge gives the same winner.
flips = 0
for a, b in pairs:
    first  = judge(option_1=a, option_2=b)
    second = judge(option_1=b, option_2=a)
    # Normalise: 'option_1' in the second call refers to b.
    if winner_identity(first, a, b) != winner_identity(second, b, a):
        flips += 1

position_bias_rate = flips / len(pairs)
# Anything materially above zero means your pairwise scores carry an
# order artefact. Mitigate by always averaging both orders.
THE MITIGATION IS CHEAP: SCORE BOTH ORDERS AND AVERAGE. THE COST IS 2× JUDGE CALLS

The last row of the table is the one that catches agent teams specifically. A judge asked to grade whether a multi-step trajectory was sensible is being asked to do the reasoning it is grading. If your hardest category is also where κ drops, you have found the limit of model-graded evaluation for that category, and the answer there is human review rather than a better prompt.

The calibration protocol

Six steps: write the rubric, have two humans independently label a stratified sample, compute human-human κ, fix the rubric if it is low, run the judge on the same sample and compute judge-human κ, then re-run the whole thing whenever the rubric or the judge model changes.
The protocol, concretely
1. RUBRIC
   Write it as decidable criteria, not adjectives.
   Bad:  "the response is helpful"
   Good: "the response answers the question asked, cites the order ID,
          and does not promise anything outside the refund policy"

2. SAMPLE  (stratified, not uniform)
   ~300 items for a binary rubric; more for many categories.
   Deliberately over-represent failures and edge cases.

3. TWO HUMANS, INDEPENDENTLY
   No discussion until both are done. Discussion first produces
   agreement that measures conversation, not the rubric.

4. HUMAN-HUMAN κ  ← THE CEILING
   κ < 0.6?  Stop. Rewrite the rubric and re-label. Do not proceed
   to the judge; you have nothing to calibrate against.

5. JUDGE-HUMAN κ
   Run the judge on the same items. Compare against the ceiling,
   not against an abstract threshold.

6. RE-RUN ON CHANGE
   Any rubric edit, judge-model change, or judge-prompt change
   invalidates the calibration. Pin the judge model version.
STEP 4 IS A GATE, NOT A METRIC — IF IT FAILS, THE REST OF THE PROTOCOL IS MEANINGLESS

Pin the judge model

A calibration is a statement about a specific judge model at a specific version with a specific prompt. If any of the three changes, the number no longer applies — and since providers ship model updates on their own schedule, an unpinned judge means your eval suite silently recalibrates itself without telling you. Pin the version, and treat a judge upgrade as a change that requires re-calibration before it ships.

Sample size and intervals

Report a confidence interval, not a point estimate. A κ of 0.72 from 40 items and a κ of 0.72 from 400 items are different claims, and only one of them supports a decision. Bootstrap the interval if a closed form is inconvenient — resampling the labelled set a few thousand times is cheaper than the meeting you will have about whether the number moved.

What to report

Every eval result should carry four things: the score, the judge-human κ with its interval, the human-human κ it is being compared against, and the judge model version. A score without the other three is not a measurement, and a reader cannot tell whether to believe it.
A defensible eval report line
eval: refund_correctness         2026-07-30
  score .................. 78.4%  (n = 1,204)
  judge–human κ .......... 0.74   [0.68, 0.79]   ← weighted, quadratic
  human–human κ .......... 0.79   [0.73, 0.84]   ← the ceiling
  judge ................... claude-opus-5 @ prompt v4  (pinned)
  position-bias rate ...... 0.03
  eval set ................ stratified: 40% failure-weighted

Read as: the judge is performing near the achievable ceiling on this
rubric, so the 78.4% can be treated as a property of the system rather
than of the measuring instrument.
THE LAST SENTENCE IS THE POINT OF ALL OF THIS — IT LICENSES YOU TO TRUST THE SCORE

That final line is what calibration buys. Not a better score — the score is whatever it is — but the right to attribute it to your system. Without it, every eval discussion has an unresolvable ambiguity at the centre of it, and teams end up arguing about vibes with numbers attached.

Two connections worth making. Calibration needs labelled trajectories, which means it depends on having captured them — the evidence layer is a prerequisite, not a parallel workstream. And the reason trajectory evaluation is hard in the first place is the same reason agents are hard to test at all, which is the argument for building a workflow where you can.

Frequently asked questions

What is inter-rater reliability?

Inter-rater reliability is the degree to which independent raters assign the same label to the same item. It matters for evaluation because raw percentage agreement overstates reliability — two raters who both guess will agree often by chance — so reliability coefficients correct for the agreement you would expect at random.

How do you calculate Cohen's kappa?

Kappa is (observed agreement − expected agreement) ÷ (1 − expected agreement). Expected agreement is what two raters would achieve by chance given how often each uses each label. The result is 1 for perfect agreement, 0 for chance-level agreement, and negative when raters agree less than chance would predict.

What is a good Cohen's kappa for an LLM judge?

Judge it against your human-human agreement rather than a fixed threshold, because that is the achievable ceiling. Conventional interpretation bands treat roughly 0.61–0.80 as substantial and above 0.81 as almost perfect, but those bands are a convention rather than a law — a judge matching human-human agreement on the same rubric is the meaningful target.

Why is my agreement high but my kappa low?

That is the kappa paradox, and it happens when one label dominates. If 95% of items are 'pass', two raters who both say pass almost always will show very high raw agreement and near-zero kappa, because chance agreement is already high. The fix is to balance the evaluation set or report a coefficient less sensitive to prevalence, not to drop kappa.

What biases affect LLM judges?

Research on LLM-as-a-judge identifies position bias, verbosity bias and self-enhancement bias, along with limited reasoning ability on some tasks. In practice that means the order you present options can change the winner, longer answers are favoured regardless of quality, and a model can prefer outputs resembling its own.

Should I use Cohen's kappa, Fleiss' kappa or Krippendorff's alpha?

Cohen's kappa for exactly two raters on nominal labels; Fleiss' kappa when more than two raters each label the items; weighted kappa when labels are ordinal so that near-misses should count partially; Krippendorff's alpha when you have missing judgements, varying numbers of raters, or ordinal and interval data.

How many items do I need to calibrate a judge?

Enough that the confidence interval around your kappa is narrow enough to act on — usually a few hundred items for a binary rubric, more if labels are imbalanced or the rubric has many categories. Report the interval rather than the point estimate, because a kappa of 0.7 from 40 items and one from 400 are not the same claim.

Sources

  1. 01Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena Zheng et al., 2023
  2. 02sklearn.metrics.cohen_kappa_score scikit-learn, 2026
  3. 03statsmodels.stats.inter_rater.fleiss_kappa statsmodels, 2026
Tandem Machines
Notes on coordinated intelligence — one essay a month
Subscribe