0Pricing
AI Engineering Academy · Ders

İnce Ayarlı Modelinizi Değerlendirme ve Dağıtma

Temel ve ince ayarlı modeli ayrılmış test örnekleri üzerinde karşılaştıran nicel değerlendirmeler çalıştırın, yerel çıkarım için GGUF'a dönüştürün ve llama.cpp veya vLLM üzerinden sunun.

İnce Ayarlı Modelinizi Değerlendirme ve Dağıtma, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.

Değerlendirme Neden Dağıtımdan Önce Gelmelidir?

Eğitim verilerinde iyi performans gösteren ince ayar yapılmış bir model, gerçek üretim kullanım alanınızda temel modelden daha kötü performans gösterebilir. Bunu öğrenmenin tek yolu titiz bir değerlendirmedir. İnce ayar; felaket düzeyinde unutmaya (temel modelin sahip olduğu yetenekleri kaybetmeye), aşırı özelleşmeye (görevinizde iyi, yakın görevlerde daha kötü performans göstermeye) veya güvenlik davranışlarında fark edilmesi zor gerilemelere yol açabilir. İnce ayar yapılmış bir modeli, temsili bir test kümesinde temel modele karşı değerlendirmeden asla dağıtmayın.

Ayrılmış Bir Test Kümesi Oluşturma

Test kümeniz eğitim ve doğrulama verilerinden tamamen ayrı olmalıdır — modelin eğitimin hiçbir aşamasında görmediği örneklerden oluşmalıdır. Test kümesi üretim girdilerinin tam dağılımını temsil etmelidir: yaygın durumlar, uç durumlar ve kötü amaçlı girdiler. Yönerge izleme görevleri için yalnızca en yaygın unsurları değil, yönergenin tüm yönlerine uyulmasını gerektiren örnekler ekleyin. Güvenilir bir değerlendirme için genellikle 100-500 örnekten oluşan bir test kümesi yeterlidir.

import json
from typing import TypedDict

class TestCase(TypedDict):
    input: str                 # the user message
    expected_output: str       # the ideal response
    category: str              # e.g., 'format', 'accuracy', 'edge_case'
    evaluation_method: str     # 'exact_match', 'json_schema', 'llm_judge'

# Load test set (never used during training)
def load_test_set(path: str) -> list[TestCase]:
    cases = []
    with open(path) as f:
        for line in f:
            data = json.loads(line.strip())
            cases.append({
                'input': data['messages'][-2]['content'],  # user message
                'expected_output': data['messages'][-1]['content'],  # assistant response
                'category': data.get('metadata', {}).get('category', 'general'),
                'evaluation_method': data.get('metadata', {}).get('eval_method', 'llm_judge')
            })
    return cases

test_set = load_test_set('test.jsonl')
print(f'Test set loaded: {len(test_set)} examples')

Göreve Özel Değerlendirme için Nicel Metrikler

Görevinize uygun değerlendirme metriklerini seçin. JSON çıkarımı için şema uyumluluk oranını ve alan düzeyinde doğruluğu ölçün. Sınıflandırma için her sınıfın doğruluğunu, kesinliğini ve duyarlılığını ölçün. Metin üretimi için kaliteyi LLM-as-judge puanlamasıyla değerlendirin. Biçime uyum için tam biçim uyumluluk oranını ölçün. İyileşme farkını ölçebilmek için her metriği hem temel modelde hem de ince ayar yapılmış modelde çalıştırın.

import json

def evaluate_json_extraction(model_output: str, expected: str, schema: dict) -> dict:
    metrics = {'valid_json': False, 'schema_compliant': False, 'field_accuracy': 0.0}
    
    try:
        parsed = json.loads(model_output.strip())
        metrics['valid_json'] = True
        
        # Check schema compliance
        required_fields = schema.get('required', [])
        all_present = all(field in parsed for field in required_fields)
        correct_types = all(
            isinstance(parsed.get(field), schema['properties'][field]['expected_type'])
            for field in required_fields if field in parsed
        )
        metrics['schema_compliant'] = all_present and correct_types
        
        # Field-level accuracy against expected output
        expected_parsed = json.loads(expected)
        correct_fields = sum(1 for k in expected_parsed if parsed.get(k) == expected_parsed[k])
        metrics['field_accuracy'] = correct_fields / len(expected_parsed) if expected_parsed else 0.0
    
    except json.JSONDecodeError:
        pass  # valid_json stays False
    
    return metrics

