Zwischen deinem Prompt und jedem Wort der Antwort (technisch gesehen ein Token, aber halten wir es einfach) passieren vier Dinge. Der Forward Pass bewertet jedes Token im Vokabular. Die Temperatur formt diese Bewertungen in eine Wahrscheinlichkeitsverteilung um. Top-k und Top-p entscheiden, welche Kandidaten im Rennen bleiben. Die Ziehung wählt eines aus. Sie ist die einzige Zufälligkeit in dieser Erklärung, und der Seed ist das, was sie steuert.
Hier ist, was du erwarten würdest. Drehst du die Temperatur auf null, fällt die Verteilung auf ein einziges Token zusammen. Die Ziehung ist also noch da, hat aber nichts mehr zu entscheiden. Oder du lässt die Temperatur in Ruhe und fixierst den Seed. Dann trifft die Ziehung jedes Mal dieselbe Wahl. Derselbe Prompt sollte jedes Mal mit derselben Antwort zurückkommen.
Tut er aber nicht, und die Abweichung ist nicht klein. Dieser Artikel dokumentiert, was passierte, als ich es überprüft habe.
Hinweis: Der Begleitartikel zu diesem Text ist Was sich ändert, wenn ein Teil deines Systems nicht-deterministisch ist. Um das Folgende ganz zu verstehen, lies ihn zuerst. Er argumentiert, dass nicht-deterministisch ein schwaches Wort ist, das vieles verdeckt, was du wissen musst. Er erklärt auch Temperatur, Top-k, Top-p und den Seed, die vier Hyperparameter, auf die sich dieser Artikel bezieht.
Also habe ich es gemessen
Ich habe denselben Prompt einhundert Mal an gpt-4.1-mini gesendet, fixiert auf seinen Snapshot 2025-04-14, und habe das dann fünf weitere Male mit veränderten Sampling-Einstellungen wiederholt: zwei Temperaturen, gekreuzt mit keinem Seed, einem festen Seed und einem anderen Seed bei jedem Aufruf. Sechshundert Aufrufe, nacheinander statt parallel ausgeführt. Hätte ich sie gleichzeitig abgefeuert, hätten meine eigenen Anfragen im selben Server-Batch landen können, und die Batch-Zusammensetzung wollte ich genau nicht antasten.
Der Prompt war jedes Mal derselbe, ohne Systemnachricht:
List three reasons a flaky test might pass on a retry. One sentence each.
(Nenne drei Gründe, warum ein flaky Test bei einem Retry bestehen könnte. Jeweils ein Satz.)
Zwei Antworten zählen als unterschiedlich, wenn die Strings nicht Zeichen für Zeichen identisch sind, ohne dass eine Normalisierung stattfindet.
Als separate Prüfung habe ich jede Antwort in Kleinbuchstaben umgewandelt, die Satzzeichen entfernt und die Leerzeichen zusammengezogen. Keine der sechs Zählungen unten hat sich geändert. Jeder Unterschied ist ein Unterschied in den Worten.
Das sind die Messwerte aus dem Experiment:
Das sind die Messwerte aus dem Experiment:
Einstellung | Unterschiedliche Antworten, von 100 |
Temperatur 0, kein Seed | 27 |
Temperatur 0, seed=42 bei jedem Aufruf | 30 |
Temperatur 0, ein anderer Seed bei jedem Aufruf | 27 |
Temperatur 1.0, kein Seed | 100 |
Temperatur 1.0, seed=42 bei jedem Aufruf | 26 |
Temperatur 1.0, ein anderer Seed bei jedem Aufruf | 100 |

