Presence Penalty
Presence Penalty ist ein Parameter, der die Wahrscheinlichkeit reduziert, dass ein Token erneut verwendet wird, sobald es einmal im generierten Text erschienen ist. Im Gegensatz zu Frequency Penalty ist die Strafe hier binär - sie gilt ab dem ersten Auftreten.
Was ist Presence Penalty?
Presence Penalty wendet eine feste Strafe auf alle Tokens an, die bereits im generierten Text vorkamen. Dabei spielt es keine Rolle, ob das Token einmal oder zehnmal erschienen ist - die Strafe bleibt gleich.
Einfach erklärt: Stell dir vor, die KI führt eine "Bereits-verwendet-Liste". Sobald ein Wort auf dieser Liste steht, wird es bei zukünftigen Entscheidungen benachteiligt - egal wie oft es schon vorkam.
Mathematische Funktionsweise
Die Formel für Presence Penalty:
logit_neu = logit_original - (presence_penalty × indikator)
wobei: indikator = {
1, wenn Token bereits vorkam
0, wenn Token noch nicht vorkam
}
Presence vs. Frequency Penalty
Visueller Vergleich
Beispiel: Ein Token wurde unterschiedlich oft verwendet
Token | Vorkommen | Frequency Penalty (0.5) | Presence Penalty (0.5) |
---|---|---|---|
"Innovation" | 5× | 5 × 0.5 = 2.5 | 1 × 0.5 = 0.5 |
"Technologie" | 1× | 1 × 0.5 = 0.5 | 1 × 0.5 = 0.5 |
"Zukunft" | 0× | 0 × 0.5 = 0 | 0 × 0.5 = 0 |
Wie du siehst, behandelt Presence Penalty "Innovation" und "Technologie" gleich, obwohl "Innovation" fünfmal häufiger vorkam.
Wann solltest du Presence Penalty verwenden?
Hohe Presence Penalty (0.5 - 2.0)
- Brainstorming: Fördert neue Ideen und Konzepte
- Kreative Exploration: Ermutigt die KI, verschiedene Themen zu erkunden
- Vielfältige Listen: Verhindert thematische Redundanz in Aufzählungen
- Abwechslungsreiche Dialoge: Macht Konversationen dynamischer
Niedrige Presence Penalty (0.0 - 0.5)
- Fokussierte Texte: Wenn ein Thema vertieft werden soll
- Technische Erklärungen: Konsistente Verwendung von Begriffen
- Kohärente Narrativen: Beibehaltung des roten Fadens
Negative Presence Penalty (-2.0 - 0.0)
- Thematische Verstärkung: Betont bestimmte Konzepte
- Markensprache: Wiederholung wichtiger Begriffe
- SEO-Optimierung: Häufigere Keyword-Verwendung (mit Bedacht!)
Praktische Code-Beispiele
OpenAI GPT-4 Grundlagen
from openai import OpenAI
client = OpenAI()
# Beispiel 1: Brainstorming mit hoher Presence Penalty
brainstorm_response = client.chat.completions.create(
model="gpt-4",
messages=[{
"role": "user",
"content": "Generiere 10 innovative Geschäftsideen für die Zukunft"
}],
presence_penalty=1.2, # Fördert neue Themen
temperature=0.9
)
# Beispiel 2: Fokussierte Erklärung mit niedriger Presence Penalty
explanation_response = client.chat.completions.create(
model="gpt-4",
messages=[{
"role": "user",
"content": "Erkläre ausführlich, wie Machine Learning funktioniert"
}],
presence_penalty=0.2, # Erlaubt Wiederholung wichtiger Begriffe
temperature=0.7
)
Optimale Kombination mit Frequency Penalty
# Verschiedene Kombinationen für unterschiedliche Zwecke
# 1. Kreatives Schreiben: Vielfalt ohne Redundanz
creative_config = {
"presence_penalty": 0.6, # Neue Themen fördern
"frequency_penalty": 0.8, # Wortwiederholungen reduzieren
"temperature": 0.9
}
# 2. Technische Dokumentation: Präzise und konsistent
technical_config = {
"presence_penalty": 0.1, # Thematische Kohärenz
"frequency_penalty": 0.3, # Leichte Variation
"temperature": 0.5
}
# 3. Marketing-Copy: Balance zwischen Fokus und Kreativität
marketing_config = {
"presence_penalty": 0.4, # Moderate Themenvielfalt
"frequency_penalty": 0.6, # Sprachliche Abwechslung
"temperature": 0.8
}
# Anwendungsbeispiel
def generate_with_config(prompt, config, purpose=""):
print(f"Generiere {purpose}...")
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
**config
)
return response.choices[0].message.content
# Tests
creative_text = generate_with_config(
"Schreibe eine kurze Fantasy-Geschichte",
creative_config,
"kreative Geschichte"
)
technical_text = generate_with_config(
"Erkläre die Funktionsweise einer Blockchain",
technical_config,
"technische Erklärung"
)
Konkrete Anwendungsbeispiele
Beispiel 1: Produktideen-Generator
def generate_product_ideas(category, num_ideas=5):
"""
Generiert vielfältige Produktideen mit hoher Presence Penalty
"""
prompt = f"Generiere {num_ideas} innovative Produktideen für {category}"
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
presence_penalty=1.5, # Sehr hohe Themenvielfalt
frequency_penalty=0.5, # Moderate Wortvariation
temperature=0.9
)
return response.choices[0].message.content
# Beispielaufruf
ideas = generate_product_ideas("nachhaltige Haushaltsprodukte", 10)
print(ideas)
Beispiel 2: Dynamisches Storytelling
class StoryGenerator:
def __init__(self):
self.story_parts = []
def generate_chapter(self, prompt, chapter_num):
"""
Generiert Kapitel mit angepasster Presence Penalty
"""
# Erste Kapitel: mehr Vielfalt
# Spätere Kapitel: mehr Fokus
presence_penalty = max(0.2, 1.0 - (chapter_num * 0.15))
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "Du bist ein kreativer Geschichtenerzähler."},
{"role": "user", "content": prompt}
],
presence_penalty=presence_penalty,
frequency_penalty=0.6,
temperature=0.8,
max_tokens=500
)
chapter = response.choices[0].message.content
self.story_parts.append(chapter)
return chapter, presence_penalty
# Verwendung
story = StoryGenerator()
for i in range(5):
prompt = f"Schreibe Kapitel {i+1} der Geschichte. Bisherige Zusammenfassung: {' '.join(story.story_parts[-2:])}"
chapter, penalty_used = story.generate_chapter(prompt, i)
print(f"Kapitel {i+1} (Presence Penalty: {penalty_used:.1f})")
print(chapter[:200] + "...")
print("-" * 50)
Beispiel 3: A/B-Test verschiedener Penalties
def compare_penalties(prompt, test_configs):
"""
Vergleicht verschiedene Penalty-Konfigurationen
"""
results = []
for config_name, settings in test_configs.items():
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
**settings,
max_tokens=150
)
text = response.choices[0].message.content
# Analysiere Vielfalt
words = text.lower().split()
unique_words = set(words)
topics = extract_topics(text) # Hypothetische Funktion
results.append({
'config': config_name,
'text': text,
'word_diversity': len(unique_words) / len(words),
'unique_topics': len(topics),
'settings': settings
})
return results
# Test-Konfigurationen
configs = {
"high_presence": {
"presence_penalty": 1.5,
"frequency_penalty": 0.0,
"temperature": 0.8
},
"high_frequency": {
"presence_penalty": 0.0,
"frequency_penalty": 1.5,
"temperature": 0.8
},
"balanced": {
"presence_penalty": 0.6,
"frequency_penalty": 0.6,
"temperature": 0.8
},
"no_penalties": {
"presence_penalty": 0.0,
"frequency_penalty": 0.0,
"temperature": 0.8
}
}
# Durchführung
results = compare_penalties(
"Schreibe einen Absatz über die Zukunft der Arbeit",
configs
)
# Auswertung
for result in results:
print(f"
Konfiguration: {result['config']}")
print(f"Wortvielfalt: {result['word_diversity']:.2%}")
print(f"Text-Auszug: {result['text'][:100]}...")
print(f"Settings: {result['settings']}")
Optimierungsstrategien
Anpassung basierend auf Textlänge
def calculate_optimal_presence_penalty(target_length, text_type="general"):
"""
Berechnet optimale Presence Penalty basierend auf Textlänge
"""
base_penalties = {
"creative": 0.8,
"technical": 0.2,
"general": 0.5,
"brainstorm": 1.2
}
base = base_penalties.get(text_type, 0.5)
# Reduziere Penalty für längere Texte
if target_length > 1000:
return base * 0.6
elif target_length > 500:
return base * 0.8
else:
return base
# Beispiel
short_penalty = calculate_optimal_presence_penalty(200, "creative")
long_penalty = calculate_optimal_presence_penalty(2000, "creative")
print(f"Kurzer Text: {short_penalty}")
print(f"Langer Text: {long_penalty}")
Dynamische Anpassung während der Generierung
class AdaptivePenaltyGenerator:
def __init__(self):
self.generated_segments = []
self.topic_history = []
def analyze_topic_diversity(self, text):
"""Analysiert Themenvielfalt (vereinfacht)"""
# In der Praxis würde man hier NLP-Tools verwenden
key_words = set(word for word in text.lower().split()
if len(word) > 5)
return len(key_words)
def get_adaptive_penalty(self):
"""Passt Penalty basierend auf bisheriger Vielfalt an"""
if not self.generated_segments:
return 0.6 # Startewert
recent_diversity = sum(
self.analyze_topic_diversity(seg)
for seg in self.generated_segments[-3:]
) / min(3, len(self.generated_segments))
if recent_diversity < 10:
return min(1.5, 0.6 + 0.3) # Erhöhe Vielfalt
elif recent_diversity > 25:
return max(0.2, 0.6 - 0.3) # Mehr Fokus
else:
return 0.6
def generate_segment(self, prompt):
penalty = self.get_adaptive_penalty()
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
presence_penalty=penalty,
frequency_penalty=0.5,
temperature=0.8
)
segment = response.choices[0].message.content
self.generated_segments.append(segment)
return segment, penalty
API-Verfügbarkeit
Anbieter | Verfügbar | Bereich | Standard | Besonderheiten |
---|---|---|---|---|
OpenAI | ✅ | -2.0 bis 2.0 | 0.0 | Vollständige Unterstützung |
Anthropic Claude | ❌ | - | - | Verwendet andere Mechanismen |
Google Gemini | ✅ | -2.0 bis 2.0 | 0.0 | Als "presence_penalty" |
Cohere | ✅ | 0.0 bis 1.0 | 0.0 | Begrenzterer Bereich |
Azure OpenAI | ✅ | -2.0 bis 2.0 | 0.0 | Identisch mit OpenAI |
Best Practices
✅ Do's
- Verwende Presence Penalty für thematische Vielfalt, nicht für Wortvariation
- Kombiniere mit Frequency Penalty für optimale Ergebnisse
- Passe Werte an die Textlänge an (niedrigere Werte für längere Texte)
- Teste verschiedene Werte mit deinem spezifischen Use Case
- Dokumentiere erfolgreiche Konfigurationen
❌ Don'ts
- Verwende keine zu hohen Werte (>1.5) ohne ausführliche Tests
- Setze Presence Penalty nicht als einzigen Kreativitätsparameter ein
- Ignoriere nicht den Kontext und Zweck deines Textes
- Verwende keine hohen negativen Werte für öffentliche Inhalte
Troubleshooting
⚠️ Problem: Texte springen wild zwischen Themen
Lösung: Reduziere Presence Penalty von z.B. 1.5 auf 0.8
⚠️ Problem: Texte sind zu fokussiert und eintönig
Lösung: Erhöhe Presence Penalty von z.B. 0.2 auf 0.6-0.8
⚠️ Problem: Inkohärente längere Texte
Lösung: Verwende niedrigere Presence Penalty für längere Generierungen