A golden dataset is the smallest set of labeled examples that reliably tells you whether an AI feature is ready to ship. For most teams that number lands close to 50: enough to cover every intent, difficulty tier, and failure mode that actually matters, each one hand-labeled with the output you'd accept in production.
Quick answer: Build a 50-example golden dataset by sampling real user logs (not synthetic prompts), stratifying across happy-path, edge, adversarial, and known-hard cases, then hand-labeling the exact output you'd accept. Only grow past 50 when your intent count or risk profile genuinely demands it.
Why 50 Examples Beat 10,000 Rows
The mental model shift that matters here: a golden dataset isn't a sample of your traffic, it's a map of your decisions. Fifty representative examples that cover every intent and difficulty tier will surface more real failure modes than ten thousand rows pulled at random from a firehose of mostly-easy queries.
This isn't a contrarian take invented to make a smaller task feel acceptable. Hamel Husain, an ML consultant who has audited evaluation setups across dozens of LLM products, has argued for years that teams waste enormous effort collecting volume before they've even looked closely at thirty or forty real transcripts — and that close reading is usually where the actual bugs surface. Andrew Ng's data-centric AI movement makes the same point from the modeling side: a smaller, carefully curated dataset that targets your model's actual weak spots consistently outperforms a larger, noisier one for improving real-world accuracy.
The reason volume fails you specifically in evals is distribution. Most production traffic is easy. If you randomly sample 10,000 real conversations, the overwhelming majority will be near-identical "happy path" requests your model already handles fine. You'll spend your labeling budget confirming what you already knew and starve the rare-but-critical cases — the ones that actually decide whether the feature is safe to ship — of any coverage at all.
A golden dataset inverts that ratio on purpose. You're not estimating average accuracy across your traffic distribution; you're pressure-testing the decisions where being wrong is expensive. That's a sampling problem, not a scale problem, and it's why 50 well-chosen rows beat 10,000 badly-chosen ones almost every time.
What "representative" actually means here:
- Every intent your feature is meant to handle appears at least once, usually 3-5 times.
- Every difficulty tier (trivial, ambiguous, adversarial, known-hard) has enough rows to spot a pattern, not just an anecdote.
- Every failure mode your team has already seen in production, support tickets, or user complaints is represented, not just hypothesized ones.
If you haven't already framed what "good enough to ship" even means for this feature, that groundwork belongs in an AI feasibility assessment before you start collecting examples — the golden dataset is how you test the bar you already set, not how you discover it.
Where the 50 Examples Come From
The best golden dataset examples come from real user logs, support tickets, and beta-session transcripts — not from prompting an LLM to generate test cases. Synthetic examples reflect what a model thinks a hard question looks like; real logs reflect what your actual users do, which is almost always stranger, messier, and more specific.
This distinction matters more than most teams expect going in. Synthetic data generation is tempting because it's fast and infinitely scalable, but it inherits the generating model's blind spots — it tends to produce clean, well-formed edge cases and systematically miss the garbled, half-finished, oddly-phrased inputs real users actually send. Google's People + AI Research (PAIR) guidebook makes essentially this argument for human-AI systems generally: evaluation sets need to mirror the actual distribution of user behavior, not a designer's idealized guess at it.
Four log sources most teams already have
- Support tickets and escalations — these are pre-filtered for difficulty; someone already flagged them as a problem.
- Chat or session transcripts where the user rephrased, corrected, or abandoned the interaction — a strong proxy for confusion or failure.
- Analytics "near-miss" events — clicks on a fallback, thumbs-down signals, or sessions that end right after the AI responds.
- Beta or internal dogfooding sessions, especially from teammates in support, sales, or ops who use the product differently than engineers do.
If your feature doesn't exist yet and there are no logs to mine, borrow from an adjacent surface — the search queries, support tickets, or manual workflows the AI feature is meant to replace. The inputs people send a human today are a solid proxy for what they'll send an AI tomorrow. This is also where the discipline of context engineering pays off early: understanding exactly what information the model will and won't see at inference time tells you which real-world inputs are even fair to include in your golden set.
One caution: don't cherry-pick only the examples that make your model look good, and don't over-index on the three loudest complaints in your Slack channel. The goal is coverage of the decision space, not a highlight reel.
The Stratification Grid: Happy Path, Edge, Adversarial, Known-Hard
A stratified golden dataset splits your 50 examples across four buckets by difficulty and intent, not by convenience. This keeps easy cases from crowding out the rare ones that actually determine whether the feature is safe to ship, and it gives you a defensible answer when someone asks "did you test for X?"
Here's a worked allocation for a first golden dataset of 50 rows:
| Bucket | Share of 50 | What It Tests | How to Source It |
|---|---|---|---|
| Happy path | ~18 rows (36%) | The feature works for the majority-case, well-formed request | Top intents from analytics, sampled across your main user segments |
| Edge case | ~14 rows (28%) | Ambiguous phrasing, partial info, multi-step or compound requests | Support tickets, sessions with corrections/rephrasing |
| Adversarial | ~10 rows (20%) | Prompt injection, jailbreak attempts, off-topic or hostile input | Security/red-team logs, or deliberately constructed per an adversarial thinking pass |
| Known-hard | ~8 rows (16%) | Cases your team has already seen fail — the "we know this breaks" pile | Bug reports, postmortems, engineer/support anecdotes |
A worked example
Imagine an AI feature that triages inbound support tickets into categories and drafts a first response. Happy-path rows are single-issue tickets with clear category signals ("my invoice is wrong"). Edge rows are tickets that blend two issues, or that a human would need to ask a clarifying question about. Adversarial rows include a user trying to get a refund by threatening escalation, or pasting instructions that attempt to override the categorization logic. Known-hard rows are the specific ticket types your support lead has already told you the current heuristic gets wrong.
Notice what this grid does structurally: it forces the adversarial and known-hard buckets to exist even though they're a minority of real traffic. That's the entire point — those are the rows most likely to reveal a launch-blocking gap, and they're exactly the rows a random sample would under-represent.
Hand-Labeling: Turning 50 Rows Into Ground Truth
Hand-labeling means writing down the specific output you would accept for each example — not a vague quality score, but the actual answer, category, or action a reviewer would sign off on. Vague labels ("looks fine," "seems okay") produce eval scores nobody trusts three months later when the model changes.
Research from Shreya Shankar and Hamel Husain on LLM-assisted evaluation found that even domain experts frequently disagree with each other on borderline outputs the first time through a labeling pass — which is a feature of the process, not a failure. Disagreement is where your team discovers that "good" wasn't as clearly defined as everyone assumed.
The two-labeler rule
- Have two people independently label the same 50 examples using a shared rubric, without seeing each other's answers first.
- Compare and flag every disagreement — not just the big ones.
- Resolve disagreements in a short working session, and rewrite the rubric wherever the disagreement traces back to ambiguous wording rather than a genuine judgment call.
- Re-label only the examples affected by the rubric change; don't re-litigate everything.
A disagreement rate above roughly 10-15% on your first pass usually means the rubric is under-specified, not that your labelers are careless. Chip Huyen's writing on building evaluation and test sets for ML systems makes a similar point: the labeling guideline is itself a spec, and it should be versioned and reviewed like one.
What a good label actually contains
A usable label is more than pass/fail. For each example, capture:
- The expected output verbatim (the exact response, category, or action).
- The rubric dimensions it needs to satisfy (
accuracy,tone,completeness,safety) scored independently rather than one blended judgment. - A one-line rationale for why this is the right answer, so future reviewers don't have to reverse-engineer the labeler's reasoning.
Keeping these labels and their rubric versioned matters more than it sounds like it should — your golden dataset will get revisited every time the feature scope shifts, and a living spec approach to documenting expected behavior means the eval set updates alongside the product requirement instead of silently drifting out of sync with it. Once labels exist, the next step is deciding what score counts as a pass — which is really a question of setting numeric, failable thresholds rather than leaving "good enough" as a matter of vibes.
The Rule for When 50 Is Too Few
Fifty is a floor, not a universal target. The rule: if any single cell in your stratification grid — one intent crossed with one difficulty tier — has fewer than three examples, or if a wrong answer carries safety, financial, legal, or compliance consequences, you need more than 50 before you can trust the result.
Two variables drive this most reliably: how many distinct intents the feature actually handles, and how expensive a wrong answer is. A single-purpose internal tool with three intents and low stakes can ship a trustworthy eval at 30-50 examples. A multi-intent, customer-facing assistant needs enough rows that each intent still has a real sample size once you've split it across difficulty tiers.
| Scenario | Distinct Intents | Stakes if Wrong | Recommended Floor |
|---|---|---|---|
| Internal tool, single workflow | 1-3 | Low (rework, minor delay) | 30-50 examples |
| Customer-facing assistant, narrow scope | 4-8 | Medium (refund, churn, bad support experience) | 50-120 examples |
| Multi-intent agent or regulated domain (financial, medical, legal, safety) | 8+ | High (compliance, harm, irreversible action) | 150-300+, growing per new intent |
Signals that you need more than 50
- Any grid cell has fewer than 3 examples once you've stratified by intent and difficulty.
- Your reviewers keep disagreeing on the same rubric dimension across unrelated examples — a sign that dimension needs its own dedicated sub-sample.
- The feature can take an action with financial, legal, medical, or safety consequences, where a single missed case is not an acceptable cost.
- You're adding a genuinely new intent — treat it as its own mini stratification grid, not an afterthought bolted onto the existing 50.
In every one of these cases, the fix isn't "add 500 random rows." It's the same discipline applied again: identify the specific decision that's under-covered, and go find more real examples of exactly that decision.
Turning Your Golden Dataset Into a Ship/No-Ship Gate
A golden dataset only earns its keep if a missing or stale one can actually block a launch, not sit in a spreadsheet nobody reopens. Treating "we don't have a golden dataset yet" as equivalent to "we haven't decided what good looks like" turns it from documentation into a real launch blocker.
Once the 50 rows are labeled, you still need something to run them through. Open-source harnesses like openai/evals or promptfoo exist for exactly this: they replay your golden dataset against a model or prompt version and score each row against the rubric you wrote, so the dataset keeps earning its keep every time something upstream changes.
The honest version of this tie-in is simple: no tool, prototype or otherwise, replaces the work of reading fifty real transcripts closely and deciding what "right" looks like for each one. What a well-designed workflow can do is make it hard to skip that work quietly.
Key Takeaways
- A golden dataset is a map of decisions, not a sample of traffic — 50 representative, hand-labeled examples typically surface more real failure modes than 10,000 random rows.
- Source examples from real user logs, support tickets, and session transcripts; synthetic-only test sets inherit the generating model's blind spots and miss how real users actually phrase things.
- Stratify every dataset across happy-path, edge, adversarial, and known-hard buckets so rare-but-critical cases don't get crowded out by easy ones.
- Hand-labeling means writing the exact expected output plus a rubric and rationale — not a vague quality score that nobody can defend later.
- Use two independent labelers and treat disagreement as a signal to fix the rubric, not a sign your labelers are careless.
- Fifty is a floor: grow past it when any grid cell is under-sampled, when a new intent appears, or when a wrong answer carries real-world consequences.
- Treat a missing golden dataset as a launch blocker, not a documentation gap you'll get to later.
Frequently Asked Questions
How many examples do I need for an LLM eval dataset?
Fifty is a reasonable starting floor for a single-feature, low-to-medium-stakes AI product, as long as every intent and difficulty tier in your stratification grid has at least three examples. Scale up when you add intents, face regulated or high-stakes decisions, or find grid cells with too few rows to trust.
What is a golden dataset in machine learning?
A golden dataset is a small, hand-labeled set of input-output pairs that represents the ground truth for what "correct" looks like on your specific task. It's used to score model outputs, catch regressions after a prompt or model change, and give teams a concrete, defensible answer to "how do we know this works."
Should I use synthetic data or real user data for golden dataset examples?
Prefer real user data — logs, support tickets, and transcripts — because it reflects how people actually phrase requests, including the messy, ambiguous, and adversarial inputs a model will meet in production. Synthetic examples can supplement gaps (like intents you haven't seen yet) but shouldn't be the primary source.
Who should label the expected outputs in a golden dataset?
Use at least two people with real domain context — often a PM plus a subject-matter expert or support lead — labeling independently before comparing notes. Disagreements between them usually reveal an underspecified rubric, which is exactly the ambiguity you want surfaced before launch rather than after.
How often should a golden dataset be updated?
Revisit it whenever the feature's scope, prompt, or underlying model changes meaningfully, and audit it on a regular cadence (quarterly is a common default) even without a change, since real usage patterns drift. Treat it like a living spec rather than a one-time deliverable.