Stellen Sie sich folgendes Szenario vor: Ein mittelständischer E-Commerce-Betreiber namens TechMart steht vor einem kritischen Problem. Während des jährlichen Singles' Day (11.11.) explodieren die Kundenservice-Anfragen von 500 auf über 50.000 pro Tag. Das bestehende KI-System basiert ausschließlich auf GPT-4 und kostet bei diesen Volumina über 3.000 US-Dollar pro Tag – bei einer durchschnittlichen Latenz von 2,3 Sekunden, die Kunden abschreckt.

In meiner dreijährigen Beratungspraxis habe ich dieses Muster unzählige Male gesehen. Der Wendepunkt kam für TechMart erst, als wir ein intelligentes Multi-Modell-Routing implementierten: Triviale FAQ-Anfragen werden automatisch an DeepSeek V3.2 (0,42 US-Dollar pro Million Token) weitergeleitet, komplexe Produktvergleiche an Gemini 2.5 Flash (2,50 US-Dollar), und nur kritische Eskalationsfälle erreichen Claude Sonnet 4.5 (15 US-Dollar). Das Ergebnis? Eine Kostenreduktion von 87% bei gleichzeitiger Verbesserung der Antwortqualität.

Warum Multi-Modell-Routing heute unverzichtbar ist

Die KI-Modelllandschaft 2026 bietet eine beispiellose Diversität. HolySheep AI als universeller Zugangspunkt ermöglicht den gleichzeitigen Zugriff auf GPT-4.1 (8 US-Dollar/MTok), Claude Sonnet 4.5 (15 US-Dollar/MTok), Gemini 2.5 Flash (2,50 US-Dollar/MTok) und DeepSeek V3.2 (0,42 US-Dollar/MTok) über eine einheitliche API. Bei einem Wechselkurs von ¥1 = 1 US-Dollar und Unterstützung für WeChat und Alipay ist HolySheep besonders für den chinesischen Markt optimiert, mit einer Latenz von unter 50 Millisekunden.

Architektur eines intelligenten Routing-Systems

Klassifizierung der Aufgabentypen

Der Kern eines jeden Routing-Systems ist die präzise Klassifizierung der eingehenden Anfragen. Ich unterscheide fünf Hauptkategorien:

Implementierung des Routing-Layers

Die folgende Python-Implementierung demonstriert einen produktionsreifen Router, den ich für TechMart entwickelt habe:

import os
import json
import time
from typing import Dict, List, Optional
from enum import Enum
from dataclasses import dataclass
import requests

HolySheep AI Konfiguration

HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1" HOLYSHEEP_API_KEY = os.getenv("YOUR_HOLYSHEEP_API_KEY") class TaskType(Enum): TRIVIAL = "trivial" STRUCTURED = "structured" COMPLEX_REASONING = "complex_reasoning" CREATIVE_SENSITIVE = "creative_sensitive" DOMAIN_EXPERT = "domain_expert" @dataclass class ModelConfig: model_id: str cost_per_mtok: float max_latency_ms: int strengths: List[str] recommended_for: List[TaskType] class ModelRouter: """ Intelligenter Router für Multi-Modell-Auswahl. Wählt basierend auf Aufgabenanalyse das optimale Modell aus. """ def __init__(self): self.models = { "deepseek-v3.2": ModelConfig( model_id="deepseek-v3.2", cost_per_mtok=0.42, max_latency_ms=1200, strengths=["Faktenwissen", "Strukturierte Antworten", "Schnelle Inferenz"], recommended_for=[TaskType.TRIVIAL, TaskType.STRUCTURED] ), "gemini-2.5-flash": ModelConfig( model_id="gemini-2.5-flash", cost_per_mtok=2.50, max_latency_ms=800, strengths=["Code-Generierung", "Mehrsprachigkeit", "Analyse"], recommended_for=[TaskType.STRUCTURED, TaskType.COMPLEX_REASONING] ), "gpt-4.1": ModelConfig( model_id="gpt-4.1", cost_per_mtok=8.00, max_latency_ms=1500, strengths=["Komplexes Reasoning", "Konsistenz", "Breites Wissen"], recommended_for=[TaskType.COMPLEX_REASONING, TaskType.DOMAIN_EXPERT] ), "claude-sonnet-4.5": ModelConfig( model_id="claude-sonnet-4.5", cost_per_mtok=15.00, max_latency_ms=1800, strengths=["Nuancen", "Empathie", "Kreativität"], recommended_for=[TaskType.CREATIVE_SENSITIVE] ) } self.usage_stats = {model_id: {"requests": 0, "tokens": 0, "cost": 0.0} for model_id in self.models.keys()} def classify_task(self, prompt: str, context: Optional[Dict] = None) -> TaskType: """ Klassifiziert die Aufgabe basierend auf semantischer Analyse. Verwendet ein leichtgewichtiges Klassifizierungsmodell. """ prompt_lower = prompt.lower() # Triviale Indikatoren trivial_keywords = ["was ist", "definiere", "wie funktioniert", "status", "tracking", "lieferzeit", "öffnungszeiten"] if any(kw in prompt_lower for kw in trivial_keywords): return TaskType.TRIVIAL # Strukturiert/Analytisch structured_keywords = ["vergleiche", "tabelle", "analyse", "statistik", "code", "programmieren", "daten"] if any(kw in prompt_lower for kw in structured_keywords): return TaskType.STRUCTURED # Komplexes Reasoning reasoning_keywords = ["warum", "erkläre detailliert", "strategie", "empfehle", "optimiere", "mehrstufig"] if any(kw in prompt_lower for kw in reasoning_keywords): return TaskType.COMPLEX_REASONING # Kreativ/Sensibel creative_keywords = ["schreibe", "erzähle", "emotional", "beschwerde", "reklamation", "marketing"] if any(kw in prompt_lower for kw in creative_keywords): return TaskType.CREATIVE_SENSITIVE # Domain-Expert Indikatoren expert_keywords = ["medizinisch", "rechtlich", "diagnose", "vertrag", "juristisch", "therapie"] if any(kw in prompt_lower for kw in expert_keywords): return TaskType.DOMAIN_EXPERT # Standard: strukturiert für moderate Komplexität return TaskType.STRUCTURED def select_model(self, task_type: TaskType, urgency: str = "normal") -> str: """ Wählt das optimale Modell basierend auf Aufgabentyp und Dringlichkeit. """ candidates = [m for m, cfg in self.models.items() if task_type in cfg.recommended_for] if not candidates: candidates = list(self.models.keys()) # Bei hoher Dringlichkeit: wähle schnellstes Modell if urgency == "high": return min(candidates, key=lambda m: self.models[m].max_latency_ms) # Bei normaler Dringlichkeit: wähle günstigstes Modell unter den Kandidaten return min(candidates, key=lambda m: self.models[m].cost_per_mtok) def call_model(self, model_id: str, prompt: str) -> Dict: """ Sendet Anfrage an HolySheep AI API. """ headers = { "Authorization": f"Bearer {HOLYSHEEP_API_KEY}", "Content-Type": "application/json" } payload = { "model": model_id, "messages": [{"role": "user", "content": prompt}], "max_tokens": 2000, "temperature": 0.7 } start_time = time.time() try: response = requests.post( f"{HOLYSHEEP_BASE_URL}/chat/completions", headers=headers, json=payload, timeout=30 ) response.raise_for_status() elapsed_ms = (time.time() - start_time) * 1000 result = response.json() usage = result.get("usage", {}) input_tokens = usage.get("prompt_tokens", 0) output_tokens = usage.get("completion_tokens", 0) total_tokens = input_tokens + output_tokens # Kostenberechnung cost = (total_tokens / 1_000_000) * self.models[model_id].cost_per_mtok # Statistik aktualisieren self.usage_stats[model_id]["requests"] += 1 self.usage_stats[model_id]["tokens"] += total_tokens self.usage_stats[model_id]["cost"] += cost return { "success": True, "model": model_id, "content": result["choices"][0]["message"]["content"], "latency_ms": round(elapsed_ms, 2), "tokens": total_tokens, "cost_usd": round(cost, 4), "total_cost_so_far": round(sum(s["cost"] for s in self.usage_stats.values()), 4) } except requests.exceptions.RequestException as e: return { "success": False, "error": str(e), "model": model_id, "latency_ms": round((time.time() - start_time) * 1000, 2) } def route_and_execute(self, prompt: str, context: Optional[Dict] = None) -> Dict: """ Hauptmethode: Klassifiziert, wählt Modell, führt aus. """ task_type = self.classify_task(prompt, context) urgency = context.get("urgency", "normal") if context else "normal" selected_model = self.select_model(task_type, urgency) return { "task_type": task_type.value, "selected_model": selected_model, "estimated_cost_per_1k_tokens": self.models[selected_model].cost_per_mtok, **self.call_model(selected_model, prompt) } def get_cost_report(self) -> Dict: """Generiert Kostenübersicht über alle Modelle.""" total_cost = sum(s["cost"] for s in self.usage_stats.values()) total_requests = sum(s["requests"] for s in self.usage_stats.values()) return { "total_requests": total_requests, "total_cost_usd": round(total_cost, 4), "breakdown_by_model": { model_id: { "requests": stats["requests"], "tokens": stats["tokens"], "cost_usd": round(stats["cost"], 4), "percentage": f"{stats['cost']/total_cost*100:.1f}%" if total_cost > 0 else "0%" } for model_id, stats in self.usage_stats.items() } }

Initialisierung

router = ModelRouter()

Beispiel-Ausführung

if __name__ == "__main__": test_prompts = [ "Was ist die Lieferzeit für Standardversand?", "Vergleiche die technischen Specs von iPhone 15 und Samsung S24 in einer Tabelle.", "Wie kann ich meine Bestellung 返回 (retournieren)?", "Schreibe eine empathische Antwort auf eine Beschwerde über verspätete Lieferung.", "Erkläre mehrstufig, wie ich mein Passwort zurücksetzen kann." ] print("=== Multi-Modell Routing Demo ===\n") for prompt in test_prompts: result = router.route_and_execute(prompt) print(f"Prompt: {prompt[:50]}...") print(f" → Task: {result['task_type']}") print(f" → Model: {result['selected_model']}") print(f" → Latency: {result.get('latency_ms', 'N/A')}ms") print(f" → Cost: ${result.get('cost_usd', 0):.4f}") print(f" → Total so far: ${result.get('total_cost_so_far', 0):.4f}\n") print("\n=== Kostenreport ===") report = router.get_cost_report() print(f"Gesamtkosten: ${report['total_cost_usd']}") print(f"Anzahl Anfragen: {report['total_requests']}")

Praxis-Beispiel: E-Commerce Kundenservice-Integration

Der folgende Production-Code zeigt die vollständige Integration in ein E-Commerce-System mit automatischer Eskalation und Fallback-Mechanismen:

"""
Production-Ready E-Commerce Kundenservice mit Multi-Modell-Routing
Integriert in bestehende TechMart-Architektur mit Redis-Cache und Monitoring
"""

import redis
import json
from datetime import datetime
from typing import Optional, Tuple
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class EcommerceCustomerServiceRouter:
    """
    Produktionsreifer Kundenservice-Router mit Caching,
    Monitoring und automatischer Eskalation.
    """
    
    def __init__(self, router: ModelRouter, redis_client: redis.Redis):
        self.router = router
        self.redis = redis_client
        self.escalation_threshold = 0.85  # 85% Konfidenzschwelle
        
        # Cache-TTL in Sekunden
        self.cache_ttl = {
            TaskType.TRIVIAL: 3600,      # 1 Stunde
            TaskType.STRUCTURED: 1800,   # 30 Minuten
            TaskType.COMPLEX_REASONING: 300,  # 5 Minuten
            TaskType.CREATIVE_SENSITIVE: 600, # 10 Minuten
            TaskType.DOMAIN_EXPERT: 600  # 10 Minuten
        }
    
    def _get_cache_key(self, prompt: str, task_type: TaskType) -> str:
        """Generiert Cache-Key basierend auf Prompt-Hash und Task-Type."""
        import hashlib
        prompt_hash = hashlib.md5(prompt.encode()).hexdigest()
        return f"cs:{task_type.value}:{prompt_hash}"
    
    def _check_cache(self, cache_key: str) -> Optional[Dict]:
        """Prüft Redis-Cache und gibt gecachte Antwort zurück."""
        cached = self.redis.get(cache_key)
        if cached:
            logger.info(f"Cache-Hit für Key: {cache_key}")
            return json.loads(cached)
        return None
    
    def _store_cache(self, cache_key: str, response: Dict, task_type: TaskType):
        """Speichert Antwort im Redis-Cache."""
        self.redis.setex(
            cache_key, 
            self.cache_ttl.get(task_type, 600), 
            json.dumps(response)
        )
        logger.info(f"Cache gespeichert für Key: {cache_key}")
    
    def _should_escalate(self, response: Dict, context: Dict) -> bool:
        """
        Bestimmt, ob ein Fall eskaliert werden muss.
        Kriterien: negative Kundenhistorie, hoher Auftragswert, Schlüsselwörter.
        """
        customer_id = context.get("customer_id")
        
        # Prüfe Kundenhistorie
        if customer_id:
            complaint_count = self.redis.scard(f"customer:{customer_id}:complaints")
            if complaint_count > 2:
                return True
        
        # Prüfe Auftragswert
        order_value = context.get("order_value", 0)
        if order_value > 500:  # Hochpreisige Bestellungen
            return True
        
        # Prüfe Escalation-Keywords
        escalation_keywords = ["anwalt", "verklagen", "verbraucherschutz", 
                               "新闻媒体", "offline stellen"]
        if any(kw in context.get("original_prompt", "").lower() 
               for kw in escalation_keywords):
            return True
        
        return False
    
    def _create_context_from_request(self, request_data: Dict) -> Dict:
        """Extrahiert relevante Kontextinformationen aus der Anfrage."""
        return {
            "customer_id": request_data.get("customer_id"),
            "order_id": request_data.get("order_id"),
            "order_value": request_data.get("order_value", 0),
            "original_prompt": request_data.get("message", ""),
            "language": request_data.get("language", "de"),
            "channel": request_data.get("channel", "chat"),
            "timestamp": datetime.now().isoformat()
        }
    
    def process_request(self, request_data: Dict) -> Dict:
        """
        Verarbeitet Kundenservice-Anfrage mit vollständiger Pipeline:
        1. Cache-Prüfung
        2. Task-Klassifizierung
        3. Modell-Routing
        4. Response-Generierung
        5. Eskalationsprüfung
        6. Monitoring-Log
        """
        message = request_data.get("message", "")
        context = self._create_context_from_request(request_data)
        
        # Schritt 1: Task klassifizieren
        task_type = self.router.classify_task(message, context)
        logger.info(f"Klassifizierte Anfrage als: {task_type.value}")
        
        # Schritt 2: Cache prüfen
        cache_key = self._get_cache_key(message, task_type)
        cached_response = self._check_cache(cache_key)
        
        if cached_response:
            return {
                **cached_response,
                "cache_hit": True,
                "escalated": self._should_escalate(cached_response, context)
            }
        
        # Schritt 3: Modell auswählen und ausführen
        urgency = "high" if context.get("channel") == "phone" else "normal"
        result = self.router.route_and_execute(message, context)
        
        # Schritt 4: Eskalationsprüfung
        should_escalate = self._should_escalate(result, context)
        
        response_data = {
            "success": result["success"],
            "message": result.get("content", result.get("error", "Unknown error")),
            "model_used": result["selected_model"],
            "task_type": task_type.value,
            "latency_ms": result.get("latency_ms", 0),
            "cost_usd": result.get("cost_usd", 0),
            "cache_hit": False,
            "escalated": should_escalate,
            "timestamp": context["timestamp"]
        }
        
        # Schritt 5: Cache speichern (nur bei erfolgreicher, nicht-eskalierter Antwort)
        if result["success"] and not should_escalate:
            self._store_cache(cache_key, response_data, task_type)
        
        # Schritt 6: Monitoring
        self._log_interaction(request_data, response_data)
        
        return response_data
    
    def _log_interaction(self, request: Dict, response: Dict):
        """Speichert Interaktion für Analytics und Modellverbesserung."""
        log_entry = {
            "request": {
                "customer_id": request.get("customer_id"),
                "message_length": len(request.get("message", "")),
                "channel": request.get("channel")
            },
            "response": {
                "success": response["success"],
                "model": response["model_used"],
                "task_type": response["task_type"],
                "escalated": response["escalated"],
                "cost_usd": response["cost_usd"]
            }
        }
        
        # Speichere in Redis für spätere Analyse
        self.redis.lpush("interactions:logs", json.dumps(log_entry))
        self.redis.ltrim("interactions:logs", 0, 9999)  # Behalte letzte 10.000
        
        logger.info(f"Interaktion geloggt: {response['model_used']} | "
                   f"Escalated: {response['escalated']}")


Production-Initialisierung

redis_client = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True) ecommerce_router = EcommerceCustomerServiceRouter(router, redis_client)

Beispiel-Requests

if __name__ == "__main__": test_requests = [ { "message": "Wo ist meine Bestellung #12345?", "customer_id": "CUST_001", "order_id": "12345", "order_value": 49.99, "channel": "chat", "language": "de" }, { "message": "Ich möchte meine Bestellung 返回 (retournieren), " "das Produkt ist kaputt. Ich erwäge rechtliche Schritte!", "customer_id": "CUST_002", "order_id": "67890", "order_value": 899.00, "channel": "chat", "language": "de" }, { "message": "Vergleiche die Garantiebedingungen aller angebotenen Laptops", "customer_id": "CUST_003", "order_id": None, "order_value": 0, "channel": "web", "language": "de" } ] print("=== E-Commerce Kundenservice Routing ===\n") for req in test_requests: print(f"Anfrage: {req['message'][:60]}...") result = ecommerce_router.process_request(req) print(f" Modell: {result['model_used']}") print(f" Task-Type: {result['task_type']}") print(f" Latenz: {result['latency_ms']}ms") print(f" Kosten: ${result['cost_usd']:.4f}") print(f" Escalated: {'⚠️ JA - Manuell prüfen!' if result['escalated'] else '✓ Nein'}") print(f" Cache-Hit: {'✓' if result['cache_hit'] else '✗'}") print()

Erweiterte Routing-Strategien für Enterprise-Systeme

In meiner Enterprise-Beratung habe ich festgestellt, dass reines Keyword-Routing für große Systeme unzureichend ist. Aktive Lernschleifen und A/B-Testing sind entscheidend:

"""
Adaptive Routing mit Feedback-Schleife und automatischer Modelloptimierung
Lernt aus Benutzerfeedback und passt Routing-Entscheidungen kontinuierlich an
"""

from collections import defaultdict
import numpy as np
from datetime import datetime, timedelta

class AdaptiveModelRouter(ModelRouter):
    """
    Erweiterter Router mit automatischer Optimierung basierend auf:
    - Explizitem Benutzerfeedback (Thumbs up/down)
    - Impliziten Signalen (Antwortzeit akzeptanz, Folgeantfragen)
    - Kosten-Nutzen-Optimierung
    """
    
    def __init__(self):
        super().__init__()
        
        # Modell-Performance-Tracking
        self.model_scores = defaultdict(lambda: {
            "quality_scores": [],
            "latency_scores": [],
            "cost_efficiency": [],
            "escalation_rate": []
        })
        
        # Task-spezifische Modell-Performance
        self.task_model_performance = defaultdict(lambda: defaultdict(lambda: {
            "success_count": 0,
            "failure_count": 0,
            "avg_quality": 0.0,
            "avg_latency_ms": 0.0
        }))
        
        # Dynamische Kosten-Gewichte
        self.cost_weight = 0.3      # Wie wichtig sind Kosten?
        self.quality_weight = 0.5  # Wie wichtig ist Qualität?
        self.latency_weight = 0.2  # Wie wichtig ist Geschwindigkeit?
        
        # Minimale Stichproben für zuverlässige Statistik
        self.min_samples = 10
    
    def update_model_performance(self, model_id: str, task_type: TaskType,
                                  quality_score: float, latency_ms: float,
                                  required_escalation: bool):
        """
        Aktualisiert die Modell-Performance-Metriken basierend auf Feedback.
        """
        perf = self.task_model_performance[task_type][model_id]
        
        # Gleitender Durchschnitt für Qualität
        samples = perf["success_count"] + perf["failure_count"]
        if samples >= self.min_samples:
            perf["avg_quality"] = (perf["avg_quality"] * samples + quality_score) / (samples + 1)
        else:
            perf["avg_quality"] = (perf["avg_quality"] * samples + quality_score) / (samples + 1)
        
        # Latenz-Tracking
        if perf["avg_latency_ms"] > 0:
            perf["avg_latency_ms"] = (perf["avg_latency_ms"] + latency_ms) / 2
        else:
            perf["avg_latency_ms"] = latency_ms
        
        # Erfolg/Misserfolg
        if quality_score >= 0.7 and not required_escalation:
            perf["success_count"] += 1
        else:
            perf["failure_count"] += 1
        
        # Gesamtscore aktualisieren
        self.model_scores[model_id]["quality_scores"].append(quality_score)
        self.model_scores[model_id]["latency_scores"].append(latency_ms)
        self.model_scores[model_id]["escalation_rate"].append(1 if required_escalation else 0)
    
    def calculate_model_score(self, model_id: str, task_type: TaskType) -> float:
        """
        Berechnet einen zusammengesetzten Score für ein Modell bei einer Aufgabe.
        """
        base_config = self.models[model_id]
        task_perf = self.task_model_performance[task_type][model_id]
        
        # Qualitätskomponente (normalisiert 0-1)
        quality_score = task_perf["avg_quality"]
        
        # Latenzkomponente (invertiert, da niedriger besser)
        max_latency = max(m.max_latency_ms for m in self.models.values())
        latency_score = 1 - (task_perf["avg_latency_ms"] / max_latency)
        
        # Kostenkomponente (invertiert, da niedriger besser)
        max_cost = max(m.cost_per_mtok for m in self.models.values())
        cost_score = 1 - (base_config.cost_per_mtok / max_cost)
        
        # Eskalationsrate
        total_requests = task_perf["success_count"] + task_perf["failure_count"]
        if total_requests >= self.min_samples:
            escalation_rate = task_perf["failure_count"] / total_requests
        else:
            escalation_rate = 0.5  # Unsicherheit bei wenigen Daten
        
        # Zusammengesetzter Score
        composite = (
            self.quality_weight * quality_score +
            self.latency_weight * latency_score +
            self.cost_weight * cost_score
        ) * (1 - escalation_rate * 0.3)  # Bestrafe hohe Eskalationsrate
        
        return max(0, min(1, composite))  # Clamp to [0, 1]
    
    def adaptive_model_selection(self, task_type: TaskType, 
                                  urgency: str = "normal") -> str:
        """
        Wählt Modell mit dynamischer Optimierung basierend auf historischer Performance.
        """
        candidates = [m for m, cfg in self.models.items() 
                     if task_type in cfg.recommended_for]
        
        if not candidates:
            candidates = list(self.models.keys())
        
        # Bei hoher Dringlichkeit: priorisiere Latenz
        if urgency == "high":
            return min(candidates, key=lambda m: self.models[m].max_latency_ms)
        
        # Bei normaler Dringlichkeit: nutze adaptiven Score
        scores = {m: self.calculate_model_score(m, task_type) for m in candidates}
        
        # Wähle bestes Modell mit leichtem Zufallsfaktor (Exploration)
        exploration_factor = 0.1
        exploration_candidate = np.random.choice(candidates)
        
        best_model = max(scores.items(), key=lambda x: x[1])[0]
        
        if np.random.random() < exploration_factor:
            logger.info(f"Exploration: Wähle {exploration_candidate} statt {best_model}")
            return exploration_candidate
        
        return best_model
    
    def get_optimization_report(self) -> Dict:
        """Generiert Bericht über Routing-Optimierungspotenzial."""
        report = {
            "model_recommendations": {},
            "cost_savings_potential": 0.0,
            "quality_metrics": {}
        }
        
        for task_type in TaskType:
            scores = {
                m: self.calculate_model_score(m, task_type) 
                for m in self.models.keys()
            }
            best_model = max(scores.items(), key=lambda x: x[1])
            
            report["model_recommendations"][task_type.value] = {
                "recommended_model": best_model[0],
                "confidence": round(best_model[1], 3),
                "all_scores": {m: round(s, 3) for m, s in scores.items()}
            }
            
            # Kostenvergleich: aktuell vs. optimal
            current_avg = np.mean([self.models[m].cost_per_mtok for m in scores.keys()])
            optimal_cost = self.models[best_model[0]].cost_per_mtok
            report["cost_savings_potential"] += (current_avg - optimal_cost) * 1000
        
        return report
    
    def run_ab_test(self, test_duration_hours: int = 24):
        """
        Führt A/B-Test zwischen aktuellem Routing und randomisiertem Routing durch.
        """
        logger.info(f"Starte A/B-Test für {test_duration_hours} Stunden...")
        
        # Konfiguration: 80% aktuelles Routing, 20% random
        control_ratio = 0.8
        
        test_results = {
            "control": {"costs": [], "quality": [], "latency": []},
            "random": {"costs": [], "quality": [], "latency": []}
        }
        
        # Simulation von Testdaten
        np.random.seed(42)
        n_samples = 100
        
        for i in range(n_samples):
            prompt = f"Test-Prompt {i}"
            task_type = self.classify_task(prompt)
            
            # Kontrollgruppe: aktuelles Routing
            control_model = self.adaptive_model_selection(task_type)
            control_cost = self.models[control_model].cost_per_mtok
            control_quality = self.task_model_performance[task_type][control_model]["avg_quality"]
            
            test_results["control"]["costs"].append(control_cost)
            test_results["control"]["quality"].append(control_quality)
            test_results["control"]["latency"].append(
                self.models[control_model].max_latency_ms
            )
            
            # Testgruppe: zufälliges Routing
            random_model = np.random.choice(list(self.models.keys()))
            random_cost = self.models[random_model].cost_per_mtok
            random_quality = self.task_model_performance[task_type][random_model]["avg_quality"]
            
            test_results["random"]["costs"].append(random_cost)
            test_results["random"]["quality"].append(random_quality)
            test_results["random"]["latency"].append(
                self.models[random_model].max_latency_ms
            )
        
        return {
            "control": {
                "avg_cost": np.mean(test_results["control"]["costs"]),
                "avg_quality": np.mean(test_results["control"]["quality"]),
                "avg_latency": np.mean(test_results["control"]["latency"])
            },
            "random": {
                "avg_cost": np.mean(test_results["random"]["costs"]),
                "avg_quality": np.mean(test_results["random"]["quality"]),
                "avg_latency": np.mean(test_results["random"]["latency"])
            },
            "improvement": {
                "cost_reduction": (
                    (np.mean(test_results["random"]["costs"]) - 
                     np.mean(test_results["control"]["costs"])) /
                    np.mean(test_results["random"]["costs"]) * 100
                ),
                "quality_delta": (
                    np.mean(test_results["control"]["quality"]) -
                    np.mean(test_results["random"]["quality"])
                )
            }
        }


Demonstration der adaptiven Optimierung

if __name__ == "__main__": adaptive_router = AdaptiveModelRouter() # Simuliere einige Feedback-Daten for _ in range(20): for model_id in ["deepseek-v3.2", "gemini-2.5-flash", "gpt-4.1"]: adaptive