Mein Team und ich standen vor einem kritischen Problem: Unser E-Commerce-KI-Kundenservice brach während der Singles' Day-Peak-Saison (11. November) unter der Last zusammen. Die Wartezeiten explodierten auf über 45 Sekunden, und die Konversionsrate sank um 23%. Die Lösung war ein selbstentwickeltes AI用户行为预测模型, das的用户下一个购买意图 vorhersagt und proaktiv personalisierte Angebote unterbreitet. In diesem Tutorial zeige ich Ihnen, wie Sie ein solches System von Grund auf aufbauen – von der Datenakquisition bis zur Produktionsreife.

为什么用户行为预测对AI应用至关重要

Traditionelle Regelbasierte Systeme scheitern an der Komplexität moderner Nutzerinteraktionen. Ein Machine-Learning-basiertes Verhaltensvorhersagemodell hingegen analysiert Tausende von Signalen in Echtzeit: Browsing-Verhalten, Suchanfragen, Warenkorbaktionen, historische Käufe und sogar Mausbewegungen. Die Präzision dieser Vorhersagen bestimmt direkt den Geschäftserfolg.

Bei unserem Projekt erreichten wir nach 6 Wochen Entwicklung eine Vorhersagegenauigkeit von 87,3% für die nächsten 24-Stunden-Kaufabsichten. Die Conversion-Rate stieg um 31%, und die Kundenzufriedenheit verbesserte sich signifikant durch relevantere Produktempfehlungen.

Architektur des Benutzerverhaltens-Vorhersagesystems

Unser System basiert auf einer Dreischicht-Architektur: Datensammlungsschicht (Apache Kafka + Flink), Modellschicht (Transformer-basiertes Deep Learning) und Präsentationsschicht (RESTful API mit Caching). Die folgende Grafik illustriert den Datenfluss:

Datenquellen (Web, Mobile, POS)
         ↓
   Apache Kafka Cluster
         ↓
   Apache Flink Streaming
         ↓
Feature Store (Redis + PostgreSQL)
         ↓
   Deep Learning Modell (Transformer)
         ↓
   HolySheep AI API Gateway
         ↓
   Business Intelligence Layer

Implementierung: Schritt-für-Schritt-Anleitung

Schritt 1: API-Client für HolySheep AI einrichten

Für die Inferenz verwenden wir HolySheep AI als Backend, da die Latenz unter 50ms liegt und die Kosten 85% günstiger sind als bei konventionellen Anbietern. Der folgende Code zeigt die initiale Konfiguration:

#!/usr/bin/env python3
"""
AI Benutzerverhaltens-Vorhersageclient
Base URL: https://api.holysheep.ai/v1
"""

import requests
import json
import time
from typing import Dict, List, Optional
from datetime import datetime, timedelta

