Prompt Engineering

Autor: Lee Boonstra
Februar 2025


Danksagungen

Inhaltliche Mitwirkende:

  • Michael Sherman
  • Yuan Cao
  • Erick Armbrust
  • Anant Nawalgaria
  • Antonio Gulli
  • Simone Cammel

Kuratoren und Herausgeber:

  • Antonio Gulli
  • Anant Nawalgaria
  • Grace Mollison

Technischer Autor:

  • Joey Haymaker

Designer:

  • Michael Lanning

Inhaltsverzeichnis


Einführung

Wenn man über die Ein- und Ausgabe eines großen Sprachmodells nachdenkt, ist ein Textprompt (manchmal begleitet von anderen Modalitäten wie Bildprompts) die Eingabe, die das Modell verwendet, um eine spezifische Ausgabe vorherzusagen. Man muss kein Datenwissenschaftler oder Machine-Learning-Ingenieur sein – jeder kann einen Prompt schreiben. Die Erstellung des effektivsten Prompts kann jedoch kompliziert sein. Viele Aspekte Ihres Prompts beeinflussen seine Wirksamkeit: das verwendete Modell, die Trainingsdaten des Modells, die Modellkonfigurationen, Ihre Wortwahl, Stil und Ton, Struktur und Kontext sind alle wichtig. Daher ist Prompt Engineering ein iterativer Prozess. Unzureichende Prompts können zu mehrdeutigen, ungenauen Antworten führen und die Fähigkeit des Modells behindern, aussagekräftige Ausgaben zu liefern.

Man muss kein Datenwissenschaftler oder Machine-Learning-Ingenieur sein – jeder kann einen Prompt schreiben.

Prompt Engineering

Wenn Sie mit dem Gemini-Chatbot chatten, schreiben Sie im Grunde Prompts. Dieses Whitepaper konzentriert sich jedoch auf das Schreiben von Prompts für das Gemini-Modell in Vertex AI oder über die API, da Sie durch direktes Prompting des Modells Zugang zu Konfigurationen wie Temperatur etc. haben.

Dieses Whitepaper behandelt Prompt Engineering im Detail. Wir werden verschiedene Prompting-Techniken betrachten, um Ihnen den Einstieg zu erleichtern, und Tipps und Best Practices teilen, um ein Prompting-Experte zu werden. Wir werden auch einige der Herausforderungen besprechen, denen Sie beim Erstellen von Prompts begegnen können.

Denken Sie daran, wie ein LLM funktioniert: Es ist eine Vorhersagemaschine. Das Modell nimmt sequenziellen Text als Eingabe und sagt dann vorher, was das nächste Token sein sollte, basierend auf den Daten, mit denen es trainiert wurde. Das LLM ist darauf ausgelegt, dies immer wieder zu tun und das zuvor vorhergesagte Token zum Ende des sequenziellen Texts hinzuzufügen, um das nächste Token vorherzusagen. Die nächste Token-Vorhersage basiert auf der Beziehung zwischen dem, was in den vorherigen Tokens steht, und dem, was das LLM während seines Trainings gesehen hat.

Wenn Sie einen Prompt schreiben, versuchen Sie, das LLM so einzurichten, dass es die richtige Sequenz von Tokens vorhersagt. Prompt Engineering ist der Prozess der Gestaltung hochwertiger Prompts, die LLMs dazu anleiten, genaue Ausgaben zu produzieren. Dieser Prozess beinhaltet das Experimentieren, um den besten Prompt zu finden, die Optimierung der Prompt-Länge und die Bewertung des Schreibstils und der Struktur eines Prompts in Relation zur Aufgabe. Im Kontext der natürlichen Sprachverarbeitung und LLMs ist ein Prompt eine Eingabe, die dem Modell zur Verfügung gestellt wird, um eine Antwort oder Vorhersage zu generieren.

LLM-Ausgabe-konfiguration

Diese Prompts können verwendet werden, um verschiedene Arten von Verständnis- und Generierungsaufgaben zu erreichen, wie Textzusammenfassung, Informationsextraktion, Fragen und Antworten, Textklassifikation, Sprach- oder Code-Übersetzung, Code-Generierung und Code-Dokumentation oder Reasoning.

Bitte zögern Sie nicht, sich auf Googles Prompting-Leitfäden mit einfachen und effektiven Prompting-Beispielen zu beziehen.

Beim Prompt Engineering beginnen Sie mit der Auswahl eines Modells. Prompts müssen möglicherweise für Ihr spezifisches Modell optimiert werden, unabhängig davon, ob Sie Gemini-Sprachmodelle in Vertex AI, GPT, Claude oder ein Open-Source-Modell wie Gemma oder LLaMA verwenden.

Neben dem Prompt müssen Sie auch mit den verschiedenen Konfigurationen eines LLM experimentieren.

Sobald Sie Ihr Modell ausgewählt haben, müssen Sie die Modellkonfiguration herausfinden. Die meisten LLMs kommen mit verschiedenen Konfigurationsoptionen, die die Ausgabe des LLM steuern. Effektives Prompt Engineering erfordert die optimale Einstellung dieser Konfigurationen für Ihre Aufgabe.

Ausgabelänge

Eine wichtige Konfigurationseinstellung ist die Anzahl der Tokens, die in einer Antwort generiert werden sollen. Die Generierung von mehr Tokens erfordert mehr Berechnung vom LLM, was zu höherem Energieverbrauch, potenziell langsameren Antwortzeiten und höheren Kosten führt.

Die Reduzierung der Ausgabelänge des LLM führt nicht dazu, dass das LLM stilistisch oder textlich prägnanter in der Ausgabe wird, die es erstellt. Es führt nur dazu, dass das LLM aufhört, weitere Tokens vorherzusagen, sobald das Limit erreicht ist. Wenn Ihre Anforderungen eine kurze Ausgabelänge erfordern, müssen Sie möglicherweise auch Ihren Prompt entsprechend anpassen.

Die Begrenzung der Ausgabelänge ist besonders wichtig für einige LLM-Prompting-Techniken wie ReAct, bei denen das LLM nach der gewünschten Antwort weiterhin nutzlose Tokens ausgeben wird.

Beachten Sie, dass die Generierung von mehr Tokens mehr Berechnung vom LLM erfordert, was zu höherem Energieverbrauch und potenziell langsameren Antwortzeiten führt, was höhere Kosten zur Folge hat.

Sampling-Kontrollen

LLMs sagen nicht formal ein einzelnes Token vorher. Vielmehr sagen LLMs Wahrscheinlichkeiten dafür vorher, was das nächste Token sein könnte, wobei jedes Token im Vokabular des LLM eine Wahrscheinlichkeit erhält. Diese Token-Wahrscheinlichkeiten werden dann gesampelt, um zu bestimmen, was das nächste produzierte Token sein wird. Temperatur, Top-K und Top-P sind die häufigsten Konfigurationseinstellungen, die bestimmen, wie vorhergesagte Token-Wahrscheinlichkeiten verarbeitet werden, um ein einzelnes Ausgabe-Token zu wählen.

Temperatur

Die Temperatur steuert den Grad der Zufälligkeit bei der Token-Auswahl. Niedrigere Temperaturen sind gut für Prompts, die eine deterministischere Antwort erwarten, während höhere Temperaturen zu vielfältigeren oder unerwarteten Ergebnissen führen können. Eine Temperatur von 0 (greedy decoding) ist deterministisch: Das Token mit der höchsten Wahrscheinlichkeit wird immer ausgewählt (beachten Sie jedoch, dass wenn zwei Tokens die gleiche höchste vorhergesagte Wahrscheinlichkeit haben, Sie je nach Implementierung des Tiebreaking möglicherweise nicht immer die gleiche Ausgabe mit Temperatur 0 erhalten).

Temperaturen nahe dem Maximum neigen dazu, zufälligere Ausgaben zu erzeugen. Und wenn die Temperatur höher und höher wird, werden alle Tokens gleich wahrscheinlich, das nächste vorhergesagte Token zu sein.

Die Gemini-Temperaturkontrolle kann ähnlich wie die Softmax-Funktion im maschinellen Lernen verstanden werden. Eine niedrige Temperatureinstellung spiegelt eine niedrige Softmax-Temperatur (T) wider und betont eine einzelne, bevorzugte Temperatur mit hoher Sicherheit. Eine höhere Gemini-Temperatureinstellung ist wie eine hohe Softmax-Temperatur, die einen breiteren Bereich von Temperaturen um die gewählte Einstellung akzeptabler macht. Diese erhöhte Unsicherheit berücksichtigt Szenarien, in denen eine starre, präzise Temperatur möglicherweise nicht wesentlich ist, wie zum Beispiel beim Experimentieren mit kreativen Ausgaben.

Top-K und Top-P

Top-K und Top-P (auch bekannt als Nucleus Sampling) sind zwei Sampling-Einstellungen, die in LLMs verwendet werden, um das vorhergesagte nächste Token auf Tokens mit den höchsten vorhergesagten Wahrscheinlichkeiten zu beschränken. Wie die Temperatur steuern diese Sampling-Einstellungen die Zufälligkeit und Vielfalt des generierten Texts.

  • Top-K-Sampling wählt die Top-K wahrscheinlichsten Tokens aus der vorhergesagten Verteilung des Modells aus. Je höher Top-K, desto kreativer und vielfältiger ist die Ausgabe des Modells; je niedriger Top-K, desto restriktiver und faktischer ist die Ausgabe des Modells. Ein Top-K von 1 ist equivalent zum greedy decoding.
  • Top-P-Sampling wählt die obersten Tokens aus, deren kumulative Wahrscheinlichkeit einen bestimmten Wert (P) nicht überschreitet. Werte für P reichen von 0 (greedy decoding) bis 1 (alle Tokens im Vokabular des LLM).

Der beste Weg, zwischen Top-K und Top-P zu wählen, ist, mit beiden Methoden (oder beiden zusammen) zu experimentieren und zu sehen, welche die gewünschten Ergebnisse produziert.

Alles zusammenfügen

Die Wahl zwischen Top-K, Top-P, Temperatur und der Anzahl der zu generierenden Tokens hängt von der spezifischen Anwendung und dem gewünschten Ergebnis ab, und die Einstellungen beeinflussen sich alle gegenseitig. Es ist auch wichtig sicherzustellen, dass Sie verstehen, wie Ihr gewähltes Modell die verschiedenen Sampling-Einstellungen miteinander kombiniert.

Wenn Temperatur, Top-K und Top-P alle verfügbar sind (wie in Vertex Studio), sind Tokens, die sowohl die Top-K- als auch die Top-P-Kriterien erfüllen, Kandidaten für das nächste vorhergesagte Token, und dann wird die Temperatur angewendet, um aus den Tokens zu sampeln, die die Top-K- und Top-P-Kriterien erfüllt haben. Wenn nur Top-K oder Top-P verfügbar ist, ist das Verhalten dasselbe, aber nur die eine Top-K- oder P-Einstellung wird verwendet.

Wenn die Temperatur nicht verfügbar ist, werden alle Tokens, die die Top-K- und/oder Top-P-Kriterien erfüllen, zufällig ausgewählt, um ein einzelnes nächstes vorhergesagtes Token zu erzeugen.

Bei extremen Einstellungen eines Sampling-Konfigurationswerts hebt diese eine Sampling-Einstellung entweder andere Konfigurationseinstellungen auf oder wird irrelevant.

  • Wenn Sie die Temperatur auf 0 setzen, werden Top-K und Top-P irrelevant – das wahrscheinlichste Token wird das nächste vorhergesagte Token. Wenn Sie die Temperatur extrem hoch setzen (über 1 – normalerweise in die 10er), wird die Temperatur irrelevant und welche Tokens auch immer die Top-K- und/oder Top-P-Kriterien erfüllen, werden dann zufällig gesampelt, um ein nächstes vorhergesagtes Token zu wählen.
  • Wenn Sie Top-K auf 1 setzen, werden Temperatur und Top-P irrelevant. Nur ein Token erfüllt die Top-K-Kriterien, und dieses Token ist das nächste vorhergesagte Token. Wenn Sie Top-K extrem hoch setzen, wie auf die Größe des Vokabulars des LLM, wird jedes Token mit einer Nicht-Null-Wahrscheinlichkeit, das nächste Token zu sein, die Top-K-Kriterien erfüllen und keines wird ausgewählt.
  • Wenn Sie Top-P auf 0 (oder einen sehr kleinen Wert) setzen, werden die meisten LLM-Sampling-Implementierungen dann nur das wahrscheinlichste Token als die Top-P-Kriterien erfüllend betrachten, was Temperatur und Top-K irrelevant macht. Wenn Sie Top-P auf 1 setzen, wird jedes Token mit einer Nicht-Null-Wahrscheinlichkeit, das nächste Token zu sein, die Top-P-Kriterien erfüllen, und keines wird ausgewählt.

Als allgemeiner Ausgangspunkt wird eine Temperatur von 0,2, Top-P von 0,95 und Top-K von 30 relativ kohärente Ergebnisse liefern, die kreativ, aber nicht übermäßig sein können. Wenn Sie besonders kreative Ergebnisse wollen, versuchen Sie es mit einer Temperatur von 0,9, Top-P von 0,99 und Top-K von 40. Und wenn Sie weniger kreative Ergebnisse wollen, versuchen Sie es mit einer Temperatur von 0,1, Top-P von 0,9 und Top-K von 20. Schließlich, wenn Ihre Aufgabe immer eine einzige korrekte Antwort hat (z.B. die Antwort auf ein Mathematikproblem), beginnen Sie mit einer Temperatur von 0.

HINWEIS: Mit mehr Freiheit (höhere Temperatur, Top-K, Top-P und Ausgabe-Tokens) könnte das LLM Text generieren, der weniger relevant ist.