LLM-as-Judge Değerlendirmesi

Açık uçlu üretim görevlerinde, ince ayar yapılmış modelin çıktılarını beklenen çıktılara göre puanlamak için LLM-as-judge kullanın. GPT-4o'yu değerlendirici olarak çalışacak şekilde yönlendirin; girdiyi, beklenen çıktıyı ve model çıktısını sağlayarak doğruluğu, eksiksizliği ve biçim uyumluluğunu 1-5 aralığında puanlamasını isteyin. Genel kalite puanını elde etmek için test kümesindeki puanların ortalamasını alın. İnce ayar yapılmış modelin puanını aynı test kümesindeki temel modelin puanıyla karşılaştırın.

from openai import OpenAI

client = OpenAI()

def llm_judge_score(instruction: str, expected: str, actual: str) -> dict:
    judge_prompt = f'''Evaluate the quality of an AI assistant response.

Instruction given to assistant:
{instruction}

Expected ideal response:
{expected}

Actual response from model being evaluated:
{actual}

Rate the actual response on these criteria (1=poor, 5=excellent):
1. Correctness: Is the information accurate?
2. Format compliance: Does it follow the expected output format?
3. Completeness: Does it address all parts of the instruction?

Return JSON: {{"correctness": N, "format": N, "completeness": N, "overall": N, "reason": "brief explanation"}}'''
    
    response = client.chat.completions.create(
        model='gpt-4o',
        messages=[{'role': 'user', 'content': judge_prompt}],
        response_format={'type': 'json_object'}
    )
    return json.loads(response.choices[0].message.content)

Karşılaştırmalı Değerlendirmeyi Çalıştırma

Tüm test durumlarında temel modeli, ince ayar yapılmış modeli ve isteğe bağlı olarak güçlü bir istem taban çizgisini karşılaştıran başa baş bir değerlendirme çalıştırın. Her test durumunda her modelden çıktılar üretin, ardından tüm çıktıları değerlendirme metriklerinizle puanlayın. Metrik puanlarını, standart sapmaları ve ince ayar yapılmış modelin taban çizgisine göre kazandığı ve kaybettiği durumlara ilişkin örnekleri gösteren bir karşılaştırma tablosu oluşturun.

def run_full_evaluation(test_set: list, models: dict, system_prompt: str) -> dict:
    results = {name: {'scores': [], 'errors': 0} for name in models}
    
    for i, test_case in enumerate(test_set):
        print(f'Evaluating test case {i+1}/{len(test_set)}')
        
        for model_name, model_fn in models.items():
            try:
                output = model_fn(test_case['input'], system_prompt)
                score = llm_judge_score(
                    test_case['input'],
                    test_case['expected_output'],
                    output
                )
                results[model_name]['scores'].append(score['overall'])
            except Exception as e:
                results[model_name]['errors'] += 1
                results[model_name]['scores'].append(0)
    
    # Summarize
    summary = {}
    for name, data in results.items():
        scores = data['scores']
        summary[name] = {
            'mean_score': sum(scores) / len(scores),
            'errors': data['errors']
        }
        print(f'{name}: mean={summary[name]["mean_score"]:.2f}, errors={data["errors"]}')
    return summary

Felaket Düzeyinde Unutma için Gerileme Testi

İnce ayar, modelin genel yeteneklerini zayıflatabilir; bu olguya felaket düzeyinde unutma adı verilir. Hem temel hem de ince ayar yapılmış modelde, hedef görevin ötesinde önem verdiğiniz görevleri kapsayan bir gerileme test paketi çalıştırın: genel soru yanıtlama, akıl yürütme, kod üretimi ve yönerge izleme. İnce ayar yapılmış model bu görevlerde belirgin biçimde daha düşük puan alıyorsa LoRA dereceniz fazla yüksek olabilir veya çok fazla dönem eğitim yapmış olabilirsiniz.

REGRESSION_TEST_CASES = [
    # General QA
    {'input': 'What is the capital of France?', 'expected_substring': 'Paris'},
    {'input': 'What is 17 * 23?', 'expected_substring': '391'},
    # Instruction following
    {'input': 'List 3 planets. Format as: 1. Planet Name', 'expected_pattern': r'^1\. '},
    # Reasoning
    {'input': 'If all A are B and all B are C, are all A also C?', 'expected_substring': 'yes'},
]

