LLM aspect ratings
Victor Friedrich · Bachelor's thesis in Informatics · TU Munich

Testing an LLM judge when the human labels are biased.

How should an LLM's scores be evaluated when the human scores they're compared with are unreliable? On Hostelworld, guests rate seven aspects of each stay, but 40% give all seven the same score. This thesis evaluates an LLM scoring pipeline across 342 hostels and three models, without treating those ratings as correct. It tests whether LLMs separate the aspects better than guests do, which pipeline design choices entangle the scores, how stable they stay when LLMs have less information available, and how fine-grained the resulting scores are.

How much the seven aspects move together0.78
more independentone overall feeling
Guests' ratings7 cities
Facil.Secur.StaffAtmos.Loc.ValueCleanFacil.Secur.StaffAtmos.Loc.0.960.930.930.850.890.880.830.900.860.890.440.400.520.480.440.930.970.930.940.920.48
Correlation between two aspects across hostels. Dark red = they rise and fall together. Outlined: cleanliness × location.
Step 1 of 5
One feeling, seven scores

A hostel rated well on one aspect tends to be rated well on all seven. Psychologists call this the halo effect: one overall impression shapes every specific judgment. The clearest sign comes from guests of the same hostel, who all share one address: across 357 hostels, guests who rate cleanliness 4 or lower rate the location 1.8 points below their hostel's average.

Same hostel, same address
Guests who rated cleanliness← location rated lowerhigher →
4 or lower
−1.8
6
−0.5
8
−0.1
10
+0.4
Result 1

Models tell the aspects apart,
and not at random.

All three models rank hostels almost exactly like guests do, but their seven aspect scores are far less alike. Where they come apart matches the guests who did not give every aspect the same score.

Same ranking as guests
Overall score per hostel, 342 hostels. The models score lower than guests and on a narrower range, but in the same order. Calibration maps them onto the guests' scale with a straight-line fit made on these same hostels, so its low error is optimistic.
000.250.250.50.50.750.7511Claude scoreGuests' score
r 0.974MSE 0.011n 342
Models loosen the same links as guests whose scores vary
How strongly aspects move together (average correlation), for three kinds of pairs. Cleanliness, facilities and security stay linked: a run-down building hurts all three. Staff, atmosphere and value loosen. Location comes free entirely, since the address says nothing about the rest. Guests whose scores vary show the same order, only weaker.
All guestsGuests whose scores varyClaudeDeepSeekJev
0.000.250.500.751.000.910.880.740.740.74Physical0.890.750.470.580.34Subjective0.510.240.07-0.000.02Location
Limits

LLM scores are stable between runs,
but need many reviews.

Two separate tests of how far a single score can be trusted.

Test 1 · Same input, three runs

Each hostel was scored three times with identical settings. A score is only useful if a rerun lands close to it, measured against how far hostels differ from each other. All three models pass: the spread between hostels is 31 times the run-to-run variation for Claude, 50 times for Jev and 6 times for DeepSeek. That is enough to rank hostels. But DeepSeek's reruns vary as much as its prompt versions do, so subtle variations from prompt design cannot be measured.

Three runs per hostel
Each group of three dots is one hostel scored three times.
Claudehostels ÷ runs 31×
spread between runs 0.005between hostels 0.166
DeepSeekhostels ÷ runs 6×
spread between runs 0.027between hostels 0.157
Jevhostels ÷ runs 50×
spread between runs 0.003between hostels 0.153
Test 2 · Less text

Each hostel was scored again from random samples of its reviews, from about 5 to 43 reviews. At every size, the guests' own average gets closer to its full-sample value than the models do.

Agreement with the score from all reviews
Correlation between scores from a sample of reviews and from all reviews, by characters of review text. 1 = same ranking of hostels.
Guests' averageClaudeJev
0.500.600.700.800.901.001.25k2k5k10kGuests' averageClaudeJev
Precision

64% of DeepSeek's scores
end in a 5.

A score of 0.85 looks precise to the hundredth. Add the scores ending in 0 and it is 81%: in practice DeepSeek scores in steps of 0.05. Claude is not much better, with 84% of its scores ending in 2, 5 or 8. So differences of a few hundredths carry no information.