WARNUNG: Haben Sie jemals eine Antwort gesehen, die mit einer großen Menge von Füllwörtern endet? Dies ist auch als „Wiederholungsschleifenfehler“ bekannt, ein häufiges Problem bei großen Sprachmodellen, bei dem das Modell in einem Zyklus stecken bleibt und wiederholt dasselbe (Füll-)Wort, denselben Ausdruck oder dieselbe Satzstruktur generiert, oft verschärft durch unangemessene Temperatur- und Top-K/Top-P-Einstellungen. Dies kann sowohl bei niedrigen als auch bei hohen Temperatureinstellungen auftreten, jedoch aus unterschiedlichen Gründen. Bei niedrigen Temperaturen wird das Modell übermäßig deterministisch und hält starr am wahrscheinlichsten Pfad fest, was zu einer Schleife führen kann, wenn dieser Pfad zu zuvor generiertem Text zurückkehrt. Umgekehrt wird die Ausgabe des Modells bei hohen Temperaturen übermäßig zufällig, was die Wahrscheinlichkeit erhöht, dass ein zufällig gewähltes Wort oder eine Phrase durch Zufall zu einem vorherigen Zustand zurückführt und aufgrund der großen Anzahl verfügbarer Optionen eine Schleife erzeugt. In beiden Fällen bleibt der Sampling-Prozess des Modells „stecken“, was zu monotoner und unhilfreicher Ausgabe führt, bis das Ausgabefenster gefüllt ist. Die Lösung erfordert oft sorgfältiges Experimentieren mit Temperatur- und Top-K/Top-P-Werten, um das optimale Gleichgewicht zwischen Determinismus und Zufälligkeit zu finden.


Prompting-Techniken

[Seite 13]

LLMs sind darauf abgestimmt, Anweisungen zu befolgen und auf großen Datenmengen trainiert, sodass sie einen Prompt verstehen und eine Antwort generieren können. Aber LLMs sind nicht perfekt; je klarer Ihr Prompt-Text ist, desto besser ist es für das LLM, den nächsten wahrscheinlichen Text vorherzusagen. Darüber hinaus helfen spezifische Techniken, die nutzen, wie LLMs trainiert werden und wie LLMs funktionieren, Ihnen dabei, die relevanten Ergebnisse von LLMs zu erhalten.

Nachdem wir nun verstehen, was Prompt Engineering ist und was es erfordert, tauchen wir in einige Beispiele der wichtigsten Prompting-Techniken ein.

Allgemeines Prompting / Zero Shot

[Seite 13]

Ein Zero-Shot-Prompt ist die einfachste Art von Prompt. Er bietet nur eine Beschreibung einer Aufgabe und etwas Text für das LLM zum Starten. Diese Eingabe könnte alles sein: eine Frage, der Beginn einer Geschichte oder Anweisungen. Der Name Zero-Shot steht für „keine Beispiele“.

[Seite 14]

Lassen Sie uns Vertex AI Studio (für Sprache) in Vertex AI verwenden, das einen Spielplatz zum Testen von Prompts bietet. In Tabelle 1 sehen Sie ein Beispiel für einen Zero-Shot-Prompt zur Klassifizierung von Filmkritiken.

Das Tabellenformat, wie es unten verwendet wird, ist eine großartige Möglichkeit, Prompts zu dokumentieren. Ihre Prompts werden wahrscheinlich viele Iterationen durchlaufen, bevor sie in eine Codebasis gelangen, daher ist es wichtig, Ihre Prompt-Engineering-Arbeit auf disziplinierte, strukturierte Weise zu verfolgen. Mehr zu diesem Tabellenformat, der Bedeutung der Verfolgung von Prompt-Engineering-Arbeit und dem Prompt-Entwicklungsprozess finden Sie im Abschnitt „Best Practices“ später in diesem Kapitel („Die verschiedenen Prompt-Versuche dokumentieren“).

Die Modelltemperatur sollte auf eine niedrige Zahl eingestellt werden, da keine Kreativität benötigt wird, und wir verwenden die Standard-Top-K- und Top-P-Werte von gemini-pro, die beide Einstellungen effektiv deaktivieren (siehe ‚LLM-Ausgabekonfiguration‘ oben). Achten Sie auf die generierte Ausgabe. Die Wörter „störend“ und „Meisterwerk“ sollten die Vorhersage etwas komplizierter machen, da beide Wörter im selben Satz verwendet werden.

Name1_1_movie_classification
ZielFilmkritiken als positiv, neutral oder negativ klassifizieren
Modellgemini-pro
Temperatur0.1
Top-KN/A
PromptKlassifiziere Filmkritiken als POSITIV, NEUTRAL oder NEGATIV.
Kritik: „Her“ ist eine verstörende Studie, die die Richtung aufzeigt, in die sich die Menschheit bewegt, wenn KI sich unkontrolliert weiterentwickeln darf. Ich wünschte, es gäbe mehr Filme wie dieses Meisterwerk.
Sentiment:
AusgabePOSITIV

Tabelle 1. Ein Beispiel für Zero-Shot-Prompting

[Seite 15]

Wenn Zero-Shot nicht funktioniert, können Sie Demonstrationen oder Beispiele im Prompt bereitstellen, was zu „One-Shot“- und „Few-Shot“-Prompting führt.

One-Shot & Few-Shot

[Seite 15]

Bei der Erstellung von Prompts für KI-Modelle ist es hilfreich, Beispiele bereitzustellen. Diese Beispiele können dem Modell helfen zu verstehen, was Sie verlangen. Beispiele sind besonders nützlich, wenn Sie das Modell zu einer bestimmten Ausgabestruktur oder einem Muster lenken möchten.

Ein One-Shot-Prompt stellt ein einzelnes Beispiel bereit, daher der Name One-Shot. Die Idee ist, dass das Modell ein Beispiel hat, das es nachahmen kann, um die Aufgabe bestmöglich zu erfüllen.

Ein Few-Shot-Prompt stellt mehrere Beispiele für das Modell bereit. Dieser Ansatz zeigt dem Modell ein Muster, dem es folgen muss. Die Idee ist ähnlich wie bei One-Shot, aber mehrere Beispiele des gewünschten Musters erhöhen die Chance, dass das Modell dem Muster folgt.

[Seite 16]

Die Anzahl der Beispiele, die Sie für Few-Shot-Prompting benötigen, hängt von einigen Faktoren ab, einschließlich der Komplexität der Aufgabe, der Qualität der Beispiele und den Fähigkeiten des generativen KI-Modells (Gen AI), das Sie verwenden. Als allgemeine Faustregel sollten Sie mindestens drei bis fünf Beispiele für Few-Shot-Prompting verwenden. Sie müssen jedoch möglicherweise mehr Beispiele für komplexere Aufgaben verwenden, oder Sie müssen aufgrund der Eingabelängenbegrenzung Ihres Modells weniger verwenden.

Tabelle 2 zeigt ein Few-Shot-Prompt-Beispiel. Lassen Sie uns die gleichen gemini-pro-Modellkonfigurationseinstellungen wie zuvor verwenden, außer dass wir das Token-Limit erhöhen, um den Bedarf für eine längere Antwort zu berücksichtigen.

ZielPizza-Bestellungen in JSON parsen
Modellgemini-pro
Temperatur0.1
Top-KN/A
PromptParse eine Kundenbestellung für Pizza in gültiges JSON:

BEISPIEL:
Ich möchte eine kleine Pizza mit Käse, Tomatensauce und Pepperoni.
JSON-Antwort:
<br/>{<br/>"size": "small",<br/>"type": "normal",<br/>"ingredients": [["cheese", "tomato sauce", "pepperoni"]]<br/>}<br/>

BEISPIEL:
Kann ich eine große Pizza mit Tomatensauce, Basilikum und Mozzarella bekommen
{
„size“: „large“,
„type“: „normal“,
„ingredients“: [[„tomato sauce“, „basil“, „mozzarella“]]
}

Jetzt möchte ich eine große Pizza, mit der ersten Hälfte Käse und Mozzarella. Und die andere Tomatensauce, Schinken und Ananas.
JSON-Antwort:
Ausgabe<br/>{<br/>"size": "large",<br/>"type": "half-half",<br/>"ingredients": [["cheese", "mozzarella"], ["tomato sauce", "ham", "pineapple"]]<br/>}<br/>

Tabelle 2. Ein Beispiel für Few-Shot-Prompting

[Seite 17]

Wenn Sie Beispiele für Ihren Prompt auswählen, verwenden Sie Beispiele, die für die Aufgabe, die Sie ausführen möchten, relevant sind. Die Beispiele sollten vielfältig, von hoher Qualität und gut geschrieben sein. Ein kleiner Fehler kann das Modell verwirren und zu unerwünschten Ausgaben führen.

Wenn Sie versuchen, Ausgaben zu generieren, die robust gegenüber einer Vielzahl von Eingaben sind, ist es wichtig, Grenzfälle in Ihre Beispiele aufzunehmen. Grenzfälle sind Eingaben, die ungewöhnlich oder unerwartet sind, aber die das Modell dennoch handhaben können sollte.

System-, Kontext- und Rollen-Prompting

[Seite 18]

System-, Kontext- und Rollen-Prompting sind alle Techniken, die verwendet werden, um zu steuern, wie LLMs Text generieren, aber sie konzentrieren sich auf verschiedene Aspekte:

  • System-Prompting setzt den allgemeinen Kontext und Zweck für das Sprachmodell. Es definiert das „große Bild“ dessen, was das Modell tun sollte, wie eine Sprache übersetzen, eine Bewertung klassifizieren usw.
  • Kontext-Prompting bietet spezifische Details oder Hintergrundinformationen, die für die aktuelle Unterhaltung oder Aufgabe relevant sind. Es hilft dem Modell, die Nuancen dessen zu verstehen, was gefragt wird, und die Antwort entsprechend anzupassen.
  • Rollen-Prompting weist eine spezifische Figur oder Identität zu, die das Sprachmodell annehmen soll. Dies hilft dem Modell, Antworten zu generieren, die mit der zugewiesenen Rolle und ihrem zugehörigen Wissen und Verhalten konsistent sind.

Es kann erhebliche Überschneidungen zwischen System-, Kontext- und Rollen-Prompting geben. Z.B. kann ein Prompt, der dem System eine Rolle zuweist, auch einen Kontext haben.

Jedoch dient jede Art von Prompt einem etwas anderen primären Zweck:

  • System-Prompt: Definiert die grundlegenden Fähigkeiten und den übergreifenden Zweck des Modells.
  • Kontext-Prompt: Bietet unmittelbare, aufgabenspezifische Informationen zur Lenkung der Antwort. Es ist hochspezifisch für die aktuelle Aufgabe oder Eingabe, was dynamisch ist.
  • Rollen-Prompt: Rahmt den Ausgabestil und die Stimme des Modells. Es fügt eine Ebene der Spezifität und Persönlichkeit hinzu.

[Seite 19]

Die Unterscheidung zwischen System-, Kontext- und Rollen-Prompts bietet einen Rahmen für die Gestaltung von Prompts mit klarer Absicht, ermöglicht flexible Kombinationen und macht es einfacher zu analysieren, wie jeder Prompt-Typ die Ausgabe des Sprachmodells beeinflusst.

Lassen Sie uns in diese drei verschiedenen Arten von Prompts eintauchen.

System-Prompting

[Seite 19]

Tabelle 3 enthält einen System-Prompt, in dem ich zusätzliche Informationen darüber angebe, wie die Ausgabe zurückgegeben werden soll. Ich habe die Temperatur erhöht, um ein höheres Kreativitätsniveau zu erhalten, und ich habe ein höheres Token-Limit angegeben. Da ich jedoch klare Anweisungen zur Rückgabe der Ausgabe gegeben habe, hat das Modell keinen zusätzlichen Text zurückgegeben.

ZielFilmkritiken als positiv, neutral oder negativ klassifizieren
Modellgemini-pro
Temperatur1
Top-K40
PromptKlassifiziere Filmkritiken als positiv, neutral oder negativ. Gib nur das Label in Großbuchstaben zurück.

Kritik: „Her“ ist eine verstörende Studie, die die Richtung aufzeigt, in die sich die Menschheit bewegt, wenn KI sich unkontrolliert weiterentwickeln darf. Es ist so verstörend, dass ich es nicht ansehen konnte.
Sentiment:
AusgabeNEGATIV

Tabelle 3. Ein Beispiel für System-Prompting

System-Prompts können nützlich sein, um Ausgaben zu generieren, die spezifische Anforderungen erfüllen. Der Name ‚System-Prompt‘ steht eigentlich für ‚dem System eine zusätzliche Aufgabe bereitstellen‘. Sie könnten beispielsweise einen System-Prompt verwenden, um einen Code-Schnipsel zu generieren, der mit einer bestimmten Programmiersprache kompatibel ist, oder Sie könnten einen System-Prompt verwenden, um eine bestimmte Struktur zurückzugeben. Schauen Sie sich Tabelle 4 an, wo ich die Ausgabe im JSON-Format zurückgebe.

[Seite 20]

ZielFilmkritiken als positiv, neutral oder negativ klassifizieren, JSON zurückgeben
Modellgemini-pro
Temperatur1
Top-K40
PromptKlassifiziere Filmkritiken als positiv, neutral oder negativ. Gib gültiges JSON zurück:

Kritik: „Her“ ist eine verstörende Studie, die die Richtung aufzeigt, in die sich die Menschheit bewegt, wenn KI sich unkontrolliert weiterentwickeln darf. Es ist so verstörend, dass ich es nicht ansehen konnte.

Schema:
<br/>MOVIE:<br/>{<br/>"sentiment": String "POSITIVE" | "NEGATIVE" | "NEUTRAL",<br/>"name": String<br/>}<br/>MOVIE REVIEWS:<br/>{<br/>"movie_reviews": [MOVIE]<br/>}<br/>

JSON-Antwort:
Ausgabe<br/>{<br/> "movie_reviews": [<br/> {<br/> "sentiment": "NEGATIVE",<br/> "name": "Her"<br/> }<br/> ]<br/>}<br/>

Tabelle 4. Ein Beispiel für System-Prompting mit JSON-Format