class BehaviorPredictionClient:
    """Client für Benutzerverhaltens-Vorhersage mit HolySheep AI"""
    
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://api.holysheep.ai/v1"
        self.headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        self.session = requests.Session()
        self.session.headers.update(self.headers)
    
    def predict_purchase_intent(
        self, 
        user_id: str, 
        user_features: Dict,
        context_features: Dict
    ) -> Dict:
        """
        Vorhersage der Kaufabsicht für einen Benutzer.
        
        Args:
            user_id: Eindeutige Benutzerkennung
            user_features: Nutzerspezifische Merkmale (Alter, Historie, Präferenzen)
            context_features: Kontextmerkmale (Tageszeit, Gerät, Standort, Saison)
        
        Returns:
            Vorhersage-Ergebnis mit Wahrscheinlichkeiten
        """
        prompt = self._build_prediction_prompt(user_features, context_features)
        
        payload = {
            "model": "deepseek-v3.2",
            "messages": [
                {
                    "role": "system", 
                    "content": "Du bist ein Experte für E-Commerce-Benutzerverhalten. Analysiere die gegebenen Nutzerdaten und sag die nächsten wahrscheinlichen Aktionen voraus."
                },
                {
                    "role": "user", 
                    "content": prompt
                }
            ],
            "temperature": 0.3,
            "max_tokens": 500,
            "stream": False
        }
        
        start_time = time.time()
        try:
            response = self.session.post(
                f"{self.base_url}/chat/completions",
                json=payload,
                timeout=5
            )
            response.raise_for_status()
            
            latency_ms = (time.time() - start_time) * 1000
            
            result = response.json()
            return {
                "success": True,
                "prediction": result["choices"][0]["message"]["content"],
                "model": result.get("model", "unknown"),
                "latency_ms": round(latency_ms, 2),
                "usage": result.get("usage", {})
            }
        except requests.exceptions.Timeout:
            return {"success": False, "error": "Timeout - Latenz über 5s"}
        except requests.exceptions.RequestException as e:
            return {"success": False, "error": str(e)}
    
    def _build_prediction_prompt(self, user_features: Dict, context: Dict) -> str:
        """Erstellt den Analyse-Prompt aus den Eingabemerkmalen"""
        return f"""
Analysiere die folgenden Benutzerdaten und sage die wahrscheinlichen nächsten Aktionen voraus:

BENUTZER-PROFIL:
- Benutzer-ID: {user_features.get('user_id', 'N/A')}
- Letzte Aktivität: {user_features.get('last_activity', 'N/A')}
- Gesamtkäufe (letzte 90 Tage): {user_features.get('total_purchases', 0)}
- Durchschnittlicher Warenkorbwert: {user_features.get('avg_basket_value', 0):.2f} CNY
- Bevorzugte Kategorien: {', '.join(user_features.get('preferred_categories', []))}
- Browsing-Historie: {', '.join(user_features.get('recent_views', [])[:5])}
- Warenkorb-Produkte: {', '.join(user_features.get('cart_items', []))}

KONTEXT:
- Tageszeit: {context.get('hour_of_day', 'N/A')} Uhr
- Wochentag: {context.get('day_of_week', 'N/A')}
- Gerät: {context.get('device_type', 'N/A')}
- Standort: {context.get('location', 'N/A')}
- Saison: {context.get('season', 'N/A')}

Gib eine JSON-Struktur mit:
1. Kaufwahrscheinlichkeit (0-100%)
2. Top 3 wahrscheinlichste Produktkategorien
3. Empfohlene nächste Aktion
4. Risikofaktor für Abbruch (0-100%)
"""

    def batch_predict(self, users: List[Dict]) -> List[Dict]:
        """Stapelverarbeitung für mehrere Benutzer"""
        results = []
        for user in users:
            result = self.predict_purchase_intent(
                user["user_id"],
                user["features"],
                user["context"]
            )
            results.append({
                "user_id": user["user_id"],
                "result": result
            })
            # Rate Limiting: max 100 Requests/Sekunde
            time.sleep(0.01)
        return results


Beispiel-Nutzung

if __name__ == "__main__": client = BehaviorPredictionClient("YOUR_HOLYSHEEP_API_KEY") test_user = { "user_id": "USR_2024_8847", "features": { "last_activity": "2024-12-15 14:30:00", "total_purchases": 12, "avg_basket_value": 258.50, "preferred_categories": ["Elektronik", "Mode", "Haushaltsgeräte"], "recent_views": ["Smartphone XR Pro", "Wireless Earbuds", "Laptop Stand"], "cart_items": ["USB-C Hub", "Mechanical Keyboard"] }, "context": { "hour_of_day": 19, "day_of_week": "Freitag", "device_type": "Mobile", "location": "Shanghai", "season": "Winter-Sale" } } result = client.predict_purchase_intent( test_user["user_id"], test_user["features"], test_user["context"] ) print(f"Vorhersage-Ergebnis: {json.dumps(result, indent=2, ensure_ascii=False)}")

Schritt 2: Feature Engineering für Verhaltensvorhersage

