Every LLM evaluation metric is a proxy. None of them measure "is this output good" — they measure something correlated with it, cheaply. The skill is not picking the best metric. It is knowing the specific way each one goes wrong, so you notice when the number stops tracking reality.
Here are the ones worth knowing, roughly in order of cost.
Exact match and structural assertions
What it measures: the output is literally this string, or parses as JSON with these keys, or contains these three labelled sections.
When it is right: classification, extraction, routing, anything with a closed set of correct answers. Also every structural guarantee you depend on downstream.
How it lies: it cannot see quality at all. A summarizer that returns valid JSON containing garbage passes every structural assertion you wrote. Teams get a green suite and conclude the system works, when what they proved is that it did not crash.
Use it anyway — it is free, deterministic, and never drifts. Just never let a green structural suite stand in for quality evidence.
BLEU, ROUGE, and n-gram overlap
What it measures: how much vocabulary the output shares with a reference answer.
When it is right: translation and summarization against a reference, where wording is genuinely part of correctness, and mostly for tracking a system against itself over time.
How it lies: it rewards phrasing, not meaning. A correct answer worded differently scores badly; a wrong answer that recycles the reference's vocabulary scores well. For open-ended generation the correlation with human judgment is weak enough that the number becomes actively misleading.
If you inherited a BLEU dashboard, check whether anyone has ever made a decision from it.
Embedding similarity
What it measures: cosine distance between the output and a reference in embedding space.
When it is right: semantic drift detection, deduplication, "did this answer wander off topic," retrieval relevance.
How it lies: it is insensitive to exactly the errors that hurt most. Negation barely moves the vector — "the patient is not diabetic" sits close to "the patient is diabetic." So do swapped numbers, wrong dates, and inverted recommendations. Similarity is a topic detector wearing a correctness costume.
Never use it as the only gate on anything where being wrong is worse than being off-topic.
LLM-as-a-judge
What it measures: a model's opinion of the output, usually on a 1–5 scale or as a pairwise preference.
When it is right: open-ended quality that resists a regex — tone, helpfulness, whether an explanation actually explains. It is the only scalable option for a lot of real tasks.
How it lies: in several documented, specific ways, and you should assume all of them are happening.
- Position bias. In pairwise comparison, the first option wins more often than it should. Run both orders and average, or the metric is measuring your list order.
- Length bias. Longer answers score higher, roughly independent of content.
- Self-preference. Judges rate outputs from their own model family more highly.
- Scale compression. Ask for 1–10 and you get 7s and 8s. Most of your range is decorative.
- Run-to-run variance. The same judge, same input, different score. This is the big one, and it is next.
None of these make the approach useless. They make an unvalidated judge useless. Before trusting one, check it against human labels on twenty cases and measure how often it agrees with itself.
Rubric scoring
What it measures: named dimensions scored separately — objective clarity, bounded behavior, output specification, failure handling — rather than one holistic number.
When it is right: when you need to know where something is weak, not just that it is. One score ends a conversation; ten scores produce a punch list. It is also the only approach that gives you a diff between two versions rather than an argument.
How it lies: it is still a model judgment, so it inherits every bias above. And the aggregate rolls up dimensions that are not equally important to you — a prompt can gain three points on maintainability while losing two on safety and look like it improved.
Read the dimensions, not just the rollup. That is the entire reason to have dimensions.
The failure that spans all of them
Every model-based metric on this list moves when nothing changes. That is not a flaw to design around — it is a quantity to measure.
Run the same evaluation on the same unchanged text several times and you get a distribution, not a value. Ours typically wobbles about a point in either direction, but the spread is wildly artifact-dependent: standard deviation 3.06 on one triage prompt, 0.82 on another. Same rubric, same model, nearly four times the variance.
The consequences are concrete:
- A single global threshold — "±1 point is noise" — false-alarms on the noisy artifact and misses real regressions on the quiet one. Thresholds must be measured per artifact.
- A 2-point improvement from one run of each version is indistinguishable from a coin flip. You need repeats on both sides and a Welch's t-test against the noise floor.
- Ten dimensions tested at p < 0.05 give you a false positive around forty percent of the time. Correct for it — Benjamini-Hochberg is the standard move.
- Report the interval, not the point. A mean delta of +0.9 with a confidence interval of [-0.4, 2.2] crosses zero. That is not a small win; it is not a win.
Measure the noise, then measure the change. In that order, or you are reporting weather.
What to actually do
A stack that works, cheapest first:
- Structural assertions on everything you depend on downstream. Free, deterministic, catches real breakage.
- A golden set of 30–50 real inputs with confirmed-correct outputs, grown from failures you actually hit. This catches more production bugs than any aggregate metric.
- Rubric scores with a per-dimension floor for the quality that resists assertions.
- Repeats and a significance test the moment you want to claim an improvement rather than just detect a break.
And be precise about the claim you have earned. A rubric audit can honestly say a change moved the score by more than the evaluator's own run-to-run variation. It cannot say the change is better for your users — that needs labeled data or live outcomes. Rubrkit labels every verdict as rubric-judged quality for exactly this reason.
The useful metric is rarely the sophisticated one. It is the one whose failure mode you can name.