Menu

Prompts iterativ verbessern: Testen und optimieren

Einen Prompt zu verbessern, funktioniert am besten als kleines Experiment: festlegen, wie eine gute Antwort aussieht, ein paar feste Testeingaben behalten, immer nur eine Sache ändern und die Ausgaben nebeneinander vergleichen.

Jeder Prompt auf dieser Seite lässt sich bearbeiten und danach in ChatGPT, Claude oder einer anderen KI-App öffnen.

Die erste Version eines Prompts ist ein Entwurf. Oft bringt sie dich nah an das, was du willst, und die Lücke zwischen nah dran und richtig schließt du durch Iterieren: den Prompt gezielt ändern, ihn erneut mit demselben Input laufen lassen und prüfen, ob die Änderung geholfen hat. Nachlässig gemacht, wird Iterieren zu zufälligem Umformulieren, bis eine glückliche Ausgabe gut aussieht. Als kleines Experiment gemacht, bekommst du einen Prompt, der bei den nächsten hundert Inputs funktioniert, nicht nur bei dem einen, den du getestet hast.

Die Methode hat fünf Schritte: festlegen, wie gut aussieht, feste Testeingaben behalten, immer nur eine Sache ändern, Ausgaben vergleichen und wissen, wann Schluss ist.

Leg fest, wie eine gute Antwort aussieht

Bevor du irgendetwas änderst, schreib auf, was die Ausgabe leisten muss, als Prüfungen, die sich mit Ja oder Nein beantworten lassen. "Eine gute Commit-Message" lässt sich nicht prüfen. Diese Punkte schon:

  1. Die Betreffzeile hat weniger als 50 Zeichen.
  2. Sie folgt dem Format Conventional Commits (fix:, feat: und so weiter).
  3. Der Text sagt, warum die Änderung nötig war, nicht was der Diff ohnehin zeigt.
  4. Sie nennt die Issue-Nummer, wenn es eine gibt.

Kriterien erfüllen zwei Aufgaben. Sie sagen dir, was du in den Prompt schreiben musst, denn jedes ist oft eine fehlende Anweisung. Und sie halten dich davon ab, Ausgaben danach zu beurteilen, wie angenehm sie klingen, denn so übernimmt man am leichtesten eine selbstsichere, aber falsche Antwort.

Behalte ein kleines Set an Testeingaben

Wähl drei bis zehn Inputs und halte sie fest, während du arbeitest. Nimm typische Fälle auf, ein paar unbequeme (ein leeres Feld, ein sehr langer Input, eine Sprache, mit der der Prompt nicht gerechnet hat) und jeden Input, der schon einmal gescheitert ist. Ein Prompt, der an einem einzigen Beispiel feingeschliffen wurde, passt meist genau zu diesem Beispiel und scheitert am nächsten.

Schreib den Prompt als Vorlage mit einem Platz für den Input, damit jede Version mit genau demselben Material läuft.

Ändere immer nur eine Sache

Wenn du Rolle, Format und Beispiele gleichzeitig änderst und die Ausgabe besser wird, weißt du nicht, welche Änderung es war, und behältst vielleicht zwei nutzlose Änderungen. Ändere eine Sache, lass es laufen, vergleiche. Die Tabs unten sind drei Versionen desselben Prompts, jede eine einzige Änderung von der vorigen entfernt.

Schreib eine Commit-Message für diesen Diff.- if len(password) > 8: + if len(password) >= 8: return True
Try it
Example replyReplies vary between models and runs.

Passwortlängen-Validierung aktualisiert

Dieser Commit aktualisiert die Logik der Passwortvalidierung, indem der Vergleichsoperator von > auf >= geändert wird. Dadurch gelten Passwörter mit genau 8 Zeichen jetzt als gültig. Diese Änderung verbessert die Genauigkeit der Validierung und sorgt für eine bessere Erfahrung für Nutzer, die ein Konto anlegen.

Version 1 verfehlt die Kriterien 2 und 3: Die Betreffzeile hat kein Typ-Präfix, und der Text erzählt den Diff mit mehr Worten nach. Version 2 ergänzt die Formatvorgaben und erfüllt die Kriterien 1 und 2, aber ihr Text beschreibt immer noch den Diff. Die naheliegende nächste Änderung wäre eine weitere Anweisung ("erkläre, warum"), aber das Modell kann keinen Grund erklären, den es nie bekommen hat. Version 3 ergänzt stattdessen den fehlenden Kontext, und der Text und der Issue-Verweis folgen, ohne dass danach gefragt wurde. Das ist die häufigste Lehre beim Iterieren: Wenn eine Anweisung eine Ausgabe nicht verbessert, fehlt dem Prompt meist Information, nicht Nachdruck.

