00 Neden Sentetik Veri? — Label Shortage, Privacy, Augmentation
Gerçek veri toplamak pahalı, yavaş ve çoğu zaman imkânsızdır. Sentetik veri bu üç problemi aynı anda çözebilir.
Label shortage: bir NLP modelini fine-tune etmek için genellikle binlerce etiketlenmiş örnek gerekir; bunları insan annotatorlar ile toplamak hem pahalı (~$5-20/saat) hem zaman alıcıdır. LLM'ler, belirli formatta veri üretme talimatı verildiğinde bu maliyeti dramatik düşürebilir. GPT-4 veya Claude ile üretilen instruction data, insan kalitesine yakın sonuçlar veriyor.
Gizlilik: Sağlık, finans veya hukuk alanında gerçek veri GDPR/KVKK kapsamındadır. Orijinal veriyle aynı istatistiksel dağılımı paylaşan sentetik veri, gizliliği ihlal etmeden model eğitimine imkan tanır. Augmentation: nadir sınıflar için gerçek örnek bulmak güçtür; sentetik üretim sınıf dengesizliğini giderir ve modelin zor vakaları görmesini sağlar.
| Kullanım | Yöntem | Araç | Çıktı |
|---|---|---|---|
| Instruction tuning | Self-Instruct, Magpie | LLM API | Soru-cevap çiftleri |
| Görüntü augment | Diffusion img2img | Stable Diffusion | Değiştirilmiş görüntüler |
| Tablo verisi | GAN tabanlı | CTGAN, TVAE | Sentetik satırlar |
| NLP augment | Back-translation, paraphrase | LLM, PEGASUS | Benzer metinler |
01 LLM ile Metin Üretimi — Self-Instruct & Alpaca Yaklaşımı
Self-Instruct, küçük bir seed instruction setini LLM ile bootstrapping yaparak büyük bir instruction dataset'ine dönüştürür.
Wang et al. 2022'de yayımlanan Self-Instruct, şu döngüyü takip eder: (1) 175 insan tarafından yazılmış seed instruction. (2) LLM'den yeni instruction üret. (3) LLM'den instruction için input-output çifti üret. (4) Kalite filtresi. (5) Dataset'e ekle ve 2'den tekrarla. Stanford Alpaca, bu yöntemi text-davinci-003 ile 52.000 instruction-following çifti üretmek için kullandı ve Llama-7B'yi fine-tune etti — GPT-3.5'e yakın performans elde etti.
from openai import OpenAI
import json, random, hashlib
client = OpenAI()
# ── Seed instruction'lar ──────────────────────────────────────
SEED_INSTRUCTIONS = [
{"instruction": "Bir e-posta yaz.", "input": "", "output": "..."},
{"instruction": "Bu metni özetle.", "input": "Uzun metin...", "output": "..."},
{"instruction": "Bu kodun hatasını bul.", "input": "def foo(): ...", "output": "..."},
]
GENERATION_PROMPT = """Aşağıda {n_shots} örnek instruction-input-output çifti verilmiştir.
Bu formatta yeni bir tane üret. Farklı konular ve görev tipleri seç.
Örnekler:
{examples}
Şimdi yeni bir tane üret (JSON formatında):"""
def generate_instruction(seed_pool: list, n_shots: int = 3) -> dict:
examples = json.dumps(
random.sample(seed_pool, min(n_shots, len(seed_pool))),
ensure_ascii=False, indent=2
)
prompt = GENERATION_PROMPT.format(n_shots=n_shots, examples=examples)
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
temperature=0.9,
response_format={"type": "json_object"},
)
return json.loads(response.choices[0].message.content)
def quality_filter(item: dict) -> bool:
"""Basit kalite filtresi."""
instr = item.get("instruction", "")
if len(instr) < 10: return False
if len(instr) > 500: return False
if "aşağıda" in instr.lower() and "örnek" in instr.lower():
return False # prompt sızıntısı
return True
def dedup_hash(item: dict) -> str:
return hashlib.md5(item["instruction"].encode()).hexdigest()
# ── Üretim döngüsü ────────────────────────────────────────────
dataset = list(SEED_INSTRUCTIONS)
seen_hashes = {dedup_hash(x) for x in dataset}
target = 1000
while len(dataset) < target:
try:
new_item = generate_instruction(dataset)
h = dedup_hash(new_item)
if h not in seen_hashes and quality_filter(new_item):
dataset.append(new_item)
seen_hashes.add(h)
except Exception as e:
print(f"Hata: {e}")
with open("synthetic_instructions.jsonl", "w") as f:
for item in dataset:
f.write(json.dumps(item, ensure_ascii=False) + "\n")
print(f"Üretilen: {len(dataset)} instruction")