Menyiapkan Kumpulan Data Pelatihan Berkualitas Tinggi
Kumpulkan, bersihkan, dan format data pengikuti instruksi dalam format Alpaca dan ShareGPT, terapkan deduplikasi data, lalu bagi data menjadi set pelatihan dan validasi.
Menyiapkan Kumpulan Data Pelatihan Berkualitas Tinggi adalah pelajaran AI Engineering Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Data Adalah Faktor Fine-Tuning yang Paling Penting
Dalam fine-tuning, kualitas data pelatihan Anda lebih penting daripada hyperparameter, pilihan arsitektur, atau teknik pelatihan apa pun. 100 contoh berkualitas tinggi mengungguli 10.000 contoh biasa-biasa saja. Masukan buruk menghasilkan keluaran buruk—model yang telah melalui fine-tuning akan meniru dengan setia pola apa pun yang terdapat dalam data Anda, termasuk kesalahan, bias, dan ketidakkonsistenan format. Berinvestasi pada kualitas data merupakan tindakan dengan dampak terbesar dalam proyek fine-tuning apa pun.
Format untuk Mengikuti Instruksi
Sebagian besar fine-tuning untuk tugas mengikuti instruksi menggunakan format pesan percakapan dengan peran sistem, pengguna, dan asisten. API fine-tuning OpenAI menggunakan berkas JSONL, dengan setiap baris berisi satu contoh percakapan lengkap. Format Alpaca (instruction/input/output) dan format ShareGPT (daftar percakapan) juga banyak digunakan. Pilih format yang sesuai dengan kerangka fine-tuning yang akan Anda gunakan.
import json
# OpenAI fine-tuning format (JSONL)
# Each line is one training example
openai_example = {
'messages': [
{'role': 'system', 'content': 'You are a JSON extraction agent.'},
{'role': 'user', 'content': 'Extract: "John Smith, age 32, from Seattle, joined 2023-01-15"'},
{'role': 'assistant', 'content': '{"name": "John Smith", "age": 32, "city": "Seattle", "join_date": "2023-01-15"}'}
]
}
# Alpaca format
alpaca_example = {
'instruction': 'Extract structured data from the following text.',
'input': 'John Smith, age 32, from Seattle, joined 2023-01-15',
'output': '{"name": "John Smith", "age": 32, "city": "Seattle", "join_date": "2023-01-15"}'
}
# Write as JSONL
with open('train.jsonl', 'w') as f:
f.write(json.dumps(openai_example) + '\n')
# Add more examples here...Mengumpulkan Data Pelatihan: Tiga Strategi
Ada tiga strategi utama untuk membangun kumpulan data fine-tuning. Pembuatan oleh manusia: pakar menulis contoh ideal secara manual—kualitas tertinggi, tetapi lambat dan mahal. Pembuatan oleh LLM: model yang kuat (GPT-4o) menghasilkan contoh yang kemudian divalidasi oleh manusia—jauh lebih cepat dan murah, dengan kualitas yang baik jika divalidasi. Penambangan dari log: mengekstrak pasangan masukan-keluaran dari log produksi yang ada, lalu menyaring contoh berkualitas tinggi menggunakan sinyal kualitas seperti peringkat pengguna atau penilaian LLM sebagai juri.
from openai import OpenAI
client = OpenAI()
def generate_training_example_with_gpt4o(task_description: str, example_input: str) -> dict:
'''Use GPT-4o to generate a training example for a smaller model.'''
prompt = f'''You are creating a training example for fine-tuning a smaller model.
Task: {task_description}
Given this input:
{example_input}
Write the ideal assistant response that demonstrates the correct behavior for this task.
Be specific, accurate, and follow the expected format precisely.'''
response = client.chat.completions.create(
model='gpt-4o', # teacher model
messages=[{'role': 'user', 'content': prompt}]
)
return {
'messages': [
{'role': 'system', 'content': task_description},
{'role': 'user', 'content': example_input},
{'role': 'assistant', 'content': response.choices[0].message.content}
]
}Penyaringan dan Validasi Kualitas
Setiap contoh pelatihan harus melewati langkah validasi kualitas sebelum disertakan. Validasi hal-hal berikut: respons menggunakan format yang benar, respons akurat (untuk tugas faktual), respons tidak mengandung halusinasi atau konten berbahaya, pasangan instruksi-respons koheren, dan contoh mewakili kasus penggunaan produksi. Gunakan validasi otomatis untuk pemeriksaan format dan LLM sebagai juri untuk kualitas konten, serta tinjauan manusia pada sampel.
import json
def validate_training_example(example: dict, schema_validator=None) -> dict:
issues = []
# Format check
if 'messages' not in example:
issues.append('Missing messages field')
return {'valid': False, 'issues': issues}
messages = example['messages']
if not any(m['role'] == 'assistant' for m in messages):
issues.append('No assistant message found')
# Check assistant message quality
assistant_content = next((m['content'] for m in messages if m['role'] == 'assistant'), '')
if len(assistant_content) < 5:
issues.append('Assistant response too short')
# Schema validation for JSON output tasks
if schema_validator:
try:
parsed = json.loads(assistant_content)
schema_validator(parsed) # raises if invalid
except json.JSONDecodeError:
issues.append('Assistant response is not valid JSON')
except Exception as e:
issues.append(f'Schema validation failed: {str(e)}')
return {'valid': len(issues) == 0, 'issues': issues}
# Run validation on all examples before training
examples = load_training_examples('raw_dataset.jsonl')
valid_examples = [e for e in examples if validate_training_example(e)['valid']]
print(f'Valid examples: {len(valid_examples)}/{len(examples)}')Deduplicasi Data
Contoh duplikat atau hampir duplikat dalam data pelatihan dapat merugikan. Contoh-contoh tersebut menyebabkan model terlalu menyesuaikan diri dengan contoh tertentu, sehingga kapasitas pelatihan yang seharusnya dapat mempelajari pola yang beragam menjadi terbuang. Jalankan deduplikasi sebelum menyelesaikan kumpulan data Anda. Deduplicasi persis menggunakan hashing untuk menemukan contoh yang identik. Deduplicasi hampir sama menggunakan MinHash atau kemiripan embedding untuk menemukan contoh yang hanya berbeda dalam hal-hal sepele.
import hashlib
from datasketch import MinHash, MinHashLSH
def exact_deduplicate(examples: list[dict]) -> list[dict]:
seen_hashes = set()
unique = []
for ex in examples:
# Hash the user and assistant messages
content = str(ex['messages'])
h = hashlib.md5(content.encode()).hexdigest()
if h not in seen_hashes:
seen_hashes.add(h)
unique.append(ex)
print(f'Exact dedup: {len(examples)} -> {len(unique)} ({len(examples)-len(unique)} removed)')
return unique
def near_deduplicate_by_input(examples: list[dict], similarity_threshold=0.85) -> list[dict]:
# Build index of input texts
inputs = [next((m['content'] for m in ex['messages'] if m['role'] == 'user'), '') for ex in examples]
lsh = MinHashLSH(threshold=similarity_threshold, num_perm=128)
unique_indices = set()
for i, text in enumerate(inputs):
m = MinHash(num_perm=128)
for word in text.lower().split():
m.update(word.encode('utf-8'))
if not lsh.query(m): # no similar items found
lsh.insert(str(i), m)
unique_indices.add(i)
return [examples[i] for i in sorted(unique_indices)]Pembagian Pelatihan/Validasi
Bagi kumpulan data Anda menjadi set pelatihan dan validasi sebelum memulai proses fine-tuning apa pun. Set validasi digunakan untuk memantau overfitting selama pelatihan (jika loss validasi meningkat sementara loss pelatihan menurun, model mengalami overfitting). Pembagian yang umum adalah 90% pelatihan / 10% validasi. Pastikan pembagian dilakukan secara acak dan terstratifikasi jika kumpulan data Anda memiliki kategori yang bermakna (misalnya, semua jenis intent terwakili secara seimbang dalam kedua set).
import random
import json
def split_dataset(examples: list[dict], val_fraction=0.1, seed=42) -> tuple[list, list]:
random.seed(seed) # reproducible split
shuffled = examples.copy()
random.shuffle(shuffled)
n_val = max(1, int(len(shuffled) * val_fraction))
val_set = shuffled[:n_val]
train_set = shuffled[n_val:]
print(f'Train: {len(train_set)} examples, Validation: {len(val_set)} examples')
return train_set, val_set
def save_jsonl(examples: list[dict], path: str):
with open(path, 'w') as f:
for ex in examples:
f.write(json.dumps(ex) + '\n')
# Split and save
examples = load_training_examples('clean_dataset.jsonl')
train, val = split_dataset(examples, val_fraction=0.1)
save_jsonl(train, 'train.jsonl')
save_jsonl(val, 'validation.jsonl')
print(f'Saved train.jsonl ({len(train)}) and validation.jsonl ({len(val)})')Menyeimbangkan Kumpulan Data
Kumpulan data yang tidak seimbang menyebabkan model yang telah melalui fine-tuning terlalu terspesialisasi pada kasus umum dan gagal menangani kasus yang jarang tetapi penting. Jika kumpulan data Anda memiliki 900 contoh kategori A dan 100 contoh kategori B, model mungkin belajar untuk selalu memprediksi A. Seimbangkan kumpulan data dengan cara: melakukan oversampling pada kategori minoritas (menduplikasi contoh yang jarang), melakukan undersampling pada kategori mayoritas, atau menghasilkan contoh sintetis untuk kasus yang kurang terwakili menggunakan GPT-4o.
from collections import Counter
import random
def analyze_distribution(examples: list[dict], category_extractor) -> dict:
categories = [category_extractor(ex) for ex in examples]
counts = Counter(categories)
print('Category distribution:')
for cat, count in counts.most_common():
print(f' {cat}: {count} ({100*count/len(examples):.1f}%)')
return counts
def oversample_minority(examples: list[dict], category_extractor, target_count: int) -> list[dict]:
by_category = {}
for ex in examples:
cat = category_extractor(ex)
by_category.setdefault(cat, []).append(ex)
balanced = []
for cat, cat_examples in by_category.items():
if len(cat_examples) < target_count:
# Oversample with replacement
oversampled = random.choices(cat_examples, k=target_count)
balanced.extend(oversampled)
else:
# Undersample to target_count
balanced.extend(random.sample(cat_examples, target_count))
random.shuffle(balanced)
return balancedPembersihan dan Normalisasi Data
Data pelatihan sering mengandung ketidakkonsistenan yang merugikan fine-tuning: kapitalisasi yang bercampur pada bidang keluaran, spasi putih di akhir, penggunaan tanda kutip yang tidak konsisten, format angka yang bercampur, atau konvensi penamaan kunci JSON yang beragam. Normalisasikan semua itu sebelum pelatihan. Model yang telah melalui fine-tuning akan mempelajari format persis yang terdapat dalam data Anda—jika data Anda tidak konsisten, model akan menirunya.
import json
import re
def normalize_json_output_example(example: dict) -> dict:
'''Normalize JSON output in assistant messages for consistency.'''
messages = example.get('messages', [])
normalized = []
for msg in messages:
if msg['role'] == 'assistant':
content = msg['content'].strip()
# Try to parse and re-serialize JSON for consistent formatting
try:
parsed = json.loads(content)
# Normalize: sort keys, consistent spacing
content = json.dumps(parsed, ensure_ascii=False, sort_keys=True)
except json.JSONDecodeError:
pass # Not JSON output - leave as is
normalized.append({'role': 'assistant', 'content': content})
else:
normalized.append(msg)
return {'messages': normalized}
def normalize_dataset(examples: list[dict]) -> list[dict]:
return [normalize_json_output_example(ex) for ex in examples]Mengukur Metrik Kualitas Kumpulan Data
Sebelum mengirimkan data untuk fine-tuning, hitung metrik kualitas pada seluruh kumpulan data. Periksa: jumlah token rata-rata dan maksimum per contoh (contoh yang panjang lebih mahal untuk dilatih dan mungkin terpotong), cakupan kosakata (apakah kumpulan data mencakup seluruh keragaman masukan produksi?), serta skor konsistensi (apakah masukan yang serupa menghasilkan keluaran yang serupa?). Sebagian besar penyedia fine-tuning memiliki titik akhir validasi data yang memeriksa kesalahan format sebelum menagih biaya untuk proses pelatihan yang gagal.
import tiktoken
def analyze_dataset_quality(examples: list[dict], model='gpt-4o-mini') -> dict:
encoder = tiktoken.encoding_for_model(model)
token_counts = []
for ex in examples:
total_tokens = sum(
len(encoder.encode(m['content']))
for m in ex['messages']
)
token_counts.append(total_tokens)
report = {
'total_examples': len(examples),
'avg_tokens_per_example': sum(token_counts) / len(token_counts),
'max_tokens': max(token_counts),
'min_tokens': min(token_counts),
'examples_over_4k_tokens': sum(1 for t in token_counts if t > 4096),
'estimated_training_tokens': sum(token_counts),
'estimated_cost': sum(token_counts) / 1_000_000 * 8.0 # ~$8/1M tokens for gpt-4o-mini
}
for key, value in report.items():
print(f'{key}: {value}')
return reportPeningkatan Kumpulan Data secara Iteratif
Penyiapan kumpulan data merupakan proses iteratif. Lakukan fine-tuning pada model kecil menggunakan kumpulan data awal Anda, evaluasi model tersebut pada contoh yang disisihkan, identifikasi pola kegagalan, lalu telusuri kembali penyebabnya ke kekurangan atau masalah kualitas dalam kumpulan data. Setelah itu, perbaiki data dan latih ulang model. Siklus peningkatan data berdasarkan kesalahan ini merupakan praktik standar dalam fine-tuning produksi dan jauh lebih efektif daripada mencoba mengumpulkan kumpulan data sempurna dalam satu kali proses.
Konsistensi Prompt Sistem di Seluruh Contoh
Jika model yang Anda sempurnakan akan selalu menggunakan perintah sistem yang sama dalam produksi, sertakan perintah sistem yang persis sama itu dalam setiap contoh pelatihan. Jika Anda ingin model bekerja tanpa perintah sistem apa pun, lakukan pelatihan tanpa perintah sistem. Ketidaksesuaian antara kondisi pelatihan dan inferensi merupakan salah satu penyebab utama hasil fine-tuning tidak memenuhi harapan. Model mempelajari perilaku yang dipengaruhi oleh struktur perintah persis seperti yang dilihatnya selama pelatihan.
Pemeriksaan Singkat
Uji pemahaman Anda tentang cara menyiapkan dataset pelatihan untuk fine-tuning dari pelajaran ini.
Rangkuman Pelajaran
Dalam pelajaran ini Anda mempelajari bahwa kualitas data lebih penting daripada kuantitas data dalam fine-tuning — 100 contoh yang sangat baik lebih unggul daripada 10.000 contoh biasa-biasa saja, deduplikasi, validasi, penyeimbangan, dan normalisasi adalah empat langkah utama pembersihan data sebelum pelatihan apa pun dijalankan, dan pemisahan data pelatihan/validasi sangat penting untuk mendeteksi overfitting selama pelatihan sebelum menurunkan kinerja di dunia nyata. Selanjutnya, kita akan menjalankan fine-tuning LoRA dengan Hugging Face PEFT.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menyiapkan Kumpulan Data Pelatihan Berkualitas Tinggi” gratis?
Ya — teks lengkap “Menyiapkan Kumpulan Data Pelatihan Berkualitas Tinggi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Engineering Academy, upgrade ke CoddyKit PRO. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Menyiapkan Kumpulan Data Pelatihan Berkualitas Tinggi”?
Kumpulkan, bersihkan, dan format data pengikuti instruksi dalam format Alpaca dan ShareGPT, terapkan deduplikasi data, lalu bagi data menjadi set pelatihan dan validasi. Kamu berlatih AI Engineering Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Engineering Academy?
Tidak diperlukan pengalaman sebelumnya. AI Engineering Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Menyiapkan Kumpulan Data Pelatihan Berkualitas Tinggi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Engineering Academy ini?
Ya. Setiap pelajaran AI Engineering Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Kapan Penyetelan Halus Mengungguli Pemberian Perintah
- Menyiapkan Kumpulan Data Pelatihan Berkualitas Tinggi
- Penyetelan Halus LoRA dengan Hugging Face PEFT
- Mengevaluasi dan Menerapkan Model yang Disetel Halus