An AI feature is "working" when it clears a score you wrote down before anyone touched a prompt or a training run — not when a demo looks convincing in a review. Getting there means building an eval set first: a fixed collection of representative inputs, expected outputs or grading criteria, deliberately hard edge cases, and a numeric target the feature must clear before it ships.

Quick answer: An eval set is a dataset — representative inputs, expected outputs or graders, hard cases, and a target score — that defines what "working" means for an AI feature before it's built. The PM owns it, because it encodes what "good enough" means to the business and the user, not just what the model can technically produce.

Why an Eval Set Beats a Vibe Check

Vibe-checking an AI feature — trying a dozen prompts, nodding at the outputs, shipping — fails because it tests the demo, not the distribution. An eval set fixes that by forcing you to decide, in advance, what counts as correct across the full range of inputs real users will actually send, then scoring against that definition every time the prompt or model changes.

The failure mode is familiar to anyone who has watched a promising AI demo turn into a support queue three weeks after launch. It happens in a predictable order:

  1. A handful of hand-picked prompts look great in a demo, because they were unconsciously chosen to look great.
  2. The feature ships on the strength of that impression, with no written definition of failure.
  3. Real users send inputs nobody tried — messier, shorter, angrier, in a different language, missing context.
  4. Someone swaps the model or tweaks the prompt for cost or latency reasons, with no way to tell if quality moved.
  5. A support ticket or a churn signal is the first real feedback the team gets on whether the feature actually works.

Each of those steps is a symptom of the same root cause: nobody wrote down a scoreable definition of "working" before building. Cursor-style prompt tinkering and side-by-side eyeballing are useful for exploration, but they don't produce anything you can rerun, diff, or defend in a launch review.

The regression problem nobody notices until it's a ticket

Every prompt edit, every model upgrade, every added tool call is a change that can silently move quality in either direction. Without an eval set, teams have no way to detect a regression until a user reports one — by which point it's already shipped to everyone.

Software engineer Andrej Karpathy has argued publicly that evals function as the unit tests of the LLM era: without them, teams are effectively shipping untested code and calling it "prompting." Anthropic's own published guidance on building evaluations makes a similar case, framing a small, well-curated eval set as the first artifact to build — before extensive prompt iteration — precisely so that iteration has something to measure against.

That reframing matters for PMs specifically. A PRD without acceptance criteria isn't a spec, it's a wish list; an AI feature without an eval set is the same problem wearing a different outfit. The AI feasibility work you do before committing to build the feature should already be surfacing the inputs and failure modes that belong in this eval set — the eval set is where that feasibility analysis gets turned into something scoreable.

The Four Building Blocks of a Working Eval Set

A working eval set has exactly four parts: representative inputs pulled from real usage, expected outputs or a grading rubric that defines correctness, a curated set of hard cases designed to break the feature, and a target score the feature must clear before and after every change. Skip any one of the four and the eval set can't do its job.

ComponentWhat it isWhere it comes fromExample (support-ticket triage)
Representative inputsA sample spanning the real distribution of what users will actually sendProduction logs, support transcripts, user interviews200 real ticket bodies, stratified by category, length, and language
Expected outputs / gradersThe correct answer, or a rubric/function that scores correctnessDomain experts, existing labels, policy documentsCorrect urgency label (P1-P4) for each ticket
Hard casesInputs deliberately chosen to be ambiguous, adversarial, or rarePast incidents, journey-map pain points, red-teamingSarcastic tickets, multi-issue tickets, non-English tickets
Target scoreThe numeric bar the feature must clear to shipBusiness risk tolerance plus a measured baseline≥92% weighted accuracy, ≥85% recall on P1 tickets

A few things about each column are easy to get wrong in practice.

Representative inputs need a real distribution, not a curated one

Pulling examples from production logs or support transcripts beats inventing them, because invented examples unconsciously mirror what the team expects rather than what users actually do. If your team has already run a data readiness audit for this feature, that's usually the fastest source of a representative sample — it already surfaces what real inputs look like and where the gaps are.

Interview-based sources work too. Grounding representative inputs in the tasks users are actually trying to get done — the lens jobs-to-be-done research provides — keeps the sample anchored to real intent rather than to whatever's easiest to scrape.

Expected outputs need a rubric, not just an answer key

For classification, expected outputs are close to a normal answer key: one correct label per input. For anything generative, "expected output" has to become a rubric — a short list of scoreable criteria (accurate, on-tone, complete, no fabricated details) rather than one golden sentence, because no two acceptable answers to an open-ended prompt will ever be identical.

Hard cases come from where things already went wrong