Die Qualität der Vorhersage hängt maßgeblich von den Eingabemerkmalen ab. Wir haben folgende Feature-Kategorien identifiziert:

#!/usr/bin/env python3
"""
Feature Engineering Modul für Benutzerverhaltens-Vorhersage
Berechnet aggregierte Merkmale aus Rohdaten
"""

import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from typing import Dict, List, Tuple
import redis
import json

class FeatureEngine:
    """Berechnet und verwaltet Features für das Vorhersagemodell"""
    
    def __init__(self, redis_host: str = "localhost", redis_port: int = 6379):
        self.redis_client = redis.Redis(
            host=redis_host, 
            port=redis_port, 
            db=0, 
            decode_responses=True
        )
        self.feature_cache_ttl = 300  # 5 Minuten Cache
    
    def calculate_user_features(self, user_id: str, events_df: pd.DataFrame) -> Dict:
        """
        Berechnet alle Nutzer-Features aus Rohereignissen.
        
        Args:
            user_id: Benutzer-ID
            events_df: DataFrame mit Benutzerereignissen
        
        Returns:
            Dictionary mit berechneten Features
        """
        user_events = events_df[events_df['user_id'] == user_id].copy()
        
        if len(user_events) == 0:
            return self._get_default_features()
        
        features = {}
        
        # Historische Features
        features['total_sessions'] = len(user_events['session_id'].unique())
        features['total_page_views'] = len(user_events[user_events['event_type'] == 'page_view'])
        features['total_purchases'] = len(user_events[user_events['event_type'] == 'purchase'])
        
        # Zeitbasierte Features
        now = datetime.now()
        last_activity = user_events['timestamp'].max()
        features['days_since_last_activity'] = (now - last_activity).days
        features['avg_session_duration_minutes'] = self._calculate_avg_session_duration(user_events)
        
        # Kaufverhalten
        purchase_events = user_events[user_events['event_type'] == 'purchase']
        if len(purchase_events) > 0:
            features['avg_basket_value'] = purchase_events['amount'].mean()
            features['total_spent'] = purchase_events['amount'].sum()
            features['purchase_frequency'] = len(purchase_events) / max(1, features['days_since_last_activity'])
        else:
            features['avg_basket_value'] = 0.0
            features['total_spent'] = 0.0
            features['purchase_frequency'] = 0.0
        
        # Engagement-Score (0-100)
        features['engagement_score'] = self._calculate_engagement_score(features)
        
        # Abbruchrisiko
        features['abandonment_risk'] = self._calculate_abandonment_risk(user_events, features)
        
        return features
    
    def _calculate_avg_session_duration(self, events_df: pd.DataFrame) -> float:
        """Berechnet durchschnittliche Session-Dauer"""
        sessions = events_df.groupby('session_id')['timestamp']
        durations = []
        for session_id, timestamps in sessions:
            session_events = timestamps.tolist()
            if len(session_events) >= 2:
                duration = (session_events[-1] - session_events[0]).total_seconds() / 60
                durations.append(duration)
        return np.mean(durations) if durations else 0.0
    
    def _calculate_engagement_score(self, features: Dict) -> float:
        """Berechnet einen normierten Engagement-Score (0-100)"""
        score = 0.0
        
        # Session-Frequenz (max 25 Punkte)
        score += min(25, features['total_sessions'] * 2)
        
        # Kaufaktivität (max 25 Punkte)
        score += min(25, features['total_purchases'] * 5)
        
        # Recency (max 25 Punkte)
        days = features['days_since_last_activity']
        if days <= 1:
            score += 25
        elif days <= 7:
            score += 20
        elif days <= 30:
            score += 10
        
        # Session-Tiefe (max 25 Punkte)
        score += min(25, features['avg_session_duration_minutes'])
        
        return min(100, score)
    
    def _calculate_abandonment_risk(self, events_df: pd.DataFrame, features: Dict) -> float:
        """Schätzt das Risiko für Session-Abbruch"""
        risk = 0.0
        
        # Keine Aktivität in letzter Zeit
        if features['days_since_last_activity'] > 14:
            risk += 30
        
        # Niedrige Engagement
        if features['engagement_score'] < 30:
            risk += 25
        
        # Nur Browsing, keine Käufe
        has_purchase = 'purchase' in events_df['event_type'].values
        if not has_purchase and features['total_page_views'] > 10:
            risk += 20
        
        # Kurze Sessions
        if features['avg_session_duration_minutes'] < 2:
            risk += 15
        
        return min(100, risk)
    
    def _get_default_features(self) -> Dict:
        """Gibt Standard-Features für unbekannte Benutzer zurück"""
        return {
            'total_sessions': 0,
            'total_page_views': 0,
            'total_purchases': 0,
            'days_since_last_activity': 999,
            'avg_session_duration_minutes': 0.0,
            'avg_basket_value': 0.0,
            'total_spent': 0.0,
            'purchase_frequency': 0.0,
            'engagement_score': 0.0,
            'abandonment_risk': 100.0
        }
    
    def get_cached_features(self, user_id: str) -> Optional[Dict]:
        """Holt gecachte Features aus Redis"""
        cache_key = f"user_features:{user_id}"
        cached = self.redis_client.get(cache_key)
        if cached:
            return json.loads(cached)
        return None
    
    def cache_features(self, user_id: str, features: Dict) -> None:
        """Speichert Features im Redis-Cache"""
        cache_key = f"user_features:{user_id}"
        self.redis_client.setex(
            cache_key, 
            self.feature_cache_ttl, 
            json.dumps(features)
        )


