Evals and ObservabilityJudging the output

Pairwise comparison and human review that scales

"Which is better, A or B" gets a cleaner answer than "rate this 1 to 5."

WHY THIS, FOR YOU

You asked five reviewers to rate a batch of answers from 1 to 5, and got noise back: two reviewers gave the same answer a 3 and a 5, and neither one was wrong, they just weighted things differently. A star rating asks a reviewer to invent an absolute scale in their head and hold it steady across a hundred examples, which people are bad at and inconsistent about. This lesson covers a question people answer more consistently - which of these two is better - and how to spend a human reviewer's limited attention on the comparisons that actually change a decision, instead of reviewing everything.

How to trust a judge got you a judge you can rely on for most cases. This lesson is about the reviewer time you still have left over - human or model - and how not to waste it on the wrong question.

1.Why "rate this 1 to 5" gets you noise

Ask a reviewer to score an answer on a scale and you're asking them to do two things at once: build a mental reference for what a 3 looks like versus a 5, and then hold that reference steady across a hundred examples reviewed over an afternoon. People don't do this consistently. Scores cluster in the middle of the range because reviewers hedge, drift over a session as fatigue sets in, and disagree with each other in ways that have nothing to do with the answer's actual quality. None of that is a training problem you can fix with a better rubric page - it's a property of the task you asked for.

Pairwise comparison asks a smaller, more concrete question: given these two answers to the same input, which one is better? That's a task people (and judges) answer far more consistently, because there's no scale to invent - just a choice between two things sitting side by side. The same holds when the reviewer is a judge model rather than a human: a judge asked to compare tends to agree with human preference more closely than the same judge asked to rate each answer alone.

Absolute scoring (1-5, or similar)Pairwise comparison
What it asksHow good is this, on its ownWhich of these two is better
Consistency across reviewersLow - scores cluster and driftHigher - a binary choice is easier to hold steady
Reviewer fatigueCompounds - each score requires inventing contextLower per judgment, but many more judgments needed to rank many items
Cost to compare N itemsOne score each, N judgmentsGrows with the number of pairs, not just N
Best forA single absolute bar you check against repeatedly (did this clear a floor)Deciding which of a few candidates is better - a prompt edit, a model swap, a rollout decision
Reading down the rows: pairwise wins on consistency everywhere but the last one - the cost of comparing N items - which is the row that decides whether pairwise fits the task in front of you.

Use absolute scoring where you genuinely need a floor - "did this pass," "is this safe to show a user" - and pairwise where the actual question is "which of these two should we ship."

2.Pairwise comparison, and its own trap

Pairwise isn't a free fix, and treating it as one is the mistake to avoid here. A judge asked to compare two answers can still favor whichever one it saw first, for the same structural reason a scoring judge does - it's reading position, not just content. Research specifically comparing the two setups has found that pairwise comparison can amplify an evaluator's existing biases rather than remove them: a judge that leans toward longer or more confidently worded answers carries that lean straight into the comparison, and a side-by-side layout gives it more surface to act on, not less.

The fix is the same one from the last lesson, applied again here rather than assumed to be handled already: randomize or swap which side each answer appears on, across every comparison you run, human or model. If flipping the order flips the verdict on the same pair, the "better" answer was actually "the one in slot A," and you've learned something about your judge, not about the two candidates.

A star rating tells you a reviewer's mood. A pairwise choice tells you their preference - as long as you don't let the slots tell you the answer first.

The other real cost is scale. Comparing every pair among a set of candidates grows with the square of how many candidates you have - five candidates is ten pairs, twenty candidates is one hundred and ninety. That's fine when you're comparing two prompt versions head to head, which is the common case in this course. It stops being fine the moment someone suggests ranking a dozen candidate prompts against each other pairwise "to be thorough." Don't do that. Pick the comparison you actually need answered - usually old vs. new, one pair - and save the combinatorics for problems that genuinely require ranking many things against each other.

Two versions, head to head · 1 pairs190 pairs · A dozen or more candidates, ranked · LOG
A logarithmic scale from 1 pairs to 190 pairs. Two candidates, 1 pair. Five candidates, 10 pairs. Twenty candidates, 190 pairs.
The pair count on a log scale, straight from the numbers above: two versions head to head is a single pair, but the moment a dozen or twenty candidates want ranking, the count is already in the hundreds.

3.Spending a human reviewer's attention where it changes a decision

None of this argues for reviewing everything by hand - that was never the plan, and it doesn't scale past a demo. The plan is to have judges handle the volume and route a human only to the comparisons where a human's judgment would actually change the outcome.

Two signals tell you where that is. Disagreement: run the comparison through two judges (different models, or the same judge with the order swapped) and send a human only the cases where they land on opposite sides. Low confidence: if your judge setup produces something like a margin or a repeated-run consistency check, a comparison the judge itself is unsure about is exactly the one worth a second, human opinion. Everything else - the cases where judges agree confidently and repeatedly - is not where a human's hour is best spent.

from collections import Counter

def needs_human_review(question: str, answer_a: str, answer_b: str,
                        judge_fn, n_runs: int = 3) -> bool:
    """Sample the same comparison a few times, swapping order half the time.
    Route to a human only on disagreement - not on every comparison."""
    verdicts = []
    for i in range(n_runs):
        if i % 2 == 0:
            verdicts.append(judge_fn(question, answer_a, answer_b))
        else:
            flipped = judge_fn(question, answer_b, answer_a)
            verdicts.append("B" if flipped == "A" else "A")  # un-swap the label

    counts = Counter(verdicts)
    top_count = counts.most_common(1)[0][1]
    agreement = top_count / n_runs
    return agreement < 1.0   # anything less than unanimous goes to a human

# Example: three runs, one disagreement -> flagged for human review
sample_verdicts = ["A", "A", "B"]
print(Counter(sample_verdicts).most_common(1)[0][1] / len(sample_verdicts))  # 0.67, flagged
i = 0, order not swapped
The judge sees answer A first, answer B second, and records its verdict as given.
  1. verdicts so far["A"]
The three-run example from the code, one call at a time: two runs land on A, the third disagrees, and anything short of unanimous is what sends a case to a human.

This is a small function doing a large amount of work: it turns "review everything" into "review the fraction that's actually ambiguous," which is usually a small slice of total volume. Write down what "better" means for your task - correctness first, tone second, whatever your rubric actually is - before a reviewer sees a single example, so that when a case does reach a human, they're applying the same standard the judges were asked to apply, not inventing a new one on the spot.

With a calibrated judge and a way to route the hard cases, you have what you need to check a change before it ships. Regression testing a prompt or model change is where that judgment gets applied to an actual diff.

WHAT YOU TAKE AWAY

  1. Ask "which is better" before you ask "how good" - scores compress toward the middle, comparisons don't.
  2. Randomize which side an answer appears on, in every pairwise comparison, human or model.
  3. Write down what "better" means before a reviewer sees a single example.
  4. Route a human to a case only when judges disagree or confidence is low.
  5. Treat a full human review of every output as the exception, not the default.

RECALL NO SCROLLING BACK

  1. Two reviewers rate the same answer a 3 and a 5 on a 1-to-5 scale. What does this usually mean?

  2. Why does pairwise comparison usually track human preference better than a 1-to-5 score?

  3. What's the real cost of pairwise comparison at scale?

  4. Pairwise comparison automatically removes position bias from a judge. True or false?

  5. You have a fixed number of hours of human review time each week. Where should most of it go?

GO DEEPER