Zum Inhalt springen →

ChatGPT Prompt Engineering for Developers

Prompt Engineering ist eine wichtige Qualifikation um bessere Ergebnisse aus einem LLM zu erhalten. Der kostenlose Kurs „ChatGPT Prompt Engineering for Developers“ von DeepLearning.AI, zeigt in ein paar einfachen Lektionen, wie man Prompts schreibt und worauf man achten sollte. Ich habe den Kurs mal durchgearbeitet und dabei als LLM devstral verwendet. Nicht optimal, aber ein sehr gutes Modell zum Programmieren und die hier gestellten Aufgaben hat das Modell auch ohne Probleme gemeistert.

Der Kurs wird von Isa Fulford und Andrew Ng geleitet und ist kostenlos. Er besteht aus den folgenden Videos zu denen dann immer ein Jupyter Notebook existiert, dass man direkt online ausführen kann.

  • Introduction
    Video・6 mins
  • Guidelines
    Video with code examples・17 mins
  • Iterative
    Video with code examples・13 mins
  • Summarizing
    Video with code examples・7 mins
  • Inferring
    Video with code examples・11 mins
  • Transforming
    Video with code examples・12 mins
  • Expanding
    Video with code examples・6 mins
  • Chatbot
    Video with code examples・12 mins
  • Conclusion
    Video・2 mins

Hinweis: Wer denkt, dass „ChatGPT Prompt Engineering for Developers“ speziell auf die Bedürfnisse von Entwickler eingeht, liegt erst mal leicht daneben. Es geht hier doch eher um Prompt-Grundlagen. Der Teil „for Developers“ bezieht sich wohl darauf, dass man die Prompts in einem Jupyter Notebook mit der OpenAI API und Python nutzt. Das ist dann aber auch schon alles was man „for Developers“ bezeichnen kann.

Hier sind meine Notizen dazu:

Zwei Grundprinzipien bilden die Basis für das Prompting:

Prinzip 1: Schreiben von klaren und spezifischen Anweisungen
Je unmissverständlicher und detaillierter eine Anweisung ist, desto besser kann das Modell die Intention verstehen und die gewünschte Ausgabe liefern. Vage Informationen und unklare Anweisungen führen zu unvorhersehbaren Ergebnissen.

