Define the coverage gap first
Do not start by asking a model to create “more examples.” Start with a coverage map:- target tasks and output formats;
- languages, domains, and user profiles;
- common and rare intents;
- safety and refusal boundaries;
- tool or structured-output requirements;
- known error clusters;
- examples explicitly excluded from training.
Generate with provenance
For every synthetic record, store:- generation job and objective;
- seed or template identifier;
- generator model and configuration;
- prompt version;
- decoding parameters;
- generation timestamp;
- raw output and transformations;
- validation results;
- review status and final disposition.
Filter in layers
No single quality score is sufficient. I use layered filters:- Schema checks: required fields, types, ranges, and parseability.
- Policy checks: sensitive content, prohibited topics, unsafe instructions, and data leakage.
- Deduplication: exact, normalized, and semantic similarity against train and evaluation sets.
- Consistency checks: answer supported by the provided context, valid tool arguments, labels aligned with rules.
- Difficulty and coverage checks: distribution matches the generation objective.
- Expert sampling: domain review for categories where automatic checks are weak.
Protect the evaluation boundary
Synthetic data can contaminate evaluation silently. If the generator sees held-out examples, evaluation prompts, or close paraphrases, the final score may measure memorization of the benchmark design. Maintain immutable evaluation sets with restricted access. Deduplicate generated records against all evaluation splits before training. When synthetic examples are derived from a real case, group related variants so they cannot land on both sides of the train-test boundary. The final evaluation should prioritize independent, real domain tasks. Synthetic holdouts can test specific rules, but they cannot prove that the model generalizes to real users.Version data and training together
A fine-tuning result is reproducible only if the team can connect it to the exact:- source and synthetic dataset versions;
- filtering configuration;
- sampling weights;
- tokenizer and base model;
- training code and hyperparameters;
- evaluation suite and evaluator versions.
Evaluate contribution, not just the final model
Run controlled comparisons:- baseline without synthetic data;
- real data plus one synthetic slice;
- cumulative slices in a documented order;
- alternative sampling weights;
- ablations of filters or generation strategies.