0Pricing
AI Engineering Academy · Lektion

Ihr feinabgestimmtes Modell evaluieren und bereitstellen

Führen Sie quantitative Evaluierungen durch, die das Basismodell mit dem feinabgestimmten Modell anhand zurückgehaltener Testfälle vergleichen, konvertieren Sie das Modell für lokale Inferenz in GGUF und stellen Sie es über llama.cpp oder vLLM bereit.

Ihr feinabgestimmtes Modell evaluieren und bereitstellen ist eine kostenlose AI Engineering Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Engineering Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Engineering Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum die Evaluation vor der Bereitstellung erfolgen muss

Ein Fine-Tuning-Modell, das bei Trainingsdaten gute Ergebnisse erzielt, kann in Ihrem tatsächlichen Produktionsanwendungsfall schlechter abschneiden als das Basismodell. Nur eine sorgfältige Evaluation kann dies feststellen. Fine-Tuning kann zu katastrophalem Vergessen (dem Verlust von Fähigkeiten des Basismodells), Überspezialisierung (gute Leistung bei Ihrer Aufgabe, aber schlechtere Leistung bei verwandten Aufgaben) oder subtilen Rückschritten beim Sicherheitsverhalten führen. Stellen Sie ein Fine-Tuning-Modell niemals bereit, ohne es anhand eines repräsentativen Testsatzes mit dem Basismodell verglichen zu haben.

Erstellen eines zurückgehaltenen Testsatzes

Ihr Testsatz muss vollständig von den Trainings- und Validierungsdaten getrennt sein – er darf nur Beispiele enthalten, die das Modell in keiner Phase des Trainings gesehen hat. Der Testsatz sollte die vollständige Verteilung der Eingaben aus der Produktion abbilden: häufige Fälle, Grenzfälle und adversariale Eingaben. Bei Aufgaben zur Befolgung von Anweisungen sollten Sie Beispiele aufnehmen, bei denen alle Aspekte der Anweisung befolgt werden müssen, nicht nur die häufigsten. Ein Testsatz mit 100–500 Beispielen reicht in der Regel für eine zuverlässige Evaluation aus.

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

Quantitative Metriken für aufgabenspezifische Evaluation

Wählen Sie Evaluationsmetriken, die zu Ihrer Aufgabe passen. Messen Sie bei der JSON-Extraktion die Rate der Schema-Konformität und die Genauigkeit auf Feldebene. Messen Sie bei der Klassifikation Genauigkeit, Präzision und Trefferquote für jede Klasse. Verwenden Sie bei der Textgenerierung eine Bewertung durch ein LLM als Judge zur Beurteilung der Qualität. Messen Sie bei der Formatkonformität die exakte Rate der Formatübereinstimmung. Wenden Sie jede Metrik sowohl auf das Basismodell als auch auf das Fine-Tuning-Modell an, um die Verbesserungsdifferenz zu bestimmen.

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

Evaluation mit LLM-as-Judge

Verwenden Sie bei offenen Generierungsaufgaben ein LLM-as-Judge, um die Ausgaben des Fine-Tuning-Modells anhand der erwarteten Ausgaben zu bewerten. Fordern Sie GPT-4o mit einem Prompt auf, als Evaluator zu fungieren, stellen Sie die Eingabe, die erwartete Ausgabe und die Modellausgabe bereit und bitten Sie um eine Bewertung von Korrektheit, Vollständigkeit und Formatkonformität auf einer Skala von 1 bis 5. Mitteln Sie die Bewertungen über den Testsatz, um eine Gesamteinschätzung der Qualität zu erhalten. Vergleichen Sie den Wert des Fine-Tuning-Modells mit dem Wert des Basismodells auf demselben Testsatz.

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)

Ausführen der Vergleichsevaluation

Führen Sie eine direkte Vergleichsevaluation durch, bei der Sie das Basismodell, das Fine-Tuning-Modell und optional eine starke Prompting-Baseline anhand aller Testfälle vergleichen. Erzeugen Sie für jeden Testfall Ausgaben von jedem Modell und bewerten Sie anschließend alle Ausgaben mit Ihren Evaluationsmetriken. Erstellen Sie eine Vergleichstabelle mit Metrikwerten, Standardabweichungen und Beispielen dafür, wann das Fine-Tuning-Modell gegenüber der Baseline besser oder schlechter abschneidet.

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

Regressionstests auf katastrophales Vergessen

Fine-Tuning kann die allgemeinen Fähigkeiten des Modells verschlechtern – ein Phänomen, das als katastrophales Vergessen bezeichnet wird. Führen Sie eine Regressions-Testsuite sowohl auf dem Basis- als auch auf dem Fine-Tuning-Modell aus. Decken Sie dabei Aufgaben ab, die über Ihre Zielaufgabe hinaus relevant sind: allgemeine Fragenbeantwortung, Schlussfolgern, Codegenerierung und Befolgung von Anweisungen. Wenn das Fine-Tuning-Modell bei diesen Aufgaben deutlich schlechter abschneidet, ist möglicherweise Ihr LoRA-Rang zu hoch oder Sie haben zu viele Epochen trainiert.

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

Konvertieren in GGUF für lokale Inferenz

Für die lokale Bereitstellung ohne teure GPU-Infrastruktur konvertieren Sie Ihr zusammengeführtes Modell in das GGUF-Format und führen die Inferenz mit llama.cpp aus. GGUF unterstützt verschiedene Quantisierungsstufen: Q4_K_M (4-Bit, gutes Verhältnis von Qualität und Geschwindigkeit), Q8_0 (8-Bit, nahezu vollständige Qualität) und Q2_K (2-Bit, sehr schnell, aber mit geringerer Qualität). Ein quantisiertes 7B-Modell mit Q4 benötigt nur etwa 4 GB RAM und kann auf einer CPU mit 1–5 Token pro Sekunde ausgeführt werden.