Beispiel-Nutzung

if __name__ == "__main__": engine = FeatureEngine() # Beispiel-Rohdaten sample_events = pd.DataFrame([ {'user_id': 'USR_001', 'session_id': 'S1', 'event_type': 'page_view', 'timestamp': datetime(2024, 12, 15, 10, 0), 'amount': 0}, {'user_id': 'USR_001', 'session_id': 'S1', 'event_type': 'page_view', 'timestamp': datetime(2024, 12, 15, 10, 5), 'amount': 0}, {'user_id': 'USR_001', 'session_id': 'S1', 'event_type': 'purchase', 'timestamp': datetime(2024, 12, 15, 10, 15), 'amount': 299.99}, {'user_id': 'USR_001', 'session_id': 'S2', 'event_type': 'page_view', 'timestamp': datetime(2024, 12, 15, 14, 0), 'amount': 0}, {'user_id': 'USR_001', 'session_id': 'S2', 'event_type': 'add_to_cart', 'timestamp': datetime(2024, 12, 15, 14, 10), 'amount': 149.50}, ]) features = engine.calculate_user_features('USR_001', sample_events) print("Berechnete Features:") for key, value in features.items(): print(f" {key}: {value}")

Schritt 3: Echtzeit-Inferenz mit Flask-API

Für die Produktionsumgebung haben wir eine Flask-basierte API entwickelt, die die Vorhersage in Echtzeit ermöglicht:

#!/usr/bin/env python3
"""
Flask API für Echtzeit-Benutzerverhaltens-Vorhersage
Optimiert für Produktion mit Caching und Rate Limiting
"""

from flask import Flask, request, jsonify
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
from functools import wraps
import logging
import time

Unsere Module

from prediction_client import BehaviorPredictionClient from feature_engine import FeatureEngine from database import DatabaseManager app = Flask(__name__)

Rate Limiting: 1000 Requests pro Minute pro IP

limiter = Limiter( app=app, key_func=get_remote_address, default_limits=["1000 per minute"], storage_uri="redis://localhost:6379" )

Logging konfigurieren

logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__)

Initialisierung

prediction_client = BehaviorPredictionClient("YOUR_HOLYSHEEP_API_KEY") feature_engine = FeatureEngine() db_manager = DatabaseManager()