How often each last digit appears
Share of scores ending in each digit (the second decimal). Digits used: how many of the ten the scores effectively spread over; 10 means all equally.
0123456789digits usedDeepSeek3.3 of 10Claude5.0 of 10Guests' average10.0 of 10Jev9.9 of 10
What to do instead

For finer scores, use a model that returns a probability per rating level and average the levels by probability, as Jev does over ten levels. Note that the guests’ score and Jev’s are both averages, so they are finer-grained by design, not because they read the text better.

Cost

Caching sets the price,
and the prompt order.

Per token, Claude costs 5 to 31 times as much as DeepSeek. What matters is the cost per hostel, and that depends on how the scoring is designed and how each provider caches. Scoring one aspect per call means eleven calls over the same reviews. With caching they cost Claude 2.2× a single call, not 11×.

Reviews first, instruction last
Caching only reuses an identical prefix. So the pipeline reverses the usual prompt order, which puts the instruction first. The schema sits in the prefix too, so it has to be the same for every aspect. Whether the reversed order costs accuracy is untested: testing it means paying full price for every call.
Reviews
≈110k characters
Schema
same for every aspect
Rate cleanliness
changes per call
cached once, reused by all eleven callspaid in full
Caching cuts Claude's per-aspect cost from 64¢ to 13.6¢ per hostel
Real-time cost per hostel in US cents at listed prices. The grey bar is the same eleven calls priced without caching.
Claude, aspects individually, no cache64.3¢Claude, aspects individually13.6¢Claude, aspects together6.2¢DeepSeek, aspects individually4.7¢DeepSeek, aspects together0.51¢Jev0.08¢

Providers cache differently

On Bedrock, Claude reads cached tokens at a 90% discount, which cuts the per-aspect bill by 79%. DeepSeek through OpenRouter gives about 50% off and hits the cache less reliably, saving only 22%, so its per-aspect scoring costs 9× its single call.

Batch or cache, not both

Batch processing halves the price in exchange for answers within 24 hours, but it cannot be combined with caching. For Claude's per-aspect calls, caching saves more. For single calls, batching wins and brings DeepSeek to about 0.26¢ per hostel.

Cheap runs buy reliability

At under a cent per hostel, scoring every hostel several times and averaging the runs becomes affordable, which addresses the run-to-run variation from chapter 02. Jev goes further: at 0.08¢ per hostel it is the cheapest setup measured, and also the most stable between runs.

For people building with LLMs

Six lessons that transfer
to agent design.

The setting is hostel reviews, but the same design questions come up in any LLM pipeline or agent.

Tool schemas create subtle biases.

Claude scored one aspect per call, but the tool it answered through listed all seven. That list alone kept 40% of the overlap that separate calls should have removed. The model reads a tool definition as context, not just as a format. Expose only the fields a step needs, and review a schema change like a prompt change.

Isolate judgments that must stay independent.

Scoring all aspects in one answer caused the other 60%. LLMs are autoregressive, so every score leaned on the ones already written.

A score with two decimals doesn’t carry two decimals of information.

Claude ended four in five of its scores in 2, 5 or 8; DeepSeek preferred 0 and 5. Ties are therefore more frequent than the underlying data would suggest, which makes choosing reasonable tiebreakers important.

Clean runs don’t prove a failure mode is absent.

DeepSeek occasionally returned 0.0 for all seven aspects: valid JSON that passed every schema check and would have entered the results as normal scores. Aside from regular benchmarking, check generated scores for rare, implausible values to catch long-tail errors.

Design the prompt around the cache.

Prompt caches only reuse an identical prefix. Put everything that stays the same across calls first, the tool schema included, and the part that changes last, even if that puts the instruction after the content. For Claude, this made separate per-aspect calls 79% cheaper.

Benchmark with the assumption that the LLM might be more accurate than the human-annotated reference dataset.

40% of guests gave every aspect the same score, so a model that matched their ratings perfectly would have copied that halo. When the reference labels may be worse than the model, agreement stops being the goal. Test for what a good score must do instead: separate what should differ, agree with the most careful annotators, and stay stable across reruns and smaller samples.