# 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'])

Bereitstellen mit vLLM für die Produktion

Für das Bereitstellen eines feinabgestimmten Modells in der Produktion und bei hoher Auslastung gilt vLLM derzeit als Standard. vLLM verwendet PagedAttention, um mehrere Anfragen effizient gemeinsam zu verarbeiten und dadurch den GPU-Durchsatz deutlich zu erhöhen. Es unterstützt mit OpenAI kompatible API-Endpunkte und kann daher direkt als Ersatz für die OpenAI API eingesetzt werden. Eine einzelne A100 GPU mit vLLM und einem feinabgestimmten 7B-Modell kann Hunderte Anfragen pro Minute verarbeiten.

# 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)

A/B-Tests des feinabgestimmten Modells

Bevor Sie in der Produktion vollständig auf das feinabgestimmte Modell umstellen, führen Sie einen A/B-Test durch: Leiten Sie zunächst einen Teil des Produktionsdatenverkehrs (5–10 %) an das feinabgestimmte Modell weiter, während die Mehrheit weiterhin das Basismodell oder den bisherigen Prompt-Ansatz verwendet. Überwachen Sie für beide Gruppen Qualitätswerte, Latenz und Kennzahlen zur Nutzerzufriedenheit. Erhöhen Sie den Anteil des feinabgestimmten Modells nur, wenn der A/B-Test nach einer statistisch signifikanten Anzahl von Anfragen eine Verbesserung bestätigt.

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

Pflege feinabgestimmter Modelle im Zeitverlauf

Feinabgestimmte Modelle müssen laufend gepflegt werden. Wenn das Basismodell aktualisiert wird (etwa durch eine neue GPT-4o-Version oder eine neue Mistral-Version), sind Ihre Adaptergewichte möglicherweise nicht kompatibel und Sie müssen eventuell neu trainieren. Wenn sich die Anforderungen an Ihre Aufgabe ändern, müssen Sie die Trainingsdaten aktualisieren und das Modell neu trainieren. Wenn Sie in der Produktion neue Fehlerfälle entdecken, fügen Sie Ihrem Trainingsdatensatz entsprechende Beispiele hinzu. Planen Sie regelmäßiges Nachtrainieren als Bestandteil Ihres Workflows für den Betrieb von ML-Systemen in der Produktion ein.

Entscheidungsmatrix für die Bereitstellung

Welche Bereitstellungsstrategie für Ihr feinabgestimmtes Modell geeignet ist, hängt von Ihrer Auslastung und den Einschränkungen Ihrer Infrastruktur ab. Bei geringem Volumen (weniger als 1000 Anfragen pro Tag) ist die Fine-Tuning-API von OpenAI am einfachsten. Bei mittlerem Volumen (1000–100.000 pro Tag) kommt vLLM auf einer einzelnen GPU-Instanz infrage. Für Anwendungen mit hohem Volumen oder kritischen Latenzanforderungen verwenden Sie vLLM mit mehreren GPUs, ziehen Sie Tensor-Parallelismus in Betracht und schalten Sie einen Caching-Layer vor. Bei datenschutzsensiblen Daten hosten Sie das Modell auf Ihrer eigenen Infrastruktur mit GGUF/llama.cpp oder vLLM.

Kurze Überprüfung

Testen Sie Ihr Verständnis der Bewertung und Bereitstellung feinabgestimmter Modelle aus dieser Lektion.

Zusammenfassung der Lektion

In dieser Lektion haben Sie gelernt: Eine gründliche Bewertung vor der Bereitstellung, bei der das feinabgestimmte Modell anhand zurückgehaltener Testfälle mit dem Basismodell verglichen wird, ist unverzichtbar. Regressionstests erkennen das katastrophale Vergessen allgemeiner Fähigkeiten, das durch eine zu starke Spezialisierung entstehen kann. Die Bereitstellungsoptionen reichen von der verwalteten Fine-Tuning-API von OpenAI für eine einfache Einrichtung über vLLM für das Bereitstellen mit hohem Durchsatz in der Produktion bis zu GGUF/llama.cpp für lokale Inferenz auf der CPU. Herzlichen Glückwunsch zum Abschluss des AI-Engineering-Lernpfads!

Häufig gestellte Fragen

Ist die Lektion „Ihr feinabgestimmtes Modell evaluieren und bereitstellen“ kostenlos?

Ja — der vollständige Text von „Ihr feinabgestimmtes Modell evaluieren und bereitstellen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Engineering Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Engineering Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Ihr feinabgestimmtes Modell evaluieren und bereitstellen“?

Führen Sie quantitative Evaluierungen durch, die das Basismodell mit dem feinabgestimmten Modell anhand zurückgehaltener Testfälle vergleichen, konvertieren Sie das Modell für lokale Inferenz in GGUF… Du übst AI Engineering Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um AI Engineering Academy zu starten?

Keine Vorkenntnisse erforderlich. AI Engineering Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Ihr feinabgestimmtes Modell evaluieren und bereitstellen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser AI Engineering Academy-Lektion Code schreiben und ausführen?

Ja. Jede AI Engineering Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Wann Fine-Tuning besser ist als Prompting
  2. Einen hochwertigen Trainingsdatensatz vorbereiten
  3. LoRA-Fine-Tuning mit Hugging Face PEFT
  4. Ihr feinabgestimmtes Modell evaluieren und bereitstellen
← Zurück zu AI Engineering Academy