def run_regression_tests(model_fn, test_cases: list) -> float:
    passed = 0
    for test in test_cases:
        output = model_fn(test['input'], '')
        if 'expected_substring' in test:
            if test['expected_substring'].lower() in output.lower():
                passed += 1
        elif 'expected_pattern' in test:
            import re
            if re.search(test['expected_pattern'], output):
                passed += 1
    
    rate = passed / len(test_cases)
    print(f'Regression test pass rate: {rate:.1%} ({passed}/{len(test_cases)})')
    return rate

Yerel Çıkarım için GGUF'a Dönüştürme

Pahalı GPU altyapısı olmadan yerel dağıtım yapmak için birleştirilmiş modelinizi GGUF biçimine dönüştürün ve llama.cpp ile çıkarım çalıştırın. GGUF çeşitli nicemleme düzeylerini destekler: Q4_K_M (4 bit, kalite/hız dengesi iyi), Q8_0 (8 bit, tam kaliteye yakın) ve Q2_K (2 bit, çok hızlı ancak kalite daha düşük). 4 bit nicemlenmiş bir 7B model yalnızca yaklaşık 4 GB RAM gerektirir ve CPU üzerinde saniyede 1-5 belirteç hızında çalışabilir.

# Step 1: Convert merged HuggingFace model to GGUF
# git clone https://github.com/ggerganov/llama.cpp
# python llama.cpp/convert_hf_to_gguf.py ./merged-model --outtype f16 --outfile model-f16.gguf

# Step 2: Quantize to 4-bit
# ./llama.cpp/llama-quantize model-f16.gguf model-q4.gguf Q4_K_M

# Step 3: Run inference with llama.cpp Python bindings
# pip install llama-cpp-python
from llama_cpp import Llama

llm = Llama(
    model_path='./model-q4.gguf',
    n_ctx=4096,         # context window
    n_threads=8,        # CPU threads
    n_gpu_layers=0      # set > 0 to offload layers to GPU
)

output = llm.create_chat_completion(
    messages=[{'role': 'user', 'content': 'What is the capital of France?'}],
    temperature=0.1
)
print(output['choices'][0]['message']['content'])

Üretim Ortamında vLLM ile Sunma

İnce ayar yapılmış bir modeli büyük ölçekte üretim ortamında sunmak için vLLM günümüzdeki standarttır. vLLM, birden fazla isteği birlikte verimli biçimde toplu işlemek için PagedAttention kullanır ve GPU aktarım kapasitesini büyük ölçüde artırır. OpenAI uyumlu API uç noktalarını desteklediğinden OpenAI API'sinin doğrudan yerine kullanılabilir. İnce ayar yapılmış 7B modelle vLLM çalıştıran tek bir A100 GPU'su dakikada yüzlerce isteği işleyebilir.

# Start vLLM server (run from command line)
# pip install vllm
# python -m vllm.entrypoints.openai.api_server \
#     --model ./merged-model \
#     --host 0.0.0.0 \
#     --port 8000 \
#     --max-model-len 4096 \
#     --tensor-parallel-size 1

# Use with OpenAI client (drop-in replacement)
from openai import OpenAI

client = OpenAI(
    base_url='http://localhost:8000/v1',
    api_key='not-needed'  # vLLM doesn't require auth by default
)

response = client.chat.completions.create(
    model='merged-model',  # model name matches the path you passed to vLLM
    messages=[{'role': 'user', 'content': 'Extract JSON from: "Alice, 30, NYC"'}]
)
print(response.choices[0].message.content)

İnce Ayar Yapılmış Modelde A/B Testi

Üretimde tamamen ince ayar yapılmış modele geçmeden önce bir A/B testi çalıştırın: üretim trafiğinin bir bölümünü (başlangıçta %5-10) ince ayar yapılmış modele yönlendirirken çoğunluğunu temel modelinize veya mevcut istem yaklaşımınıza gönderin. Her iki grup için kalite puanlarını, gecikmeyi ve kullanıcı memnuniyeti metriklerini izleyin. İnce ayar yapılmış modelin trafik payını ancak A/B testi, istatistiksel olarak anlamlı sayıda istekten sonra iyileşme olduğunu doğrularsa artırın.

import random

