LLMs as their own dataset factories
Real data is the gold standard. Synthetic data is what gets you from 50 cases to 500 cases over lunch. Used correctly, it covers blind spots your production logs do not yet contain — rare combinations, adversarial inputs, multi-language coverage.
What synthetic data is good for
- Coverage gaps — generating examples in languages, domains, or formats your real users have not yet exercised.
- Adversarial tests — variants of jailbreak prompts, prompt injection attempts, edge-case formats.
- Stress tests — extra-long inputs, deeply nested JSON, mixed-language documents.
- Privacy-safe development — synthetic versions of sensitive data so engineers can iterate without touching real records.
What synthetic data is bad for
- Distribution matching — generated inputs feel "model-shaped." They are smoother and more polite than real users.
- Surfacing unknown unknowns — the LLM cannot generate a failure mode that nobody knows exists yet.
- Final go/no-go decisions — never ship purely on synthetic eval results. Mix real and synthetic; weight real higher.
Principle: Synthetic data fills coverage gaps; real data discovers new failure modes. Use both. Never substitute one for the other.
Generation patterns that actually work
Seed-and-vary. Take 20 real cases, ask the model to generate 5 variants of each (paraphrases, longer versions, different languages). Now you have 100 cases preserving real distribution shape.
Persona-driven. Generate cases from the perspective of N user personas. Captures intent diversity better than ad-hoc prompts.
Failure-mode-driven. List the failure modes you fear; have the model generate inputs likely to trigger each one.