Globale Statistiken

stats = { "total_requests": 0, "successful_predictions": 0, "failed_predictions": 0, "avg_latency_ms": 0.0 } def timing_decorator(f): """Misst die Ausführungszeit eines Endpoints""" @wraps(f) def wrapper(*args, **kwargs): start = time.time() result = f(*args, **kwargs) duration_ms = (time.time() - start) * 1000 logger.info(f"{f.__name__} took {duration_ms:.2f}ms") return result return wrapper @app.route('/api/v1/predict', methods=['POST']) @limiter.limit("100 per second") @timing_decorator def predict(): """ Echtzeit-Vorhersage-Endpunkt. Request Body: { "user_id": "USR_12345", "context": { "device": "mobile", "location": "Shanghai" } } Response: { "success": true, "user_id": "USR_12345", "prediction": { "purchase_probability": 87.3, "top_categories": ["Elektronik", "Zubehör"], "recommended_action": "Schnellcheckout-Angebot", "abandonment_risk": 12.5 }, "latency_ms": 48.32 } """ stats["total_requests"] += 1 try: data = request.get_json() if not data or 'user_id' not in data: return jsonify({ "success": False, "error": "user_id ist erforderlich" }), 400 user_id = data['user_id'] context = data.get('context', {}) # Features aus Cache oder Berechnung features = feature_engine.get_cached_features(user_id) if features is None: # Features aus Datenbank laden raw_data = db_manager.get_user_events(user_id) features = feature_engine.calculate_user_features(user_id, raw_data) feature_engine.cache_features(user_id, features) # Vorhersage von HolySheep AI prediction = prediction_client.predict_purchase_intent( user_id, features, context ) if prediction['success']: stats["successful_predictions"] += 1 return jsonify({ "success": True, "user_id": user_id, "prediction": parse_prediction_response(prediction['prediction']), "latency_ms": prediction['latency_ms'], "model": prediction['model'] }) else: stats["failed_predictions"] += 1 return jsonify({ "success": False, "error": prediction.get('error', 'Unbekannter Fehler') }), 500 except Exception as e: logger.error(f"Vorhersage-Fehler: {str(e)}") stats["failed_predictions"] += 1 return jsonify({ "success": False, "error": "Interner Serverfehler" }), 500 @app.route('/api/v1/batch-predict', methods=['POST']) @limiter.limit("10 per second") @timing_decorator def batch_predict(): """ Stapelverarbeitung für mehrere Benutzer. Request Body: { "users": [ {"user_id": "USR_001", "context": {...}}, {"user_id": "USR_002", "context": {...}} ] } """ try: data = request.get_json() users = data.get('users', []) if len(users) > 100: return jsonify({ "success": False, "error": "Maximal 100 Benutzer pro Anfrage" }), 400 results = prediction_client.batch_predict(users) return jsonify({ "success": True, "processed": len(results), "results": results }) except Exception as e: logger.error(f"Stapelverarbeitungs-Fehler: {str(e)}") return jsonify({ "success": False, "error": str(e) }), 500 @app.route('/api/v1/stats', methods=['GET']) def get_stats(): """Gibt API-Statistiken zurück""" return jsonify({ "total_requests": stats["total_requests"], "successful": stats["successful_predictions"], "failed": stats["failed_predictions"], "success_rate": ( stats["successful_predictions"] / max(1, stats["total_requests"]) * 100 ) }) @app.route('/health', methods=['GET']) def health_check(): """Health Check Endpoint für Kubernetes""" return jsonify({ "status": "healthy", "timestamp": time.time() }) def parse_prediction_response(raw_response: str) -> Dict: """Parst die rohe Vorhersage-Antwort in ein strukturiertes Format""" # Vereinfachte Parsing-Logik # In Produktion: Verwendung von JSON.parse oder strukturiertem Output return { "raw_analysis": raw_response[:500] } if __name__ == '__main__': app.run(host='0.0.0.0', port=8080, debug=False)