Abbildung 1
Jede Zeile in diesem Diagramm zeigt die einhundert Antworten für eine Einstellung, so sortiert, dass identische Antworten nebeneinander liegen. Ein Block ist eine unterschiedliche Antwort, und seine Breite zeigt, wie oft diese Antwort zurückkam. Die Anzahl der Blöcke in einer Zeile entspricht also der Zahl am Rand, und du kannst sie nachzählen.
Lies zuerst die Zeilen für Temperatur 1.0. Dort verhält sich der Seed so, wie du es erwarten würdest. Ohne Seed und mit einem unterschiedlichen Seed bei jedem Aufruf bestehen die Zeilen aus hundert feinen Linien: Keine einzige Antwort kam zweimal zurück. Hältst du den Seed stattdessen fest, fällt die Zeile in ein paar breite Blöcke zusammen. Der größte davon steht für dreizehn Aufrufe, die Wort für Wort dieselbe Antwort geliefert haben. Der Seed wird beachtet und leistet echte Arbeit.
Er macht aber nicht den Job, für den du ihn eingestellt hast. Ein Seed, der die Ausgabe kontrolliert, würde eine einzige Antwort hundertmal zurückgeben. Er lieferte sechsundzwanzig. Der Seed fixiert den Pfad durch die Verteilung, die er übergeben bekommt. Die wahrscheinlichste Interpretation ist, dass er nicht zweimal dieselbe Verteilung erhält.
Lies jetzt die Zeilen für Temperatur 0, wo dieselben drei Einstellungen 27, 30 und 27 produzieren. Der Seed spielt keine Rolle mehr. Genau das sagt die Pipeline voraus: Wenn die Verteilung zusammenfällt, bleibt für die Ziehung nur ein einziger Kandidat übrig. Es gibt also nichts mehr, was ein Seed steuern könnte. Es ist befriedigend zu sehen, wie eine Vorhersage den Kontakt mit hundert Aufrufen übersteht, und diese hier hat es getan.
Und dann die Sache, die nicht da sein sollte. Vier dieser sechs Einstellungen landen zwischen 26 und 30 unterschiedlichen Antworten. Diese vier kommen auf einem von zwei Wegen dorthin: Bei Temperatur null hat die Ziehung nur einen Kandidaten und trifft keine Wahl, und bei einem festen Seed bei Temperatur 1.0 trifft sie jedes Mal dieselbe Wahl. Unterschiedliche Wege, und beide enden an derselben Stelle: bei etwa 27 unterschiedlichen Antworten aus hundert.
Dieser Boden ist die Variation, die übrig bleibt, wenn der Sampler nichts mehr beitragen kann. Was auch immer noch übrig ist, keine Sampler-Einstellung erreicht es. Wo liegt es also?
Wo die Antworten auseinandergehen

Abbildung 2
Das Diagramm oben zeigt dieselben Daten, aber diesmal entlang der Antwort gelesen statt quer dazu. Für jede Zeichenposition fragt es, wie viele der hundert Antworten noch Wort für Wort identisch zueinander sind. Dabei zählt es die größte Gruppe, die noch übereinstimmt. Wo jede Linie am Ende abflacht, ist die Breite des breitesten Blocks im früheren Diagramm. Die beiden treffen sich also am rechten Rand. Folge zum Beispiel der durchgehenden Linie für Temperatur 0, kein Seed, bis zum rechten Rand, und sie pendelt sich bei 22 ein. Das ist dieselbe 22 wie beim breitesten Block im früheren Diagramm: die größte Anzahl an Antworten, die für diese Einstellung identisch waren.
Bei Temperatur null ohne Seed sind neunundneunzig der hundert Antworten für die ersten vierundachtzig Zeichen identisch. Dann ein Schritt hinunter auf einundsiebzig, ein weiterer auf sechsunddreißig, und zweiundzwanzig davon sind den ganzen Weg über identisch. Jeder dieser Schritte ist eine Stelle, an der sich das Token mit der höchsten Bewertung geändert hat. Alles, was nach so einem Schritt kommt, ist ein anderer Satz, oder gleich mehrere.
Die beiden Durchläufe bei Temperatur 1.0 ohne festen Seed liegen genau übereinander und stürzen ab wie über eine Klippe. Bei Zeichenposition vierundachtzig, wo Temperatur null ohne Seed noch neunundneunzig übereinstimmende Antworten hat, haben sie nur noch neun.
Die Schritte sind der entscheidende Punkt. Die drei Linien für Temperatur null driften nicht auseinander, sie stimmen exakt überein, springen dann um, und stimmen auf der anderen Seite des Sprungs wieder exakt überein. Diese Variation kann von den Decoding-Einstellungen nicht erreicht werden. Bei Temperatur null haben sie nämlich nichts mehr zu entscheiden.
Mein Experiment belegt nur so viel, und der einzige Teil, den ich verteidigen kann, ist dieser:
Die Einstellungen, die wir in einer Anfrage steuern, haben einen Einfluss auf die Variation, aber die Variation verschwindet nicht. Sie ist immer noch signifikant und lässt sich nicht mit dem entfernen, was unsere Anfrage steuern kann.