Einleitung
Python-Dekoratoren erweisen sich als äußerst nützlich in Projekten, die sich mit der Entwicklung von KI- und Machine-Learning-Systemen befassen. Sie sind besonders effektiv darin, zentrale Logik wie Modellierung und Datenpipelines von anderen Routineaufgaben wie Tests, Validierungen, Zeitmessungen und Protokollierungen zu trennen.
In diesem Artikel werden fünf besonders nützliche Python-Dekoratoren vorgestellt, die sich laut Erfahrungen von Entwicklern als effektiv erwiesen haben, um AI-Code zu optimieren.
Die nachfolgenden Codebeispiele basieren auf den Standardbibliotheken von Python und bewährten Praktiken, wie z.B. functools.wraps. Ihr Hauptziel ist es, die Verwendung jedes spezifischen Dekorators zu veranschaulichen, sodass Sie sich nur darauf konzentrieren müssen, die Logik des Dekorators an Ihr AI-Coding-Projekt anzupassen.
1. Einschränkung der gleichzeitigen Ausführung
Dieser Dekorator ist besonders nützlich, wenn es um die oft lästigen Freemium-Grenzen bei der Nutzung von Drittanbieter-Modellen für große Sprachmodelle (LLMs) geht. Wenn diese Grenzen aufgrund zu vieler asynchroner Anfragen erreicht werden, führt dieses Muster einen Drosselungsmechanismus ein, um diese Aufrufe sicherer zu gestalten. Durch die Verwendung von Semaphoren wird die Anzahl der Ausführungen einer asynchronen Funktion begrenzt:
import asyncio
from functools import wraps
def limit_concurrency(limit=5):
sem = asyncio.Semaphore(limit)
def decorator(func):
@wraps(func)
async def wrapper(*args, **kwargs):
async with sem:
return await func(*args, **kwargs)
return wrapper
return decorator
# Anwendung
@limit_concurrency(5)
async def fetch_llm_batch(prompt):
return await async_api_client.generate(prompt)
2. Strukturierter Machine Learning Logger
In komplexen Softwarelösungen, die Machine Learning Systeme steuern, gehen Standard print()-Anweisungen leicht verloren, insbesondere wenn sie in der Produktion eingesetzt werden.
Mit dem folgenden Logging-Dekorator ist es möglich, Ausführungen und Fehler zu „erfassen“ und sie in strukturierte JSON-Protokolle zu formatieren, die leicht durchsuchbar sind und eine schnelle Fehlersuche ermöglichen. Das folgende Codebeispiel kann als Vorlage verwendet werden, um beispielsweise eine Funktion zu dekorieren, die eine Trainings-Epoche in einem auf neuronalen Netzen basierenden Modell definiert:
import logging, json, time
from functools import wraps
def json_log(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
try:
res = func(*args, **kwargs)
logging.info(json.dumps({"step": func.__name__, "status": "success", "time": time.time() - start}))
return res
except Exception as e:
logging.error(json.dumps({"step": func.__name__, "error": str(e)}))
raise
return wrapper
# Anwendung
@json_log
def train_epoch(model, training_data):
return model.fit(training_data)
3. Feature-Injektor
Ein besonders nützlicher Dekorator während der Modellbereitstellung und Inferenzphasen! Wenn Sie Ihr Machine Learning Modell von einem Notebook in eine leichtgewichtige Produktionsumgebung, z.B. über einen FastAPI-Endpunkt, übertragen, kann es mühsam sein, sicherzustellen, dass die rohen eingehenden Daten von Endbenutzern denselben Transformationen unterzogen werden wie die ursprünglichen Trainingsdaten. Der Feature-Injektor hilft dabei, Konsistenz in der Art und Weise zu gewährleisten, wie Merkmale aus Rohdaten generiert werden, alles im Hintergrund.
Das folgende Beispiel vereinfacht den Prozess der Hinzufügung eines Merkmals namens is_weekend, das darauf basiert, ob eine Datums-Spalte in einem bestehenden DataFrame ein Datum enthält, das mit einem Samstag oder Sonntag assoziiert ist:
from functools import wraps
def add_weekend_feature(func):
@wraps(func)
def wrapper(df, *args, **kwargs):
df = df.copy() # Verhindert Pandas-Mutationswarnungen
df['is_weekend'] = df['date'].dt.dayofweek.isin([5, 6]).astype(int)
return func(df, *args, **kwargs)
return wrapper
# Anwendung
@add_weekend_feature
def process_data(df):
# 'is_weekend' ist hier garantiert vorhanden
return df.dropna()
4. Deterministischer Seed-Setter
Dieser Dekorator ist besonders wichtig in zwei spezifischen Phasen des Lebenszyklus von KI/Machine Learning: Experimentierung und Hyperparameter-Tuning. Diese Prozesse erfordern typischerweise die Verwendung eines Zufallsseeds, um wichtige Hyperparameter wie die Lernrate eines Modells anzupassen. Wenn Sie beispielsweise den Wert angepasst haben und plötzlich die Modellgenauigkeit sinkt, müssen Sie möglicherweise wissen, ob die Ursache für diesen Leistungsabfall die neue Hyperparameter-Einstellung oder einfach eine schlechte zufällige Initialisierung der Gewichte ist. Durch das Festlegen des Seeds isolieren wir Variablen und machen die Ergebnisse von Tests wie A/B zuverlässiger.
import random, numpy as np
from functools import wraps
def lock_seed(seed=42):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
random.seed(seed)
np.random.seed(seed)
return func(*args, **kwargs)
return wrapper
return decorator
# Anwendung
@lock_seed(42)
def initialize_weights():
return np.random.randn(10, 10)
5. Fallback im Entwicklungsmodus
Ein äußerst hilfreicher Dekorator, insbesondere in lokalen Entwicklungsumgebungen und bei CI/CD-Tests. Angenommen, Sie bauen eine Anwendungsschicht auf einem LLM auf – beispielsweise ein Retrieval-Augmented Generation (RAG) System. Wenn eine dekorierte Funktion aufgrund externer Faktoren, wie z.B. Verbindungszeitüberschreitungen oder API-Nutzungsgrenzen, fehlschlägt, wird der Fehler von diesem Dekorator abgefangen und ein vordefinierter Satz von „Mock-Testdaten“ zurückgegeben.
Warum ist das so hilfreich? Weil dieser Mechanismus sicherstellt, dass Ihre Anwendung nicht vollständig stoppt, wenn ein externer Dienst vorübergehend ausfällt.
from functools import wraps
def fallback_mock(mock_data):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception: # Fängt Zeitüberschreitungen und Ratenlimits ab
return mock_data
return wrapper
return decorator
# Anwendung
@fallback_mock(mock_data=[0.01, -0.05, 0.02])
def get_text_embeddings(text):
return external_api.embed(text)
Fazit
In diesem Artikel wurden fünf effektive Python-Dekoratoren untersucht, die dazu beitragen, Ihren AI- und Machine Learning-Code in verschiedenen spezifischen Situationen zu optimieren: von strukturiertem, leicht durchsuchbarem Logging bis hin zu kontrolliertem Zufallsseed für Aspekte wie Datenstichproben, Tests und mehr.
Iván Palomares Carrascosa ist ein führender Experte, Autor, Redner und Berater im Bereich KI, Machine Learning, Deep Learning und LLMs. Er schult und berät andere darin, KI in der realen Welt zu nutzen.
„`
Bildquelle: ai-generated-gemini