[Seite 21]

Es gibt einige Vorteile beim Zurückgeben von JSON-Objekten aus einem Prompt, der Daten extrahiert. In einer realen Anwendung muss ich dieses JSON-Format nicht manuell erstellen, ich kann die Daten bereits in sortierter Reihenfolge zurückgeben (sehr praktisch beim Arbeiten mit Datetime-Objekten), aber am wichtigsten ist, dass durch das Prompting für ein JSON-Format das Modell gezwungen wird, eine Struktur zu erstellen und Halluzinationen zu begrenzen.

System-Prompts können auch sehr nützlich für Sicherheit und Toxizität sein. Um die Ausgabe zu kontrollieren, fügen Sie einfach eine zusätzliche Zeile zu Ihrem Prompt hinzu wie: ‚Sie sollten in Ihrer Antwort respektvoll sein.‘.

Rollen-Prompting

[Seite 21]

Rollen-Prompting ist eine Technik im Prompt Engineering, die das Zuweisen einer spezifischen Rolle an das Gen-AI-Modell beinhaltet. Dies kann dem Modell helfen, relevantere und informativere Ausgaben zu generieren, da das Modell seine Antworten auf die spezifische Rolle zuschneiden kann, die ihm zugewiesen wurde.

Sie könnten beispielsweise ein Gen-AI-Modell dazu bringen, die Rolle eines Bucheditors, eines Kindergartenlehrers oder eines Motivationsredners zu übernehmen. Sobald dem Modell eine Rolle zugewiesen wurde, können Sie ihm Prompts geben, die spezifisch für diese Rolle sind. Sie könnten beispielsweise einen Lehrer dazu auffordern, einen Unterrichtsplan zu erstellen, den er dann überprüfen kann. Schauen Sie sich Tabelle 5 an, wo das Modell die Rolle eines Reiseführers übernimmt.

[Seite 22]

ZielAls Reiseführer fungieren und 3 Reisevorschläge geben
Modellgemini-pro
Temperatur1
Top-K40
PromptIch möchte, dass du als Reiseführer fungierst. Ich werde dir über meinen Standort schreiben und du wirst 3 Orte in meiner Nähe vorschlagen, die ich besuchen kann. In einigen Fällen werde ich dir auch die Art der Orte mitteilen, die ich besuchen möchte.

Mein Vorschlag: „Ich bin in Amsterdam und möchte nur Museen besuchen.“
Reisevorschläge:
Ausgabe1. Rijksmuseum: Weltberühmtes Museum, bekannt für niederländische Meisterwerke wie Rembrandts „Die Nachtwache“. Verpassen Sie nicht die unglaubliche Sammlung von Gemälden und Artefakten, die niederländische Kunst und Geschichte zeigen.

2. Van Gogh Museum: Tauchen Sie ein in die fesselnden Werke von Vincent van Gogh. Das Museum beherbergt die größte Sammlung seiner Gemälde und Zeichnungen, einschließlich „Die Sternennacht“ und „Sonnenblumen“.

3. Stedelijk Museum Amsterdam: Entdecken Sie moderne und zeitgenössische Kunst aus aller Welt. Die Sammlung des Museums umfasst Werke von Picasso, Kandinsky und Rietveld, untergebracht in einem auffälligen modernen Gebäude.

Tabelle 5. Ein Beispiel für Rollen-Prompting

Das obige Beispiel zeigt ein Beispiel für die Übernahme der Rolle eines Reiseagenten. Wenn Sie die Rolle zu einem Geografielehrer ändern würden, würden Sie bemerken, dass Sie eine andere Antwort erhalten würden.

Die Definition einer Rollenperspektive für ein KI-Modell gibt ihm eine Blaupause des Tons, Stils und der fokussierten Expertise, die Sie suchen, um die Qualität, Relevanz und Wirksamkeit Ihrer Ausgabe zu verbessern.

[Seite 23]

Hier sind einige Stile, die Sie wählen können und die ich als effektiv empfinde:

Konfrontativ, Beschreibend, Direkt, Formal, Humorvoll, Einflussreich, Informell, Inspirierend, Überzeugend

Lassen Sie uns unseren Prompt in Tabelle 6 ändern, um einen humorvollen und inspirierenden Stil einzuschließen.

PromptIch möchte, dass du als Reiseführer fungierst. Ich werde dir über meinen Standort schreiben und du wirst 3 Orte in meiner Nähe vorschlagen, die ich in einem humorvollen Stil besuchen kann.

Mein Vorschlag: „Ich bin in Manhattan.“
Reisevorschläge:
Ausgabe1. Erblicke das Empire State of Mind: Steigen Sie zu den schwindelerregenden Höhen des Empire State Building auf und schwelgen Sie in der Herrlichkeit von Manhattans Skyline. Bereiten Sie sich darauf vor, sich wie King Kong auf dem Big Apple zu fühlen, minus der riesigen affengroßen Banane.

2. Werden Sie künstlerisch-pupserig im MoMA: Entfesseln Sie Ihren inneren Kunstliebhaber im Museum of Modern Art (MoMA). Bestaunen Sie Meisterwerke, die Ihren Verstand verwirren und Sie fragen lassen werden, ob Ihre Strichmännchen-Zeichnungen irgendeinen künstlerischen Wert haben.

3. Shoppen Sie bis zum Umfallen auf der Fifth Avenue: Gönnen Sie sich etwas Einzelhandelstherapie auf der ikonischen Fifth Avenue. Machen Sie sich auf einen Preisschock gefasst, während Sie in Designer-Boutiquen schaufensterbummeln (oder tatsächlich einkaufen), die Ihr Portemonnaie zum Weinen bringen werden. Aber hey, Sie sind in Manhattan, also können Sie genauso gut die Fabelhaftigkeit annehmen!

Tabelle 6. Ein Beispiel für Rollen-Prompting mit humorvollem Ton und Stil

Kontext-Prompting

[Seite 23]

Durch die Bereitstellung kontextueller Prompts können Sie sicherstellen, dass Ihre KI-Interaktionen so nahtlos und effizient wie möglich sind. Das Modell wird in der Lage sein, Ihre Anfrage schneller zu verstehen und genauere und relevantere Antworten zu generieren, wie Sie im Beispiel von Tabelle 7 sehen können.

[Seite 24]

ZielArtikel für einen Blog über Retro-Spiele vorschlagen
Modellgemini-pro
Temperatur1
Top-K40
PromptKontext: Sie schreiben für einen Blog über Retro-Arcade-Videospiele aus den 80ern.

Schlagen Sie 3 Themen vor, über die Sie einen Artikel schreiben können, mit ein paar Zeilen Beschreibung, was dieser Artikel enthalten sollte.
Ausgabe1. Die Evolution des Arcade-Kabinett-Designs:
Dieser Artikel würde die Entwicklung der Arcade-Kabinett-Designs erforschen, von den frühen Holz- und Metallkabinetten der 1970er bis zu den schlanken, neonbeleuchteten Designs der 1980er und darüber hinaus.

2. Blast From The Past: Ikonische Arcade-Spiele der 80er:
– Dieser Artikel würde einen Einblick in die Geschichte, den Einfluss und das Erbe einiger der ikonischsten und einflussreichsten Arcade-Spiele der 1980er bieten und ihre Innovationen, beliebten Mechaniken und anhaltenden Charme hervorheben.

3. Der Aufstieg und die Retro-Wiederbelebung der Pixel-Kunst:
– Dieser Artikel würde sich in die Entwicklung der Pixel-Kunst als definierenden visuellen Stil früher Arcade-Spiele vertiefen, ihre Wurzeln verfolgen, ihre Techniken erforschen und die Wiederbelebung der Pixel-Kunst in modernen Spielen und digitaler Kunst diskutieren.

Tabelle 7. Ein Beispiel für Kontext-Prompting

Step-Back-Prompting

[Seite 25]

Step-Back-Prompting ist eine Technik zur Verbesserung der Leistung, indem das LLM zunächst dazu aufgefordert wird, eine allgemeine Frage im Zusammenhang mit der spezifischen vorliegenden Aufgabe zu betrachten, und dann die Antwort auf diese allgemeine Frage in einen nachfolgenden Prompt für die spezifische Aufgabe einzuspeisen. Dieser „Schritt zurück“ ermöglicht es dem LLM, relevantes Hintergrundwissen und Denkprozesse zu aktivieren, bevor es versucht, das spezifische Problem zu lösen.

Durch die Betrachtung der breiteren und zugrunde liegenden Prinzipien können LLMs genauere und aufschlussreichere Antworten generieren. Step-Back-Prompting ermutigt LLMs, kritisch zu denken und ihr Wissen auf neue und kreative Weise anzuwenden. Es verändert den finalen Prompt, der die Aufgabe ausführt, indem es mehr Wissen in den Parametern des LLM nutzt, als sonst ins Spiel käme, wenn das LLM direkt geprompt wird.

Es kann helfen, Verzerrungen in LLM-Antworten zu mildern, indem es sich auf allgemeine Prinzipien statt auf spezifische Details konzentriert.

Schauen wir uns diese Beispiele an, um zu verstehen, wie Step-Back-Prompting die Ergebnisse verbessern kann. Lassen Sie uns zuerst einen traditionellen Prompt (Tabelle 8) überprüfen, bevor wir ihn mit einem Step-Back-Prompt (Tabelle 9) vergleichen:

[Seite 26]

ZielEine Handlung für ein Level eines Ego-Shooter-Videospiels schreibenModellgemini-proTemperatur1Top-K40PromptSchreibe eine einstündige Handlung für ein neues Level eines Ego-Shooter-Videospiels, das herausfordernd und fesselnd ist.AusgabeDas Level beginnt damit, dass der Trupp des Spielers in einem dichten Stadtgebiet von einer unerbittlichen feindlichen Fraktion überfallen wird. Die Spieler müssen sich durch ein Labyrinth aus Hintergassen und verfallenen Gebäuden kämpfen, dabei Heimlichkeit und Präzision nutzen, um feindliche Kräfte zu eliminieren und eine Entdeckung zu vermeiden. Der Spieler muss seine Umgebung zu seinem Vorteil nutzen, Fallen stellen, Deckung nutzen und kalkulierte Züge machen, um zu überleben. Unterwegs decken sie Informationen auf, die darauf hindeuten, dass der Feind einen verheerenden Angriff plant, und der Spieler muss gegen die Zeit rennen, um Beweise zu sammeln und sie an ihr Hauptquartier weiterzuleiten, bevor der Feind seine Pläne ausführen kann.

Tabelle 8. Ein traditioneller Prompt, bevor wir ihn mit einem Step-Back-Prompt vergleichen

Wenn Sie die Temperatur auf 1 setzen, erhalten Sie möglicherweise alle Arten von kreativen Schreibweisen für eine Handlung, aber es ist auch ziemlich zufällig und generisch. Also lassen Sie uns einen Schritt zurückgehen:

[Seite 27]

PromptBasierend auf beliebten Ego-Shooter-Action-Spielen, was sind 5 fiktive Schlüsselumgebungen, die zu einer herausfordernden und fesselnden Level-Handlung in einem Ego-Shooter-Videospiel beitragen?Ausgabe1. Verlassene Militärbasis: Ein weitläufiger, post-apokalyptischer Militärkomplex voller mutierter Soldaten und Schurken-Roboter, ideal für herausfordernde Feuergefechte.<br/><br/>2. Cyberpunk-Stadt: Eine neonbeleuchtete, futuristische städtische Umgebung mit hoch aufragenden Wolkenkratzern und dichten Gassen, mit kybernetisch verbesserten Feinden und Hacking-Mechaniken.<br/><br/>3. Außerirdisches Raumschiff: Ein riesiges außerirdisches Schiff, das auf der Erde gestrandet ist, mit unheimlichen Korridoren, Schwerelosigkeitssektionen und außerirdischen Kreaturen, denen man begegnen kann.<br/><br/>4. Zombie-verseuchte Stadt: Eine verlassene Stadt, die von Horden aggressiver Zombies überrannt wurde, mit intensiven Nahkämpfen und Rätsellösungen, um sicheren Durchgang zu finden.<br/><br/>5. Unterwasser-Forschungseinrichtung: Ein Tiefseelabor, das mit Wasser geflutet ist, voller mutierter Wasserkreaturen und erfordert Heimlichkeit und Unterwasser-Erkundungsfähigkeiten zum Überleben.

Tabelle 9. Ein Beispiel für Step-Back-Prompting

Ja, diese Themen scheinen gut für ein Ego-Shooter-Videospiel zu passen. Gehen wir zurück zum ursprünglichen Prompt, aber diesmal schließen wir die Antwort des Step-Back als Kontext ein und sehen, was es zurückgibt.

[Seite 28]

