Zuverlässige KI-Anwendungen entwickeln
Zuverlässigkeit ist bei LLM-basierter Software eine Eigenschaft des Systems, nicht des Modells. Ein praktischer Blick auf Grenzen, Verträge und Feedbackschleifen, die KI-Funktionen belastbar machen.
- Veröffentlicht
- Lesezeit
- 2 Min. Lesezeit
- Kategorien
- KI-Engineering · Architektur
Auf dieser Seite
Large Language Models sind probabilistische Komponenten. Dieselbe Eingabe kann unterschiedliche Ausgaben erzeugen, die Qualität schwankt je nach Eingabe, und ein Anbieter kann das Verhalten ändern, ohne dass man es bemerkt. Zuverlässige Software ist damit nicht unmöglich – aber Zuverlässigkeit muss in das System rund um das Modell eingebaut werden, statt sie vom Modell selbst zu erwarten.
Das Modell als unzuverlässige Abhängigkeit behandeln
Aus verteilten Systemen wissen wir längst, wie man mit Abhängigkeiten umgeht, die langsam, fehlerhaft oder nicht erreichbar sein können: Timeouts, Wiederholungen, Validierung, Fallbacks und Monitoring. Ein LLM-Aufruf verdient dieselbe Sorgfalt.
- Timeouts und Wiederholungen mit Backoff – und ein klares Budget dafür, wie lange Nutzer zu warten bereit sind.
- Ein definierter Fehlerzustand, den die Oberfläche ehrlich darstellen kann, statt eine halb geparste Antwort anzuzeigen.
- Feste Versionen für Modelle und Prompts, damit eine Verhaltensänderung ein bewusstes Deployment ist und keine Überraschung.
Verträge über strukturierte Ausgaben festlegen
Freitext ist schwer zu testen und schwer weiterzuverarbeiten. Wo die Ausgabe in anderen Code einfließt, sollte man strukturierte Ausgaben anfordern und sie an der Systemgrenze validieren.
import { z } from "zod";
const Finding = z.object({
severity: z.enum(["info", "warning", "critical"]),
message: z.string().min(1),
evidence: z.string().optional(),
});
const AnalysisResult = z.object({ findings: z.array(Finding) });
export function parseAnalysis(raw: unknown) {
const result = AnalysisResult.safeParse(raw);
return result.success ? { ok: true as const, value: result.data } : { ok: false as const, error: result.error };
}Ein Schema macht aus „das Modell hat etwas Seltsames gesagt“ einen typisierten, beobachtbaren Fehler, den man zählen, wiederholen oder dem Nutzer anzeigen kann.
Deterministische Logik von Modellurteilen trennen
Nicht alles braucht ein Modell. Normalisierung von Eingaben, Berechtigungsprüfungen, Formatierung, Routing und viele Geschäftsregeln sind deterministisch und gehören in gewöhnlichen, unit-getesteten Code. Das Modell sollte nur dort eingesetzt werden, wo tatsächlich Sprachverständnis gefragt ist – und diese Fläche sollte so klein wie möglich bleiben.
Diese Trennung zahlt sich beim Testen aus: Der deterministische Großteil des Systems lässt sich mit schnellen, konventionellen Tests abdecken, während sich der Evaluierungsaufwand auf den modellabhängigen Kern konzentriert.
Feedbackschleifen aufbauen, bevor man sie braucht
Zuverlässigkeit wird gepflegt, nicht einmalig erreicht. Hilfreiche Schleifen sind:
- Eine Evaluierungssuite mit repräsentativen Beispielen, die bei jeder Prompt- oder Modelländerung läuft.
- Telemetrie aus dem Produktivbetrieb: Latenz, Fehler- und Validierungsquoten, Token-Verbrauch und Nutzerfeedback.
- Ein Weg von der Produktion zurück in die Evaluierung, damit echte Fehlerfälle zu Regressionstests werden.
Den Menschen dort einbinden, wo es zählt
Bei Entscheidungen mit echten Konsequenzen sollte die Modellausgabe als Vorschlag erscheinen, den ein Mensch prüft. Die Oberfläche sollte Übernehmen, Bearbeiten und Verwerfen gleich einfach machen und klar zeigen, welche Teile generiert wurden.
Fazit
Zuverlässige KI-Anwendungen entstehen aus bekannter Engineering-Disziplin, angewandt auf eine ungewohnte Komponente: klare Grenzen, explizite Verträge, deterministischer Code, wo immer möglich, und kontinuierliche Evaluierung. Das Modell ist ein Teil des Systems – die Zuverlässigkeit gehört dem Ganzen.