The best source of hard cases is rarely a data scientist inventing edge cases in the abstract — it's the moments in the customer journey where things already go sideways: the angry follow-up message, the request that spans two categories, the ambiguous one-liner. Mapping the journey's friction points onto your hard-case list turns a generic stress test into one calibrated to your actual users.

Target score needs a business number attached, not just a percentage

A target score in isolation ("95% accuracy") is meaningless without knowing what a miss costs. Weighting the score by the business impact of each error type — a missed P1 ticket is not the same failure as a mislabeled P4 — turns an arbitrary-feeling number into a defensible one. And a quality target is incomplete without a paired constraint: a feature that's 96% accurate but takes eleven seconds to respond needs its latency budget defined alongside the accuracy bar, or you'll ship something technically "correct" that nobody wants to use.

A Worked Eval Table: Classifying Support Tickets by Urgency

A small eval table makes the abstraction concrete: for a support-ticket urgency classifier, each row is one input, its expected label, the model's actual output, whether they match, and a note on why a miss matters. Below is a trimmed sample — a real eval set for this feature would run 100-300 rows deep, not eight.

Ticket (truncated)Expected labelModel outputMatch?Note
"Prod outage, checkout is down for all users"P1P1YesClear-cut case
"Just wondering if there's a dark mode planned"P4P4YesClear-cut case
"Ugh. Third time this week. Fix it or I'm leaving."P2P4NoSarcasm/urgency masked by tone, not content
"Can't reset password AND billing charged me twice"P1P2NoMulti-issue ticket, model anchored on the lesser issue
"Le service est en panne depuis ce matin"P1P3NoNon-English input, model under-detected severity
"Feature request: export to CSV"P4P4YesClear-cut case
"Getting a 500 error on the payments page, urgent"P1P1YesExplicit severity language, easy signal
"Not sure who to ask but something feels off"P3P4NoVague ticket, model defaulted to lowest urgency

Reading the table like a PM, not like a data scientist

Raw accuracy on this sample is 5/8, or 62.5% — well under a plausible 92% target, which is the point of building the table before shipping rather than after. But the more useful read isn't the aggregate number; it's which rows missed and what that costs.

  • Two of three misses under-classified severity (P1 read as P2 or P3), which is the expensive direction to get wrong — a missed P1 becomes an escalation, while an over-classified P4 just gets triaged down a level later.
  • The pattern across misses is legible: tone-masked urgency, multi-issue tickets, and non-English input are all systematic gaps, not random noise — which means they're fixable with targeted prompt or data changes, not just "more data."
  • The vague ticket miss is arguably the hardest case in the set, and a reasonable eval design might grade it on a partial-credit rubric rather than a strict match, since even a human triager might disagree.

This is the judgment an eval table exists to force: not just "did it pass," but where it failed and whether that failure pattern is one the business can tolerate at launch or must fix first.

Golden Sets vs. LLM-as-Judge for Generative Tasks

Classification evals have a ground truth to check against; generative tasks — summaries, drafted replies, chat responses — usually don't have one right answer, so PMs need either a golden set of human-graded reference outputs or an LLM-as-judge grader, and each comes with real caveats.

A golden set is a curated collection of inputs paired with a human-written or human-approved ideal response, scored against a rubric (accurate, on-tone, complete, free of fabricated detail) rather than an exact-match string. It's slow and expensive to build — every entry requires a subject-matter expert's time — but once built, it's a stable, trustworthy benchmark that doesn't drift or develop its own biases.

LLM-as-judge uses a second model to score the first model's outputs against a written rubric, instead of a human doing it. Researchers at UC Berkeley and LMSYS, in the widely cited MT-Bench and Chatbot Arena work (Zheng et al., 2023), found that a strong judge model agreed with human preference judgments at a rate approaching how often two human raters agreed with each other — good enough to be genuinely useful, not good enough to treat as ground truth.

The caveats that come with LLM-as-judge

The same research, and follow-on work citing it, documented specific, recurring biases that any team using this method needs to design around:

  • Position bias — judges systematically favor whichever answer is shown first in a side-by-side comparison, regardless of content.
  • Verbosity bias — longer answers get rated as better even when they aren't more correct or more useful.
  • Self-preference bias — a model asked to judge tends to rate outputs written in its own style more favorably.
  • Weak grounding for facts — a judge model without retrieval access can't reliably verify claims against current, external truth; it can only check internal consistency and rubric adherence.

Mitigations are straightforward but easy to skip under deadline pressure: randomize answer order, anchor the rubric to specific, checkable criteria rather than a vague "which is better," and run a periodic human-audit sample against the judge's verdicts to catch drift. Google's PAIR Guidebook and Chip Huyen's writing on AI system evaluation both make the same point from different angles: automated judges are a scaling mechanism for a rubric a human already validated, not a replacement for having validated one.

