Bound eval-CI cost by tiering the set by trigger, swapping the frontier judge for a calibrated cheap judge, and caching baseline generations so only the candidate is regenerated per run.
Imagine a bakery that tastes every batch of bread before shipping. Tasting every loaf with the head pastry chef on every batch is expensive and slow. So the bakery sets up tiers. A quick sniff test by a junior baker checks every single batch. The full taste panel by the senior team only happens when the recipe or flour supplier changed. The exhaustive blind tasting with outside judges runs once a night against the master recipe. Most days the quick test catches the issue, the senior team only gets pulled in when something real changed, and the head chef saves their time for genuinely new recipes. The bakery still ships safe bread; it just stops burning the senior team's salary on toast.
Concept explanation~2 min read
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
Concept explanation~2 min read
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
Eval-CI on LLM applications is one of the most valuable engineering investments a team can make. It catches prompt regressions before they ship, gives a defensible answer to 'is the new model actually better', and forces honest measurement of changes that would otherwise be argued about in pull-request comments. It is also one of the easiest investments to under-budget, because the per-run cost looks small until multiplied by every push from every engineer.
A 200-example golden set with an LLM-as-judge rubric typically costs a few dollars per run. Run that on every PR, with every push to that PR, against a baseline plus a candidate, plus a frontier judge that costs more than the model being evaluated, and the monthly bill can rival a small production workload by month six. The temptation when finance notices is to scale eval back, which is exactly the wrong response because it removes the guard rail that prevents production regressions.
The right response is to keep the coverage and cut the cost per run. Three levers do most of the work: tiering the eval set by what changed, swapping the judge for a calibrated cheap model, and caching baseline generations across runs.
Tiering by trigger: most pushes do not need the full set
The naive setup runs the full eval on every push to every PR. That guarantees coverage and burns budget on coverage nobody needs. The vast majority of pushes touch test files, docs, build configs, or unrelated application code that has zero chance of affecting LLM output.
The tiering pattern uses changed-path filters as the trigger. A smoke set of 20-50 examples runs on every push as a fast sanity check. This catches the obvious 'I broke the import' or 'the prompt template now has a syntax error' regressions in under a minute. The full 200-example golden set runs only on PRs that touch tagged surfaces: prompt files, retriever configs, system messages, model-router code, tool definitions. A PR touching multiple tagged surfaces runs the full set plus a small regression panel for cross-surface interactions.
The extended set, including slow examples, rare cohorts, and adversarial probes that push PR latency too high, runs nightly against main as a backstop. If the nightly catches a regression that the per-PR runs missed, that is signal to add a new tagged-surface filter or to enlarge the per-PR golden set.
In practice, the tiering shift alone usually drops eval-CI spend by 60-80% because most PRs are infrastructure or unrelated application changes.
Situations where this technique stops working.
2–4 min · Everything important, quickly.
Real products, models, and research that use this idea.
- Promptfoo and Inspect AI both support partial-set runs and result caching out of the box, which lets a team implement the tiering and caching pattern without writing custom orchestration.
- A team using Claude Sonnet 4 in production runs Claude Haiku as the eval judge with a weekly 50-example calibration against Sonnet; agreement stays above 0.78 kappa and the judge bill drops by roughly 8x.
What an interviewer would ask next. Try answering before peeking at the approach.
QHow would you handle the case where the smoke set passes but the full set on the next PR catches a regression introduced earlier?
Run the full set nightly on main as a backstop; tag the offending commit when the nightly fails and bisect with the cached baselines to localize the regression cheaply.
Red flags & common mistakes
The phrases that signal junior thinking. Click to expand.
Red flags & common mistakes
The phrases that signal junior thinking. Click to expand.
Running the full golden set with the frontier judge on every push. The cost compounds into a production-sized line item without delivering more signal than a tiered approach.
60 second bullets to scan on the way to the call.
Tier by trigger: smoke on every push, full on tagged paths, extended nightly
Cheap judge plus a calibration set with periodic kappa check
Primary sources. Browse if you want the original framing.
Same topic, related formats. Practice these next.