Skip to work
All work
No. 262026LLM evaluation · Real Bedrock run

LLM Judge BiasAuditing the Judge That Scores Everything Else

An audit of the LLM-as-judge itself for position, verbosity, and assertiveness bias, judging controlled answer pairs in both slot orders with real Claude Haiku on Bedrock.

Headline results

Position bias
None, order-invariant
Verbosity bias
75%
Assertiveness bias
100%
Implication
Judge scores are gameable

System architecture

System architecture diagram for llm-judge-bias
Fig. 1 — LLM Judge Bias — system architectureFull size

Problem

LLM-as-judge is the backbone of modern evaluation, from leaderboards to RLAIF reward signals. It also has biases that inflate scores for reasons that have nothing to do with answer quality. If the judge rewards length or tone, every number built on top of it is measuring style as well as substance, and nobody downstream can tell the difference.

Approach

Three controlled pair sets are engineered so a fair judge has an obvious, order-independent answer, and any systematic deviation is the bias. Position pairs put a genuinely correct answer against a genuinely wrong one, verbosity pairs put a concise answer against an equally correct one padded with true-but-filler detail, and assertiveness pairs state identical correct facts hedged versus confidently. Real Claude Haiku 4.5 on AWS Bedrock judges all 32 pairs twice, once with each answer in each slot, producing 64 judgments. Both-order judging separates first_slot_rate (position preference, where 0.50 means none) from pick_worse_rate (how often the judge took the wrong, longer, or confident answer) and flip_rate (how often swapping the order reversed the verdict).

Impact

The judge has no position bias at all. On pairs with a clear correct answer it picked the wrong one 0% of the time, took the first slot exactly 0.500 of the time, and never flipped when the order was swapped. The bias is entirely in style. Verbosity bias ran to 0.750, a 75% preference for the padded answer where fair is 0.500, and assertiveness bias was total at 1.000, the confident phrasing winning in every single pair in both orders. The consequence is uncomfortable and concrete: a model under evaluation can lift its judge score by being longer and more assertive with zero improvement in substance, which is why order-swapping, length controls, and calibration against human labels are prerequisites for trusting a judge.

Decisions & tradeoffs

Judge every pair in both orders

One pass conflates position preference with the correct verdict. Running each pair twice with the slots swapped makes first_slot_rate and flip_rate measurable independently of whether the judge got the answer right.

Engineer pairs where fair behavior is known

Each pair has a defined fair value, 0.00 pick-worse for position and 0.50 for verbosity and assertiveness. Without a known fair baseline a rate is just a number, not a bias.

A fake judge with an injected bias

The offline judge is deliberately biased in a known direction and the tests assert the metrics recover it. This validates the bias arithmetic itself rather than trusting that the math is right.

Build spec

Biases
Position, verbosity, assertiveness
Pairs
12 / 10 / 10, each judged both orders
Judge
Claude Haiku 4.5 on AWS Bedrock
Result
position 0.000, verbosity 0.750, assertiveness 1.000
Cost
7,694 input / 1,636 output tokens

System notes

  • No position bias: 0.000 pick-worse, 0.500 first-slot, 0.000 flip rate across 12 pairs
  • 75% verbosity bias toward the padded but equally correct answer
  • 100% assertiveness bias for confident over hedged phrasing of identical facts
  • Every pair judged in both slot orders, isolating bias from the correct verdict

Stack

Python · Claude · AWS Bedrock · LLM-as-Judge · Evaluation · Bias

View source on GitHub
Next project
LLM Guardrails · Input/Output Safety Firewall for LLM Apps