You tweak one line in your chatbot's system prompt and re-run an LLM-as-a-judge evaluation. The average drops from 4.1 to 3.9. Should you roll back? Or: to filter near-duplicate articles you set an embedding cosine similarity threshold at 0.45, and just below it you find an article that means the same thing, just above it one that means something else entirely. Should you lower the threshold to 0.42?
It is the same question both times: is this difference larger than the score's own wobble?
Why small differences in model scores say nothing
A score produced by a model — an LLM judge score, an embedding similarity — is a measurement with a noise band, and differences smaller than that band say nothing. Use the score only to order what you look at first, and take the actual decision ("does this pass?") separately, as pass/fail plus a one-line reason.
Model scores wobble in three places:
- Same input, different run: an LLM judge gives a different score when it grades the same conversation again, and the generated conversations themselves vary run to run
- The scale misses what you care about: judges see surface qualities (grammar, politeness, length) well but subtle ones like "I felt understood" poorly. There, a high score can still be a human fail
- Wording mixed with meaning: embedding similarity rises with shared subject matter (same technology, same product). The same principle in different words and a different principle about the same subject end up with similar scores

How do you measure the noise band?
- Run it at least twice without changing anything. Same code, same scenarios; see how much each score moves between runs. That is your noise band
- Compare the post-change difference against that band. If the average shift is smaller than the per-scenario wobble, it is neither a regression nor an improvement
- Pick only the scenarios the change can affect and run them several times. It is cheaper than one full run and discriminates better
- Calibrate similarity thresholds with examples from both sides. Collect a few "should match" pairs and "should not match" pairs and plot their scores. If the two distributions overlap, no fixed threshold can separate them
If not the score, what decides?
- Collect human judgments as pass/fail plus a one-line reason, not as scores. People disagree on a 5-point scale too. Pass/fail wobbles less, and the reason points at what to fix
- Group the reasons by type and fix the largest group first. An average score never tells you what to fix
- Mix versions unlabeled on the review screen. Show conversations from the old prompt, the new prompt and a larger model side by side without labels. If failure types do not care which version produced them, you learn immediately that the problem is the design, not the wording or the model
- Let the machine reject only near-copies. Below that, require one sentence saying "how is this different from the closest one?", whatever the score. If you cannot write that sentence, it is the same thing
- Let a person (or a model reading carefully) do the grouping of "same principle". Use embeddings only for retrieval: "the top few records closest to this principle sentence"
A rule to paste into your evaluation guidelines:
Treat a difference in model-produced scores (LLM judge, embedding similarity) as evidence only when it exceeds
the wobble measured by running the unchanged setup at least twice.
Use scores to order what to review; decide pass/fail separately, with a one-line reason.
Use similarity thresholds only to reject near-duplicates; below that, decide with one sentence on what differs.
For designing LLM graders in general, Anthropic's evaluation guide (Create strong empirical evaluations) is worth reading — it recommends detailed, specific rubrics and code-based grading where possible.
What happened to us
- A judge that wobbled between runs — after editing the safety instructions of a counseling-style chat service, we re-measured quality with an LLM judge. With identical code, a single scenario's score moved 0.4–1.0 points (out of 5) between runs, so a 0.1–0.2 shift in the overall average was not a regression. Running the 5 affected scenarios twice each separated the cause better than one run of all 16
- 2–4 points for conversations every human failed — in the same service, conversations a human marked as failures ("I didn't feel understood") got 2–4 out of 5 from the judge. Switching to pass/fail with a one-line reason, and mixing versions unlabeled, showed that the failure types did not depend on the version. Judging was over half of the evaluation cost, so we turned it off when sampling conversations for human review
- Embeddings that grouped by subject — clustering 30 short work records by embedding to find "same principle" groups produced groups of the same technology or project instead. Same-principle-different-words pairs scored about 0.44 and different-principle pairs about 0.41, so no fixed threshold held. We kept machine rejection only at 0.70 and above, and below it required a one-sentence "what differs"