Temperature und Top P im Detail
Auf dieser Seite
Beherrschung der Ausgabe-Randomisierung
Sie haben die Grundlagen von temperature und top_p in Lektion 3 behandelt. Jetzt ist es Zeit, tiefer einzusteigen: Wie wirken diese beiden Parameter mathematisch auf die Generierung, wie kalibriert man sie für spezifische Anwendungsfälle und warum ist ihre Kombination eine klassische Quelle für Produktionsprobleme.
Wie Temperature funktioniert
In jedem Generierungsschritt berechnet das Modell eine Wahrscheinlichkeitsverteilung über das gesamte Vokabular: Welches Token kommt als Nächstes und mit welcher Wahrscheinlichkeit? Temperature greift in diese Verteilung vor der Stichprobe ein und verändert deren Form.
Zwischen 0,0 und 0,3 wird die Verteilung „spitz”: Das wahrscheinlichste Token dominiert die anderen massiv, wodurch das Modell quasi-deterministisch wird. Dies ist das, was Sie für Extraktion oder Klassifizierung wollen, bei denen zwei identische Aufrufe identische Ergebnisse liefern müssen. Zwischen 0,4 und 0,8 entsteht ein Gleichgewicht zwischen Kohärenz und Vielfalt – dies ist der häufigste Bereich in der Produktion, der für Chatbots und assistiertes Schreiben verwendet wird. Darüber hinaus, von 0,9 bis 1,5, wird die Verteilung abgeflacht: Deutlich unwahrscheinlichere Tokens haben nun eine realistische Chance, ausgewählt zu werden. Die Kreativität steigt, ebenso wie das Risiko der Inkohärenz, und beide nehmen gemeinsam zu.
Das folgende Experiment macht dieses Phänomen mit einem absichtlich banalen Satz greifbar.
from mistralai.client import Mistral
import os
client = Mistral(api_key=os.getenv("MISTRAL_API_KEY"))
prompt = [
{"role": "system", "content": "Ergänzen Sie den Satz mit einem einzigen Wort."},
{"role": "user", "content": "Die Farbe des Himmels ist..."}
]
# Temperature 0 — immer dieselbe Antwort
for i in range(3):
r = client.chat.complete(model="mistral-large-latest", messages=prompt, temperature=0.0, max_tokens=5)
print(f"T=0.0 Versuch {i+1}: {r.choices[0].message.content}")
# blue, blue, blue
# Temperature 1.5 — varierte Antworten
for i in range(3):
r = client.chat.complete(model="mistral-large-latest", messages=prompt, temperature=1.5, max_tokens=5)
print(f"T=1.5 Versuch {i+1}: {r.choices[0].message.content}")
# blue, azure, turquoise (variiert)
Eine Klarstellung ist bezüglich temperature=0 notwendig: Selbst bei diesem Wert können leichte Variationen zwischen zwei Aufrufen auftreten. Die Ursache liegt nicht im Modell, sondern in der Hardware – Gleitkommaoperationen auf GPUs garantieren keine identische Bewertungsreihenfolge bei jeder Ausführung, und eine Rundungsabweichung reicht manchmal aus, um die Wahl zwischen zwei nahezu gleichwahrscheinlichen Tokens zu kippen. Wenn Ihr Anwendungsfall maximale Reproduzierbarkeit erfordert, kombinieren Sie temperature=0 mit einem random_seed, sofern das Modell dies unterstützt.
Wie Top P funktioniert (Nucleus Sampling)
Top P wirkt nach der Temperatureinstellung auf die bereits umgeformte Verteilung. Sein Prinzip ist nicht die Verzerrung von Wahrscheinlichkeiten, sondern das Abschneiden der Kandidatenliste, wobei nur die Tokens beibehalten werden, deren kumulative Wahrscheinlichkeitssumme die Schwelle P erreicht. Die vollständige Abfolge entfaltet sich in vier Schritten:
- Das Modell berechnet die Wahrscheinlichkeiten für jedes Token
- Temperature modifiziert diese Wahrscheinlichkeiten
- Tokens werden nach absteigender Wahrscheinlichkeit sortiert
- Top P behält Tokens bei, bis die kumulative Schwelle erreicht ist
Konkret lässt ein top_p von 0,1 nur eine Handvoll Kandidaten überleben – nützlich, wenn die erwartete Antwort faktisch und nahezu eindeutig ist. Bei 0,95 bleibt fast das gesamte plausible Vokabular im Rennen, was einer Anfrage zur Erfindung entspricht.
# Top P = 0.1 — sehr restriktiv, nur die wahrscheinlichsten Tokens
response = client.chat.complete(
model="mistral-large-latest",
messages=[{"role": "user", "content": "Die Hauptstadt von Frankreich ist"}],
temperature=0.7,
top_p=0.1 # Nur die obersten 10 % der Wahrscheinlichkeitsmasse
)
# Top P = 0.95 — breit, fast alle Tokens berücksichtigt
response = client.chat.complete(
model="mistral-large-latest",
messages=[{"role": "user", "content": "Erfinden Sie ein neues Wort für ein Gefühl."}],
temperature=0.7,
top_p=0.95
)
Die Goldene Regel: Ein Parameter nach dem anderen
Mistral empfiehlt ausdrücklich, nicht gleichzeitig temperature und top_p anzupassen. Der Grund ergibt sich aus dem Vorhergehenden: Beide wirken auf dieselbe Verteilung, einer durch Verzerrung, der andere durch Abschneiden. Ihre Effekte multiplizieren sich auf unvorhersehbare Weise, und Sie verlieren jegliche Fähigkeit, eine Verhaltensänderung während des Tests einem der beiden Parameter zuzuschreiben. Wählen Sie Ihren Hebel und lassen Sie den anderen auf seinem Standardwert.
# GUT — temperature anpassen, top_p Standardwert
response = client.chat.complete(
model="mistral-large-latest",
messages=messages,
temperature=0.3 # top_p bleibt bei 1.0 Standardwert
)
# GUT — top_p anpassen, temperature Standardwert
response = client.chat.complete(
model="mistral-large-latest",
messages=messages,
top_p=0.5 # temperature bleibt bei 0.7 Standardwert
)
# VERMEIDEN — beide gleichzeitig
response = client.chat.complete(
model="mistral-large-latest",
messages=messages,
temperature=0.2,
top_p=0.5 # Unvorhersehbare Interaktion
)
Kalibrierung nach Anwendungsfall
Statt eine Temperatur ad hoc zu wählen, benennen Sie Ihre Konfigurationen und überlegen Sie nach dem Ziel. Extraktion und Klassifizierung zielen auf eine exakte, reproduzierbare Antwort ab, also 0,0. Zusammenfassung bleibt dem Quelltext treu mit etwas Flüssigkeit, also 0,3. Assistiertes Schreiben sucht Natürlichkeit ohne überflüssige Kreativität, bei 0,5; konversationelle Chatbots benötigen variierte Antworten, bei 0,7; Brainstorming erfordert maximale Kreativität, bei 1,2. In allen Fällen bleibt top_p bei 1,0, in Übereinstimmung mit der vorherigen Regel.
# Datenextraktion / Klassifizierung
# Ziel: exakte, reproduzierbare Antwort
CONFIG_EXTRACTION = {"temperature": 0.0, "top_p": 1.0}
# Zusammenfassung / Neuformulierung
# Ziel: treu zum Quelltext mit etwas Flüssigkeit
CONFIG_SUMMARY = {"temperature": 0.3, "top_p": 1.0}
# Assistiertes Schreiben / Professionelle E-Mail
# Ziel: natürlich, aber nicht zu kreativ
CONFIG_WRITING = {"temperature": 0.5, "top_p": 1.0}
# Konversationeller Chatbot
# Ziel: variierte und natürliche Antworten
CONFIG_CHATBOT = {"temperature": 0.7, "top_p": 1.0}
# Brainstorming / Ideenfindung
# Ziel: maximale Kreativität
CONFIG_CREATIVE = {"temperature": 1.2, "top_p": 1.0}
# Nutzung
def smart_complete(client, messages, task_type="chatbot"):
configs = {
"extraction": CONFIG_EXTRACTION,
"summary": CONFIG_SUMMARY,
"writing": CONFIG_WRITING,
"chatbot": CONFIG_CHATBOT,
"creative": CONFIG_CREATIVE,
}
config = configs.get(task_type, CONFIG_CHATBOT)
return client.chat.complete(
model="mistral-large-latest",
messages=messages,
**config
)
Experimentieren Sie methodisch
Diese Werte sind Startpunkte, keine absoluten Wahrheiten. Um die richtige Einstellung für Ihre eigene Aufgabe zu finden, müssen Sie messen, und eine einzelne Stichprobe pro Temperatur beweist nichts. Die folgende Funktion führt für jeden getesteten Wert fünf Generierungen durch und zählt die eindeutigen Antworten: Dies ist Ihr Diversitätsindikator. Eine Aufgabe, die bei T=0,3 5/5 eindeutige Antworten liefert, signalisiert ein zu offenes Prompt, weit mehr als eine schlecht gewählte Temperatur.
def test_temperature_range(client, messages, temperatures):
"""Testet mehrere Temperaturen auf demselben Prompt."""
results = []
for temp in temperatures:
responses = []
for _ in range(5): # 5 Versuche pro Temperatur
r = client.chat.complete(
model="mistral-large-latest",
messages=messages,
temperature=temp,
max_tokens=200
)
responses.append(r.choices[0].message.content)
# Misst Diversität
unique = len(set(responses))
results.append({
"temperature": temp,
"unique_responses": unique,
"sample": responses[0][:100]
})
for r in results:
print(f"T={r['temperature']:.1f} | {r['unique_responses']}/5 einzigartig | {r['sample']}...")
# Test
test_temperature_range(
client,
[{"role": "user", "content": "Geben Sie einen Produktivitätstipp."}],
[0.0, 0.3, 0.7, 1.0, 1.5]
)
Kernaussagen
- Temperature verändert die Form der Token-Wahrscheinlichkeitsverteilung
- Top P schneidet die Verteilung ab, indem es die wahrscheinlichsten Tokens behält
- Niemals beide gleichzeitig anpassen – ändern Sie einen Parameter, lassen Sie den anderen auf dem Standardwert
temperature=0ist nicht perfekt deterministisch aufgrund von GPU-Rundungen- Kalibrieren Sie mit methodischem Testen: 5+ Versuche pro Konfiguration, messen Sie die Diversität