Präsenz- und Häufigkeitsstrafen
Auf dieser Seite
Wiederholungen bekämpfen
Sprachmodelle neigen von Natur aus dazu, sich zu wiederholen. Dies zeigt sich auf drei erkennbare Arten: dasselbe Wort wiederholt sich in einem Absatz, identische Satzstrukturen wiederholen sich Zeile für Zeile, oder ganze Absätze werden neu formuliert, ohne neue Informationen hinzuzufügen. Eine Erhöhung der Temperatur (Temperature) behebt dies nicht – eine globale Erhöhung der Zufälligkeit verschlechtert die Kohärenz, ohne die lexikalische Vielfalt zu garantieren. Die Parameter presence_penalty und frequency_penalty bieten eine viel feinere Steuerung, sofern Sie verstehen, was sie unterscheidet.
Präsenzstrafe: Eine feste Strafe
Die Präsenzstrafe (presence penalty) wendet eine einzelne, feste Strafe auf jedes Token an, das mindestens einmal in der generierten Antwort aufgetreten ist. Es spielt keine Rolle, ob das Token einmal oder fünfzehnmal verwendet wurde – die Strafe bleibt gleich. Die Wirkung besteht darin, das Modell dazu zu ermutigen, aus Wörtern zu schöpfen, die es noch nicht verwendet hat, was das Vokabular der Antwort erweitert. Wenn Sie z. B. nach zehn Adjektiven fragen, um das Meer zu beschreiben, wird der Unterschied sofort sichtbar – ohne Strafe neigen Variationen dazu, sich um drei oder vier semantische Felder zu drehen.
from mistralai.client import Mistral
import os
client = Mistral(api_key=os.getenv("MISTRAL_API_KEY"))
# Keine Strafe — das Modell kann sich wiederholen
response = client.chat.complete(
model="mistral-large-latest",
messages=[{"role": "user", "content": "Liste 10 Adjektive auf, um das Meer zu beschreiben."}],
presence_penalty=0.0
)
print("Keine Strafe:", response.choices[0].message.content)
# Mit Präsenzstrafe — fördert Vielfalt im Vokabular
response = client.chat.complete(
model="mistral-large-latest",
messages=[{"role": "user", "content": "Liste 10 Adjektive auf, um das Meer zu beschreiben."}],
presence_penalty=1.0
)
print("Mit Strafe:", response.choices[0].message.content)
Der Parameter akzeptiert Werte von -2,0 bis 2,0, wobei 0,0 der Standardwert ist. Ein positiver Wert bestraft bereits gesichtete Token und erzeugt somit mehr Vielfalt; ein negativer Wert tut das Gegenteil und begünstigt Wiederholungen, was nur in sehr spezifischen Fällen wie der Generierung von Refrains oder wiederholten Formeln nützlich ist. In der Produktion sollten Sie im Bereich von 0,0 bis 1,5 bleiben.
Häufigkeitsstrafe: Eine kumulative Strafe
Die Häufigkeitsstrafe (frequency penalty) funktioniert anders: die Strafe ist kumulativ und wächst mit der Anzahl der Vorkommen des Tokens. Je häufiger ein Wort wiederholt wird, desto unwahrscheinlicher ist es beim nächsten Vorkommen. Während die Präsenzstrafe das Vokabular öffnet, verlangsamt diese Strafe schrittweise Wörter, die zu oft wiederkehren, und macht sie besonders effektiv gegen Schleifen in langen Texten.
# Keine Häufigkeitsstrafe
response = client.chat.complete(
model="mistral-large-latest",
messages=[{"role": "user", "content": "Schreibe einen Absatz über künstliche Intelligenz."}],
frequency_penalty=0.0
)
print("Keine Strafe:", response.choices[0].message.content)
# Mit Häufigkeitsstrafe — reduziert sehr häufige Token
response = client.chat.complete(
model="mistral-large-latest",
messages=[{"role": "user", "content": "Schreibe einen Absatz über künstliche Intelligenz."}],
frequency_penalty=0.8
)
print("Mit Strafe:", response.choices[0].message.content)
Wie der vorherige Parameter reicht dieser von -2,0 bis 2,0 mit 0,0 als Standardwert, wobei ein positiver Wert häufige Token zunehmend bestraft. Sein nützlicher Bereich in der Produktion ist jedoch schmaler: 0,0 bis 1,0, da seine kumulative Natur ihn bei gleichen Werten aggressiver macht.
Die folgende Tabelle fasst zusammen, was sie unterscheidet.
| Feature | Präsenzstrafe | Häufigkeitsstrafe |
|---|---|---|
| Auslöser | Beim 1. Vorkommen | Bei jedem Vorkommen |
| Wachstum | Fest (gleiche Strafe) | Kumulativ (steigt an) |
| Wirkung | Vielfalt im Vokabular | Reduziert Wiederholungen |
| Beste Anwendung | Erkundung neuer Themen | Vermeidung von Wortschleifen |
Konfigurationen nach Absicht
In der Praxis stimmen Sie diese beiden Parameter zusammen mit der Temperatur ab, abhängig davon, was Ihre Anwendung produziert. Ein Chatbot benötigt eine leichte Vielfalt und keine Wiederholungen, nichts weiter. Kreatives Schreiben treibt die Präsenzstrafe an, um das Vokabular zu bereichern, während die Häufigkeitsstrafe moderat bleibt. Bei der Datenextraktion werden beide deaktiviert: Wiederholungen sind dort legitim, und derselbe Feldname kann z. B. zehnmal erscheinen. Zusammenfassungen liegen dazwischen, mit genau genug Strafe, um das Kopieren und Einfügen des Quelltextes zu vermeiden.
# Chatbot — leichte Vielfalt, keine Wiederholungen
CONFIG_CHATBOT = {
"temperature": 0.7,
"presence_penalty": 0.3,
"frequency_penalty": 0.3
}
# Kreatives Schreiben — reiches Vokabular, keine Schleifen
CONFIG_CREATIF = {
"temperature": 0.9,
"presence_penalty": 0.8,
"frequency_penalty": 0.5
}
# Datenextraktion — keine Strafen (exakte Antwort)
CONFIG_EXTRACTION = {
"temperature": 0.0,
"presence_penalty": 0.0,
"frequency_penalty": 0.0
}
# Zusammenfassung — etwas Vielfalt, um Kopieren/Einfügen zu vermeiden
CONFIG_RESUME = {
"temperature": 0.3,
"presence_penalty": 0.2,
"frequency_penalty": 0.4
}
Diagnose vor der Abstimmung
Die Abstimmung dieser Parameter „nach Gefühl” führt schnell zu willkürlichen Anpassungen. Messen Sie stattdessen. Die folgende Funktion berechnet ein Diversitätsverhältnis (einzigartige Wörter geteilt durch Gesamtanzahl der Wörter) und isoliert Wörter, die länger als drei Buchstaben sind und mehr als zweimal vorkommen, wodurch Artikel und Präpositionen herausgefiltert werden, deren Wiederholung normal ist. Führen Sie sie mit demselben Prompt und drei frequency_penalty-Werten aus, und Sie werden sehen, wie das Verhältnis steigt und sich dann ein Plateau bildet: Dieses Plateau markiert den Wert, ab dem Sie keinen weiteren Gewinn erzielen.
def analyze_repetition(text: str) -> dict:
"""Analysiert die Wiederholungsrate des generierten Textes."""
words = text.lower().split()
total = len(words)
unique = len(set(words))
# Zähle Wörter, die mehr als 2 Mal vorkommen
from collections import Counter
counts = Counter(words)
repeated = {w: c for w, c in counts.items() if c > 2 and len(w) > 3}
return {
"total_words": total,
"unique_words": unique,
"diversity_ratio": round(unique / total, 3) if total > 0 else 0,
"repeated_words": dict(sorted(repeated.items(), key=lambda x: -x[1])[:10])
}
# Test mit und ohne Strafen
for fp in [0.0, 0.5, 1.0]:
response = client.chat.complete(
model="mistral-large-latest",
messages=[{"role": "user", "content": "Schreibe einen langen Absatz über erneuerbare Energien."}],
max_tokens=500,
frequency_penalty=fp
)
text = response.choices[0].message.content
stats = analyze_repetition(text)
print(f"frequency_penalty={fp} | Diversität: {stats['diversity_ratio']} | Wiederholungen: {stats['repeated_words']}")
Zwei Wege, alles zu ruinieren
Der erste Weg ist, zu hoch zu gehen. Ab einem Wert über 1,5 vermeidet das Modell häufige Wörter so sehr, dass es unangemessene Alternativen substituiert: Der Text wird zerfurcht und voller missbrauchter seltener Begriffe. In einer Erklärung des Satzes des Pythagoras verhindern Strafen von 2,0, dass das Modell das Wort “Seite” oder “Dreieck” wiederholt – genau die Wörter, die der Beweis benötigt.
# SCHLECHT — Strafe zu stark
response = client.chat.complete(
model="mistral-large-latest",
messages=[{"role": "user", "content": "Erkläre den Satz des Pythagoras."}],
presence_penalty=2.0,
frequency_penalty=2.0
)
# Ergebnis: zerfurchter Text, missbrauchte seltene Wörter
Der zweite Weg ist die Kombination von hohen Strafen mit hoher Temperatur. Jeder Mechanismus fügt seinen Anteil an Zufälligkeit demselben Auswahlprozess hinzu, und ihre Überlagerung erzeugt nahezu zufälligen Text. Wie bei temperature und top_p gilt die Regel, einen Parameter nach dem anderen anzupassen.
# VERMEIDEN — zu viel Zufälligkeit
{"temperature": 1.5, "presence_penalty": 1.5, "frequency_penalty": 1.5}
# RICHTIG — passe einen Parameter nach dem anderen an
{"temperature": 0.7, "presence_penalty": 0.5, "frequency_penalty": 0.3}
Kernaussagen
- Präsenzstrafe: Feste Strafe, sobald ein Token gesehen wurde – erweitert das Vokabular
- Häufigkeitsstrafe: Kumulative Strafe proportional zur Häufigkeit – bekämpft Schleifen
- Beide reichen von -2,0 bis 2,0, Standardwert 0,0
- Bleiben Sie in der Produktion für die meisten Fälle im Bereich 0,0 bis 1,0
- Kombinieren Sie hohe Werte nicht mit hoher Temperatur
- Deaktivieren Sie Strafen für Extraktion und Klassifizierung (wo Wiederholungen akzeptabel sind)