إعداد مجموعة بيانات تدريب عالية الجودة
اجمعوا بيانات اتباع التعليمات ونظفوها ونسّقوها بصيغتي Alpaca وShareGPT، وأزيلوا البيانات المكررة، وقسموها إلى مجموعتي تدريب وتحقق.
إعداد مجموعة بيانات تدريب عالية الجودة درس مجاني في AI Engineering Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Engineering Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.
البيانات هي العامل الأهم في الضبط الدقيق
في الضبط الدقيق، تهم جودة بيانات التدريب أكثر من أي معلمة فائقة أو اختيار معماري أو تقنية تدريب. يتفوّق 100 مثال عالي الجودة على 10,000 مثال متوسط الجودة. فالمدخلات الرديئة تؤدي إلى مخرجات رديئة؛ إذ سيعيد النموذج ذو الضبط الدقيق بأمانة إنتاج الأنماط الموجودة في بياناتكم، بما فيها الأخطاء والتحيزات والتناقضات في التنسيق. ويُعدّ الاستثمار في جودة البيانات الإجراء الأعلى مردودًا في أي مشروع ضبط دقيق.
تنسيقات اتباع التعليمات
يستخدم معظم الضبط الدقيق لمهام اتباع التعليمات تنسيق رسائل محادثية يتضمن أدوار النظام والمستخدم والمساعد. تستخدم واجهة fine-tuning API من OpenAI ملفات JSONL، بحيث يمثل كل سطر مثالًا لمحادثة كاملة. ويُستخدم أيضًا على نطاق واسع كل من تنسيق Alpaca (تعليمة/إدخال/إخراج) وتنسيق ShareGPT (قائمة محادثات). اختاروا التنسيق المتوافق مع إطار الضبط الدقيق الذي تخططون لاستخدامه.
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...جمع بيانات التدريب: ثلاث استراتيجيات
هناك ثلاث استراتيجيات رئيسية لبناء مجموعة بيانات للضبط الدقيق. التوليد البشري: يكتب الخبراء أمثلة مثالية يدويًا؛ وهي أعلى جودة لكنها بطيئة ومكلفة. توليد LLM: ينشئ نموذج قوي (GPT-4o) أمثلة يجري التحقق منها بعد ذلك بواسطة البشر؛ وهو أسرع وأقل تكلفة بكثير، مع جودة جيدة عند التحقق منها. التنقيب في السجلات: استخراج أزواج الإدخال والإخراج من سجلات الإنتاج الحالية، مع تصفية الأمثلة عالية الجودة باستخدام مؤشرات جودة مثل تقييمات المستخدمين أو التقييم بواسطة LLM كحَكَم.
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}
]
}تصفية الجودة والتحقق منها
يجب أن يمر كل مثال تدريبي بخطوة للتحقق من الجودة قبل تضمينه. تحقّقوا من أن: الاستجابة بالتنسيق الصحيح، والاستجابة دقيقة (في المهام الواقعية)، والاستجابة لا تتضمن هلوسات أو محتوى ضارًا، وزوج التعليمة والاستجابة متماسك، والمثال ممثل لحالة استخدام الإنتاج. استخدموا التحقق الآلي لفحص التنسيق، وLLM كحَكَم لتقييم جودة المحتوى، مع مراجعة بشرية لعينة من الأمثلة.
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)}')إزالة تكرار البيانات
تضر الأمثلة المكررة أو شبه المكررة ببيانات التدريب. فهي تجعل النموذج يفرط في التوافق مع تلك الأمثلة المحددة، وتهدر قدرة التدريب التي كان يمكن أن تتعلم أنماطًا متنوعة. أجروا إزالة التكرار قبل اعتماد مجموعة البيانات نهائيًا. تستخدم إزالة التكرار التام التجزئة للعثور على الأمثلة المتطابقة. أما إزالة التكرار التقريبي فتستخدم MinHash أو تشابه التضمينات للعثور على الأمثلة التي لا تختلف إلا في جوانب بسيطة.
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)]تقسيم التدريب والتحقق
قسّموا مجموعة البيانات إلى مجموعتي التدريب والتحقق قبل بدء أي عملية ضبط دقيق. تُستخدم مجموعة التحقق لمراقبة فرط التكيّف أثناء التدريب (إذا ازداد فقدان التحقق بينما انخفض فقدان التدريب، فهذا يعني أن النموذج يفرط في التكيّف). التقسيم المعتاد هو 90% للتدريب و10% للتحقق. احرصوا على أن يكون التقسيم عشوائيًا وطبقيًا إذا كانت لمجموعة البيانات فئات مهمة (مثل التمثيل المتساوي لجميع أنواع النوايا في المجموعتين).
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)})')موازنة مجموعة البيانات
تتسبب مجموعات البيانات غير المتوازنة في إفراط النماذج ذات الضبط الدقيق في التخصص في الحالات الشائعة، وفشلها في الحالات النادرة لكنها المهمة. فإذا كانت مجموعة البيانات لديكم تضم 900 مثال من الفئة A و100 مثال من الفئة B، فقد يتعلم النموذج التنبؤ دائمًا بالفئة A. وازنوا مجموعة البيانات من خلال: الإفراط في أخذ العينات من الفئات الأقل تمثيلًا (تكرار الأمثلة النادرة)، أو تقليل أخذ العينات من الفئات الأكثر تمثيلًا، أو توليد أمثلة اصطناعية للحالات قليلة التمثيل باستخدام 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 balancedتنظيف البيانات وتوحيدها
غالبًا ما تتضمن بيانات التدريب تناقضات تضر بالضبط الدقيق، مثل اختلاف حالة الأحرف في حقول الإخراج، أو المسافات البيضاء الزائدة، أو الاستخدام غير المتسق لعلامات الاقتباس، أو اختلاف تنسيقات الأرقام، أو تنوع اصطلاحات تسمية مفاتيح JSON. وحّدوا هذه العناصر قبل التدريب. سيتعلم النموذج ذو الضبط الدقيق التنسيق الدقيق الموجود في بياناتكم؛ فإذا كانت بياناتكم غير متسقة، فسيعيد النموذج إنتاج هذا التناقض.
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]قياس مقاييس جودة مجموعة البيانات
قبل إرسال البيانات للضبط الدقيق، احسبوا مقاييس الجودة على مجموعة البيانات ككل. تحقّقوا من: متوسط الحد الأقصى لعدد الرموز لكل مثال (فالأمثلة الطويلة تكلف أكثر في التدريب وقد تُقتطع)، وتغطية المفردات (هل تغطي مجموعة البيانات التنوع الكامل لمدخلات الإنتاج؟)، ودرجة الاتساق (هل تحصل المدخلات المتشابهة على مخرجات متشابهة؟). يوفّر معظم مزودي خدمات الضبط الدقيق نقطة نهاية للتحقق من البيانات، تفحص أخطاء التنسيق قبل أن تتم محاسبتكم على عملية تدريب فاشلة.
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 reportالتحسين التكراري لمجموعة البيانات
إعداد مجموعة البيانات عملية تكرارية. اضبطوا نموذجًا صغيرًا بدقة باستخدام مجموعة البيانات الأولية، وقيّموه على أمثلة محجوزة، وحددوا أنماط الإخفاق، ثم تتبعوها إلى ثغرات مجموعة البيانات أو مشكلات الجودة. بعد ذلك أصلحوا البيانات وأعيدوا التدريب. تُعد حلقة تحسين البيانات المدفوع بالأخطاء هذه ممارسة معيارية في الضبط الدقيق للإنتاج، وهي أكثر فعالية بكثير من محاولة جمع مجموعة بيانات مثالية من المحاولة الأولى.
اتساق مطالبة النظام عبر الأمثلة
إذا كان نموذجكم المُحسَّن سيستخدم دائمًا مطالبة النظام نفسها في بيئة الإنتاج، فأدرجوا مطالبة النظام المطابقة تمامًا في كل مثال تدريبي. وإذا أردتم أن يعمل النموذج من دون أي مطالبة نظام، فدرّبوه من دونها. يُعد عدم التطابق بين ظروف التدريب والاستدلال سببًا رئيسيًا لعدم تحقيق الضبط الدقيق للتوقعات. يتعلم النموذج السلوكيات المشروطة ببنية المطالبة الدقيقة التي يراها أثناء التدريب.
تحقق سريع
اختبروا مدى فهمكم لإعداد مجموعة بيانات التدريب الخاصة بالضبط الدقيق من خلال هذا الدرس.
مراجعة الدرس
تعلمتم في هذا الدرس أن جودة البيانات تتفوق على كميتها في الضبط الدقيق؛ إذ تتفوق 100 عينة ممتازة على 10,000 عينة متوسطة الجودة، وأن إزالة التكرار والتحقق والموازنة والتطبيع هي خطوات تنظيف البيانات الأربع الأساسية قبل أي عملية تدريب، وأن تقسيم البيانات إلى تدريب/تحقق ضروري لاكتشاف فرط التكيّف أثناء التدريب قبل أن يؤدي إلى تدهور الأداء في العالم الحقيقي. بعد ذلك سنجري ضبطًا دقيقًا باستخدام LoRA مع Hugging Face PEFT.
الأسئلة الشائعة
هل درس «إعداد مجموعة بيانات تدريب عالية الجودة» مجاني؟
نعم — نص درس «إعداد مجموعة بيانات تدريب عالية الجودة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Engineering Academy، انتقل إلى CoddyKit PRO. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.
ماذا ستتعلم في «إعداد مجموعة بيانات تدريب عالية الجودة»؟
اجمعوا بيانات اتباع التعليمات ونظفوها ونسّقوها بصيغتي Alpaca وShareGPT، وأزيلوا البيانات المكررة، وقسموها إلى مجموعتي تدريب وتحقق. تتمرن على AI Engineering Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Engineering Academy؟
لا تُشترط خبرة سابقة. AI Engineering Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «إعداد مجموعة بيانات تدريب عالية الجودة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Engineering Academy هذا؟
نعم. كل درس في AI Engineering Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- متى يتفوق الضبط الدقيق على هندسة المطالبات
- إعداد مجموعة بيانات تدريب عالية الجودة
- الضبط الدقيق باستخدام LoRA وHugging Face PEFT
- تقييم النموذج المضبوط بدقة ونشره