Zum Hauptinhalt springen

Top p (Nucleus Sampling)

Top p, auch bekannt als Nucleus Sampling, ist ein wichtiger Parameter zur Steuerung der Textgenerierung bei Large Language Models. Holtzman et al. (2019) zeigten mit dieser Methode, dass sie aus einem dynamisch angepassten Wahrscheinlichkeitsbereich die KI ihre nächsten Wörter auswählen lässt.

1. Was ist Top p?

Top p ist eine Sampling-Methode, die Tokens (Wörter oder Wortteile) basierend auf ihrer kumulativen Wahrscheinlichkeit auswählt. Zhao et al. (2024) erklären, dass im Gegensatz zu Top k, das eine feste Anzahl von Tokens berücksichtigt, Top p sich dynamisch an die Wahrscheinlichkeitsverteilung anpasst.

Einfach erklärt: Stell dir vor, die KI hat eine Liste möglicher nächster Wörter, sortiert nach Wahrscheinlichkeit. Top p = 0.9 bedeutet: "Nimm die wahrscheinlichsten Wörter, bis ihre Gesamtwahrscheinlichkeit 90% erreicht."

Top-p Live Demo

Experimentiere mit verschiedenen Top-p-Werten und beobachte die Auswirkungen

Aktueller Wert: 0.90 - 1

Effekt bei 0.9:

Gute Balance für die meisten Anwendungen

Beispiel-Ausgabe:

Klicke auf "Generieren" um eine Beispiel-Ausgabe mit dem aktuellen Parameter-Wert zu sehen

1.1 Praktisches Beispiel

Angenommen, die KI soll den Satz "Der Himmel ist..." vervollständigen:

WortWahrscheinlichkeitKumulative Wahrscheinlichkeit
blau0.400.40
grau0.250.65
bewölkt0.150.80
klar0.100.90
dunkel0.050.95
violett0.030.98
grün0.021.00

Bei Top p = 0.9 würde die KI nur aus "blau", "grau", "bewölkt" und "klar" auswählen, da diese zusammen 90% der Wahrscheinlichkeit abdecken.

2. Technische Funktionsweise

Die mathematische Formel für Top p lautet:

P(w) = min{k : Σᵢ₌₁ᵏ P(wᵢ) ≥ p}

Dabei gilt:

  • P(w) = Wahrscheinlichkeit eines Tokens
  • p = Top p Schwellenwert (z.B. 0.9)
  • k = Anzahl der berücksichtigten Tokens

2.1 Der Algorithmus im Detail

  1. Sortiere alle möglichen Tokens nach ihrer Wahrscheinlichkeit (absteigend)
  2. Addiere die Wahrscheinlichkeiten der Tokens nacheinander
  3. Stoppe, sobald die Summe den Top p Wert erreicht oder überschreitet
  4. Wähle zufällig aus den verbleibenden Tokens basierend auf ihrer relativen Wahrscheinlichkeit

3. Wann solltest du Top p verwenden?

3.1 Kreative Aufgaben (Top p = 0.9-0.95)

  • Geschichten schreiben
  • Brainstorming
  • Marketing-Texte
  • Dialoge generieren

3.2 Ausgewogene Aufgaben (Top p = 0.7-0.9)

  • Blogbeiträge
  • Produktbeschreibungen
  • E-Mails verfassen
  • Social Media Posts

3.3 Präzise Aufgaben (Top p = 0.1-0.5)

  • Technische Dokumentation
  • Code-Generierung
  • Faktische Zusammenfassungen
  • Datenanalyse

4. Top p vs. Temperature

Ein häufiger Fehler ist die gleichzeitige Verwendung von Top p und Temperature. Hugging Face (2024) und die meisten Experten empfehlen:

Best Practice

Verwende entweder Top p ODER Temperature, nicht beide gleichzeitig. Beide Parameter beeinflussen die Zufälligkeit der Ausgabe und können sich gegenseitig stören.

4.1 Vergleich der Ansätze

AspektTop pTemperature
FunktionsweiseDynamische Token-AuswahlSkalierung der Wahrscheinlichkeiten
Bereich0.0 - 1.00.0 - 2.0 (je nach Anbieter)
VorteilAdaptiv an KontextIntuitiver zu verstehen
NachteilSchwerer vorherzusagenKann extreme Tokens zulassen

5. Praktische Code-Beispiele

5.1 OpenAI GPT-4

from openai import OpenAI

client = OpenAI()

