Design von Multi-Model-Systemen: Wenn ein einzelnes Modell nicht ausreicht
Wählen Sie das einfachste Muster, das funktioniert.
Einzige-Modell-Systeme sind einfach. Multi-Modell-Systeme sind leistungsstark. Die Herausforderung besteht nicht darin, Modelle auszuwählen, sondern die Architektur zu entwerfen, die sie orchestriert.
Ein Multi-Modell-System bedeutet nicht einfach, mehr Modelle zu haben. Es geht darum, das richtige Modell für die richtige Aufgabe zum richtigen Zeitpunkt einzusetzen.

Architekturmuster
Fünf Muster decken die meisten Anwendungsfälle ab:
| Muster | Komplexität | Wann verwenden | Tradeoff |
|---|---|---|---|
| Einzelmodell | Niedrigste | Prototyping, einfache Aufgaben | Begrenzte Fähigkeiten |
| Sequenziell | Niedrig | Mehrstufige Workflows | Höhere Latenz |
| Parallel | Mittel | Unabhängige Aufgaben | Höhere Kosten |
| Hierarchisch | Hoch | Komplexe Reasoning-Aufgaben | Komplexe Orchestrierung |
| Ensemble | Höchst | Kritische Entscheidungen | Höchste Kosten |
Wählen Sie das einfachste Muster, das funktioniert. Komplexität ist real und multipliziert sich.
Sequenzielle Architektur
Verarbeiten Sie Aufgaben durch eine Kette von Modellen, die jeweils auf einen Schritt spezialisiert sind.
Muster 1: Pipeline
Pipeline-Muster — die Ausgabe jedes Modells fließt in das nächste:
class ModelPipeline:
def __init__(self):
self.models = [
{"model": "qwen3-1.7b", "task": "classify"},
{"model": "qwen3-8b", "task": "extract"},
{"model": "qwen3-32b", "task": "reason"},
]
def process(self, input: str) -> str:
current = input
for model_config in self.models:
current = self.call_model(
model_config["model"],
self.create_prompt(model_config["task"], current)
)
return current
Latenz addiert sich. Drei Modelle in Folge bedeuten das Dreifache an Latenz. Verwenden Sie dies nur, wenn jeder Schritt tatsächlich ein anderes Modell benötigt.
Muster 2: Router
Router-Muster — klassifizieren Sie die Aufgabe, leiten Sie an den Spezialisten weiter:
class ModelRouter:
def __init__(self):
self.classifier = "qwen3-1.7b"
self.specialists = {
"code": "qwen2.5-coder-7b",
"math": "qwen3-32b",
"creative": "claude-sonnet-4",
"general": "qwen3-8b",
}
def route(self, prompt: str) -> str:
task_type = self.classify(prompt)
model = self.specialists.get(task_type, self.specialists["general"])
return self.call_model(model, prompt)
Der Klassifikator ist die Schwachstelle. Wenn er falsch klassifiziert, wird an das falsche Modell weitergeleitet und die Qualität leidet. Verwenden Sie einen Klassifikator, der gut genug ist — selbst ein kleiner funktioniert, wenn die Kategorien klar sind.
Parallele Architektur
Verarbeiten Sie unabhängige Aufgaben gleichzeitig.
Muster 1: Fan-Out
Fan-Out — führen Sie denselben Prompt durch mehrere Modelle:
import asyncio
class ModelFanOut:
def __init__(self):
self.models = [
"qwen3-8b",
"qwen3-32b",
"claude-sonnet-4",
]
async def process(self, prompt: str) -> list[str]:
tasks = [self.call_model(model, prompt) for model in self.models]
return await asyncio.gather(*tasks)
Nützlich für Vergleiche, A/B-Tests oder wenn Sie die beste Ausgabe auswählen möchten. Teuer, aber der Qualitätszuwachs ist bei kritischen Entscheidungen wertvoll.
Muster 2: Voting
Voting — kombinieren Sie Ausgaben durch Konsens:
class ModelVoting:
def __init__(self):
self.models = [
"qwen3-8b",
"qwen3-32b",
"claude-sonnet-4",
]
def vote(self, prompt: str) -> str:
responses = [self.call_model(model, prompt) for model in self.models]
from collections import Counter
votes = Counter(responses)
return votes.most_common(1)[0][0]
Mehrheitsvoting funktioniert bei Klassifizierung. Bei Generierungsaufgaben ist es schwieriger — Sie benötigen semantische Ähnlichkeit, nicht exakte Übereinstimmungen.
Hierarchische Architektur
Verwenden Sie Modelle auf verschiedenen Abstraktionsebenen.
Muster 1: Planner-Executor
Planer-Ausführer — ein starkes Modell plant, kleinere Modelle führen aus:
class PlannerExecutor:
def __init__(self):
self.planner = "qwen3-32b"
self.executors = {
"code": "qwen2.5-coder-7b",
"search": "qwen3-8b",
"math": "qwen3-8b",
}
def process(self, task: str) -> str:
plan = self.call_model(self.planner, f"Plan: {task}")
results = []
for step in self.parse_plan(plan):
executor = self.executors.get(step["type"], "qwen3-8b")
result = self.call_model(executor, step["prompt"])
results.append(result)
return self.call_model(self.planner, f"Synthesize: {results}")
Der Planer übernimmt die schwere Arbeit. Die Ausführenden bearbeiten spezifische Aufgaben. Dieses Muster funktioniert gut, wenn der Planungsschritt teuer ist, die Ausführungsschritte jedoch kostengünstig.
Muster 2: Supervisor-Worker
Aufseher-Arbeiter — ein Aufseher delegiert und überprüft:
class SupervisorWorker:
def __init__(self):
self.supervisor = "qwen3-32b"
self.workers = ["qwen3-8b", "qwen2.5-coder-7b"]
def process(self, task: str) -> str:
assignments = self.call_model(self.supervisor, f"Assign: {task}")
results = []
for assignment in self.parse_assignments(assignments):
result = self.call_model(
assignment["worker"], assignment["task"]
)
results.append(result)
return self.call_model(self.supervisor, f"Review: {results}")
Der Aufseher ist der Engpass. Er plant, delegiert und überprüft. Stellen Sie sicher, dass er schnell genug ist, sonst verlangsamt sich das gesamte System.
Ensemble-Architektur
Kombinieren Sie mehrere Modelle für kritische Entscheidungen.
Muster 1: Weighted Ensemble
Gewichtetes Ensemble — bewerten Sie die Ausgabe jedes Modells, wählen Sie die höchste aus:
class WeightedEnsemble:
def __init__(self):
self.models = {
"qwen3-32b": 0.5,
"claude-sonnet-4": 0.3,
"qwen3-8b": 0.2,
}
def decide(self, prompt: str) -> str:
responses = {
model: self.call_model(model, prompt)
for model in self.models
}
scores = {}
for model, response in responses.items():
score = self.evaluate(response) * self.models[model]
scores[response] = scores.get(response, 0) + score
return max(scores, key=scores.get)
Die Gewichte spiegeln Ihr Vertrauen in jedes Modell wider. Passen Sie sie basierend auf der tatsächlichen Leistung an, nicht auf Benchmarks.
Muster 2: Consensus Ensemble
Konsens-Ensemble — erfordern Sie Übereinstimmung, eskalieren Sie bei Uneinigkeit:
class ConsensusEnsemble:
def __init__(self, threshold: float = 0.7):
self.threshold = threshold
self.models = [
"qwen3-32b",
"claude-sonnet-4",
"qwen3-8b",
]
def decide(self, prompt: str) -> str:
responses = [
self.call_model(model, prompt)
for model in self.models
]
from collections import Counter
votes = Counter(responses)
max_votes = max(votes.values())
if max_votes / len(self.models) >= self.threshold:
return votes.most_common(1)[0][0]
return self.call_model("qwen3-32b", prompt)
Die Schwelle steuert, wie streng der Konsens ist. 0,7 bedeutet eine Zwei-Drittel-Mehrheit. Senken Sie sie für schnellere Entscheidungen, erhöhen Sie sie für höhere Sicherheit.
Wann Multi-Modell-Systeme sinnvoll sind
Multi-Modell-Systeme sind sinnvoll, wenn Sie gemischte Workloads haben, hohe Qualität für kritische Entscheidungen benötigen oder Kosten und Latenz optimieren.
Sie sind nicht sinnvoll, wenn alle Aufgaben ähnlich komplex sind, Sie im Prototyping-Stadium sind oder Einfachheit wichtiger ist als Optimierung.
Daumenregel: Beginnen Sie mit einem Modell. Fügen Sie weitere hinzu, wenn Sie eine echte Einschränkung erreichen — Kosten, Latenz oder Qualität. Entwerfen Sie keine Komplexität, bevor Sie sie benötigen.
Tradeoffs
| Muster | Kosten | Latenz | Qualität | Komplexität |
|---|---|---|---|---|
| Einzelmodell | Niedrigste | Niedrigste | Variabel | Niedrigste |
| Sequenziell | Mittel | Hoch | Hoch | Mittel |
| Parallel | Hoch | Niedrig | Hoch | Mittel |
| Hierarchisch | Hoch | Hoch | Höchste | Hoch |
| Ensemble | Höchste | Mittel | Höchste | Höchste |
Jedes Muster bietet einen Tradeoff. Wählen Sie dasjenige, das Ihren Einschränkungen entspricht.
Verwandte Themen
- Model Routing Strategies — Routing basierend auf Fähigkeiten, Kosten und Latenz
- Cost Optimization for LLM Systems — Token-Budgetierung, Fallback-Modelle, Caching
- LLM Guardrails in Practice — Eingabevalidierung, Ausgabe-Filterung, Sicherheit
- LLM Architecture — Säule des Systemdesigns: Routing, Kosten, Guardrails und Orchestrierung