Handbücher · Gates mit Entscheidungsmodellen

Build: Der Router

Lektion 6/810 Min. LesezeitProfi

Lernziele

  • Du baust einen Router, der nur dann den schnellen Pfad nimmt, wenn ein Handler existiert und die Konfidenz über dem Schwellenwert liegt.
  • Du gibst alles Unbekannte über einen Auffangkorb ohne Handler an das große Modell.
  • Du loggst jede Entscheidung so, dass das Log später zum Testdatensatz wird.

Der Entscheidungs-Endpunkt zahlt sich vor einem Agenten aus. Das Muster aus Jev im Agenten-Stack geht so: Die eingehende Anfrage wird günstig klassifiziert. Ist der Klassifikator sicher, handelt der Code direkt. Ist er es nicht, geht die Anfrage an das volle Sprachmodell. Der Entscheidungskopf ist der schnelle Pfad. Der Weg über das große Modell bleibt immer offen.

Der Entwurf

Drei Regeln tragen den ganzen Router:

  • Jede Route mit festem Handler kommt ohne das große Modell aus. Ein Link zum Zurücksetzen des Passworts braucht keine Formulierungskunst.
  • Der schnelle Pfad greift nur, wenn beides stimmt: Die Konfidenz liegt über dem Schwellenwert · engl. thresholdDie Mindestkonfidenz, ab der ein Gate den günstigen Pfad nimmt. Liegt die Konfidenz darunter, geht der Eintrag an das große Modell.Im Glossar, und die Route hat einen Handler. Alles andere fällt durch.
  • Jede Entscheidung landet im Log, egal welcher Pfad. Das Log ist dein späterer Testdatensatz. Sobald Menschen die Tickets gelabelt haben, misst du damit die Genauigkeit, stimmst den Schwellenwert auf echte Fehlerkosten ab und vergleichst Jevs Antworten auf denselben Eingaben.

Der Code

Der Router läuft so, wie er ist, mit decision.py aus der letzten Lektion im selben Ordner. Für den Rückfall nutzt er Claude Opus 5.5.

# router.py – schneller Pfad bei hoher Sicherheit, sonst das große Modell
import json
import time

import anthropic

from decision import decide

client = anthropic.Anthropic()
FULL_MODEL = "claude-opus-5-5"  # der Rückfall: volle Stärke, voller Preis
THRESHOLD = 0.8                 # vorsichtig starten, später gegen Labels abstimmen
LOG_PATH = "decisions.jsonl"

# Routen mit Handler bekommen einen schnellen Pfad. "other" ist der bewusste
# Auffangkorb ohne Handler: Alles Unbekannte fällt immer durch.
ROUTES = {
    "billing": lambda t: "An die Abrechnung weitergeleitet, Beleg angefordert.",
    "password_reset": lambda t: "Link zum Zurücksetzen des Passworts verschickt.",
    "cancellation": lambda t: "An einen Menschen im Kundenerhalt eskaliert.",
    "other": None,
}
ROUTE_SCHEMA = {"type": "string", "enum": list(ROUTES)}
QUESTION = "Welche Route soll dieses Support-Ticket bearbeiten?"


def log_decision(entry: dict) -> None:
    with open(LOG_PATH, "a", encoding="utf-8") as f:
        f.write(json.dumps(entry, ensure_ascii=False) + "\n")


def fall_through(ticket: str) -> str:
    response = client.messages.create(
        model=FULL_MODEL,
        max_tokens=16000,
        output_config={"effort": "medium"},
        messages=[{"role": "user", "content": f"Bearbeite dieses Support-Ticket:\n{ticket}"}],
    )
    if response.stop_reason == "refusal":
        return "Vom Modell abgelehnt, an einen Menschen weitergegeben."
    return next(b.text for b in response.content if b.type == "text")


def handle(ticket: str) -> str:
    start = time.perf_counter()
    decision = decide(ROUTE_SCHEMA, QUESTION, ticket)
    decide_ms = round((time.perf_counter() - start) * 1000)

    handler = ROUTES.get(decision["value"])
    fast = handler is not None and decision["confidence"] >= THRESHOLD
    outcome = handler(ticket) if fast else fall_through(ticket)

    log_decision({
        "ts": time.time(),
        "ticket": ticket,
        "value": decision["value"],
        "confidence": decision["confidence"],
        "threshold": THRESHOLD,
        "path": "fast" if fast else "fall_through",
        "decide_ms": decide_ms,
    })
    return outcome


if __name__ == "__main__":
    print(handle("Ich wurde diesen Monat zweimal für dieselbe Rechnung belastet."))
    print(handle("Eure App hat drei Jahre meiner Daten gelöscht und ich bin außer mir."))

Zeilen 10-12

Das Modell für den Rückfall, der Schwellenwert und die Log-Datei. 0,8 ist ein vorsichtiger Start, der richtige Wert kommt später aus den Labels.

Für Ablehnungen bietet die API bei Opus 5.5 auch einen Weg auf Serverseite (Stand: 13. Nov. 2026). Mit der Beta server-side-fallback-2026-07-01 und dem Parameter fallbacks führt sie eine abgelehnte Anfrage im selben Aufruf auf einem Ersatzmodell aus. Wir lassen das hier weg. Eine abgelehnte Support-Anfrage soll ohnehin ein Mensch ansehen, und der Router kommt so ohne Beta-Header aus.