class ModelRouter:
    def __init__(self, fine_tuned_traffic_fraction=0.1):
        self.ft_fraction = fine_tuned_traffic_fraction
        self.metrics = {'base': {'count': 0, 'quality_sum': 0}, 'fine_tuned': {'count': 0, 'quality_sum': 0}}

    def route(self, user_id: str, request: str) -> dict:
        # Deterministic routing by user_id (same user always goes to same model)
        use_fine_tuned = (hash(user_id) % 100) < (self.ft_fraction * 100)
        model_group = 'fine_tuned' if use_fine_tuned else 'base'
        
        response = call_model(request, use_fine_tuned=use_fine_tuned)
        return {'response': response, 'model_group': model_group}

    def record_quality(self, model_group: str, quality_score: float):
        self.metrics[model_group]['count'] += 1
        self.metrics[model_group]['quality_sum'] += quality_score

    def ab_test_summary(self) -> dict:
        summary = {}
        for group, data in self.metrics.items():
            avg = data['quality_sum'] / data['count'] if data['count'] > 0 else 0
            summary[group] = {'avg_quality': avg, 'n': data['count']}
        return summary

İnce Ayar Yapılmış Modelleri Zaman İçinde Sürdürme

İnce ayar yapılmış modeller sürekli bakım gerektirir. Temel model güncellendiğinde (yeni GPT-4o sürümü veya yeni Mistral sürümü), bağdaştırıcı ağırlıklarınız uyumlu olmayabilir ve yeniden eğitim yapmanız gerekebilir. Görev gereksinimleriniz değiştiğinde eğitim verilerini güncellemeniz ve yeniden eğitim yapmanız gerekir. Üretimde yeni hata biçimleri keşfettiğinizde eğitim kümenize örnekler ekleyin. Üretim makine öğrenmesi işlemleri iş akışınızın bir parçası olarak düzenli yeniden eğitim planlayın.

Dağıtım Karar Matrisi

İnce ayar yapılmış modeliniz için dağıtım stratejisini seçmeniz, ölçeğinize ve altyapı kısıtlarınıza bağlıdır. düşük hacim (günde 1000'den az istek) için OpenAI'nin ince ayar API'si en basit seçenektir. orta hacim (günde 1000-100.000 istek) için tek bir GPU örneğinde vLLM kullanmayı değerlendirin. yüksek hacimli veya gecikmenin kritik olduğu uygulamalarda birden fazla GPU ile vLLM kullanın, tensör paralelliğini değerlendirin ve önüne bir önbellekleme katmanı ekleyin. gizliliğe duyarlı veriler için GGUF/llama.cpp veya vLLM kullanarak kendi altyapınızda barındırın.

Kısa Kontrol

Bu derste, ince ayar yapılmış modelleri değerlendirme ve dağıtma konusundaki anlayışınızı sınayın.

Ders Özeti

Bu derste şunları öğrendiniz: ayrılmış test durumlarında ince ayar yapılmış modeli temel modelle karşılaştıran titiz dağıtım öncesi değerlendirme vazgeçilmezdir; gerileme testi, aşırı uzmanlaşmanın neden olduğu genel yeteneklerin felaketle sonuçlanabilecek biçimde unutulmasını tespit eder; dağıtım seçenekleri basitlik için OpenAI'nin yönetilen ince ayar API'sinden, yüksek aktarım hızlı üretim sunumu için vLLM'e ve CPU tabanlı yerel çıkarım için GGUF/llama.cpp'ye kadar uzanır. Yapay Zekâ Mühendisliği öğrenme yolunu tamamladığınız için tebrikler!

Sıkça Sorulan Sorular

“İnce Ayarlı Modelinizi Değerlendirme ve Dağıtma” dersi ücretsiz mi?

Evet — “İnce Ayarlı Modelinizi Değerlendirme ve Dağıtma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.

“İnce Ayarlı Modelinizi Değerlendirme ve Dağıtma” dersinde ne öğreneceğim?

Temel ve ince ayarlı modeli ayrılmış test örnekleri üzerinde karşılaştıran nicel değerlendirmeler çalıştırın, yerel çıkarım için GGUF'a dönüştürün ve llama.cpp veya vLLM üzerinden sunun. AI Engineering Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“İnce Ayarlı Modelinizi Değerlendirme ve Dağıtma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Engineering Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Engineering Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. İnce Ayarın İstem Yazımını Geride Bıraktığı Durumlar
  2. Yüksek Kaliteli Eğitim Veri Kümesi Hazırlama
  3. Hugging Face PEFT ile LoRA İnce Ayarı
  4. İnce Ayarlı Modelinizi Değerlendirme ve Dağıtma
← AI Engineering Academy Sayfasına Dön