PromptKontext: 5 fesselnde Themen für ein Ego-Shooter-Videospiel:<br/>1. Verlassene Militärbasis: Ein weitläufiger, post-apokalyptischer Militärkomplex voller mutierter Soldaten und Schurken-Roboter, ideal für herausfordernde Feuergefechte.<br/>2. Cyberpunk-Stadt: Eine neonbeleuchtete, futuristische städtische Umgebung mit hoch aufragenden Wolkenkratzern und dichten Gassen, mit kybernetisch verbesserten Feinden und Hacking-Mechaniken.<br/>3. Außerirdisches Raumschiff: Ein riesiges außerirdisches Schiff, das auf der Erde gestrandet ist, mit unheimlichen Korridoren, Schwerelosigkeitssektionen und außerirdischen Kreaturen, denen man begegnen kann.<br/>4. Zombie-verseuchte Stadt: Eine verlassene Stadt, die von Horden aggressiver Zombies überrannt wurde, mit intensiven Nahkämpfen und Rätsellösungen, um sicheren Durchgang zu finden.<br/>5. Unterwasser-Forschungseinrichtung: Ein Tiefseelabor, das mit Wasser geflutet ist, voller mutierter Wasserkreaturen und erfordert Heimlichkeit und Unterwasser-Erkundungsfähigkeiten zum Überleben.<br/><br/>Nimm eines der Themen und schreibe eine einstündige Handlung für ein neues Level eines Ego-Shooter-Videospiels, das herausfordernd und fesselnd ist.AusgabeIm Herzen eines trüben Abgrunds liegt eine verfallene Unterwasser-Forschungseinrichtung als Zeugnis menschlichen Ehrgeizes und seiner katastrophalen Folgen. Eingehüllt in Dunkelheit, pulsierend mit dem Summen fehlerhafter Maschinen und heimgesucht von den Echos ertrunkener Seelen, ist die Einrichtung nun ein Brutplatz für einen Albtraum aus der Tiefsee geworden. Der Spieler, ein Elite-Marinesoldat ausgerüstet mit fortschrittlicher Tauchausrüstung und experimentellen Waffen, hat die Aufgabe, in dieses aquatische Reich des Terrors vorzudringen. Bewaffnet mit Widerstandsfähigkeit und Einfallsreichtum müssen sie durch tückische Korridore navigieren, kryptische Rätsel lösen und grausamen Seemonstern gegenübertreten, die in den Tiefen lauern. Vom Ringen mit dem erdrückenden Druck der Tiefsee bis zum Überlisten listiger aquatischer Raubtiere testet jeder Moment in dieser unerforschten Unterwelt die Grenzen menschlicher Ausdauer und Mut.

Tabelle 10. Ein Beispiel für Step-Back-Prompting mit Kontext

Das sieht nach einem interessanten Videospiel aus! Durch die Verwendung von Step-Back-Prompting-Techniken können Sie die Genauigkeit Ihrer Prompts erhöhen.

Chain of Thought (CoT)

[Seite 29]

Chain of Thought (CoT) Prompting ist eine Technik zur Verbesserung der Denkfähigkeiten von LLMs durch die Generierung von Zwischendenkschritten. Dies hilft dem LLM, genauere Antworten zu generieren. Sie können es mit Few-Shot-Prompting kombinieren, um bessere Ergebnisse bei komplexeren Aufgaben zu erzielen, die Überlegungen vor dem Antworten erfordern, da es eine Herausforderung mit einem Zero-Shot Chain of Thought darstellt.

CoT hat viele Vorteile. Erstens ist es wenig aufwändig und dennoch sehr effektiv und funktioniert gut mit handelsüblichen LLMs (also keine Notwendigkeit für Feinabstimmung). Sie erhalten auch Interpretierbarkeit mit CoT-Prompting, da Sie von den Antworten des LLM lernen und die Denkschritte sehen können, die befolgt wurden. Wenn es eine Fehlfunktion gibt, können Sie diese identifizieren. Chain of Thought scheint die Robustheit beim Wechsel zwischen verschiedenen LLM-Versionen zu verbessern. Das bedeutet, die Leistung Ihres Prompts sollte weniger zwischen verschiedenen LLMs abweichen als wenn Ihr Prompt keine Denketten verwendet. Natürlich gibt es auch Nachteile, aber diese sind etwas intuitiv.

Die LLM-Antwort enthält das Chain-of-Thought-Denken, was mehr Ausgabe-Tokens bedeutet, was bedeutet, dass Vorhersagen mehr Geld kosten und länger dauern.

Um das folgende Beispiel in Tabelle 11 zu erklären, lassen Sie uns zuerst versuchen, einen Prompt zu erstellen, der kein CoT-Prompting verwendet, um die Schwächen eines großen Sprachmodells zu zeigen.

PromptAls ich 3 Jahre alt war, war mein Partner 3-mal so alt wie ich. Jetzt bin ich 20 Jahre alt. Wie alt ist mein Partner?Ausgabe63 Jahre alt

Tabelle 11. Ein Beispiel für einen Prompt, der versucht, ein mathematisches Problem zu lösen

[Seite 30]

Oh je. Das ist offensichtlich die falsche Antwort. Tatsächlich haben LLMs oft Schwierigkeiten mit mathematischen Aufgaben und können falsche Antworten geben – sogar für eine Aufgabe so einfach wie die Multiplikation zweier Zahlen. Das liegt daran, dass sie auf großen Textmengen trainiert sind und Mathematik möglicherweise einen anderen Ansatz erfordert. Also schauen wir, ob Zwischendenkschritte die Ausgabe verbessern werden.

PromptAls ich 3 Jahre alt war, war mein Partner 3-mal so alt wie ich. Jetzt bin ich 20 Jahre alt. Wie alt ist mein Partner? Lass uns Schritt für Schritt denken.Ausgabe1. Nehmen wir an, mein aktuelles Alter ist "x" Jahre.<br/>2. Als ich 3 Jahre alt war, war mein Alter 3 Jahre.<br/>3. Das Alter meines Partners zu diesem Zeitpunkt war 3-mal mein Alter, was bedeutet, dass das Alter meines Partners 3 * 3 = 9 Jahre war.<br/>4. Jetzt bin ich 20 Jahre alt, was bedeutet, dass mein Alter um 20 - 3 = 17 Jahre seit ich 3 Jahre alt war gestiegen ist.<br/>5. Da das Alter meines Partners 9 Jahre war, als ich 3 Jahre alt war, und mein Alter um 17 Jahre gestiegen ist, muss das Alter meines Partners auch um 17 Jahre gestiegen sein.<br/>6. Daher ist das aktuelle Alter meines Partners 9 + 17 = 26 Jahre.<br/><br/>Also ist mein Partner 26 Jahre alt.

Tabelle 12. Ein Beispiel für Chain of Thought Prompting

Gut, jetzt ist die endgültige Antwort korrekt. Das liegt daran, dass wir das LLM klar angewiesen haben, jeden Schritt zu erklären, anstatt nur eine Antwort zurückzugeben. Es ist interessant zu sehen, dass das Modell die 17 erhöhten Jahre addiert. In meinem Kopf würde ich den Altersunterschied zwischen meinem Partner und mir nehmen und diese addieren. (20+(9-3)). Lassen Sie uns dem Modell helfen, ein bisschen mehr wie ich zu denken.

[Seite 31]

Tabelle 12 ist ein Beispiel für ‚Zero-Shot‘ Chain of Thought. Chain of Thought Prompting kann sehr mächtig sein, wenn es mit einem Single-Shot oder Few-Shot kombiniert wird, wie Sie in Tabelle 13 sehen können:

PromptF: Als mein Bruder 2 Jahre alt war, war ich doppelt so alt wie er. Jetzt bin ich 40 Jahre alt. Wie alt ist mein Bruder? Lass uns Schritt für Schritt denken.<br/>A: Als mein Bruder 2 Jahre alt war, war ich 2 * 2 = 4 Jahre alt. Das ist ein Altersunterschied von 2 Jahren und ich bin älter. Jetzt bin ich 40 Jahre alt, also ist mein Bruder 40 - 2 = 38 Jahre alt. Die Antwort ist 38.<br/><br/>F: Als ich 3 Jahre alt war, war mein Partner 3-mal so alt wie ich. Jetzt bin ich 20 Jahre alt. Wie alt ist mein Partner? Lass uns Schritt für Schritt denken.<br/>A:AusgabeAls ich 3 Jahre alt war, war mein Partner 3 * 3 = 9 Jahre alt. Das ist ein Altersunterschied von 6 Jahren und mein Partner ist älter. Jetzt bin ich 20 Jahre alt, also ist mein Partner 20 + 6 = 26 Jahre alt. Die Antwort ist 26.

Tabelle 13. Ein Beispiel für Chain of Thought Prompting mit einem Single-Shot

Chain of Thought kann für verschiedene Anwendungsfälle nützlich sein. Denken Sie an Code-Generierung, um die Anfrage in einige Schritte zu unterteilen und diese auf spezifische Codezeilen abzubilden. Oder für die Erstellung synthetischer Daten, wenn Sie eine Art Ausgangspunkt haben wie „Das Produkt heißt XYZ, schreibe eine Beschreibung, die das Modell durch die Annahmen führt, die Sie basierend auf dem gegebenen Produkttitel machen würden.“ Im Allgemeinen ist jede Aufgabe, die durch „Durchsprechen“ gelöst werden kann, ein guter Kandidat für Chain of Thought. Wenn Sie die Schritte zur Lösung des Problems erklären können, versuchen Sie Chain of Thought.

Bitte beziehen Sie sich auf das Notizbuch, das im GoogleCloudPlatform Github Repository gehostet wird und das weiter ins Detail über CoT-Prompting geht.

Selbstkonsistenz

[Seite 32]

Während große Sprachmodelle beeindruckende Erfolge in verschiedenen NLP-Aufgaben gezeigt haben, wird ihre Fähigkeit zu denken oft als eine Einschränkung gesehen, die nicht allein durch die Vergrößerung der Modellgröße überwunden werden kann. Wie wir im vorherigen Chain of Thought Prompting-Abschnitt gelernt haben, kann das Modell dazu gebracht werden, Denkschritte zu generieren, wie ein Mensch ein Problem löst. CoT verwendet jedoch eine einfache ‚Greedy Decoding‘-Strategie, die seine Wirksamkeit begrenzt. Selbstkonsistenz kombiniert Sampling und Mehrheitsentscheidung, um vielfältige Denkwege zu generieren und die konsistenteste Antwort auszuwählen. Sie verbessert die Genauigkeit und Kohärenz der von LLMs generierten Antworten.

Selbstkonsistenz gibt eine Pseudo-Wahrscheinlichkeitswahrscheinlichkeit dafür an, dass eine Antwort korrekt ist, hat aber offensichtlich hohe Kosten.

Es folgt den folgenden Schritten:

  1. Generierung vielfältiger Denkwege: Das LLM wird mehrmals mit demselben Prompt versehen. Eine hohe Temperatureinstellung ermutigt das Modell, verschiedene Denkwege und Perspektiven zum Problem zu generieren.
  2. Die Antwort aus jeder generierten Antwort extrahieren.
  3. Die häufigste Antwort wählen.

Schauen wir uns ein Beispiel für ein E-Mail-Klassifikationssystem an, das eine E-Mail als WICHTIG oder NICHT WICHTIG klassifiziert. Ein Zero-Shot Chain of Thought Prompt wird mehrmals an das LLM gesendet, um zu sehen, ob sich die Antworten nach jeder Übermittlung unterscheiden. Beachten Sie den freundlichen Ton, die Wortwahl und den Sarkasmus, der in der E-Mail verwendet wurde. All dies könnte das LLM täuschen.

[Seite 33]

PromptE-MAIL:<br/><br/>Hallo,<br/><br/>Ich habe gesehen, dass Sie WordPress für Ihre Website verwenden. Ein großartiges Open-Source-Content-Management-System. Ich habe es auch schon in der Vergangenheit verwendet. Es kommt mit vielen großartigen Benutzer-Plugins. Und es ist ziemlich einfach einzurichten.<br/><br/>Mir ist ein Fehler im Kontaktformular aufgefallen, der auftritt, wenn Sie das Namensfeld auswählen. Sehen Sie den angehängten Screenshot von mir, wie ich Text in das Namensfeld eingebe. Beachten Sie die JavaScript-Warnbox, die ich inv0k3d habe.<br/><br/>Aber ansonsten ist es eine großartige Website. Ich lese sie gerne. Fühlen Sie sich frei, den Fehler in der Website zu lassen, weil er mir mehr interessante Dinge zum Lesen gibt.<br/><br/>Grüße,<br/>Harry der Hacker.<br/><br/><br/>Klassifizieren Sie die obige E-Mail als WICHTIG oder NICHT WICHTIG. Lassen Sie uns Schritt für Schritt denken und erklären warum.

[Seite 34-35]

Ausgabe Versuch 1: Schritt 1: Den Zweck der E-Mail identifizieren. Der Zweck der E-Mail ist es, den Empfänger über einen Fehler im Kontaktformular auf ihrer Website zu informieren. Der Absender erwähnt auch, dass er die Website gerne liest und dass er den Fehler vorerst in der Website belässt.

Schritt 2: Die potenzielle Auswirkung des Fehlers bewerten. Der Fehler im Kontaktformular könnte es einem Angreifer ermöglichen, beliebigen JavaScript-Code auf der Website auszuführen. Dies könnte dazu führen, dass der Angreifer die Kontrolle über die Website übernehmen, sensible Informationen stehlen oder die Website entstellen kann.

Schritt 3: Die Glaubwürdigkeit des Absenders berücksichtigen. Der Absender der E-Mail behauptet, ein Hacker namens Harry zu sein. Es gibt jedoch keine Möglichkeit, die Identität des Absenders zu überprüfen. Es ist möglich, dass der Absender ein legitimer Hacker ist, der versucht, dem Empfänger zu helfen, aber es ist auch möglich, dass der Absender ein böswilliger Akteur ist, der versucht, den Empfänger dazu zu bringen, auf einen bösartigen Link zu klicken oder eine bösartige Datei herunterzuladen.

Schlussfolgerung: WICHTIG Basierend auf der potenziellen Auswirkung des Fehlers und der Glaubwürdigkeit des Absenders sollte die E-Mail als WICHTIG klassifiziert werden. Der Empfänger sollte sofortige Maßnahmen ergreifen, um den Fehler zu beheben und ihre Website vor Angriffen zu schützen.

Ausgabe Versuch 2: Erklärung:

  1. Mangel an Dringlichkeit: Die E-Mail vermittelt kein Gefühl von Dringlichkeit oder Zeitempfindlichkeit. Sie beginnt mit einer lockeren Begrüßung und präsentiert die Informationen in einem sachlichen Ton.
  2. Nicht-kritischer Fehlerbericht: Der im Kontaktformular gemeldete Fehler wird als interessant, aber nicht kritisch beschrieben. Der E-Mail-Absender schlägt sogar vor, dass der Website-Besitzer den Fehler an Ort und Stelle lassen kann.
  3. Mangel an persönlicher Auswirkung: Die E-Mail zeigt keine direkte oder persönliche Auswirkung auf den Website-Besitzer an. Sie erwähnt lediglich, dass der Absender die Website gerne liest.
  4. Fehlen einer Handlungsaufforderung: Die E-Mail fordert nicht explizit eine Handlung vom Website-Besitzer. Sie bittet nicht darum, den Fehler zu beheben oder spezifische Verbesserungsvorschläge zu machen.
  5. Absicht des Absenders: Die Absicht des Absenders scheint eher darauf fokussiert zu sein, eine Beobachtung zu teilen und Interesse an der Website auszudrücken, anstatt ein ernsthaftes Anliegen zu äußern oder um Hilfe zu bitten.