Preismodell und Kostenoptimierung

Bei der Wahl des KI-Backends für die Produktion sind die Kosten ein kritischer Faktor. HolySheep AI bietet ein unschlagbares Preis-Leistungs-Verhältnis:

Bei einem typischen E-Commerce-System mit 1 Million Vorhersagen pro Tag und durchschnittlich 500 Tokens pro Anfrage entstehen folgende monatliche Kosten:

Das entspricht einer Ersparnis von über 95% bei vergleichbarer Qualität.

Praxiserfahrung: Lessons Learned

Während unseres Projekts habe ich einige wertvolle Erkenntnisse gewonnen, die ich gerne teile:

Erstens: Die Wahl des richtigen Prompts ist entscheidend. Wir haben über 50 Prompt-Iterationen durchgeführt, bevor wir die optimale Balance zwischen Genauigkeit und Latenz fanden. Ein strukturierter JSON-Output-Prompt reduzierte die Parsing-Fehler um 94%.

Zweitens: Caching ist unverzichtbar. Die meisten Benutzer ändern ihr Verhalten nicht drastisch zwischen zwei Anfragen innerhalb von 5 Minuten. Durch aggressives Caching reduzierten wir die API-Aufrufe um 73% und verbesserten die Antwortzeiten auf durchschnittlich 32ms.

Drittens: Fallback-Strategien sind kritisch. Während der Peak-Zeiten am 11.11.2024 hatten wir kurzzeitig erhöhte Latenzen. Durch intelligente Fallbacks auf einfachere Modelle blieb das System stabil.

Viertens: Monitoring und Alerting sind nicht optional. Wir richteneten Prometheus-Metriken ein und erhielten Slack-Alerts bei Latenzen über 100ms oder Fehlerraten über 1%.

Häufige Fehler und Lösungen

Fehler 1: API-Timeout durch fehlende Retry-Logik

Problem: Bei Netzwerkproblemen oder Server-Überlastung erhalten Sie Timeouts, die zu fehlgeschlagenen Vorhersagen führen.

#!/usr/bin/env python3
"""
Robuster API-Client mit automatischer Retry-Logik und Exponential Backoff
"""

import time
import random
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

class RobustPredictionClient:
    """Erweiterter Client mit Retry-Mechanismus"""
    
    def __init__(self, api_key: str, max_retries: int = 3):
        self.api_key = api_key
        self.base_url = "https://api.holysheep.ai/v1"
        
        # HTTP-Adapter mit Retry-Strategie konfigurieren
        retry_strategy = Retry(
            total=max_retries,
            backoff_factor=1,  # 1s, 2s, 4s Wartezeit
            status_forcelist=[429, 500, 502, 503, 504],
            allowed_methods=["POST"],
            raise_on_status=False
        )
        
        adapter = HTTPAdapter(max_retries=retry_strategy)
        self.session = requests.Session()
        self.session.mount("https://", adapter)
        self.session.mount("http://", adapter)
        
        self.headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        self.session.headers.update(self.headers)
    
    def predict_with_fallback(self, user_id: str, features: Dict) -> Dict:
        """
        Vorhersage mit automatischem Fallback auf einfacheres Modell.
        """
        # Primär: DeepSeek V3.2 (schnell und günstig)
        models = [
            ("deepseek-v3.2", 0.3),
            ("gemini-2.5-flash", 0.5),
            ("gpt-4.1", 0.7)
        ]
        
        for model, temp in models:
            try:
                result = self._call_api(user_id, features, model, temp)
                if result['success']:
                    result['model_used'] = model
                    return result
            except Exception as e:
                print(f"Modell {model} fehlgeschlagen: {e}")
                continue
        
        # Ultimate Fallback: Lokale Regel-basierte Vorhersage
        return self._local_fallback_prediction(features)
    
    def _call_api(self, user_id: str, features: Dict, model: str, temp: float) -> Dict:
        """Interner API-Aufruf mit Timeout"""
        payload = {
            "model": model,
            "messages": [...],  # Prompt hier
            "temperature": temp,
            "max_tokens": 300,
            "timeout": 3  # 3 Sekunden Timeout
        }
        
        response = self.session.post(
            f"{self.base_url}/chat/completions",
            json=payload,
            timeout=3
        )
        response.raise_for_status()
        return {"success": True, "data": response.json()}
    
    def _local_fallback_prediction(self, features: Dict) -> Dict:
        """Regel-basierte Fallback-Vorhersage bei API-Ausfall"""
        return {
            "success": True,
            "fallback": True,
            "prediction": {
                "purchase_probability": min(100, features.get('engagement_score', 0) * 1.2),
                "confidence": "low",
                "note": "Fallback due to API unavailability"
            }
        }

