Konfidenz
Wie TypeSafe Gewissheit meldet, wie sie sich von Wahrscheinlichkeit unterscheidet und wie du damit Systemverhalten steuerst.
Alle Score- und Choice-Antworten von TypeSafe enthalten eine probabilities-Eigenschaft, die die Wahrscheinlichkeitsverteilung über die Optionen (bei Choice) oder Stufen (bei Score) darstellt. Die Form dieser Verteilung verrät dir, wie sicher sich das Modell ist: auf ein Ergebnis konzentriert bedeutet eine sichere Antwort, breit gestreut eine unsichere.
Die confidence-Eigenschaft der Antwort fasst diese Form in einer einzigen Zahl von 0 bis 1 zusammen, sodass du sie als Schwellenwert nutzen kannst, ohne selbst zu rechnen. Sie ist 1, wenn die ganze Wahrscheinlichkeit auf einem Ergebnis liegt, und 0, wenn die Wahrscheinlichkeit gleichmäßig verteilt ist. (Noul-Antworten tragen keine; siehe unten Noul.)
Konfidenz wird aus den Wahrscheinlichkeiten abgeleitet
confidence ist eine Statistik, die aus der Wahrscheinlichkeitsverteilung berechnet wird, die die Antwort bereits liefert. TypeSafe berechnet sie für dich und gibt sie bei jeder Choice- und Score-Antwort zurück, sodass der Normalfall keinen zusätzlichen Aufwand auf deiner Seite erfordert.
Beispiel: choice-Frage mit drei Optionen
Sieh, wie die Wahrscheinlichkeitsverteilung die Konfidenz verändert
Konfidenz
Wahrscheinlichkeit
Verschiebe einen Regler, um die Wahrscheinlichkeit einer Option zu ändern. Die anderen passen sich automatisch an, sodass die Summe 100% bleibt.
Ausgewählt: Option A
So berechnet diese Demo die Konfidenz
TypeSafe berechnet die Konfidenz daraus, wie die Wahrscheinlichkeit über die Optionen verteilt ist. Liegt alles auf einer Option, ergibt das 1.0; je gleichmäßiger verteilt, desto niedriger die Konfidenz. Diese Demo verwendet (3 × größte Wahrscheinlichkeit − 1) / 2, um die Konfidenz für drei Optionen anzunähern.
Bei einem Choice ist die Verteilung probabilities über deine Optionen. Bei einem Score ist sie die Verteilung über deine Stufen. In beiden Fällen bedeutet eine flachere Verteilung geringere Konfidenz: Niedrige Konfidenz bei einem Choice bedeutet oft, dass keine der Optionen ein klarer Sieger gegenüber den anderen ist, und niedrige Konfidenz bei einem Score bedeutet oft, dass die Stufen mehrdeutig oder mehrdimensional sind oder der Zustand nicht genug hergibt.
Die genaue Formel für jeden Fragetyp steht in Wie die Konfidenz berechnet wird, sodass du siehst, wie jeder confidence-Wert aus den eigenen probabilities der Antwort folgt.
„Ich weiß es nicht“ ist ein nützliches Signal
Wenn ein intelligentes System, ob Mensch oder Maschine, ehrliche Unsicherheit nicht ausdrücken kann, kann man dem System nicht trauen.
Konfidenz gibt dir einen eingebauten Mechanismus, damit das Modell sagen kann: „Da bin ich mir nicht sicher.“ So kann dein Code für unterschiedliche Sicherheitsgrade unterschiedliches Verhalten umsetzen, und das ist die Grundlage für Systeme, auf die du dich wirklich verlassen kannst.
Drei Wege, Konfidenz in deinem Code zu nutzen
Ein nützliches Startmuster ist, die Konfidenz in drei Bereiche zu unterteilen, von denen jeder ein anderes Systemverhalten erzeugt:
Hohe Konfidenz: Handle automatisch. Das Modell hat einen klaren Befund und du kannst ohne menschliches Eingreifen fortfahren.
Mittlere Konfidenz: Fahre mit Vorsicht fort. Das Modell hat eine plausible Antwort, ist aber nicht sicher. Je nach Kontext kannst du den Nutzer um Bestätigung bitten, zur Prüfung markieren oder mehr Informationen sammeln, bevor du handelst.
Niedrige Konfidenz: Handle nicht. Leite an einen Menschen weiter, bitte um Klärung oder falle auf ein anderes System zurück. Das Modell sagt dir, dass es nicht genug Informationen hat oder die Frage nicht gut passt.
Wo du diese Grenzen ziehst, hängt vom Risiko ab.
Schwellenwerte skalieren mit dem Risiko
Ein Konfidenz-Schwellenwert ist nicht eine einzige Zahl. Verschiedene Aktionen innerhalb desselben Systems sollten je nach Folgen eines Fehlers auf unterschiedlichen Stufen durch Gating gesteuert werden.
response = client.system_one(
state=user_message,
questions={
"action": Choice(
instructions="What is the user trying to do?",
criteria={
"check_balance": "View account balance",
"approve_transfer": "Approve the pending withdrawal request",
"support": "Get help with an issue",
},
),
},
)
action = response.answers["action"]
confidence = action.confidence
if confidence < 0.5:
# Model is genuinely unsure. Don't guess.
route_to_human(user_message)
elif action.choice == "check_balance":
# Low stakes. Showing the wrong screen is recoverable.
show_balance(account_id)
elif action.choice == "approve_transfer":
if confidence > 0.9:
# High stakes, high confidence. Proceed with confirmation.
confirm_then_execute(account_id)
else:
# High stakes, moderate confidence. Verify first.
ask_user_to_confirm(account_id)
Der Konfidenz-Boden von 0.5 fängt alles ab, was das Modell als wirklich unsicher meldet. Oberhalb davon ist der Schwellenwert für das Handeln ohne Bestätigung bei einer destruktiven Operation höher als bei einer rein lesenden. Dein Code kodiert die Risikotoleranz.
Wie die Konfidenz berechnet wird
Jeder Fragetyp fasst seine Verteilung etwas anders zusammen. Ein Noul hat zwei Ergebnisse, ein Choice hat beliebig viele Optionen in beliebiger Reihenfolge, und die Stufen eines Score sind geordnet, daher baut jede Formel unten auf der vorigen auf.
Die confidence von TypeSafe ist eine vernünftige Art, eine Verteilung zusammenzufassen, aber nicht die einzige. Wir liefern ein festes Maß zurück, damit jede Antwort eine sinnvolle Voreinstellung mitbringt: Du kannst vom ersten Aufruf an auf confidence gaten, auf derselben Skala von 0 bis 1 für jede Frage, ohne zuerst ein eigenes Maß auszuwählen und zu validieren. Weil die Formeln unten exakt sind und jede Antwort ihre vollständigen probabilities enthält, kannst du stattdessen das Maß berechnen, das für deine Anwendung am wichtigsten ist.
Noul
Eine Noul-Antwort ist eine einzige Wahrscheinlichkeit $p$ dafür, dass die Antwort ja lautet, und TypeSafe gibt dafür kein separates confidence zurück. Die Wahrscheinlichkeit trägt die Unsicherheit bereits: Ein Wert nahe 0.5 heißt, dass das Modell unsicher ist, und die Seite Noul beschreibt, wie du sie direkt als Schwellenwert nutzt.
Wenn du trotzdem eine Zahl im Stil der Konfidenz möchtest, etwa um Nouls und Choices mit demselben Code zu gaten, verwende den Abstand von 0.5:
$$ \text{confidence} = |2p - 1| $$
Das ergibt 0 bei $p = 0.5$ und 1 bei $p = 0$ oder $p = 1$. Es ist außerdem die Choice-Formel unten, angewandt auf ein Ja/Nein-Choice, liegt also auf derselben Skala wie die Choice-Konfidenz.
Choice
Ein Choice dehnt dieselbe Idee auf beliebig viele Optionen aus. Für ein Choice mit $n$ Optionen, wobei $p_{\max}$ die Wahrscheinlichkeit der ausgewählten Option ist:
$$ \text{confidence} = \frac{p_{\max} - \frac{1}{n}}{1 - \frac{1}{n}} $$
Das misst, wie weit die höchste Wahrscheinlichkeit über einer Gleichverteilung von $\frac{1}{n}$ pro Option liegt, auf einer Skala, auf der die Gleichverteilung 0 und Sicherheit 1 ist. Nur die höchste Wahrscheinlichkeit zählt, daher haben $(0.6, 0.3, 0.1)$ und $(0.6, 0.2, 0.2)$ beide Konfidenz 0.4.
def choice_confidence(probabilities: list[float]) -> float:
n = len(probabilities)
return (max(probabilities) - 1 / n) / (1 - 1 / n)
choice_confidence(list(answer.probabilities.values()))
Der Explorer oben auf dieser Seite verwendet diese Formel mit drei Optionen.
Zwei einfachere Maße, berechnet aus denselben probabilities, sind in der Praxis oft sehr wirksam und einen Versuch neben confidence wert:
- Höchste Wahrscheinlichkeit, $p_{\max}$. Sie liest sich direkt als „wie wahrscheinlich ist die ausgewählte Option“, was Schwellenwerte leicht nachvollziehbar macht. Ihre Bedeutung hängt von der Anzahl der Optionen ab, denn 0.5 ist eine schwache Antwort unter zwei Optionen und eine starke unter zehn, also lege ihren Schwellenwert pro Frage fest.
- Verhältnis von höchster zu zweithöchster, $p_{\max} / p_{\text{second}}$. Es misst, wie klar die ausgewählte Option den Zweitplatzierten schlägt, und ignoriert, wie der Rest verteilt ist. Viele echte Entscheidungen laufen auf die zwei besten Kandidaten hinaus, und genau darauf zielt dieses Verhältnis.
Score
Die Stufen eines Score sind geordnet, daher zählt seine Formel auch, wie weit die Wahrscheinlichkeit von der wahrscheinlichsten Stufe entfernt liegt. Für ein Score mit $n$ Stufen, nummeriert von $0$ bis $n - 1$, wobei $p_i$ die Wahrscheinlichkeit der Stufe $i$ und $m$ die wahrscheinlichste Stufe ist:
$$ \text{confidence} = \max\left(0,\ 1 - \frac{\sum_i p_i , |i - m|}{\text{MAD}{\text{unif}}}\right) \qquad \text{MAD}{\text{unif}} = \frac{1}{n} \sum_i \left| i - \frac{n - 1}{2} \right| $$
Die Summe im Zähler ist der wahrscheinlichkeitsgewichtete durchschnittliche Abstand, in Stufen, zwischen der Antwort und der wahrscheinlichsten Stufe. $\text{MAD}_{\text{unif}}$ ist dieselbe Art von durchschnittlichem Abstand für eine Gleichverteilung über alle Stufen, gemessen von der mittleren Stufe. Die Konfidenz vergleicht die beiden und wird bei 0 begrenzt, wenn die Antwort mindestens so breit gestreut ist wie eine Gleichverteilung.
Wahrscheinlichkeit auf einer benachbarten Stufe senkt die Konfidenz weniger als dieselbe Wahrscheinlichkeit auf einer weiter entfernten Stufe. Bei drei Stufen hat $(0, 0.5, 0.5)$ die Konfidenz 0.25, weil das Modell zwischen zwei benachbarten Stufen hin- und hergerissen ist. $(0.5, 0, 0.5)$ hat die Konfidenz 0, weil es zwischen den entgegengesetzten Enden hin- und hergerissen ist. Die Choice-Formel würde beiden Verteilungen 0.25 geben.
Score-Frage mit fünf Stufen
Wie der Abstand zwischen Stufen die Konfidenz verändert
Konfidenz
Wahrscheinlichkeit
Verschiebe einen Regler, um die Wahrscheinlichkeit einer Stufe zu ändern. Die übrigen passen sich an, damit die Summe bei 100 % bleibt.
- Score
- 2.00
- Choice-Formel auf dieselben Wahrscheinlichkeiten
- 0.88
Wie diese Demo die Konfidenz berechnet
Diese Demo verwendet die Score-Formel. Sie bildet den mit der Wahrscheinlichkeit gewichteten mittleren Abstand – in Stufen – zwischen Antwort und Spitze. Diesen teilt sie durch 1.2, denselben Mittelwert für eine gleichmäßige Verteilung über fünf Stufen, gemessen von der mittleren Stufe, und zieht das Ergebnis von 1 ab, wobei sie bei 0 stehen bleibt. Wahrscheinlichkeit auf einer Stufe neben der Spitze senkt die Konfidenz weniger als weit entfernte Wahrscheinlichkeit – was die Choice-Formel nicht berücksichtigt.
def score_confidence(probabilities: list[float]) -> float:
n = len(probabilities)
m = probabilities.index(max(probabilities))
spread = sum(p * abs(i - m) for i, p in enumerate(probabilities))
even_spread = sum(abs(i - (n - 1) / 2) for i in range(n)) / n
return max(0.0, 1 - spread / even_spread)
levels = sorted(answer.probabilities)
score_confidence([answer.probabilities[level] for level in levels])
Die bug_severity-Antwort im Score-Antwortbeispiel hat die Wahrscheinlichkeiten $(0, 0.57, 0.43)$. Die wahrscheinlichste Stufe ist 1, der Abstand ist $0.43$, und $\text{MAD}_{\text{unif}}$ für drei Stufen ist $\frac{2}{3}$, also ist die Konfidenz $1 - 0.43 / \frac{2}{3} \approx 0.35$.