Was im Test passierte

Die zwei Beispieltickets am Ende der Datei nehmen beide Pfade (Stand: 13. Nov. 2026). Die doppelte Abbuchung ging mit Konfidenz 1,0 an die Abrechnung, nach rund einer Sekunde für fast nichts. Das Ticket über die gelöschten Daten landete bei other und fiel an Opus. Opus brauchte 12,6 Sekunden, verbrauchte 59 Eingabe- und 1.352 Ausgabe-Tokens und kostete damit rund 2,7 Cent. Heraus kamen eine interne Einordnung mit Priorität „kritisch“ und ein Antwortentwurf an die Kundin.

Mit den 20 gelabelten Tickets aus der letzten Lektion sieht die Rechnung so aus: 15 Tickets nahmen den schnellen Pfad, 5 fielen durch. Zwei der 15 schnellen Entscheidungen waren falsch. Eines davon ist das mehrdeutige Ticket mit Kontozugang und Abbuchung, das Haiku mit fünf von fünf Stimmen der Abrechnung gab. Ein höherer Schwellenwert hätte nichts geändert. Bei 0,9 waren es dieselben 15 Tickets, weil fast jede Konfidenz 1,0 war.

Der Rechner zeigt, was der schnelle Pfad spart. Er nimmt die gemessenen Kosten: rund 0,00017 US-Dollar pro Entscheidung und 2,7 Cent pro Opus-Aufruf.

Was der Router pro 1000 Tickets kostet

Mit Router
6,92 USD
Alles an Opus
27,00 USD
Ersparnis
74 %

Die Kosten für Fehler auf dem schnellen Pfad fehlen in dieser Rechnung. Genau sie bestimmen, wo dein Schwellenwert liegen sollte.

Welcher Pfad?

Der Schwellenwert steht auf 0,8. Ordne jede Entscheidung dem Pfad zu, den router.py nimmt.

Noch offen (5)

  • billing, Konfidenz 1,0
  • password_reset, Konfidenz 0,8
  • cancellation, Konfidenz 0,6
  • other, Konfidenz 1,0
  • billing, Konfidenz 0,4

Schneller Pfad (0)

    Fällt an Opus (0)

      Worauf du achtest

      Der Schwellenwert ist eine Geschäftsentscheidung. Du bemisst ihn an den Kosten einer falschen Aktion auf dem schnellen Pfad, wie in Jev im Agenten-Stack beschrieben. Ein Passwort-Link an die falsche Person ist ärgerlich. Eine automatische Erstattung an die falsche Person kostet Geld.

      Beim Stand-in kommt eine zweite Einschränkung dazu. Seine Konfidenz ist ein Stimmenanteil, über Kalibrierung sagt sie nichts. Fünf gleiche Stimmen bei einem mehrdeutigen Ticket sind häufig, unser Test hat das bestätigt. Behalte deshalb den Auffangkorb und vergleich das Log jede Woche mit dem Urteil von Menschen, bevor du den Schwellenwert senkst.

      Das Log selbst darfst du nicht weglassen. Sobald du Zugang zu Jev hast, ist diese Datei mit Eingaben, Entscheidungen und Konfidenzen genau das, was du durch Jev schickst. Das zeigt die nächste Lektion, Build: Der Jev-Tausch.

      Merksätze

      • Der schnelle Pfad braucht zwei Dinge: einen Handler für die Route und eine Konfidenz über dem Schwellenwert.
      • other hat bewusst keinen Handler. Alles Unbekannte fällt damit an das große Modell.
      • Im Test kostete der schnelle Pfad rund 0,00017 US-Dollar, ein Opus-Aufruf rund 2,7 Cent und 12,6 Sekunden.
      • Mit dem Stand-in greift der Schwellenwert kaum, weil fast jede Konfidenz 1,0 ist. Fehler auf dem schnellen Pfad findest du nur mit Labels.
      • Das Log ist der Testdatensatz für den Tausch. Es braucht Regeln für Zugriff und Löschung.

      Prüf dich selbst

      Denkfrage

      Warum bekommt other keinen Handler, auch keinen einfachen?

      Denkfrage

      Du hebst den Schwellenwert von 0,8 auf 0,9, und es ändert sich nichts. Woran liegt das?

      Prüf dich selbst

      1. 1Wann nimmt router.py den schnellen Pfad?
      2. 2Wozu schreibt der Router auch den Schwellenwert ins Log?
      3. 3Was bestimmt den richtigen Schwellenwert?

      Selbst nachweisen

      0 von 3 erledigt

      Quellen

      1. Models overview · Anthropic, Stand: Nov. 2026

        claude-opus-5-5, Preise 4 und 20 US-Dollar pro Million Tokens.

      2. Effort · Anthropic, Stand: Nov. 2026

        output_config.effort, Standard bei Opus 5.5 ist medium.

      3. Confidence · TypeSafe, Stand: Nov. 2026

        Schwellenwerte auf die Wahrscheinlichkeit der gewählten Option setzen.

      Dein Fortschritt bleibt nur in diesem Browser gespeichert.