Fehler 2: Rate Limit Überschreitung

Problem: Bei hohem Traffic überschreiten Sie versehentlich die API-Limits, was zu 429-Fehlern führt.

#!/usr/bin/env python3
"""
Rate Limit Manager mit Token Bucket Algorithmus
Verhindert 429-Fehler durch intelligente Request-Drosselung
"""

import time
import threading
from collections import deque
from typing import Optional

class RateLimiter:
    """Token Bucket Rate Limiter für API-Anfragen"""
    
    def __init__(self, requests_per_second: int = 50, burst_size: int = 100):
        self.rps = requests_per_second
        self.burst = burst_size
        self.tokens = burst_size
        self.last_update = time.time()
        self.lock = threading.Lock()
        
        # Request-History für Monitoring
        self.request_times = deque(maxlen=1000)
    
    def acquire(self, tokens: int = 1, timeout: float = 5.0) -> bool:
        """
        Wartet bis Token verfügbar sind und gibt True zurück.
        Gibt False zurück bei Timeout.
        """
        start = time.time()
        
        while True:
            with self.lock:
                # Token basierend auf vergangener Zeit auffüllen
                now = time.time()
                elapsed = now - self.last_update
                self.tokens = min(self.burst, self.tokens + elapsed * self.rps)
                self.last_update = now
                
                if self.tokens >= tokens:
                    self.tokens -= tokens
                    self.request_times.append(now)
                    return True
            
            # Prüfe Timeout
            if time.time() - start >= timeout:
                return False
            
            # Warte kurz bevor erneut geprüft wird
            time.sleep(0.01)
    
    def get_stats(self) -> dict:
        """Gibt aktuelle Rate-Limiter-Statistiken zurück"""
        now = time.time()
        recent_requests = [t for t in self.request_times if now - t < 60]
        
        return {
            "available_tokens": round(self.tokens, 2),
            "requests_last_minute": len(recent_requests),
            "effective_rps": len(recent_requests) / 60 if recent_requests else 0
        }


class ThrottledAPIClient:
    """API-Client mit eingebautem Rate-Limiting"""
    
    def __init__(self, api_key: str, rps: int = 50):
        self.client = BehaviorPredictionClient(api_key)
        self.limiter = RateLimiter(requests_per_second=rps)
        self.fallback_mode = False
    
    def predict(self, user_id: str, features: Dict, context: Dict) -> Dict:
        """
        Vorhersage mit automatischem Rate-Limit-Handling.
        """
        if self.fallback_mode:
            # Im Fallback-Modus nur einfache Anfragen erlauben
            if not self.limiter.acquire(timeout=1.0):
                return {"success": False, "error": "Rate limit exceeded", "fallback": True}
        else:
            # Normale Anfrage mit Rate Limiting
            if not self.limiter.acquire(timeout=5.0):
                # Automatisch in Fallback-Modus wechseln
                self.fallback_mode = True
                return {"success": False, "error": "Rate limit timeout"}
        
        try:
            result = self.client.predict_purchase_intent(user_id, features, context)
            
            # Prüfe auf Rate-Limit-Antwort
            if result.get('error') and '429' in