# Kreative Aufgabe mit hohem Top p
creative_response = client.chat.completions.create(
    model="gpt-4",
    messages=[{
        "role": "user",
        "content": "Schreibe eine kreative Geschichte über einen Roboter"
    }],
    top_p=0.95,
    temperature=None  # Explizit None setzen
)

# Präzise Aufgabe mit niedrigem Top p
precise_response = client.chat.completions.create(
    model="gpt-4",
    messages=[{
        "role": "user",
        "content": "Erkläre die Funktionsweise einer For-Schleife"
    }],
    top_p=0.3,
    temperature=None
)

5.2 Anthropic Claude

import anthropic

client = anthropic.Anthropic()

# Verwende entweder top_p oder temperature
response = client.messages.create(
    model="claude-3-opus-20240229",
    max_tokens=1000,
    top_p=0.9,  # Nucleus sampling aktiviert
    messages=[{
        "role": "user",
        "content": "Generiere 5 kreative Produktnamen für ein Fitness-Getränk"
    }]
)

# Alternative: Verwende temperature statt top_p
response_temp = client.messages.create(
    model="claude-3-opus-20240229",
    max_tokens=1000,
    temperature=0.8,  # Statt top_p
    messages=[{
        "role": "user",
        "content": "Generiere 5 kreative Produktnamen für ein Fitness-Getränk"
    }]
)

5.3 Google Gemini

import google.generativeai as genai

genai.configure(api_key="YOUR_API_KEY")

# Gemini erlaubt die Kombination von top_p und top_k
model = genai.GenerativeModel('gemini-pro')

# Kreative Generierung
creative_config = genai.types.GenerationConfig(
    top_p=0.9,
    top_k=40,  # Zusätzlich zu top_p
    temperature=None
)

response = model.generate_content(
    "Erfinde eine neue Sportart",
    generation_config=creative_config
)

# Präzise Generierung
precise_config = genai.types.GenerationConfig(
    top_p=0.2,
    top_k=10,
    temperature=None
)

response = model.generate_content(
    "Liste die Schritte zur Installation von Python auf",
    generation_config=precise_config
)

6. API-Verfügbarkeit und Standardwerte

AnbieterVerfügbarBereichStandardwertBesonderheiten
OpenAI0.0 - 1.01.0Empfiehlt Verwendung ohne Temperature
Anthropic Claude0.0 - 1.01.0Entweder top_p oder temperature
Google Gemini0.0 - 1.00.95Kombinierbar mit top_k
Cohere0.0 - 1.00.75Als "p" Parameter
Mistral0.0 - 1.01.0Standard-Implementation

7. Tipps und Tricks

7.1 Optimale Werte finden

  1. Starte mit dem Standardwert: Beginne mit top_p=0.9 und passe von dort aus an
  2. Iteratives Testen: Teste verschiedene Werte mit derselben Eingabe
  3. Kontextabhängig wählen: Verschiedene Aufgaben erfordern unterschiedliche Werte

7.2 Häufige Fehler vermeiden

  • ❌ Top p und Temperature gleichzeitig verwenden
  • ❌ Zu niedrige Werte für kreative Aufgaben (unter 0.7)
  • ❌ Zu hohe Werte für faktische Aufgaben (über 0.5)
  • ❌ Den Wert während einer Konversation ständig ändern

7.3 Debugging-Strategie

# Test verschiedener Top p Werte
test_values = [0.1, 0.3, 0.5, 0.7, 0.9, 0.95]
prompt = "Beschreibe einen Sonnenuntergang"

for top_p in test_values:
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}],
        top_p=top_p,
        temperature=None,
        max_tokens=100
    )
    print(f"Top p = {top_p}:")
    print(response.choices[0].message.content)
    print("-" * 50)

8. Fortgeschrittene Konzepte

8.1 Dynamisches Top p

Manche Anwendungen passen Top p basierend auf dem Kontext an:

def get_dynamic_top_p(task_type: str) -> float:
    """Wähle Top p basierend auf der Aufgabe"""
    task_configs = {
        "creative_writing": 0.95,
        "technical_docs": 0.3,
        "chat": 0.8,
        "code_generation": 0.2,
        "brainstorming": 0.98,
        "summarization": 0.5
    }
    return task_configs.get(task_type, 0.9)

8.2 Kombination mit anderen Parametern

Bei Google Gemini kannst du Top p mit Top k kombinieren:

# Erst Top k, dann Top p Filterung
config = genai.types.GenerationConfig(
    top_k=50,    # Betrachte nur die 50 wahrscheinlichsten Tokens
    top_p=0.8,   # Davon nimm die, die 80% Wahrscheinlichkeit abdecken
    temperature=None
)