DimensionGolden set (human-graded)LLM-as-judge
Cost per runHigh upfront to build, cheap to rerunLow upfront, ongoing per-call cost
ScalabilityLimited to what you can afford to have humans gradeScales to thousands of cases cheaply
ConsistencyHigh, if the rubric is tight and graders are trainedVariable — subject to position and verbosity bias
Best forSmall, high-stakes eval sets and launch guardrailsBroad regression testing at volume, every model swap
Main caveatSlow to expand or updateNeeds a periodic human-audit sample to catch drift

In practice, most teams run both: a small, human-graded golden set as the trusted anchor, and a larger LLM-as-judge pass for day-to-day regression testing, with the golden set periodically used to check whether the judge itself is still calibrated. Stanford's HELM project (Holistic Evaluation of Language Models) is a useful reference point here — it standardizes evaluation across many models and tasks precisely because ad hoc, one-off comparisons are so easy to get wrong.

Make the Eval Set a Spec Input, Not a Post-Build Afterthought

The eval set belongs in the feature spec next to acceptance criteria, written before backlog grooming starts — not bolted on after the model ships and something goes wrong. That's the real shift: defining "working" becomes a product deliverable the PM owns and writes down, not a QA checklist someone else fills in after the fact.

Treating it as a spec input changes what a PM actually hands to engineering. Instead of "make it good at classifying tickets," the brief becomes: here are 200 representative inputs, here's the rubric, here are the twelve hard cases we know will break a naive approach, and here's the score we need before this ships.

That's a concrete, testable spec — much closer to the kind of clarity the questions engineering needs from an AI spec actually calls for. It removes an entire category of back-and-forth about what "done" means.

Where this fits in Prodinja

It's a simulated version of the exact discipline this article is arguing for: evaluation as a spec input, defined up front, not an afterthought bolted on once something breaks.

Ownership matters here more than tooling. A data scientist can build the grading pipeline, but only the PM has the context to say what a miss actually costs the business — which is the judgment call every target score ultimately encodes.

Key Takeaways

  • An eval set is four things, not one: representative inputs, expected outputs or a grading rubric, hard cases, and a target score — missing any one leaves the definition of "working" incomplete.
  • Vibe-checking a demo tests the wrong thing. It evaluates a handful of cherry-picked prompts, not the real distribution of inputs users will send once the feature ships.
  • Hard cases should come from where things already went wrong — past incidents, journey-map friction points, and known ambiguous inputs — not from abstract invention.
  • Classification tasks get a golden answer key; generative tasks need a rubric, because open-ended outputs rarely have exactly one correct answer to match against.
  • LLM-as-judge scales evaluation but carries real, documented biases — position, verbosity, and self-preference — that require randomized ordering and periodic human audits to catch.
  • A target score without a business-cost weighting is just a percentage. Weight it by what each type of error actually costs, and pair it with a latency or cost budget.
  • The eval set belongs in the spec, before the build starts — that's the shift from evaluation as QA afterthought to evaluation as a PM-owned deliverable.

Frequently Asked Questions

What is an AI feature eval set?

An AI feature eval set is a fixed dataset used to measure whether an AI feature is working: representative inputs, expected outputs or grading criteria, a set of deliberately hard cases, and a target score the feature must clear. It's built before development starts and rerun every time the prompt, model, or pipeline changes.

How many examples do I need in an eval set?

There's no universal number, but most useful eval sets start small — often a few dozen to low hundreds of examples — rather than waiting to collect thousands before testing anything. Anthropic's public guidance on building evaluations favors starting with a focused set that captures known failure modes, then expanding coverage over time as new edge cases surface in production.

What's the difference between a golden set and LLM-as-judge?

A golden set is a small collection of human-graded reference outputs used as a trusted, stable benchmark; LLM-as-judge uses a second model to score outputs against a rubric at much larger scale, but with known biases toward answer position, verbosity, and its own writing style. Most mature setups use a golden set to periodically check that the judge is still calibrated.

Who should own the eval set — the PM or the data science team?

The PM should own the definition of "working" — the target score, the hard cases that matter to the business, and the rubric for correctness — because that's a product and risk decision, not a modeling one. Data science typically owns building the grading pipeline and running it, against criteria the PM defined.

How do I choose a target score for an AI feature?

Start from the cost of a miss, not from an arbitrary percentage: weight the target by how expensive each type of error is to the business, then set the bar above whatever manual or rules-based baseline the feature is replacing. A target score is only meaningful when it's paired with a defined latency or cost budget, so a feature can't hit the quality bar by becoming unusably slow.