Prinzip 2: Man muss dem Modell Zeit zum „Denken“ geben
Bei komplexen Anfragen kann es hilfreich sein, dem Modell Zwischenschritte vorzugeben oder es anzuweisen, seine eigene Lösung zu erarbeiten, bevor es eine endgültige Antwort gibt. Dies verhindert übereilte und potenziell fehlerhafte Ergebnisse.

    Taktiken für klare und spezifische Anweisungen

    Um verschiedene Teile des Prompts klar voneinander abzugrenzen (z.B. Anweisung vs. zu bearbeitender Text), kann man Trennzeichen wie dreifache Backticks („`), Anführungszeichen („““) oder XML-Tags (`<text>…</text>`) verwenden.

    Beispiel:

     
    Prompt:
    
    Fasse den folgenden Text, der durch dreifache Backticks begrenzt ist, in maximal zwei Sätzen zusammen.
    
    ```Dieser Roman erzählt die Geschichte einer jungen Entdeckerin, die auf der Suche nach einer verlorenen Zivilisation zahlreiche Abenteuer erlebt, gefährliche Rätsel löst und dabei unerwartete Freundschaften schließt. Ihr Mut und ihre Entschlossenheit werden auf eine harte Probe gestellt, als sie sich finsteren Mächten entgegenstellen muss, die das Geheimnis der Zivilisation für sich beanspruchen wollen.```
    Antwort:

    Der Roman erzählt von einer jungen Entdeckerin, die auf der Suche nach einer verlorenen Zivilisation zahlreiche Abenteuer erlebt und dabei unerwartete Freundschaften schließt sowie finstere Mächte bekämpft. Ihr Mut und ihre Entschlossenheit werden dabei auf eine harte Probe gestellt.

    Wenn man ein bestimmtes Ausgabeformat benötigt (z.B. JSON, HTML, Listen), muss man dies explizit angeben.

    Beispiel:

    Prompt:
    Erstelle eine Liste von drei fiktiven deutschen Städtenamen zusammen mit ihrer ungefähren Einwohnerzahl und einem markanten Wahrzeichen.
    Gib die Antwort im JSON-Format mit den Schlüsseln "stadt", "einwohner" und "wahrzeichen".
    Antwort:
    [
      {
        "stadt": "Mittelberg",
        "einwohner": 5000,
        "wahrzeichen": "Das alte Rathaus"
      },
      {
        "stadt": "Feldhausen",
        "einwohner": 12000,
        "wahrzeichen": "Der Feldhauser Turm"
      },
      {
        "stadt": "Walddorf",
        "einwohner": 8500,
        "wahrzeichen": "Die Walddorfer Kathedrale"
      }
    ]

    Man kann das Modell anweisen, zu prüfen, ob bestimmte Bedingungen erfüllt sind, und je nach Ergebnis unterschiedlich zu reagieren.

    Beispiel:

    Du erhältst einen Text, der durch """ begrenzt ist.
    Wenn der Text eine Schritt-für-Schritt-Anleitung enthält, gib die Schritte nummeriert wieder. Wenn der Text keine Anleitung enthält, antworte mit "Keine Anleitung gefunden."
    """Um einen Kuchen zu backen, mische zuerst Mehl und Zucker. Gib dann Eier und Milch hinzu und verrühre alles gut. Fülle den Teig in eine Form und backe ihn bei 180 Grad."""
    Antwort:
    1. Mehl und Zucker mischen
    2. Eier und Milch hinzufügen und alles gut verrühren
    3. Teig in eine Form füllen
    4. Bei 180 Grad backen

    Iteration

    Selten ist der erste Prompt der beste. Iteratives Prompt Engineering ist ein Prozess, bei dem man einen Prompt schrittweise verfeinert. Um den Prmopt weiter zu verbessern muss man prüfen, ob das Ergebnis den Erwartungen entspricht. Ist das nicht der Fall, kann man die Anweisungen anpassen um die Probleme zu identifizieren.

    Ausgangsmaterial (Datenblatt für einen Wanderschuh):

    MODELL: AlpinGeist X3
    TYP: Herren-Wanderschuh, Kategorie B/C
    OBERMATERIAL: Nubukleder, GORE-TEX Membran
    SOHLE: Vibram® TracMaster, selbstreinigend, Geröllschutz
    GEWICHT: 650g (Gr. 42)
    EIGENSCHAFTEN: Wasserdicht, atmungsaktiv, hohe Stabilität, Knöchelschutz
    EINSATZBEREICH: Anspruchsvolle Trekkingtouren, Klettersteige
    EXTRAS: Wiederbesohlbar, Metallösen

    Iteration 1: Allgemeiner Prompt

    Prompt:
    Schreibe eine Produktbeschreibung basierend auf den folgenden technischen Daten, begrenzt durch ```.
    ```MODELL: AlpinGeist X3
    TYP: Herren-Wanderschuh, Kategorie B/C
    OBERMATERIAL: Nubukleder, GORE-TEX Membran
    SOHLE: Vibram® TracMaster, selbstreinigend, Geröllschutz
    GEWICHT: 650g (Gr. 42)
    EIGENSCHAFTEN: Wasserdicht, atmungsaktiv, hohe Stabilität, Knöchelschutz
    EINSATZBEREICH: Anspruchsvolle Trekkingtouren, Klettersteige
    EXTRAS: Wiederbesohlbar, Metallösen```
    Antwort (potenziell zu technisch und lang):
    Produktbeschreibung: AlpinGeist X3 Herren-Wanderschuh
    
    Der AlpinGeist X3 ist ein hochwertiger Wanderschuh der Kategorie B/C, speziell entworfen für anspruchsvolle Trekkingtouren und Klettersteige. Mit einem Gewicht von 650g (Größe 42) bietet er das perfekte Gleichgewicht zwischen Komfort und Leistung.
    
    Das Obermaterial aus Nubukleder in Kombination mit einer GORE-TEX Membran sorgt für absolute Wasserdichtigkeit bei gleichzeitiger Atmungsaktivität, was Ihre Füße auch bei längeren Touren trocken und komfortabel hält. Die Vibram® TracMaster Sohle ist nicht nur selbstreinigend und bietet optimalen Geröllschutz, sondern garantiert auch hervorragenden Grip auf unebenem Terrain.
    
    Die hohe Stabilität und der integrierte Knöchelschutz bieten Ihnen die notwendige Sicherheit bei anspruchsvollen Wanderungen. Zudem ist der AlpinGeist X3 wiederbesohlbar und verfügt über Metallösen, was seine Langlebigkeit und Robustheit unterstreicht.
    
    Ideal für alle, die auch auf schwierigen Strecken nicht auf Komfort und Sicherheit verzichten möchten.

    Problem 1: Zu lang und technisch für einen typischen Online-Shop-Kunden.
    Lösung: Längenbegrenzung und Fokus auf Vorteile.

    Iteration 2: Kürzer und kundenorientierter

    Prompt:
    Schreibe eine ansprechende Produktbeschreibung für einen Online-Shop, maximal 60 Wörter, basierend auf den folgenden technischen Daten, begrenzt durch ```. Hebe die Vorteile für den Kunden hervor.MODELL: AlpinGeist X3
    TYP: Herren-Wanderschuh, Kategorie B/C
    OBERMATERIAL: Nubukleder, GORE-TEX Membran
    SOHLE: Vibram® TracMaster, selbstreinigend, Geröllschutz
    GEWICHT: 650g (Gr. 42)
    EIGENSCHAFTEN: Wasserdicht, atmungsaktiv, hohe Stabilität, Knöchelschutz
    EINSATZBEREICH: Anspruchsvolle Trekkingtouren, Klettersteige
    EXTRAS: Wiederbesohlbar, Metallösen
    Antwort:
    Entdecken Sie den AlpinGeist X3 Herren-Wanderschuh – der perfekte Begleiter für anspruchsvolle Trekkingtouren und Klettersteige. Mit Nubukleder und GORE-TEX Membran bietet er Wasserdichtigkeit und Atmungsaktivität. Die Vibram® TracMaster Sohle sorgt für Selbstreinigung, Geröllschutz und hohe Stabilität. Knöchelschutz und das geringe Gewicht von 650g (Gr. 42) garantieren maximalen Komfort und Sicherheit auf allen Wegen. Wiederbesohlbar dank Metallösen – langlebiger Begleiter für Abenteurer!

    Problem 2: Es fehlen wichtige Details wie die Möglichkeit der Wiederbesohlung (Nachhaltigkeitsaspekt).
    Lösung: Explizite Anweisung, bestimmte Details zu nennen und eine Tabelle für die wichtigsten technischen Daten hinzuzufügen.

    Iteration 3: Detaillierter und strukturierter

    Prompt:
    Schreibe eine ansprechende Produktbeschreibung (maximal 60 Wörter) für einen Online-Shop, basierend auf den Daten in ```. Hebe Vorteile hervor und erwähne explizit, dass der Schuh wiederbesohlbar ist.
    Füge darunter eine HTML-Tabelle mit dem Titel "Technische Details" und den Spalten "Merkmal" und "Spezifikation" für Obermaterial, Sohle und Gewicht hinzu.
    ```MODELL: AlpinGeist X3
    TYP: Herren-Wanderschuh, Kategorie B/C
    OBERMATERIAL: Nubukleder, GORE-TEX Membran
    SOHLE: Vibram® TracMaster, selbstreinigend, Geröllschutz
    GEWICHT: 650g (Gr. 42)
    EIGENSCHAFTEN: Wasserdicht, atmungsaktiv, hohe Stabilität, Knöchelschutz
    EINSATZBEREICH: Anspruchsvolle Trekkingtouren, Klettersteige
    EXTRAS: Wiederbesohlbar, Metallösen```
    Antwort:
    Erleben Sie Komfort und Halt mit dem AlpinGeist X3 Herren-Wanderschuh. Wasserdicht, atmungsaktiv und wiederbesohlbar - ideal für anspruchsvolle Trekkingtouren und Klettersteige.
    
    <table>
    <thead>
    <tr>
    <th colspan="2">Technische Details</th>
    </tr>
    </thead>
    <tbody>
    <tr>
    <td>Merkmal</td>
    <td>Spezifikation</td>
    </tr>
    <tr>
    <td>Obermaterial</td>
    <td>Nubukleder, GORE-TEX Membran</td>
    </tr>
    <tr>
    <td>Sohle</td>
    <td>Vibram® TracMaster, selbstreinigend, Geröllschutz</td>
    </tr>
    <tr>
    <td>Gewicht</td>
    <td>650g (Gr. 42)</td>
    </tr>
    </tbody>
    </table>

    Dieser iterative Prozess führt zu einer deutlich besseren und nützlicheren Ausgabe.

    Summarizing

    LLMs können lange Texte zusammenfassen, auch mit spezifischem Fokus.

    Beispiel: Zusammenfassung einer Produktbewertung für verschiedene Abteilungen

    Produktbewertung:

    "Das neue Smartphone 'BlitzPhone X' ist unglaublich schnell und die Kamera macht fantastische Fotos, selbst bei wenig Licht. Der Akku hält locker zwei Tage. Allerdings finde ich den Preis von 1200€ etwas hoch, und die mitgelieferte Schutzhülle wirkt billig. Die Lieferung erfolgte aber super schnell, schon am nächsten Tag!"

    Prompt für die Marketingabteilung (Fokus: positive Aspekte, max. 30 Wörter):

    Fasse die folgende Produktbewertung, begrenzt durch 
    ```...Bewertungstext...```

    Antwort:
    Das BlitzPhone X überzeugt mit blitzschneller Leistung, exzellenten Fotos auch bei wenig Licht und einem Akku für zwei Tage. Lieferung erfolgt superschnell am nächsten Tag!

    Prompt für die Produktentwicklungsabteilung (Fokus: Kritikpunkte, max. 30 Wörter):

    Extrahiere aus der folgenden Produktbewertung, begrenzt durch 
    ```...Bewertungstext...```
    Antwort:
    Der Preis von 1200€ ist hoch und die mitgelieferte Schutzhülle wirkt billig.

    Wichtig: Der Befehl „extract“ (extrahieren) ist oft besser als „summarize“ (zusammenfassen), wenn man nur bestimmte Informationen ohne zusätzliche Umschreibungen wünschen.

    Inferring (Schlussfolgern)

    LLMs können aus Texten Informationen ableiten, die nicht explizit genannt werden (z.B. Stimmung, Emotionen, genannte Entitäten).

    Beispiel: Analyse einer Kunden-E-Mail

    Kunden-E-Mail:

    "Sehr geehrte Damen und Herren, ich bin wirklich enttäuscht. Mein neu bestellter 'KaffeeMeister 5000' ist nach nur einer Woche defekt – er mahlt keine Bohnen mehr! Ich erwarte eine schnelle Lösung, sonst sehe ich mich gezwungen, den Kauf zu stornieren. Ich hatte mich so auf das Gerät von Ihrer Firma 'PremiumKüche GmbH' gefreut."

    Prompt (mehrere Schlussfolgerungen in einem JSON-Objekt):

    Analysiere die folgende Kunden-E-Mail, begrenzt durch ```.
    Gib deine Antwort als JSON-Objekt mit folgenden Schlüsseln aus:
    - "stimmung": (positiv, negativ, neutral)- "emotionen_erkennbar": (eine Liste von bis zu 3 erkannten Emotionen)- "produkt_erwaehnt": (Name des Produkts)
    - "firma_erwaehnt": (Name der Firma)
    - "hauptanliegen": (kurze Zusammenfassung des Problems)
    ```...E-Mail-Text...```
    Antwort:
    {
      "stimmung": "negativ",
      "emotionen_erkennbar": ["Enttäuschung", "Frustration"],
      "produkt_erwaehnt": "KaffeeMeister 5000",
      "firma_erwaehnt": "PremiumKüche GmbH",
      "hauptanliegen": "Der KaffeeMeister 5000 mahlt nach einer Woche keine Bohnen mehr und der Kunde möchte eine schnelle Lösung."
    }

     

    Transforming (Transformieren)

     

    LLMs können Texte umwandeln: Übersetzungen, Tonanpassung, Formatkonvertierung, Rechtschreib-/Grammatikkorrektur.

    Übersetzung:
    Beispiel:

    Prompt:
    Übersetze den folgenden deutschen Satz ins Englische und ins formelle Französisch:
    "Könnten Sie mir bitte sagen, wie spät es ist?"
    Antwort:
    Here are the translations:
    English:
    "Could you please tell me what time it is?"
    French (formal):
    "Pourriez-vous m'indiquer l'heure, s'il vous plaît ?"
    These translations maintain the polite tone of the original German sentence.

    Tonanpassung:
    Beispiel:

    Prompt:
    Formuliere die folgende umgangssprachliche Aussage in einen höflichen, formellen Geschäftssatz um:"Hey Chef, die Zahlen für letzten Monat sind echt mies, da müssen wir was machen."
    Antwort:
    Sehr geehrter Herr/Frau [Name des Vorgesetzten],
    ich möchte Sie darauf hinweisen, dass die finanziellen Ergebnisse des vergangenen Monats nicht den Erwartungen entsprechen. Es wäre ratsam, Maßnahmen zu ergreifen, um diese Situation zu verbessern.
    
    Mit freundlichen Grüßen,
    [Ihr Name]

    Formatkonvertierung (z.B. JSON zu HTML): Dies wurde bereits im iterativen Beispiel gezeigt.

    Rechtschreib- und Grammatikprüfung:

    Beispiel:

    Fehlerhafter Text: "Dass Auto was ich gestern gekauft habe fahrt sehr gut, es hatt nur ein kleinen Kratzer."
    

    Prompt:

    Korrigiere die Rechtschreib- und Grammatikfehler im folgenden Satz. Gib nur den korrigierten Satz aus.
    "Dass Auto was ich gestern gekauft habe fahrt sehr gut, es hatt nur ein kleinen Kratzer."

    Antwort:

    Das Auto, das ich gestern gekauft habe, fährt sehr gut; es hat nur einen kleinen Kratzer.

     

    Expanding (Erweitern)

    LLMs können aus kurzen Eingaben längere, detailliertere Texte generieren, z.B. personalisierte E-Mails.

    Beispiel: Personalisierte Antwort auf eine negative Kundenbewertung

    Kundenbewertung (negativ):

    "Der Staubsauger 'SaugWunder Pro' ist eine Katastrophe! Die Saugleistung ist viel schwächer als beworben und der Akku hält keine 15 Minuten. Reine Geldverschwendung!"

    Sentiment: negativ

    Prompt:

    Erstelle basierend auf der Kundenbewertung (begrenzt durch ```) und dem angegebenen Sentiment eine Antwort.
    Wenn das Sentiment negativ ist, entschuldige dich, gehe auf spezifische Kritikpunkte aus der Bewertung ein und biete eine Lösung oder Kontaktaufnahme an.
    Schreibe in einem prägnanten und professionellen Ton.
    Unterzeichne die E-Mail als "Ihr KI-Kundenservice-Team".
    
    Kundenbewertung: ```Der Staubsauger 'SaugWunder Pro' ist eine Katastrophe! Die Saugleistung ist viel schwächer als beworben und der Akku hält keine 15 Minuten. Reine Geldverschwendung!```
    Sentiment der Bewertung: negativ

    Antwort:

    Betreff: Vielen Dank für Ihr Feedback zu Ihrem 'SaugWunder Pro'
    
    Sehr geehrte/r [Kundenname],
    
    vielen Dank, dass Sie sich die Zeit genommen haben, uns Ihr Feedback zum 'SaugWunder Pro' mitzuteilen. Wir bedauern sehr zu hören, dass unser Produkt nicht Ihren Erwartungen entspricht und entschuldigen uns für etwaige Unannehmlichkeiten.
    
    Wir haben Ihre Kritikpunkte zur Kenntnis genommen:
    
    Die Saugleistung ist schwächer als beworben.
    Der Akku hält keine 15 Minuten.
    
    Ihre Zufriedenheit ist uns sehr wichtig, daher möchten wir Ihnen die Möglichkeit geben, das Problem schnell zu lösen. Bitte kontaktieren Sie unser Kundenservice-Team unter [Kontaktinformation], damit wir weitere Maßnahmen ergreifen können.
    
    Wir hoffen, dass wir Ihre Erwartungen bald erfüllen können und freuen uns darauf, weiterhin für Sie da zu sein.
    
    Mit freundlichen Grüßen,
    Ihr KI-Kundenservice-Team
    

    Der Dialog: Chatbots mit dem Chat-Format erstellen

    Für fortlaufende Konversationen ist das Chat-Format entscheidend. Es verwendet eine Liste von Nachrichten mit Rollen (system, user, assistant), um Kontext und Gedächtnis zu simulieren.

    • system: Definiert das Verhalten des Chatbots (z.B. „Du bist ein hilfsbereiter Reiseberater für Deutschland.“).
    • user: Die Eingabe des Nutzers.
    • assistant: Frühere Antworten des Chatbots, um den Kontext zu wahren.

    Dieses Verhalten wird von den vorhandenen Tools implementiert. Ich verwende hier gerade Open-WebUI, dass mit einem Ollama Server über REST kommuniziert. In den REST Requests wird das hier beschriebene Verhalten umgesetzt.

    Beispiel: Ein einfacher Reiseberater-Chat

    # Initialisierung mit System-Nachricht

    nachrichten = [
        {'role':'system', 'content':'Du bist ein freundlicher und kenntnisreicher Reiseberater, spezialisiert auf Reiseziele in Deutschland. Du gibst kurze, hilfreiche Tipps.'}
    ]

    # Erste Nutzeranfrage

    nutzer_anfrage_1 = "Hallo, ich plane einen Kurztrip im Sommer. Hast du eine Idee für eine schöne Stadt mit viel Natur in der Nähe?"

    nachrichten.append({'role':'user', 'content': nutzer_anfrage_1})

    # Antwort vom LLM (simuliert)

    # llm_antwort_1 = get_completion_from_messages(nachrichten)

    llm_antwort_1 = "Hallo! Wie wäre es mit Freiburg im Breisgau? Die Stadt liegt direkt am Schwarzwald und bietet tolle Wandermöglichkeiten sowie eine charmante Altstadt."

    nachrichten.append({'role':'assistant', 'content': llm_antwort_1})

    print(f"Reiseberater: {llm_antwort_1}")

    # Zweite Nutzeranfrage, baut auf Kontext auf

    nutzer_anfrage_2 = "Das klingt gut! Gibt es dort auch Seen zum Baden?"

    nachrichten.append({'role':'user', 'content': nutzer_anfrage_2})

    # Antwort vom LLM (simuliert)

    # llm_antwort_2 = get_completion_from_messages(nachrichten)

    llm_antwort_2 = "Ja, in der Umgebung von Freiburg gibt es mehrere schöne Seen, wie den Titisee oder den Schluchsee, die beide tolle Bademöglichkeiten bieten."

    nachrichten.append({'role':'assistant', 'content': llm_antwort_2})

    print(f"Reiseberater: {llm_antwort_2}")

    Durch das Mitführen des nachrichten-Verlaufs kann der Chatbot auf frühere Gesprächsteile Bezug nehmen. Das ist nötig, da LLMs stateless sind und immer nur ein Token erzeugen können, ohne sich an die vorherige Konversation zu erinnern.

    Fazit

    Effektives Prompt Engineering ist der Schlüssel, um das Potenzial von LLMs wie Qwen, Llama, Mistral, etc. auszuschöpfen. Indem man klare, spezifische Anweisungen gibt, den iterativen Entwicklungsprozess nutzt und die vielfältigen Fähigkeiten wie Zusammenfassen, Schlussfolgern, Transformieren und Erweitern gezielt einsetzt, kann man präzisere, nützlichere und kreativere Ergebnisse erzielen. Das Chat-Format eröffnet zudem die Tür zu interaktiven und kontextbewussten KI-Anwendungen.

    Veröffentlicht in Allgemein