Spekulativer Fan-Out
Sende viele Fragen in einem einzigen Aufruf, auch spekulative, und lass deinen Code entscheiden, was relevant ist.
Weil TypeSafe das Senden vieler Fragen in einem einzigen API-Aufruf unterstützt, empfehlen wir, alle Fragen, die dein System braucht, in eine einzige Anfrage zu packen und dann im Code zu entscheiden, was nachträglich relevant ist. Alle Fragen werden parallel ausgewertet, deshalb hat das Hinzufügen weiterer Fragen meist wenig Einfluss auf die Antwortzeit.
Beispiel: Triage von Support-Tickets
Stell dir vor, du baust ein Support-System, das Support-Tickets triagieren muss. Du musst das Ticket in eine Kategorie einordnen. Wenn es ein Bug-Report ist, musst du außerdem die Schwere des Bugs bestimmen.
Statt zuerst nach der Kategorie und dann in einem Folgeaufruf nach der Schwere zu fragen, kannst du nach beiden gleichzeitig fragen. Ist das Ticket kein Bug-Report, ignorierst du die Ergebnisse der Frage nach der Bug-Schwere einfach.
%%{init: {"fontFamily": "Inter, sans-serif", "flowchart": {"rankSpacing": 35, "wrappingWidth": 300, "subGraphTitleMargin": {"top": 8, "bottom": 60}}}}%%
flowchart LR
t["support ticket"]
subgraph req["TypeSafe AI model<br/>evaluates each question<br/>against the ticket in parallel"]
direction TB
c["<b>Choice:</b> category"]
b["<b>Score:</b> bug severity"]
r["<b>Noul:</b> reproducible steps?"]
f["<b>Noul:</b> refund requested?"]
s["<b>Score:</b> frustration"]
%% invisible links: without an edge these share a rank and sit side by side
c ~~~ b ~~~ r ~~~ f ~~~ s
end
t -- "one request<br/>ticket + 5 questions" --> req
req -- "one response: 5 answers<br/>decisions + probabilities" --> route{"<b>filter, combine, and route</b><br/>in your code"}
route -- "bug_report" --> eng["read severity + repro steps<br/>escalate or backlog"]
route -- "billing" --> bill["refund requested<br/>send to billing"]
route -- "feature_request" --> feat["log it<br/>sent to devs"]
Schritt 1: Spekulativer Fan-Out
{
"category": {
"type": "choice",
"instructions": "Determine the broad category of this support ticket",
"criteria": {
"bug_report": "The user is reporting something that is broken or producing errors",
"billing": "Charges, invoices, refunds, subscriptions",
"feature_request": "The user is requesting new functionality",
"account": "Login, permissions, profile, security"
}
},
"bug_severity": {
"type": "score",
"instructions": "How severe is the reported issue",
"criteria": [
"Cosmetic; no impact to functionality",
"Broken or degraded feature; workaround exists",
"Blocking issue; no workaround exists"
]
},
"has_reproducible_steps": {
"type": "noul",
"instructions": "The user describes specific steps to reproduce the issue"
},
"refund_requested": {
"type": "noul",
"instructions": "The user is explicitly asking for a refund or credit"
},
"frustration": {
"type": "score",
"instructions": "How frustrated the user appears",
"criteria": [
"Calm, matter-of-fact",
"Frustrated but civil",
"Very angry"
]
}
}Schritt 2: Mit Code routen
Dein Code entscheidet anhand des Klassifizierungsergebnisses, was relevant ist:
triage.py
category = response.answers["category"]
bug_severity = response.answers["bug_severity"]
bug_repro = response.answers["has_reproducible_steps"]
refund = response.answers["refund_requested"]
frustration = response.answers["frustration"]
if category.choice == "bug_report":
if bug_severity.score > 1.5 and bug_repro.noul > 0.6:
escalate_to_engineering(ticket_id, severity="high")
else:
add_to_bug_backlog(ticket_id)
elif category.choice == "billing":
if refund.noul > 0.7:
route_to_billing_with_flag(ticket_id, refund_likely=True)
else:
route_to_billing(ticket_id)
elif category.choice == "feature_request":
log_feature_request(ticket_id)
# Frustration is useful regardless of category
if frustration.score > 1.5:
flag_for_priority_response(ticket_id)
Alles, was für den vollständigen Entscheidungsbaum nötig ist, kommt aus einem einzigen Aufruf. Spekulative Fragen werden ignoriert, wenn sie irrelevant sind, und sparen einen Roundtrip, wenn sie es nicht sind.