Synthetic data
Model-generated inputs, labels or conversations that fill eval or training gaps; fast to make, trustworthy only after filtering, dedupe and human spot checks.
Synthetic data is data an AI model writes for you: test questions, example conversations, labelled answers. It fills gaps when real data is scarce, sensitive (medical, financial) or missing the rare cases you need to test, such as edge-case inputs or adversarial prompts.
It is a supplement, not a replacement: synthetic questions tend to be cleaner and more predictable than what real users type, so evals built only from them overestimate quality.
A flight simulator's generated storms: invaluable for practising rare emergencies, but you still need hours in real weather before anyone believes you can fly.
Asking one model to write questions and grade the answers, then reporting 95%. The generator writes questions that the same model family finds easy, and the grader shares its blind spots.
Generate along explicit dimensions instead of asking for 'diverse questions': cross-product a few axes (persona × intent × difficulty × phrasing style), then have the model write inputs for each cell. Seed from real artefacts (actual documents, schemas, anonymised traces) so the content is grounded. Filter aggressively: dedupe with MinHash or embedding similarity (cosine ≥0.92 as near-duplicate), drop items a validator model flags as unanswerable or ambiguous, and have a human review a 10% sample; keep rates of 30–60% are normal.
For evals, synthetic inputs are fine but labels should be human or carefully verified, and synthetic slices should be reported separately from real-traffic slices. For training, Self-Instruct (Wang et al., 2022) bootstrapped 52k instructions from 175 seed tasks, and Model distillation uses a strong model's outputs to train a smaller one, but recursively training on generated data without fresh real data degrades the tail of the distribution (Shumailov et al., Nature 2024, 'model collapse'). Never seed a generator from your held-out test set; that is self-inflicted Benchmark contamination.
Generator: a frontier model different from the system under test; explicit axis grid; seeds from real documents or de-identified traces; MinHash (datasketch) plus embedding-similarity dedupe; validator pass for answerability; 10% human review; tag every case source: synthetic and report its slice separately. Tools: distilabel, promptfoo or Inspect dataset generators, or a short script.
Clinical intake assistant, no real patient data allowed in dev. Axes: 6 chief complaints × 4 personas (terse, anxious, non-native English, caregiver speaking for a parent) × 3 completeness levels = 72 cells × 5 = 360 synthetic intake conversations, generated from de-identified clinic templates. Filters: dedupe removes 41, a validator flags 63 as clinically implausible, a nurse reviews 40 of the rest and rejects 4. Final set: 252 cases. Real-traffic pilot later shows the 'caregiver' slice is under-represented 3× versus reality; the next batch is re-weighted.
Say: "I generate along explicit axes from real seed material, filter and dedupe, have a human check a sample, and report synthetic slices separately from real ones." Expect: "why not just generate 10,000 cases?": because volume without diversity or verified labels gives a precise estimate of the wrong thing.
Numbers worth knowing
- Keep rate after filtering
- 30–60%dedupe + validator + human sample; above 90% usually means filters are too loose
- Self-Instruct scale
- 52k instructions from 175 seed tasksWang et al. 2022
- Human review sample
- 10% of generated items, ≥50reject the batch if >15% fail
How to decide
| When | Do this |
|---|---|
| Real data is unavailable or cannot leave production (PHI, financial records) | Generate from de-identified templates; validate with a domain expert sample. |
| You need rare or adversarial cases | Generate them deliberately per axis; real traffic rarely contains enough. |
| Real traffic exists | Use it as the majority of the eval; synthetic fills named gaps only. |
Cost maths
Generation: 360 cases × (1.5k in + 600 out) at $3 / $15 per M ≈ 360 × $0.0135 ≈ $4.90. Validator on a Haiku-class model ≈ $1. Human review: 40 items at 3 minutes by a $100/h nurse = $200. Humans are 95% of the cost and 100% of the trust.
Operating it
- Synthetic cases exceed 50% of the eval set: rebalance with sampled real traffic as soon as it exists.
- Generated sets are reused for training: add dedupe against all eval sets and a fresh-real-data quota per training round.
- Score gap between synthetic and real-traffic slices: alert when synthetic exceeds real by more than 10 points.
- Near-duplicate rate within each new generated batch: alert above 15%.
When it goes wrong
An insurance-claims bot scored 94% on a 1,000-case synthetic eval and 71% on its first week of real claims.
Pilot adjusters' override rate (29%) on live claims.
All cases were generated by one model from clean policy summaries; real claims had OCR noise, mixed languages and multi-incident narratives the generator never produced, and the same model family graded the answers.
Rebuilt the eval as 60% sampled real claims (human-labelled) and 40% synthetic edge cases generated from real noisy documents, graded by a judge validated against adjusters.
Related terms
Sources
- Self-Instruct: Aligning Language Models with Self-Generated Instructions — Wang et al., 2022paper
- AI models collapse when trained on recursively generated data — Shumailov et al., 2024paper
Check yourself
Three questions. Every option is explained once you answer.