Vergleiche die Ausgaben nebeneinander

Lass jede Version mit jeder Testeingabe laufen, und zwar mehr als einmal, denn Chatmodelle sampeln ihre Wörter, und zwei Durchläufe desselben Prompts unterscheiden sich. Leg die Ausgaben nebeneinander und prüf sie gegen deine Kriterien, nicht gegen deine Erinnerung an den letzten Durchlauf.

Bei präzisen Kriterien kann ein zweiter Modellaufruf den ersten Bewertungsdurchgang übernehmen. Füg die Ausgaben in einen Bewertungs-Prompt ein, mit ausformulierten Kriterien:

Ausgaben nach festen Kriterien bewerten
Fill in
Prüf jede Ausgabe unten gegen die Kriterien. Antworte für jedes Kriterium mit bestanden oder nicht bestanden und einer kurzen Begründung, die die Ausgabe zitiert. Beurteile nur die genannten Kriterien. Belohne weder Länge noch Stil. Kriterien: 1. Betreffzeile unter 50 Zeichen. 2. Folgt Conventional Commits. 3. Der Text sagt, warum die Änderung nötig war, nicht was der Diff zeigt. 4. Nennt die Issue-Nummer. Ausgabe A: """ fix: Passwörter mit genau 8 Zeichen akzeptieren Längenprüfung von > auf >= ändern, damit Passwörter mit genau 8 Zeichen die Validierung bestehen. """ Ausgabe B: """ fix: Passwörter mit genau 8 Zeichen akzeptieren Die Registrierungsseite verlangt mindestens 8 Zeichen, aber die Prüfung hat Passwörter mit genau dieser Länge abgelehnt, sodass sich Nutzer, die der Anleitung gefolgt sind, nicht registrieren konnten. Fixes #412 """ Antworte als Tabelle mit einer Zeile pro Kriterium.
Try it
Example replyReplies vary between models and runs.
KriteriumAusgabe AAusgabe B
1. Betreff unter 50 ZeichenBestanden: Der Betreff hat 47 ZeichenBestanden: derselbe Betreff, 47 Zeichen
2. Conventional CommitsBestanden: beginnt mit "fix:"Bestanden: beginnt mit "fix:"
3. Text erklärt, warumNicht bestanden: "Längenprüfung von > auf >= ändern" wiederholt den DiffBestanden: "sodass sich Nutzer, die der Anleitung gefolgt sind, nicht registrieren konnten"
4. Nennt das IssueNicht bestanden: keine Issue-NummerBestanden: "Fixes #412"

Behandle ein Modell als Bewerter wie einen Assistenten, nicht wie einen Schiedsrichter. Zheng et al. 2023, "Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena", haben Verzerrungen bei Modellen als Bewertern dokumentiert, darunter eine Vorliebe für längere Antworten und für die Antwort an einer bestimmten Position. Halte die Kriterien prüfbar, bitte um zitierte Belege, tausch die Reihenfolge von A und B, wenn du zwei vergleichst, und lies selbst eine Stichprobe der Ausgaben. Prüfungen wie Zeichenzahlen sind als Codezeile zuverlässiger denn als Urteil eines Modells.

Verbessere den Prompt, nicht das Gespräch

In einem Chat ist es verlockend, die Antwort mit Nachfragen zu korrigieren: "kürzer", "nein, nenn das Issue", "nimm das andere Format". So bekommst du eine gute Ausgabe, und der Prompt bleibt so schlecht, wie er war. Wenn eine Korrektur funktioniert, übernimm sie in den Prompt und lass den Prompt frisch laufen. Wenn du das Ergebnis das nächste Mal brauchst, fügst du eine Nachricht ein, statt fünf zu wiederholen.

Heb alte Versionen mit einer einzeiligen Notiz auf, was sich geändert und was es behoben hat. Eine einfache Textdatei reicht. Wenn eine spätere Änderung alles verschlechtert, kannst du zurückgehen, statt dich zu erinnern, was der Prompt früher sagte.

Ein Vergleich im Code

Sobald ein Prompt über eine API läuft, kann ein kurzes Skript die Gegenüberstellung für jede Version und jede Testeingabe erzeugen. Dieses nutzt das OpenAI Python SDK und schreibt eine Markdown-Datei, die du von oben nach unten lesen kannst.

from openai import OpenAI

client = OpenAI()
MODEL = "your-model-id"  # e.g. from your provider's model list