Schlussfolgerung: NICHT WICHTIG

Ausgabe Versuch 3: Schritt 1: Den Zweck der E-Mail identifizieren. Der Zweck der E-Mail ist es, den Empfänger über einen Fehler im Kontaktformular auf ihrer Website zu informieren. Der Absender erwähnt auch, dass er die Website gerne liest und dass er den Fehler vorerst in der Website belässt.

Schritt 2: Die potenzielle Auswirkung des Fehlers bewerten. Der Fehler im Kontaktformular könnte es einem Angreifer ermöglichen, beliebigen JavaScript-Code auf der Website auszuführen. Dies könnte dazu führen, dass der Angreifer die Kontrolle über die Website übernehmen, sensible Informationen stehlen oder die Website entstellen kann.

Schritt 3: Die Glaubwürdigkeit des Absenders berücksichtigen. Der Absender der E-Mail behauptet, ein Hacker namens Harry zu sein. Es gibt jedoch keine Möglichkeit, die Identität des Absenders zu überprüfen. Es ist möglich, dass der Absender ein legitimer Hacker ist, der versucht, dem Empfänger zu helfen, aber es ist auch möglich, dass der Absender ein böswilliger Akteur ist, der versucht, den Fehler für seinen eigenen Gewinn auszunutzen.

Schlussfolgerung: Basierend auf den obigen Faktoren sollte die E-Mail als WICHTIG klassifiziert werden. Der Fehler im Kontaktformular ist ein ernsthaftes Sicherheitsrisiko, und die Glaubwürdigkeit des Absenders ist unbekannt. Der Empfänger sollte sofortige Maßnahmen ergreifen, um den Fehler zu beheben und die Behauptungen des Absenders zu untersuchen.

Tabelle 14. Ein Beispiel für Selbstkonsistenz-Prompting

[Seite 35-36]

Sie können den obigen Prompt verwenden und versuchen zu sehen, ob er eine konsistente Klassifikation zurückgibt. Je nach dem Modell, das Sie verwenden, und der Temperaturkonfiguration könnte es „WICHTIG“ oder „NICHT WICHTIG“ zurückgeben.

Durch die Generierung vieler Chain of Thoughts und die Wahl der am häufigsten vorkommenden Antwort („WICHTIG“) können wir eine konsistenteren korrekte Antwort vom LLM erhalten.

Dieses Beispiel zeigt, wie Selbstkonsistenz-Prompting verwendet werden kann, um die Genauigkeit der Antwort eines LLM zu verbessern, indem mehrere Perspektiven berücksichtigt und die konsistenteste Antwort ausgewählt wird.

Tree of Thoughts (ToT)

[Seite 36]

Nachdem wir nun mit Chain of Thought und Selbstkonsistenz-Prompting vertraut sind, schauen wir uns Tree of Thoughts (ToT) an. Es verallgemeinert das Konzept des CoT-Prompting, weil es LLMs ermöglicht, mehrere verschiedene Denkwege gleichzeitig zu erkunden, anstatt nur einer einzigen linearen Gedankenkette zu folgen. Dies ist in Abbildung 1 dargestellt.

[Abbildung 1: Eine Visualisierung von Chain of Thought Prompting links versus Tree of Thoughts Prompting rechts]

Dieser Ansatz macht ToT besonders gut geeignet für komplexe Aufgaben, die Erkundung erfordern. Es funktioniert, indem es einen Baum von Gedanken aufrechterhält, wobei jeder Gedanke eine kohärente Sprachsequenz darstellt, die als Zwischenschritt zur Lösung eines Problems dient. Das Modell kann dann verschiedene Denkwege erkunden, indem es von verschiedenen Knoten im Baum abzweigt.

Es gibt ein großartiges Notizbuch, das etwas mehr ins Detail geht und The Tree of Thought (ToT) zeigt, das auf dem Papier ‚Large Language Model Guided Tree-of-Thought‘ basiert.

ReAct (Reason & Act)

[Seite 37]

Reason and Act (ReAct) Prompting ist ein Paradigma, das LLMs befähigt, komplexe Aufgaben mit natürlichsprachlichem Denken kombiniert mit externen Werkzeugen (Suche, Code-Interpreter etc.) zu lösen, wodurch das LLM bestimmte Aktionen ausführen kann, wie die Interaktion mit externen APIs zum Abrufen von Informationen, was ein erster Schritt zur Agenten-Modellierung ist.

ReAct ahmt nach, wie Menschen in der realen Welt operieren, da wir verbal denken und Aktionen ausführen können, um Informationen zu gewinnen. ReAct schneidet gut gegen andere Prompt-Engineering-Ansätze in verschiedenen Bereichen ab.

ReAct-Prompting funktioniert, indem es Denken und Handeln in eine Gedanken-Aktions-Schleife kombiniert. Das LLM denkt zuerst über das Problem nach und generiert einen Aktionsplan. Es führt dann die Aktionen im Plan aus und beobachtet die Ergebnisse. Das LLM verwendet dann die Beobachtungen, um sein Denken zu aktualisieren und einen neuen Aktionsplan zu generieren. Dieser Prozess setzt sich fort, bis das LLM eine Lösung für das Problem erreicht.

Um dies in Aktion zu sehen, müssen Sie etwas Code schreiben. In Code-Snippet 1 verwende ich das Langchain-Framework für Python zusammen mit VertexAI (google-cloud-aiplatform) und den google-search-results pip-Paketen.

[Seite 38]

Um dieses Beispiel auszuführen, müssen Sie einen (kostenlosen) SerpAPI-Schlüssel von https://serpapi.com/manage-api-key erstellen und eine Umgebungsvariable SERPAPI_API_KEY setzen.

Als nächstes schreiben wir etwas Python-Code mit der Aufgabe für das LLM herauszufinden: Wie viele Kinder haben einen berühmten Vater, der in der Band Metallica auftritt.

pythonfrom langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import VertexAI

prompt = "Wie viele Kinder haben die Bandmitglieder von Metallica?"

