AI Engineering Academy · पाठ

उच्च-गुणवत्ता प्रशिक्षण डेटासेट तैयार करना

Alpaca और ShareGPT प्रारूपों में निर्देशों का पालन करने वाले डेटा को एकत्रित, साफ़ और स्वरूपित करें, डेटा के डुप्लिकेट हटाएँ और उसे प्रशिक्षण तथा सत्यापन समूहों में बाँटें।

पाठ 2, कुल 4 में से13 चरण

उच्च-गुणवत्ता प्रशिक्षण डेटासेट तैयार करना, CoddyKit पर AI Engineering Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह AI Engineering Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। AI Engineering Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

डेटा फाइन-ट्यूनिंग का सबसे महत्वपूर्ण कारक है

फाइन-ट्यूनिंग में आपके प्रशिक्षण डेटा की गुणवत्ता किसी भी हाइपरपैरामीटर, आर्किटेक्चर विकल्प या प्रशिक्षण तकनीक से अधिक महत्वपूर्ण होती है। 100 उच्च-गुणवत्ता वाले उदाहरण, 10,000 औसत दर्जे के उदाहरणों से बेहतर परिणाम देते हैं। जैसा डेटा अंदर जाएगा, वैसा ही परिणाम बाहर आएगा — फाइन-ट्यून किया गया मॉडल आपके डेटा में मौजूद हर पैटर्न को, जिसमें गलतियाँ, पूर्वाग्रह और प्रारूप की असंगतियाँ भी शामिल हैं, विश्वसनीय रूप से दोहराएगा। डेटा की गुणवत्ता में निवेश करना किसी भी फाइन-ट्यूनिंग परियोजना में सबसे अधिक प्रभाव डालने वाली कार्रवाई है।

निर्देश-पालन के प्रारूप

निर्देश-पालन वाले कार्यों के लिए अधिकांश फाइन-ट्यूनिंग में सिस्टम, उपयोगकर्ता और सहायक भूमिकाओं वाला संवादात्मक संदेश प्रारूप उपयोग किया जाता है। OpenAI का फाइन-ट्यूनिंग API 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-as-judge स्कोरिंग जैसे गुणवत्ता संकेतों के आधार पर उच्च-गुणवत्ता वाले उदाहरण चुनना।

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-as-judge का उपयोग करें, तथा कुछ नमूनों की मानव समीक्षा करें।

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)})')

डेटा-समुच्चय को संतुलित करना

असंतुलित डेटा-समुच्चयों के कारण फाइन-ट्यून किए गए मॉडल सामान्य मामलों में अत्यधिक विशेषज्ञ बन जाते हैं और दुर्लभ लेकिन महत्वपूर्ण मामलों में विफल होते हैं। यदि आपके डेटा-समुच्चय में श्रेणी A के 900 उदाहरण और श्रेणी B के 100 उदाहरण हैं, तो मॉडल हमेशा 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 औसत उदाहरणों से बेहतर परिणाम देते हैं; किसी भी प्रशिक्षण प्रक्रिया से पहले डुप्लिकेट हटाना, सत्यापन, संतुलन और सामान्यीकरण डेटा की सफ़ाई के चार प्रमुख चरण हैं; और प्रशिक्षण के दौरान ओवरफ़िटिंग का पता लगाने के लिए प्रशिक्षण/सत्यापन विभाजन आवश्यक है, ताकि वास्तविक दुनिया के प्रदर्शन में गिरावट आने से पहले उसे रोका जा सके। अगले चरण में हम HuggingFace PEFT के साथ LoRA फ़ाइन-ट्यूनिंग चलाएँगे।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Python सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
30
पाठ
120

अक्सर पूछे जाने वाले प्रश्न

क्या “उच्च-गुणवत्ता प्रशिक्षण डेटासेट तैयार करना” पाठ निःशुल्क है?

हाँ—“उच्च-गुणवत्ता प्रशिक्षण डेटासेट तैयार करना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और AI Engineering Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। AI Engineering Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“उच्च-गुणवत्ता प्रशिक्षण डेटासेट तैयार करना” में मैं क्या सीखूँगा?

Alpaca और ShareGPT प्रारूपों में निर्देशों का पालन करने वाले डेटा को एकत्रित, साफ़ और स्वरूपित करें, डेटा के डुप्लिकेट हटाएँ और उसे प्रशिक्षण तथा सत्यापन समूहों में बाँटें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ AI Engineering Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या AI Engineering Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर AI Engineering Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“उच्च-गुणवत्ता प्रशिक्षण डेटासेट तैयार करना” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस AI Engineering Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर AI Engineering Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. प्रॉम्प्टिंग से फ़ाइन-ट्यूनिंग कब बेहतर होती है
  2. उच्च-गुणवत्ता प्रशिक्षण डेटासेट तैयार करना
  3. Hugging Face PEFT के साथ LoRA फ़ाइन-ट्यूनिंग
  4. अपने फ़ाइन-ट्यून किए मॉडल का मूल्यांकन और परिनियोजन
← AI Engineering Academy पर वापस जाएँ