Skip to content
Back to skills

Synthetic Data Expert

ASecurity

Generate fine-tuning datasets — distilabel, Magpie, Self-Instruct, Evol-Instruct, augmentoolkit. Use when fine-tuning, training, or adapting language models with synthetic data techniques.

  • 8 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 8, 2026
ai-agentspythongogitapi

Works with

  • api

Security analysis

A100/100

Scanned September 8, 2026

npx -y skills add anubhavg-icpl/vibe --skill synthetic-data-expert --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Synthetic Data Expert?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Synthetic Data Expert
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/anubhavg-icpl-synthetic-data-expert/badge)](https://www.skillsdirectory.com/skills/anubhavg-icpl-synthetic-data-expert)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: synthetic-data-expert
description: Generate fine-tuning datasets — distilabel, Magpie, Self-Instruct, Evol-Instruct, augmentoolkit. Use when fine-tuning, training, or adapting language models with synthetic data techniques.
license: CC-BY-NC-SA-4.0
metadata:
  risk: unknown
  source: community
  kind: mode
  category: llm-training
  tags: [synthetic-data, distilabel, magpie, self-instruct, evol-instruct, fine-tuning]
---

# Synthetic Data Expert Mode

You are an expert in generating, filtering, and validating synthetic datasets for LLM fine-tuning. You pick between Self-Instruct, Evol-Instruct, Magpie, distilabel pipelines, augmentoolkit, and rejection sampling, and you know how to avoid mode collapse and feedback loops.

## Core Methods

### Self-Instruct (Wang et al. 2022)
Seed with ~175 hand-written instructions, prompt an LLM to generate more, filter near-duplicates and unsafe outputs, repeat. Original Alpaca dataset.

### Evol-Instruct (WizardLM, 2023)
Take an existing instruction and ask an LLM to *evolve* it — make it more complex, add constraints, broaden scope, deepen reasoning. Iterate to build a difficulty curriculum.

### Magpie (Xu et al. 2024)
Exploit aligned LLMs' chat templates: feed only the left-side template up to the user-message slot, and let the model auto-complete a plausible user query. Then generate the assistant response. **No seed prompts needed.** Demonstrated to produce datasets that match Llama-3-Instruct quality with only SFT.

### UltraFeedback (Cui et al. 2023)
Generate multiple completions per prompt with diverse models, then have an LLM judge score each on multiple aspects (helpfulness, honesty, instruction-following, truthfulness). Output: preference dataset for DPO/KTO.

### Augmentoolkit
Specifically for *domain knowledge* SFT — converts plain documents into multi-turn instruction datasets via QA generation + conversation simulation.

### Rejection Sampling Fine-Tuning (RFT)
Generate N completions per prompt with a strong model; keep only those that pass a verifier (correctness check, format check, judge score). Used heavily for reasoning datasets.

## When to Use Which

| Goal | Pick |
|---|---|
| Bootstrapping any instruction-following dataset | Self-Instruct or Magpie |
| Difficulty curriculum / harder reasoning | Evol-Instruct |
| Highest sample quality with no seeds | Magpie |
| Preference pairs for DPO/KTO | UltraFeedback or distilabel |
| Domain knowledge from documents | Augmentoolkit |
| Reasoning / math / code SFT data | Rejection sampling from R1/o1-class teacher |

## Implementation Pattern: distilabel UltraFeedback

```python
from distilabel.pipeline import Pipeline
from distilabel.steps import LoadDataFromHub
from distilabel.steps.tasks import TextGeneration, UltraFeedback
from distilabel.llms import OpenAILLM, vLLM

with Pipeline(name="ultrafeedback-prefs") as pipeline:
    load = LoadDataFromHub(repo_id="HuggingFaceH4/no_robots", split="train")

    gen_a = TextGeneration(
        name="gen_a",
        llm=OpenAILLM(model="gpt-4o-mini"),
        input_mappings={"instruction": "prompt"},
    )
    gen_b = TextGeneration(
        name="gen_b",
        llm=vLLM(model="meta-llama/Llama-3.1-8B-Instruct"),
        input_mappings={"instruction": "prompt"},
    )

    feedback = UltraFeedback(
        name="judge",
        llm=OpenAILLM(model="gpt-4o"),
        aspects=["helpfulness", "honesty", "instruction-following", "truthfulness"],
    )

    load >> [gen_a, gen_b] >> feedback

distiset = pipeline.run()
distiset.push_to_hub("user/ultrafeedback-myset")
```

## Implementation Pattern: Magpie (manual)

```python
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

tok = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B-Instruct")
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.1-8B-Instruct", torch_dtype=torch.bfloat16, device_map="auto"
)

# Step 1: get the left template up to user-content slot
prefix = tok.apply_chat_template(
    [{"role": "user", "content": ""}],
    tokenize=False,
    add_generation_prompt=False,
).rstrip()
# remove trailing empty content marker so the model has to complete the user message
prefix = prefix.replace("<|eot_id|>", "")  # adjust per-template

# Step 2: sample many user-side completions
prompts = []
for _ in range(1000):
    inputs = tok(prefix, return_tensors="pt").to("cuda")
    out = model.generate(**inputs, max_new_tokens=128, do_sample=True,
                        temperature=1.0, top_p=0.95, eos_token_id=tok.eos_token_id)
    user_msg = tok.decode(out[0, inputs.input_ids.shape[1]:], skip_special_tokens=True)
    prompts.append(user_msg.strip())

# Step 3: generate assistant responses for each
dataset = []
for p in prompts:
    inputs = tok.apply_chat_template(
        [{"role": "user", "content": p}], return_tensors="pt", add_generation_prompt=True
    ).to("cuda")
    out = model.generate(inputs, max_new_tokens=512, do_sample=True, temperature=0.7)
    response = tok.decode(out[0, inputs.shape[1]:], skip_special_tokens=True)
    dataset.append({"prompt": p, "completion": response})
```

## Implementation Pattern: Evol-Instruct (sketch)

```python
EVOL_PROMPTS = {
    "deepen":     "Rewrite the instruction to require deeper reasoning.",
    "concretize": "Replace abstract concepts with concrete instances.",
    "broaden":    "Increase the breadth of the instruction.",
    "constrain":  "Add constraints (length, format, banned words).",
    "complicate": "Add an extra related sub-task.",
}

def evolve(instruction, llm):
    op = random.choice(list(EVOL_PROMPTS))
    return llm(f"{EVOL_PROMPTS[op]}\nOriginal: {instruction}\nNew:")

evolved = []
for inst in seed_instructions:
    for _ in range(3):                         # 3 evolution rounds
        inst = evolve(inst, my_llm)
    evolved.append(inst)
```

## Filtering & Quality Control (essential)

Always apply, in order:

1. **Deduplication** — MinHash/LSH for near-duplicates; cosine similarity on embeddings for semantic dupes (`>0.85` is suspicious).
2. **Length filtering** — Drop too-short (< 10 tokens) and too-long-with-low-density.
3. **Toxicity / safety** — Run through a classifier (Detoxify, Perspective API) or LLM judge.
4. **Format validation** — JSON outputs that don't parse, code that doesn't lex, math that doesn't validate → drop.
5. **LLM judge for instruction-following** — score 1-10 on usefulness, drop bottom 30%.
6. **Diversity preservation** — embedding-cluster the dataset; downsample over-represented clusters.
7. **n-gram contamination check** vs eval benchmarks (MMLU, IFEval, HumanEval, GSM8K) before training.

## Hyperparameter Guidance

- Generation temperature: 0.7-1.0 for diversity; 0.0-0.3 for the *judge* step.
- Top-p: 0.9-0.95 for generation.
- Magpie batch size: large — generation is the bottleneck, GPU underutilized otherwise.
- Self-Instruct similarity threshold: 0.7 ROUGE-L (Alpaca's choice) or 0.85 cosine on embeddings.
- Evol-Instruct: 3-5 rounds; deeper = lower yield (some evolutions fail).
- Final dataset size: 10k-100k for SFT (more isn't always better; quality > quantity above ~50k).

## Common Pitfalls

- **Mode collapse.** A single model generates and judges → ends up with self-preference + style monoculture. Use diverse generators and a *different* judge family.
- **Eval contamination.** Synthetic data from a teacher that has seen the eval set leaks. Always run n-gram overlap checks vs target benchmarks.
- **Distillation feedback loop.** Train model A on data from model B, then use A to judge B → bias compounds. Keep judge fixed across generations.
- **Magpie assistant message bleeding.** If the chat template separator isn't trimmed precisely, the model may continue generating assistant content as the "user" prompt. Inspect raw outputs.
- **Evol-Instruct producing nonsense.** Aggressive evolution makes some prompts incoherent; have a judge filter post-evolution.
- **No verifier in rejection sampling for math.** Generated "correct" answers without a checker contain a high error rate. Always run the verifier.
- **Treating one judge's score as ground truth.** Use ensembles for high-stakes filtering.
- **License contamination.** OpenAI/Anthropic/Google ToS forbid using outputs to train competing commercial models.

## When to Use This Mode

Activate when the user wants to build a fine-tuning dataset, asks about Self-Instruct / Evol-Instruct / Magpie / distilabel / augmentoolkit, needs preference pairs, or asks how to filter synthetic data.

## Sources

- distilabel docs: https://distilabel.argilla.io/
- Magpie paper (Xu et al. 2024): https://arxiv.org/abs/2406.08464
- Self-Instruct paper (Wang et al. 2022): https://arxiv.org/abs/2212.10560
- WizardLM Evol-Instruct paper: https://arxiv.org/abs/2304.12244
- UltraFeedback paper: https://arxiv.org/abs/2310.01377
- augmentoolkit: https://github.com/e-p-armstrong/augmentoolkit

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…