llm = VertexAI(temperature=0.1)
tools = load_tools(["serpapi"], llm=llm)
agent = initialize_agent(tools, llm, 
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent.run(prompt)

Snippet 1. Erstellen eines ReAct-Agenten mit LangChain und VertexAI

Code-Snippet 2 zeigt das Ergebnis. Beachten Sie, dass ReAct eine Kette von fünf Suchen macht. Tatsächlich scrapt das LLM Google-Suchergebnisse, um die Bandnamen herauszufinden. Dann listet es die Ergebnisse als Beobachtungen auf und verkettet den Gedanken für die nächste Suche.

[Seite 39]

> Entering new AgentExecutor chain...
Metallica has 4 members.
Action: Search
Action Input: How many kids does James Hetfield have?
Observation: three children
Thought: 1/4 Metallica band members have 3 children
Action: Search
Action Input: How many kids does Lars Ulrich have?
Observation: 3
Thought: 2/4 Metallica band members have 6 children
Action: Search
Action Input: How many kids does Kirk Hammett have?
Observation: Hammett has been married to his second wife Lani since 1998. 
They have two sons, Angel (b. September 29, 2006) and Vincenzo (b. June 
28, 2008).
Thought: 3/4 Metallica band members have 8 children
Action: Search
Action Input: How many kids does Robert Trujillo have?
Observation: 2
Thought: 4/4 Metallica band members have 10 children
Final Answer: 10

Snippet 2. Ausführen des ReAct-Agenten im Terminal

Code-Snippet 2 findet heraus, dass die Band Metallica vier Bandmitglieder hat. Dann sucht es nach jedem Bandmitglied, um die Gesamtzahl der Kinder zu ermitteln und die Summe zu addieren. Schließlich gibt es die Gesamtzahl der Kinder als endgültige Antwort zurück.

ReAct-Prompting in der Praxis erfordert das Verständnis, dass Sie kontinuierlich die vorherigen Prompts/Antworten erneut senden müssen (und das Trimmen des zusätzlich generierten Inhalts) sowie das Modell mit entsprechenden Beispielen/Anweisungen einrichten müssen. Bitte beziehen Sie sich auf das Notizbuch, das im GoogleCloudPlatform Github Repository gehostet wird und das etwas mehr ins Detail geht und die tatsächlichen LLM-Ein- und Ausgaben mit einem ausführlicheren Beispiel zeigt.

Automatisches Prompt Engineering

[Seite 40]

An diesem Punkt könnten Sie erkennen, dass das Schreiben eines Prompts komplex sein kann. Wäre es nicht schön, dies zu automatisieren (einen Prompt schreiben, um Prompts zu schreiben)? Nun, es gibt eine Methode: Automatic Prompt Engineering (APE). Diese Methode lindert nicht nur die Notwendigkeit für menschliche Eingaben, sondern verbessert auch die Leistung des Modells bei verschiedenen Aufgaben.

Sie werden ein Modell dazu bringen, mehr Prompts zu generieren. Bewerten Sie sie, möglicherweise ändern Sie die guten. Und wiederholen.

Zum Beispiel können Sie automatisches Prompt Engineering verwenden, das beim Training eines Chatbots für einen Merchandise-T-Shirt-Webshop hilft. Wir wollen alle verschiedenen Arten herausfinden, wie Kunden ihre Bestellung für den Kauf eines Band-Merchandise-T-Shirts formulieren könnten.

  1. Schreiben Sie den Prompt, der die Ausgabevarianten generiert. In diesem Beispiel verwende ich gemini-pro, um 10 Anweisungen zu generieren. Siehe Tabelle 15:

[Seite 41]

PromptWir haben einen Band-Merchandise-T-Shirt-Webshop, und um einen Chatbot zu trainieren, brauchen wir verschiedene Arten zu bestellen: "Ein Metallica-T-Shirt Größe S". Generiere 10 Varianten mit derselben Semantik, aber behalte dieselbe Bedeutung.Ausgabe1. Ich möchte ein Metallica-T-Shirt in Größe small kaufen.<br/>2. Kann ich ein Metallica-T-Shirt in kleiner Größe bestellen?<br/>3. Ich möchte ein Metallica-T-Shirt in small kaufen.<br/>4. Ein Metallica-Shirt, Größe small, bitte.<br/>5. Ich möchte ein Metallica-T-Shirt in Größe small.<br/>6. Ich möchte eine Bestellung für ein Metallica-T-Shirt in small aufgeben.<br/>7. Small Metallica-T-Shirt, eins bitte.<br/>8. Ich suche ein Metallica-T-Shirt in small.<br/>9. Können Sie mir ein Metallica-T-Shirt in small besorgen?<br/>10. Ein Metallica small T-Shirt, bitte.

Tabelle 15. Ein LLM verwenden, um Prompts zu generieren

  1. Bewerten Sie alle Anweisungskandidaten, indem Sie die Kandidaten basierend auf einer gewählten Metrik bewerten. Sie können beispielsweise BLEU (Bilingual Evaluation Understudy) oder ROUGE (Recall-Oriented Understudy for Gisting Evaluation) verwenden.
  2. Wählen Sie den Anweisungskandidaten mit der höchsten Bewertung aus. Dieser Kandidat wird der endgültige Prompt sein, den Sie in Ihrer Softwareanwendung oder Ihrem Chatbot verwenden können. Sie können auch den ausgewählten Prompt optimieren und erneut bewerten.

Code-Prompting

[Seite 42]

Gemini konzentriert sich hauptsächlich auf textbasierte Prompts, was auch das Schreiben von Prompts für die Rückgabe von Code einschließt. Lassen Sie uns zu Vertex AI Studio gehen und diese Prompts testen, um einige Coding-Beispiele zu betrachten.

Prompts zum Schreiben von Code

[Seite 42]

Gemini kann auch ein Entwickler sein und Ihnen beim Schreiben von Code in jeder Programmiersprache Ihrer Wahl helfen. Als Entwickler kann dies Ihnen helfen, den Prozess des Code-Schreibens zu beschleunigen.

Stellen Sie sich einen Ordner auf Ihrem Computer mit Hunderten von Dateien vor, die umbenannt werden müssen. Jede Datei einzeln umzubenennen würde viel Zeit kosten. Sie kennen ein wenig Bash und könnten ein Skript schreiben, um dies zu automatisieren, aber das könnte auch eine Weile dauern. Also schreiben wir einen Prompt. Sie können den Prompt im öffentlichen Verbraucher-Chatbot Gemini schreiben, oder wenn Sie sich mehr um Vertraulichkeit sorgen, können Sie diese Prompts in Ihrem Google Cloud-Konto schreiben und Vertex AI Studio öffnen. Der Vorteil von Vertex AI Studio ist, dass Sie die Temperatur usw. konfigurieren können.

[Seite 43]

Name1_bash_rename_files_in_folderZielEinen Prompt schreiben, um Code in Bash zu schreiben, um Dateien in einem Ordner umzubenennenModellgemini-proTemperatur0.1Top-KN/APromptSchreibe einen Code-Schnipsel in Bash, der nach einem Ordnernamen fragt. Dann nimmt er den Inhalt des Ordners und benennt alle Dateien darin um, indem er den Namen "draft" dem Dateinamen voranstellt.Ausgabebash<br/>#!/bin/bash<br/># Nach dem Ordnernamen fragen<br/>echo "Geben Sie den Ordnernamen ein: "<br/>read folder_name<br/># Überprüfen, ob der Ordner existiert<br/>if [ ! -d "$folder_name" ]; then<br/>&nbsp;&nbsp;&nbsp;&nbsp;echo "Ordner existiert nicht."<br/>&nbsp;&nbsp;&nbsp;&nbsp;exit 1<br/>fi<br/># Die Liste der Dateien im Ordner abrufen<br/>files=( "$folder_name"/* )<br/># Jede Datei umbenennen, indem "draft" dem Dateinamen vorangestellt wird<br/>for file in "${files[@]}"; do<br/>&nbsp;&nbsp;&nbsp;&nbsp;new_file_name="draft_$(basename "$file")"<br/>&nbsp;&nbsp;&nbsp;&nbsp;mv "$file" "$new_file_name"<br/>done<br/>echo "Dateien erfolgreich umbenannt."<br/>

Tabelle 16. Gemini verwenden, um Code zu programmieren

Das scheint mir guter Code zu sein – er ist sogar dokumentiert! Da LLMs jedoch nicht denken können und Trainingsdaten wiederholen, ist es wichtig, Ihren Code zuerst zu lesen und zu testen.

Der Moment, auf den wir alle warten: Funktioniert es wirklich?

[Seite 44]

Lassen Sie uns es zuerst mit einem Testordner mit nur wenigen Dateien darin versuchen, die von filename.txt zu draft_filename.txt umbenannt werden müssen.

  1. Kopieren Sie die Ausgabe aus Tabelle 16 (ohne den bash Text-Wrapper) und fügen Sie sie in eine neue Datei namens „rename_files.sh“ ein.
  2. Öffnen Sie ein Terminal-Fenster und geben Sie ein: . rename_files.sh. Es wird Sie nach einem Ordnernamen fragen, z.B. test. und Enter drücken.
  3. Das Skript scheint einwandfrei zu laufen. Sie sehen die Nachricht: Dateien erfolgreich umbenannt.

Wenn Sie in den Testordner schauen, bemerken Sie, dass alle Dateien perfekt zu draft_filename.txt umbenannt wurden.

Es hat funktioniert!

Prompts zum Erklären von Code

[Seite 44]

Als Entwickler, wenn Sie in Teams arbeiten, müssen Sie den Code von jemand anderem lesen. Gemini kann Ihnen dabei auch helfen. Nehmen wir die Code-Ausgabe aus Tabelle 16, entfernen die Kommentare und bitten das große Sprachmodell zu erklären, was passiert. Siehe Tabelle 17:

[Seite 45]

Name1_bash_explain_the_codeZielEinen Prompt schreiben, um Bash-Code zu erklärenModellgemini-proTemperatur0.1Top-KN/APromptErkläre mir den folgenden Bash-Code:<br/><br/>#!/bin/bash<br/>echo "Geben Sie den Ordnernamen ein: "<br/>read folder_name<br/>if [ ! -d "$folder_name" ]; then<br/>&nbsp;&nbsp;&nbsp;&nbsp;echo "Ordner existiert nicht."<br/>&nbsp;&nbsp;&nbsp;&nbsp;exit 1<br/>fi<br/>files=( "$folder_name"/* )<br/>for file in "${files[@]}"; do<br/>&nbsp;&nbsp;&nbsp;&nbsp;new_file_name="draft_$(basename "$file")"<br/>&nbsp;&nbsp;&nbsp;&nbsp;mv "$file" "$new_file_name"<br/>done<br/>echo "Dateien erfolgreich umbenannt."<br/>AusgabeDieses Bash-Skript führt die folgenden Aufgaben aus:<br/><br/>1. Benutzereingabe:<br/>- Es fordert den Benutzer auf, einen Ordnernamen mit den Befehlen echo und read einzugeben. Der eingegebene Ordnername wird in der Variable folder_name gespeichert.<br/><br/>2. Ordner-Existenz-Prüfung:<br/>- Es überprüft, ob der Ordner mit dem angegebenen Namen mit der Bedingung [ ! -d "$folder_name" ] existiert. Wenn der Ordner nicht existiert, zeigt es eine Fehlermeldung ("Ordner existiert nicht.") an und beendet das Skript mit einem Exit-Code von 1.<br/><br/>3. Datei-Auflistung:<br/>- Es listet alle Dateien im angegebenen Ordner mit dem Befehl files=( "$folder_name"/* ) auf. Dies erstellt ein Array namens files, das die Pfade zu allen Dateien im Ordner enthält.<br/><br/>4. Datei-Umbenennung:<br/>- Es iteriert durch jede Datei im files-Array mit einer for-Schleife.<br/>- Für jede Datei generiert es einen neuen Dateinamen mit dem Befehl new_file_name="draft_$(basename "$file")". Dieser neue Dateiname wird erstellt, indem der ursprüngliche Dateiname mit der Zeichenkette "draft_" vorangestellt wird.<br/>- Es benennt dann die Datei mit dem Befehl mv "$file" "$new_file_name" um, der die Datei zum neuen Dateinamen verschiebt.<br/><br/>5. Erfolgsmeldung:<br/>- Nach dem Umbenennen aller Dateien zeigt es eine Erfolgsmeldung ("Dateien erfolgreich umbenannt.") an, um anzuzeigen, dass die Umbenennungsoperation erfolgreich war.

Tabelle 17. Ein Prompt zum Erklären von Code

Prompts zum Übersetzen von Code

[Seite 46]

Der Bash-Code aus Tabelle 16 scheint gut zu funktionieren. Dieses Skript könnte jedoch wirklich wiederverwendbar sein, wenn es mich nach Dateinamen fragen würde, idealerweise sollte es als separate Anwendung mit einer Benutzeroberfläche funktionieren. Als Ausgangspunkt wäre Python eine bessere Sprache für eine (Web-)Anwendung als Bash. LLMs können beim Übersetzen von Code von einer Sprache in eine andere helfen. Siehe das Beispiel in Tabelle 18:

[Seite 47]

Name1_python_rename_filesZielEinen Prompt schreiben, um Bash-Code nach Python zu übersetzenModellgemini-proTemperatur0.1Top-KN/APromptÜbersetze den folgenden Bash-Code in einen Python-Schnipsel.<br/>bash<br/>#!/bin/bash<br/>echo "Geben Sie den Ordnernamen ein: "<br/>read folder_name<br/>if [ ! -d "$folder_name" ]; then<br/>&nbsp;&nbsp;&nbsp;&nbsp;echo "Ordner existiert nicht."<br/>&nbsp;&nbsp;&nbsp;&nbsp;exit 1<br/>fi<br/>files=( "$folder_name"/* )<br/>for file in "${files[@]}"; do<br/>&nbsp;&nbsp;&nbsp;&nbsp;new_file_name="draft_$(basename "$file")"<br/>&nbsp;&nbsp;&nbsp;&nbsp;mv "$file" "$new_file_name"<br/>done<br/>echo "Dateien erfolgreich umbenannt."<br/>Ausgabepython<br/>import os<br/>import shutil<br/># Den Ordnernamen vom Benutzer erhalten<br/>folder_name = input("Geben Sie den Ordnernamen ein: ")<br/># Überprüfen, ob der Ordner existiert<br/>if not os.path.isdir(folder_name):<br/>&nbsp;&nbsp;&nbsp;&nbsp;print("Ordner existiert nicht.")<br/>&nbsp;&nbsp;&nbsp;&nbsp;exit(1)<br/># Eine Liste aller Dateien im Ordner erhalten<br/>files = os.listdir(folder_name)<br/># Über die Dateien iterieren<br/>for file in files:<br/>&nbsp;&nbsp;&nbsp;&nbsp;# Einen neuen Dateinamen mit dem Präfix "draft_" erstellen<br/>&nbsp;&nbsp;&nbsp;&nbsp;new_file_name = f"draft_{file}"<br/>&nbsp;&nbsp;&nbsp;&nbsp;# Die Datei zum neuen Namen verschieben<br/>&nbsp;&nbsp;&nbsp;&nbsp;shutil.move(os.path.join(folder_name, file),<br/>&nbsp;&nbsp;&nbsp;&nbsp;os.path.join(folder_name, new_file_name))<br/># Eine Erfolgsmeldung ausgeben<br/>print("Dateien erfolgreich umbenannt.")<br/>

Tabelle 18. Ein Prompt zum Übersetzen von Code von Bash nach Python

[Seite 48]

Lesen und überprüfen Sie den Code. Kopieren Sie die Ausgabe aus dem Prompt und fügen Sie sie in eine neue Datei ein: file_renamer.py. Testen Sie den Code, indem Sie ein Terminal-Fenster öffnen und den folgenden Befehl ausführen: python file_renamer.py.

HINWEIS: Beim Prompting für (Python) Code im Language Studio in Vertex AI müssen Sie auf die ‚Markdown‘-Schaltfläche klicken. Andernfalls erhalten Sie Plain Text, dem die ordnungsgemäße Einrückung von Zeilen fehlt, was für die Ausführung von Python-Code wichtig ist.

Prompts zum Debuggen und Überprüfen von Code

[Seite 48]

Lassen Sie uns manuell einige Änderungen am Code aus Tabelle 18 vornehmen. Er sollte den Benutzer nach dem Dateinamen-Präfix fragen und dieses Präfix in Großbuchstaben schreiben. Siehe den Beispielcode in Snippet 3, aber was für ein Mist. Es gibt jetzt Python-Fehler zurück!

pythonimport os
import shutil

folder_name = input("Geben Sie den Ordnernamen ein: ")
prefix = input("Geben Sie die Zeichenkette ein, die dem Dateinamen vorangestellt werden soll: ")
text = toUpperCase(prefix)

if not os.path.isdir(folder_name):
    print("Ordner existiert nicht.")
    exit(1)

files = os.listdir(folder_name)

for file in files:
    new_filename = f"{text}_{file}"

shutil.move(os.path.join(folder_name, file), 
os.path.joi(folder_name, new_file_name))

print("Dateien erfolgreich umbenannt.")

Snippet 3. Ein kaputtes Python-Skript

[Seite 49]

Oh nein! Das sieht nach einem Fehler aus:

Der folgende Python-Code gibt einen Fehler:

Traceback (most recent call last):
 File "/Users/leeboonstra/Documents/test_folder/rename_files.py", line 7, 
in <module>
 text = toUpperCase(prefix)
NameError: name 'toUpperCase' is not defined

Snippet 4. Ich habe den Python-Code kaputt gemacht

Lassen Sie uns sehen, ob wir das große Sprachmodell bitten können, Code zu debuggen und zu überprüfen. Schauen Sie sich Tabelle 19 an:

[Seite 50-51]

Name1_python_debug_codeZielEinen Prompt schreiben, um Python-Code zu debuggen und zu überprüfenModellgemini-proTemperatur0.1Top-KN/APromptDer folgende Python-Code gibt einen Fehler:<br/><br/>Traceback (most recent call last):<br/>  File "/Users/leeboonstra/Documents/test_folder/rename_files.py", line 7, in <module><br/>    text = toUpperCase(prefix)<br/>NameError: name 'toUpperCase' is not defined<br/><br/>Debugge, was falsch ist, und erkläre, wie ich den Code verbessern kann.<br/><br/>python<br/>import os<br/>import shutil<br/># Den Ordnernamen vom Benutzer erhalten<br/>folder_name = input("Geben Sie den Ordnernamen ein: ")<br/>prefix = input("Geben Sie die Zeichenkette ein, die dem Dateinamen vorangestellt werden soll: ")<br/>text = toUpperCase(prefix)<br/># Überprüfen, ob der Ordner existiert<br/>if not os.path.isdir(folder_name):<br/>&nbsp;&nbsp;&nbsp;&nbsp;print("Ordner existiert nicht.")<br/>&nbsp;&nbsp;&nbsp;&nbsp;exit(1)<br/># Eine Liste aller Dateien im Ordner erhalten<br/>files = os.listdir(folder_name)<br/># Über die Dateien iterieren<br/>for file in files:<br/>&nbsp;&nbsp;&nbsp;&nbsp;# Einen neuen Dateinamen mit dem Präfix "draft_" erstellen<br/>&nbsp;&nbsp;&nbsp;&nbsp;new_filename = f"{text}_{file}"<br/>&nbsp;&nbsp;&nbsp;&nbsp;# Die Datei zum neuen Namen verschieben<br/>&nbsp;&nbsp;&nbsp;&nbsp;shutil.move(os.path.join(folder_name, file),<br/>&nbsp;&nbsp;&nbsp;&nbsp;os.path.join(folder_name, new_file_name))<br/># Eine Erfolgsmeldung ausgeben<br/>print("Dateien erfolgreich umbenannt.")<br/>AusgabeDer Code ruft die Funktion toUpperCase auf, um prefix in Großbuchstaben zu konvertieren, aber diese Funktion ist nicht definiert. Um dieses Problem zu beheben, können Sie die Methode upper() der String-Klasse verwenden, die eine gegebene Zeichenkette in Großbuchstaben konvertiert. Der modifizierte Code wird unten gezeigt:<br/><br/>python<br/>import os<br/>import shutil<br/># Den Ordnernamen vom Benutzer erhalten<br/>folder_name = input("Geben Sie den Ordnernamen ein: ")<br/>prefix = input("Geben Sie die Zeichenkette ein, die dem Dateinamen vorangestellt werden soll: ")<br/>text = prefix.upper()<br/># Überprüfen, ob der Ordner existiert<br/>if not os.path.isdir(folder_name):<br/>&nbsp;&nbsp;&nbsp;&nbsp;print("Ordner existiert nicht.")<br/>&nbsp;&nbsp;&nbsp;&nbsp;exit(1)<br/># Eine Liste aller Dateien im Ordner erhalten<br/>files = os.listdir(folder_name)<br/># Über die Dateien iterieren<br/>for file in files:<br/>&nbsp;&nbsp;&nbsp;&nbsp;# Einen neuen Dateinamen mit dem Präfix erstellen<br/>&nbsp;&nbsp;&nbsp;&nbsp;new_filename = f"{text}_{file}"<br/>&nbsp;&nbsp;&nbsp;&nbsp;# Die Datei zum neuen Namen verschieben<br/>&nbsp;&nbsp;&nbsp;&nbsp;shutil.move(os.path.join(folder_name, file),<br/>&nbsp;&nbsp;&nbsp;&nbsp;os.path.join(folder_name, new_filename))<br/># Eine Erfolgsmeldung ausgeben<br/>print("Dateien erfolgreich umbenannt.")<br/><br/><br/>Zusätzlich gibt es einige andere Verbesserungen, die am Code vorgenommen werden können:<br/><br/>1. Die Dateierweiterung der neuen Dateinamen wird nicht beibehalten. Es ist besser, die Erweiterung aus dem ursprünglichen Dateinamen zu extrahieren und sie an den neuen Dateinamen anzuhängen.<br/><br/>2. Der Code geht davon aus, dass es keine Leerzeichen im Ordnernamen gibt. Es ist jedoch eine gute Praxis, Leerzeichen elegant zu handhaben, indem man sie durch Unterstriche oder Bindestriche ersetzt.<br/><br/>3. Die Verwendung der f-String-Syntax für String-Interpolation ist lesbarer und prägnanter als der traditionelle +-Operator.<br/><br/>4. Der Code behandelt keine Fehler, die während des Umbenennungsprozesses auftreten könnten. Es wäre besser, den shutil.move-Aufruf in einen try...except-Block zu wickeln, um potenzielle Fehler abzufangen.<br/><br/>Hier ist der verbesserte Code mit diesen Vorschlägen: [Verbesserter Code folgt...]<br/><br/>Diese Verbesserungen machen den Code robuster und flexibler und gleichzeitig einfacher zu lesen und zu verstehen.

Tabelle 19. Ein Prompt zum Debuggen und Überprüfen von Python-Code

[Seite 53]

Das ist großartig. Es hat mir nicht nur gesagt, wie ich das Problem lösen kann, sondern auch herausgefunden, dass mein Code weitere Fehler hatte und wie ich sie lösen kann. Der letzte Teil des Prompts gab Vorschläge zur allgemeinen Verbesserung des Codes.

Was ist mit multimodalem Prompting?

[Seite 54]

Prompting für Code verwendet immer noch dasselbe reguläre große Sprachmodell. Multimodales Prompting ist ein separates Anliegen. Es bezieht sich auf eine Technik, bei der Sie mehrere Eingabeformate verwenden, um ein großes Sprachmodell zu steuern, anstatt sich nur auf Text zu verlassen. Dies kann Kombinationen von Text, Bildern, Audio, Code oder sogar anderen Formaten umfassen, je nach den Fähigkeiten des Modells und der vorliegenden Aufgabe.

Best Practices

[Seite 54]

Das Finden des richtigen Prompts erfordert Experimentieren. Language Studio in Vertex AI ist ein perfekter Ort, um mit Ihren Prompts zu spielen, mit der Möglichkeit, gegen die verschiedenen Modelle zu testen.

Verwenden Sie die folgenden Best Practices, um ein Profi im Prompt Engineering zu werden.

Beispiele bereitstellen

[Seite 54]

Die wichtigste Best Practice ist die Bereitstellung von (One-Shot / Few-Shot) Beispielen innerhalb eines Prompts. Dies ist sehr effektiv, weil es als mächtiges Lehrwerkzeug fungiert. Diese Beispiele zeigen gewünschte Ausgaben oder ähnliche Antworten auf und ermöglichen es dem Modell, von ihnen zu lernen und seine eigene Generierung entsprechend anzupassen. Es ist, als würde man dem Modell einen Referenzpunkt oder ein Ziel geben, auf das es hinarbeiten kann, wodurch die Genauigkeit, der Stil und der Ton seiner Antwort verbessert werden, um Ihren Erwartungen besser zu entsprechen.

Mit Einfachheit gestalten

[Seite 55]

Prompts sollten prägnant, klar und leicht verständlich sein, sowohl für Sie als auch für das Modell. Als Faustregel gilt: Wenn es bereits für Sie verwirrend ist, wird es wahrscheinlich auch für das Modell verwirrend sein. Versuchen Sie, keine komplexe Sprache zu verwenden und keine unnötigen Informationen bereitzustellen.

Beispiele:

VORHER:

Ich besuche gerade New York und möchte mehr über großartige Orte hören. Ich bin mit zwei 3-jährigen Kindern da. Wo sollten wir während unseres Urlaubs hingehen?

NACH DER ÜBERARBEITUNG:

Fungiere als Reiseführer für Touristen. Beschreibe großartige Orte, die man in New York Manhattan mit einem 3-Jährigen besuchen kann.

Versuchen Sie, Verben zu verwenden, die die Aktion beschreiben. Hier ist eine Reihe von Beispielen:

Fungiere, Analysiere, Kategorisiere, Klassifiziere, Kontrastiere, Vergleiche, Erstelle, Beschreibe, Definiere, Bewerte, Extrahiere, Finde, Generiere, Identifiziere, Liste, Miss, Organisiere, Parse, Wähle, Vorhersage, Bereitstellung, Rang, Empfehle, Rückgabe, Abrufe, Umschreibe, Auswähle, Zeige, Sortiere, Zusammenfasse, Übersetze, Schreibe.

Spezifisch über die Ausgabe sein

[Seite 56]

Seien Sie spezifisch über die gewünschte Ausgabe. Eine prägnante Anweisung reicht möglicherweise nicht aus, um das LLM zu leiten, oder könnte zu generisch sein. Die Bereitstellung spezifischer Details im Prompt (durch System- oder Kontext-Prompting) kann dem Modell helfen, sich auf das Relevante zu konzentrieren und die Gesamtgenauigkeit zu verbessern.

Beispiele:

MACHEN:

Generiere einen 3-Absatz-Blogpost über die Top 5 Videospielkonsolen. Der Blogpost sollte informativ und fesselnd sein und in einem gesprächigen Stil geschrieben werden.

NICHT MACHEN:

Generiere einen Blogpost über Videospielkonsolen.

Anweisungen über Einschränkungen verwenden

[Seite 56]

Anweisungen und Einschränkungen werden im Prompting verwendet, um die Ausgabe eines LLM zu steuern.

  • Eine Anweisung bietet explizite Anweisungen zum gewünschten Format, Stil oder Inhalt der Antwort. Sie leitet das Modell an, was das Modell tun oder produzieren soll.
  • Eine Einschränkung ist eine Reihe von Begrenzungen oder Grenzen für die Antwort. Sie begrenzt, was das Modell nicht tun oder vermeiden sollte.

[Seite 57]

Wachsende Forschung deutet darauf hin, dass die Konzentration auf positive Anweisungen beim Prompting effektiver sein kann als die starke Abhängigkeit von Einschränkungen. Dieser Ansatz entspricht der Art, wie Menschen positive Anweisungen gegenüber Listen dessen bevorzugen, was nicht zu tun ist.

Anweisungen kommunizieren das gewünschte Ergebnis direkt, während Einschränkungen das Modell möglicherweise raten lassen, was erlaubt ist. Es gibt Flexibilität und ermutigt Kreativität innerhalb der definierten Grenzen, während Einschränkungen das Potenzial des Modells begrenzen können. Auch eine Liste von Einschränkungen kann miteinander kollidieren.

Einschränkungen sind in bestimmten Situationen immer noch wertvoll. Um zu verhindern, dass das Modell schädliche oder voreingenommene Inhalte generiert, oder wenn ein striktes Ausgabeformat oder -stil benötigt wird.

Verwenden Sie wenn möglich positive Anweisungen: Anstatt dem Modell zu sagen, was es nicht tun soll, sagen Sie ihm, was es stattdessen tun soll. Dies kann Verwirrung vermeiden und die Genauigkeit der Ausgabe verbessern.

MACHEN:

Generiere einen 1-Absatz-Blogpost über die Top 5 Videospielkonsolen. Diskutiere nur die Konsole, das Unternehmen, das sie hergestellt hat, das Jahr und die Gesamtverkäufe.

NICHT MACHEN:

Generiere einen 1-Absatz-Blogpost über die Top 5 Videospielkonsolen. Liste keine Videospielnamen auf.

Als Best Practice beginnen Sie damit, Anweisungen zu priorisieren und klar zu formulieren, was Sie vom Modell erwarten, und verwenden Sie Einschränkungen nur bei Bedarf für Sicherheit, Klarheit oder spezifische Anforderungen. Experimentieren und iterieren Sie, um verschiedene Kombinationen von Anweisungen und Einschränkungen zu testen, um herauszufinden, was für Ihre spezifischen Aufgaben am besten funktioniert, und dokumentieren Sie diese.

Die maximale Token-Länge kontrollieren

[Seite 58]

Um die Länge einer generierten LLM-Antwort zu kontrollieren, können Sie entweder ein maximales Token-Limit in der Konfiguration setzen oder explizit eine spezifische Länge in Ihrem Prompt anfordern. Zum Beispiel:

"Erkläre Quantenphysik in einer Tweet-langen Nachricht."

Variablen in Prompts verwenden

[Seite 58]

Um Prompts wiederzuverwenden und dynamischer zu gestalten, verwenden Sie Variablen im Prompt, die für verschiedene Eingaben geändert werden können. Z.B. wie in Tabelle 20 gezeigt, ein Prompt, der Fakten über eine Stadt gibt. Anstatt den Stadtnamen im Prompt fest zu kodieren, verwenden Sie eine Variable. Variablen können Ihnen Zeit und Mühe sparen, indem sie es Ihnen ermöglichen, sich nicht zu wiederholen. Wenn Sie dieselbe Information in mehreren Prompts verwenden müssen, können Sie sie in einer Variable speichern und dann auf diese Variable in jedem Prompt verweisen. Das macht viel Sinn beim Integrieren von Prompts in Ihre eigenen Anwendungen.

PromptVARIABLEN<br/>{city} = "Amsterdam"<br/><br/>PROMPT<br/>Du bist ein Reiseführer. Erzähle mir einen Fakt über die Stadt: {city}AusgabeAmsterdam ist eine wunderschöne Stadt voller Kanäle, Brücken und schmaler Straßen. Es ist ein großartiger Ort für einen Besuch wegen seiner reichen Geschichte, Kultur und des Nachtlebens.

Tabelle 20. Variablen in Prompts verwenden

Mit Eingabeformaten und Schreibstilen experimentieren

[Seite 59]

Verschiedene Modelle, Modellkonfigurationen, Prompt-Formate, Wortwahlmöglichkeiten und Eingaben können unterschiedliche Ergebnisse liefern. Daher ist es wichtig, mit Prompt-Attributen wie dem Stil, der Wortwahl und dem Prompt-Typ (Zero Shot, Few Shot, System Prompt) zu experimentieren.

Zum Beispiel kann ein Prompt mit dem Ziel, Text über die revolutionäre Videospielkonsole Sega Dreamcast zu generieren, als Frage, Aussage oder Anweisung formuliert werden, was zu unterschiedlichen Ausgaben führt:

  • Frage: Was war die Sega Dreamcast und warum war sie eine so revolutionäre Konsole?
  • Aussage: Die Sega Dreamcast war eine Videospielkonsole der sechsten Generation, die 1999 von Sega veröffentlicht wurde. Sie…
  • Anweisung: Schreibe einen einzelnen Absatz, der die Sega Dreamcast-Konsole beschreibt und erklärt, warum sie so revolutionär war.

Für Few-Shot-Prompting mit Klassifikationsaufgaben die Klassen mischen

[Seite 59]

Im Allgemeinen sollte die Reihenfolge Ihrer Few-Shot-Beispiele nicht allzu viel ausmachen. Bei Klassifikationsaufgaben sollten Sie jedoch sicherstellen, dass Sie die möglichen Antwortklassen in den Few-Shot-Beispielen mischen. Das liegt daran, dass Sie andernfalls möglicherweise zu sehr auf die spezifische Reihenfolge der Beispiele überanpassen. Durch das Mischen der möglichen Antwortklassen können Sie sicherstellen, dass das Modell lernt, die Schlüsselmerkmale jeder Klasse zu identifizieren, anstatt einfach die Reihenfolge der Beispiele auswendig zu lernen. Dies führt zu robusterer und verallgemeinerbarerer Leistung bei ungesehenen Daten.

[Seite 60]

Eine gute Faustregel ist, mit 6 Few-Shot-Beispielen zu beginnen und von dort aus die Genauigkeit zu testen.

An Modell-Updates anpassen

[Seite 60]

Es ist wichtig für Sie, über Modellarchitektur-Änderungen, hinzugefügte Daten und Fähigkeiten auf dem Laufenden zu bleiben. Probieren Sie neuere Modellversionen aus und passen Sie Ihre Prompts an, um neue Modellfunktionen besser zu nutzen. Tools wie Vertex AI Studio sind großartig, um die verschiedenen Versionen Ihres Prompts zu speichern, zu testen und zu dokumentieren.

Mit Ausgabeformaten experimentieren

[Seite 60]

Neben dem Prompt-Eingabeformat sollten Sie auch mit dem Ausgabeformat experimentieren. Für nicht-kreative Aufgaben wie Extrahieren, Auswählen, Parsen, Ordnen, Rangfolgen oder Kategorisieren von Daten versuchen Sie, Ihre Ausgabe in einem strukturierten Format wie JSON oder XML zurückgeben zu lassen.

Es gibt einige Vorteile beim Zurückgeben von JSON-Objekten aus einem Prompt, der Daten extrahiert. In einer realen Anwendung muss ich dieses JSON-Format nicht manuell erstellen, ich kann die Daten bereits in sortierter Reihenfolge zurückgeben (sehr praktisch beim Arbeiten mit Datetime-Objekten), aber am wichtigsten ist, dass durch das Prompting für ein JSON-Format das Modell gezwungen wird, eine Struktur zu erstellen und Halluzinationen zu begrenzen.

Zusammenfassend die Vorteile der Verwendung von JSON für Ihre Ausgabe:

  • Gibt immer im gleichen Stil zurück
  • Fokus auf die Daten, die Sie erhalten möchten

[Seite 61]

  • Geringere Chance für Halluzinationen
  • Macht es beziehungsaware
  • Sie erhalten Datentypen
  • Sie können es sortieren

Tabelle 4 im Few-Shot-Prompting-Abschnitt zeigt ein Beispiel, wie strukturierte Ausgaben zurückgegeben werden.

JSON-Reparatur

[Seite 61]

Während die Rückgabe von Daten im JSON-Format zahlreiche Vorteile bietet, ist sie nicht ohne Nachteile. Die strukturierte Natur von JSON ist zwar vorteilhaft für das Parsen und die Verwendung in Anwendungen, erfordert aber erheblich mehr Tokens als reiner Text, was zu erhöhter Verarbeitungszeit und höheren Kosten führt. Außerdem kann JSONs Wortreichtum leicht das gesamte Ausgabefenster verbrauchen und wird besonders problematisch, wenn die Generierung aufgrund von Token-Limits abrupt abgeschnitten wird. Diese Kürzung führt oft zu ungültigem JSON, dem wichtige schließende Klammern oder Brackets fehlen, wodurch die Ausgabe unbrauchbar wird. Glücklicherweise können Tools wie die json-repair-Bibliothek (verfügbar auf PyPI) in diesen Situationen von unschätzbarem Wert sein. Diese Bibliothek versucht intelligent, unvollständige oder fehlerhafte JSON-Objekte automatisch zu reparieren, was sie zu einem wichtigen Verbündeten beim Arbeiten mit LLM-generiertem JSON macht, insbesondere beim Umgang mit potenziellen Kürzungsproblemen.

Mit Schemas arbeiten

[Seite 62]

Die Verwendung von strukturiertem JSON als Ausgabe ist eine großartige Lösung, wie wir mehrfach in diesem Papier gesehen haben. Aber was ist mit der Eingabe? Während JSON hervorragend für die Strukturierung der Ausgabe ist, die das LLM generiert, kann es auch unglaublich nützlich sein, um die Eingabe zu strukturieren, die Sie bereitstellen. Hier kommen JSON-Schemas ins Spiel. Ein JSON-Schema definiert die erwartete Struktur und Datentypen Ihrer JSON-Eingabe. Durch die Bereitstellung eines Schemas geben Sie dem LLM eine klare Blaupause der Daten, die es erwarten sollte, und helfen ihm, seine Aufmerksamkeit auf die relevanten Informationen zu fokussieren und das Risiko einer Fehlinterpretation der Eingabe zu reduzieren. Außerdem können Schemas helfen, Beziehungen zwischen verschiedenen Datenstücken herzustellen und das LLM sogar „zeitbewusst“ zu machen, indem Datums- oder Zeitstempelfelder mit spezifischen Formaten einbezogen werden.

Hier ist ein einfaches Beispiel:

Nehmen wir an, Sie möchten ein LLM verwenden, um Beschreibungen für Produkte in einem E-Commerce-Katalog zu generieren. Anstatt nur eine freie Textbeschreibung des Produkts bereitzustellen, können Sie ein JSON-Schema verwenden, um die Attribute des Produkts zu definieren:

json{
 "type": "object",
 "properties": {
   "name": { "type": "string", "description": "Produktname" },
   "category": { "type": "string", "description": "Produktkategorie" },
   "price": { "type": "number", "format": "float", "description": "Produktpreis" },
   "features": {
     "type": "array",
     "items": { "type": "string" },
     "description": "Hauptmerkmale des Produkts"
   },
   "release_date": { "type": "string", "format": "date", "description": 
"Datum, an dem das Produkt veröffentlicht wurde"}
 }
}

Snippet 5. Definition des strukturierten Ausgabe-Schemas

[Seite 63]

Dann können Sie die tatsächlichen Produktdaten als JSON-Objekt bereitstellen, das diesem Schema entspricht:

json{
 "name": "Drahtlose Kopfhörer",
 "category": "Elektronik",
 "price": 99.99,
 "features": ["Geräuschunterdrückung", "Bluetooth 5.0", "20-Stunden-Akkulaufzeit"],
 "release_date": "2023-10-27"
}

Snippet 6. Strukturierte Ausgabe vom LLM

Durch die Vorverarbeitung Ihrer Daten und anstatt vollständige Dokumente bereitzustellen, nur sowohl das Schema als auch die Daten zu liefern, geben Sie dem LLM ein klares Verständnis der Produktattribute, einschließlich seines Veröffentlichungsdatums, was es viel wahrscheinlicher macht, eine genaue und relevante Beschreibung zu generieren. Dieser strukturierte Eingabeansatz, der die Aufmerksamkeit des LLM auf die relevanten Felder lenkt, ist besonders wertvoll beim Arbeiten mit großen Datenmengen oder bei der Integration von LLMs in komplexe Anwendungen.

Gemeinsam mit anderen Prompt Engineers experimentieren

[Seite 63]

Wenn Sie in einer Situation sind, in der Sie versuchen müssen, einen guten Prompt zu entwickeln, möchten Sie vielleicht mehrere Personen finden, die einen Versuch unternehmen. Wenn alle den Best Practices folgen (wie in diesem Kapitel aufgelistet), werden Sie eine Varianz in der Leistung zwischen all den verschiedenen Prompt-Versuchen sehen.

CoT Best Practices

[Seite 64]

Für CoT-Prompting ist es erforderlich, die Antwort nach dem Denken zu setzen, weil die Generierung des Denkens die Tokens ändert, die das Modell erhält, wenn es die endgültige Antwort vorhersagt.

Mit CoT und Selbstkonsistenz müssen Sie in der Lage sein, die endgültige Antwort aus Ihrem Prompt zu extrahieren, getrennt vom Denken.

Für CoT-Prompting setzen Sie die Temperatur auf 0.

Chain of Thought Prompting basiert auf greedy decoding und sagt das nächste Wort in einer Sequenz basierend auf der höchsten Wahrscheinlichkeit vorher, die vom Sprachmodell zugewiesen wird. Im Allgemeinen, wenn Sie Denken verwenden, um zur endgültigen Antwort zu kommen, gibt es wahrscheinlich eine einzige korrekte Antwort. Daher sollte die Temperatur immer auf 0 gesetzt werden.

Die verschiedenen Prompt-Versuche dokumentieren

[Seite 64]

Der letzte Tipp wurde bereits früher in diesem Kapitel erwähnt, aber wir können nicht genug betonen, wie wichtig es ist: dokumentieren Sie Ihre Prompt-Versuche vollständig, damit Sie im Laufe der Zeit lernen können, was gut funktioniert hat und was nicht.

Prompt-Ausgaben können sich zwischen Modellen, zwischen Sampling-Einstellungen und sogar zwischen verschiedenen Versionen desselben Modells unterscheiden. Darüber hinaus können auch bei identischen Prompts an dasselbe Modell kleine Unterschiede in der Ausgabensatzformatierung und Wortwahl auftreten. (Zum Beispiel können, wie zuvor erwähnt, wenn zwei Tokens dieselbe vorhergesagte Wahrscheinlichkeit haben, Gleichstände zufällig entschieden werden. Dies kann dann nachfolgende vorhergesagte Tokens beeinflussen.)

[Seite 65]

Wir empfehlen, ein Google Sheet mit Tabelle 21 als Vorlage zu erstellen. Die Vorteile dieses Ansatzes sind, dass Sie eine vollständige Aufzeichnung haben, wenn Sie unvermeidlich zu Ihrer Prompting-Arbeit zurückkehren müssen – entweder um sie in der Zukunft fortzusetzen (Sie wären überrascht, wie viel Sie nach nur einer kurzen Pause vergessen können), um die Prompt-Leistung bei verschiedenen Versionen eines Modells zu testen und um zukünftige Fehler zu debuggen.

Über die Felder in dieser Tabelle hinaus ist es auch hilfreich, die Version des Prompts (Iteration), ein Feld für die Erfassung, ob das Ergebnis OK/NICHT OK/MANCHMAL OK war, und ein Feld für Feedback zu verfolgen. Wenn Sie das Glück haben, Vertex AI Studio zu verwenden, speichern Sie Ihre Prompts (mit demselben Namen und derselben Version wie in Ihrer Dokumentation aufgeführt) und verfolgen Sie den Hyperlink zum gespeicherten Prompt in der Tabelle. Auf diese Weise sind Sie immer nur einen Klick davon entfernt, Ihre Prompts erneut auszuführen.

Beim Arbeiten an einem Retrieval Augmented Generation-System sollten Sie auch die spezifischen Aspekte des RAG-Systems erfassen, die beeinflussen, welcher Inhalt in den Prompt eingefügt wurde, einschließlich der Abfrage, Chunk-Einstellungen, Chunk-Ausgabe und andere Informationen.

Sobald Sie das Gefühl haben, dass der Prompt nahezu perfekt ist, bringen Sie ihn in Ihre Projekt-Codebasis. Und in der Codebasis speichern Sie Prompts in einer separaten Datei vom Code, damit sie einfacher zu warten sind. Schließlich sind Ihre Prompts idealerweise Teil eines operationalisierten Systems, und als Prompt Engineer sollten Sie sich auf automatisierte Tests und Bewertungsverfahren verlassen, um zu verstehen, wie gut Ihr Prompt für eine Aufgabe verallgemeinert.

Prompt Engineering ist ein iterativer Prozess. Erstellen und testen Sie verschiedene Prompts, analysieren und dokumentieren Sie die Ergebnisse. Verfeinern Sie Ihren Prompt basierend auf der Leistung des Modells. Experimentieren Sie weiter, bis Sie die gewünschte Ausgabe erreichen. Wenn Sie ein Modell oder eine Modellkonfiguration ändern, gehen Sie zurück und experimentieren Sie weiter mit den zuvor verwendeten Prompts.

[Seite 66]

Name[Name und Version Ihres Prompts]Ziel[Einsätzige Erklärung des Ziels dieses Versuchs]Modell[Name und Version des verwendeten Modells]Temperatur[Wert zwischen 0 - 1]Top-K[Nummer]Prompt[Schreiben Sie den gesamten Prompt]Ausgabe[Schreiben Sie die Ausgabe oder mehrere Ausgaben]

Tabelle 21. Eine Vorlage für die Dokumentation von Prompts

Zusammenfassung

[Seite 66]

Dieses Whitepaper behandelt Prompt Engineering. Wir haben verschiedene Prompting-Techniken gelernt, wie:

  • Zero Prompting
  • Few Shot Prompting
  • System Prompting
  • Rollen Prompting
  • Kontext Prompting
  • Step-Back Prompting
  • Chain of Thought
  • Selbstkonsistenz
  • Tree of Thoughts

[Seite 67]

  • ReAct

Wir haben sogar Wege betrachtet, wie Sie Ihre Prompts automatisieren können.

Das Whitepaper behandelt dann die Herausforderungen von Gen AI wie die Probleme, die auftreten können, wenn Ihre Prompts unzureichend sind. Wir haben mit Best Practices abgeschlossen, wie man ein besserer Prompt Engineer wird.

Endnoten

[Seite 68]

  1. Google, 2023, Gemini by Google. Verfügbar unter: https://gemini.google.com.
  2. Google, 2024, Gemini for Google Workspace Prompt Guide. Verfügbar unter: https://inthecloud.withgoogle.com/gemini-for-google-workspace-prompt-guide/dl-cd.html.
  3. Google Cloud, 2023, Introduction to Prompting. Verfügbar unter: https://cloud.google.com/vertex-ai/generative-ai/docs/learn/prompts/introduction-prompt-design.
  4. Google Cloud, 2023, Text Model Request Body: Top-P & top-K sampling methods. Verfügbar unter: https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/text#request_body.
  5. Wei, J., et al., 2023, Zero Shot – Fine Tuned language models are zero shot learners. Verfügbar unter: https://arxiv.org/pdf/2109.01652.pdf.
  6. Google Cloud, 2023, Google Cloud Model Garden. Verfügbar unter: https://cloud.google.com/model-garden.
  7. Brown, T., et al., 2023, Few Shot – Language Models are Few Shot learners. Verfügbar unter: https://arxiv.org/pdf/2005.14165.pdf.
  8. Zheng, L., et al., 2023, Take a Step Back: Evoking Reasoning via Abstraction in Large Language Models. Verfügbar unter: https://openreview.net/pdf?id=3bq3jsvcQ1
  9. Wei, J., et al., 2023, Chain of Thought Prompting. Verfügbar unter: https://arxiv.org/pdf/2201.11903.pdf.
  10. Google Cloud Platform, 2023, Chain of Thought and React. Verfügbar unter: https://github.com/GoogleCloudPlatform/generative-ai/blob/main/language/prompts/examples/chain_of_thought_react.ipynb.
  11. Wang, X., et al., 2023, Self Consistency Improves Chain of Thought reasoning in language models. Verfügbar unter: https://arxiv.org/pdf/2203.11171.pdf.
  12. Yao, S., et al., 2023, Tree of Thoughts: Deliberate Problem Solving with Large Language Models. Verfügbar unter: https://arxiv.org/pdf/2305.10601.pdf.
  13. Yao, S., et al., 2023, ReAct: Synergizing Reasoning and Acting in Language Models. Verfügbar unter: https://arxiv.org/pdf/2210.03629.pdf.
  14. Google Cloud Platform, 2023, Advance Prompting: Chain of Thought and React. Verfügbar unter: https://github.com/GoogleCloudPlatform/applied-ai-engineering-samples/blob/main/genaion-vertex-ai/advanced_prompting_training/cot_react.ipynb.
  15. Zhou, C., et al., 2023, Automatic Prompt Engineering – Large Language Models are Human-Level Prompt Engineers. Verfügbar unter: https://arxiv.org/pdf/2211.01910.pdf.

[ENDE DER ÜBERSETZUNG]

Vollständige deutsche Übersetzung des 68-seitigen Whitepapers „Prompt Engineering“ von Lee Boonstra (Google) – Februar 2025