# each prompt file contains {input} where the test diff goes
PROMPTS = {
    "v2": open("prompts/commit_v2.txt").read(),
    "v3": open("prompts/commit_v3.txt").read(),
}
TESTS = [open(f"tests/diff_{i}.txt").read() for i in range(1, 6)]

with open("results.md", "w") as out:
    for i, test in enumerate(TESTS, 1):
        out.write(f"## Test {i}\n\n")
        for name, template in PROMPTS.items():
            for run in (1, 2):
                response = client.chat.completions.create(
                    model=MODEL,
                    messages=[{"role": "user", "content": template.replace("{input}", test)}],
                )
                out.write(f"### {name}, run {run}\n\n{response.choices[0].message.content}\n\n")

Wann Schluss ist

Hör auf, wenn jedes Kriterium bei jeder Testeingabe über ein paar Durchläufe hinweg erfüllt ist. Was du danach noch ergänzt, bringt meist nur Länge, und jede zusätzliche Anweisung ist eine weitere, die mit den anderen kollidieren kann.

Hör auch auf, wenn Änderungen anfangen, Fehler zu tauschen: Eine Änderung behebt Test 2 und macht Test 4 kaputt, die nächste kehrt das um. Dieses Muster heißt, dass vom Prompt etwas verlangt wird, das eine einzelne Anweisung nicht festnageln kann. Die üblichen Auswege sind, das Format mit ein paar Beispielen zu zeigen (Few-Shot-Prompting), die Aufgabe mit Prompt Chaining in Schritte zu zerlegen oder die deterministischen Teile, etwa Zeichen zählen oder ein Format prüfen, in Code zu verlagern, der die Ausgabe prüft. Wenn dir die Ideen ausgehen, kann Meta-Prompting helfen: Gib einem Modell den Prompt, den Input und die schlechte Ausgabe und frag, welcher Teil des Prompts sie am wahrscheinlichsten verursacht hat.

Häufig gestellte Fragen

Wie verbessere ich einen Prompt, der schlechte Antworten liefert?

Schau dir die schlechte Antwort an und benenne, was daran falsch ist: falsches Format, fehlender Fakt, falsches Publikum, zu lang. Such dann, was der Prompt nicht gesagt hat, das es verhindert hätte, ergänze genau das und lass die neue Version mit demselben Input laufen. Schlechte Antworten kommen öfter von fehlendem Kontext oder einer fehlenden Formatangabe als von der Formulierung.

Wie viele Testeingaben brauche ich, um einen Prompt zu testen?

Für einen Prompt, den du wiederverwendest, reichen meist drei bis zehn: ein paar typische Fälle, ein oder zwei Randfälle (sehr kurz, sehr lang, ungewöhnlich) und ein Input, der früher schiefgegangen ist. Halte sie fest, während du iterierst, damit eine Änderung der Ausgabe vom Prompt kommt und nicht von einem anderen Input.

Warum bekomme ich eine andere Antwort, wenn ich denselben Prompt noch einmal ausführe?

Chatmodelle sampeln jedes Wort aus einer Wahrscheinlichkeitsverteilung, deshalb variieren die Ausgaben zwischen Durchläufen. Wenn du zwei Prompt-Versionen vergleichst, lass jede mehr als einmal mit denselben Inputs laufen. Ein Unterschied, der in jedem Durchlauf auftaucht, ist wahrscheinlich echt; einer, der nur in einem Durchlauf erscheint, kann Zufall sein. Über eine API kannst du außerdem die Temperature senken, um die Schwankung zu verringern.

Kann ich die Ausgaben meines Prompts von einer KI bewerten lassen?

Ja, bei Kriterien, die du genau formulieren kannst, etwa "der Text sagt, warum die Änderung nötig war" oder "nennt die Issue-Nummer". Gib dem Bewerter deine genauen Kriterien und bitte pro Kriterium um bestanden oder nicht bestanden, mit einem Zitat als Beleg. Modelle als Bewerter haben bekannte Verzerrungen, darunter eine Vorliebe für längere Antworten und für eine bestimmte Position, also lies selbst einige Ausgaben und tausch die Reihenfolge, wenn du zwei vergleichst.

Wann sollte ich aufhören, einen Prompt zu verbessern?

Hör auf, wenn jedes Kriterium bei jeder Testeingabe über ein paar Durchläufe hinweg erfüllt ist, oder wenn jede neue Änderung einen Fall behebt und einen anderen kaputtmacht. Dann ist meist nicht der Prompt das Problem: Die Aufgabe braucht vielleicht Beispiele, eine Aufteilung in Schritte oder eine Prüfung im Code.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S