Prompt Engineering
Dieser Leitfaden teilt Strategien und Taktiken zur Verbesserung der Ergebnisse von großen Sprachmodellen (manchmal als GPT-Modelle bezeichnet) wie GPT-4. Die hier beschriebenen Methoden können manchmal in Kombination eingesetzt werden, um eine größere Wirkung zu erzielen. Wir ermutigen zur Experimentation, um die Methoden zu finden, die am besten für Sie funktionieren.
Einige der hier vorgestellten Beispiele funktionieren derzeit nur mit unserem leistungsfähigsten Modell, gpt-4
. Im Allgemeinen lohnt es sich, wenn Sie feststellen, dass ein Modell bei einer Aufgabe versagt und ein leistungsfähigeres Modell verfügbar ist, es mit dem leistungsfähigeren Modell erneut zu versuchen.
Hinweise: Dieses Tutorial ist eine Übersetzung des offiziellen OpenAI Tip Engineering Guide. Das Tutorial erklärt die Strategie/Taktik des Schreibens von Tip-Wörtern und wie man dem LLM Anweisungen gibt, das gewünschte Ergebnis zurückzugeben.
Sechs Strategien zur Verbesserung der Ergebnisse
Klare Anweisungen schreiben
Diese Modelle können nicht Ihre Gedanken lesen. Wenn die Ausgaben zu lang sind, bitten Sie um kurze Antworten. Wenn die Ausgaben zu einfach sind, bitten Sie um Experten-Level-Schreibweise. Wenn Ihnen das Format nicht gefällt, demonstrieren Sie das Format, das Sie sehen möchten. Je weniger das Modell raten muss, was Sie wollen, desto wahrscheinlicher ist es, dass Sie es bekommen.
Taktiken:
- Fügen Sie Details in Ihre Abfrage ein, um relevantere Antworten zu erhalten
- Bitten Sie das Modell, eine Persönlichkeit anzunehmen
- Verwenden Sie Trennzeichen, um deutlich verschiedene Teile der Eingabe anzugeben
- Geben Sie die Schritte an, die zur Ausführung einer Aufgabe erforderlich sind
- Geben Sie Beispiele an
- Geben Sie die gewünschte Länge der Ausgabe an
Referenztext bereitstellen
Sprachmodelle können selbstbewusst falsche Antworten erfinden, insbesondere wenn es um esoterische Themen oder Zitate und URLs geht. Genauso wie ein Blatt Notizen einem Schüler helfen kann, bei einem Test besser abzuschneiden, kann das Bereitstellen von Referenztexten diesen Modellen helfen, mit weniger Fälschungen zu antworten.
Taktiken:
- Weisen Sie das Modell an, unter Verwendung eines Referenztexts zu antworten
- Weisen Sie das Modell an, mit Zitaten aus einem Referenztext zu antworten
Komplexe Aufgaben in einfachere Teilaufgaben aufteilen
Genauso wie es in der Softwareentwicklung eine bewährte Praxis ist, ein komplexes System in eine Reihe modularer Komponenten zu zerlegen, gilt dasselbe für Aufgaben, die an ein Sprachmodell übermittelt werden. Komplexe Aufgaben haben tendenziell höhere Fehlerquoten als einfachere Aufgaben. Darüber hinaus können komplexe Aufgaben oft als Workflow einfacherer Aufgaben neu definiert werden, bei dem die Ausgaben früherer Aufgaben verwendet werden, um die Eingaben späterer Aufgaben zu konstruieren.
Taktiken:
- Verwenden Sie die Absichtsklassifizierung, um die relevantesten Anweisungen für eine Benutzerabfrage zu identifizieren
- Für Dialoganwendungen, die sehr lange Gespräche erfordern, fassen oder filtern Sie vorherige Dialoge zusammen
- Fassen Sie lange Dokumente stückweise zusammen und konstruieren Sie eine vollständige Zusammenfassung rekursiv
Dem Modell Zeit zum "Nachdenken" geben
Wenn Sie zum Beispiel nach der Multiplikation von 17 mit 28 gefragt werden, wissen Sie es vielleicht nicht sofort, aber Sie können es trotzdem mit der Zeit herausfinden. Ebenso machen Modelle mehr Denkfehler, wenn sie versuchen, sofort zu antworten, anstatt sich Zeit zu nehmen, um eine Antwort herauszuarbeiten. Die Bitte um einen "Gedankengang" vor einer Antwort kann dem Modell helfen, zuverlässiger zu richtigen Antworten zu gelangen.
Taktiken:
- Weisen Sie dem Modell an, seine eigene Lösung herauszufinden, bevor es zu einem Schluss kommt
- Verwenden Sie innere Monologe oder eine Folge von Anfragen, um den Denkprozess des Modells zu verbergen
- Fragen Sie das Modell, ob ihm in früheren Durchgängen etwas entgangen ist
Externe Werkzeuge verwenden
Kompensieren Sie die Schwächen des Modells, indem Sie ihm die Ausgaben anderer Werkzeuge zuführen. Zum Beispiel kann ein Textabrufsystem (manchmal als RAG oder Retrieval Augmented Generation bezeichnet) dem Modell relevante Dokumente mitteilen. Ein Code-Ausführungssystem wie der OpenAI Code Interpreter kann dem Modell dabei helfen, Mathematik zu betreiben und Code auszuführen. Wenn eine Aufgabe mit einem Werkzeug zuverlässiger oder effizienter erledigt werden kann als mit einem Sprachmodell, lagern Sie sie aus, um das Beste aus beiden zu bekommen.
Taktiken:
- Verwenden Sie suchmaschinenbasierte Suche, um effiziente Wissensabfragen zu implementieren
- Verwenden Sie Code-Ausführung, um genauere Berechnungen durchzuführen oder externe APIs aufzurufen
- Geben Sie dem Modell Zugriff auf spezifische Funktionen
Änderungen systematisch testen
Die Leistungsverbesserung ist einfacher, wenn Sie sie messen können. In einigen Fällen wird eine Änderung an einer Aufforderung zwar bessere Leistung bei einigen isolierten Beispielen erzielen, aber zu einer schlechteren Gesamtleistung bei einem repräsentativeren Satz von Beispielen führen. Daher ist es möglicherweise notwendig, um sicherzustellen, dass eine Änderung eine netto positive Leistung bringt, ein umfassendes Testpaket (auch bekannt als "Evaluation") zu definieren.
Taktik:
- Bewerten Sie die Modellausgaben im Vergleich zu Goldstandard-Antworten
Taktiken
Jede der oben aufgeführten Strategien kann mit spezifischen Taktiken konkretisiert werden. Diese Taktiken sollen Ideen für Dinge liefern, die Sie ausprobieren können. Sie sind keineswegs vollständig umfassend, und Sie sollten sich frei fühlen, kreative Ideen auszuprobieren, die hier nicht vertreten sind.
Beispiel Beschreibung des Promptworts
Wir alle wissen, dass die Chat Model API, die OpenAI aufruft, drei Nachrichtentypen hat: SYSTEM, BENUTZER und ASSISTENT, und die Funktionen dieser drei Nachrichten sind wie folgt:
Nachrichtentyp (entsprechend dem Rollenparameter der API) | Beschreibung |
---|---|
SYSTEM | Die Systemnachricht hilft dabei, das Verhalten des Assistenten festzulegen. Sie können beispielsweise die Persönlichkeit des Assistenten ändern oder spezifische Anweisungen dazu geben, wie er sich während des Gesprächs verhalten soll. Beachten Sie jedoch, dass die Systemnachricht optional ist und das Verhalten des Modells ohne eine Systemnachricht voraussichtlich ähnlich ist wie bei der Verwendung einer generischen Nachricht wie "Du bist ein hilfreicher Assistent". |
BENUTZER | Eine Benutzernachricht ist eine Angelegenheit der Benutzereingabe. |
ASSISTENT | Helfer-Nachrichten repräsentieren das, was GPT zurückgibt. |
Beispiele für Promptwörter in diesem Tutorial werden im folgenden Format erläutert:
// SYSTEM Nachricht
So wird das Promptwort für die SYSTEM Nachricht festgelegt.
// BENUTZER Nachricht
So wird das Promptwort für die BENUTZER Nachricht festgelegt.
// ASSISTENT Nachricht
Dies zeigt, was GPT zurückgeben könnte.
Strategie: Klare Anweisungen verfassen
Taktik: Enthalten Sie Details in Ihrer Anfrage, um relevantere Antworten zu erhalten
Um eine hoch relevante Antwort zu erhalten, stellen Sie sicher, dass Anfragen wichtige Details oder Kontext bereitstellen. Andernfalls überlassen Sie es dem Modell, zu erraten, was Sie meinen.
Schlechter | Besser |
Wie füge ich Zahlen in Excel hinzu? | Wie kann ich eine Reihe von Geldbeträgen in Excel addieren? Ich möchte dies automatisch für eine ganze Tabelle von Zeilen tun, wobei alle Summen rechts in einer Spalte namens "Gesamtsumme" enden. |
Wer ist Präsident? | Wer war der Präsident von Mexiko im Jahr 2021 und wie häufig finden Wahlen statt? |
Schreiben Sie Code, um die Fibonacci-Folge zu berechnen. | Schreiben Sie eine TypeScript-Funktion, um die Fibonacci-Folge effizient zu berechnen. Kommentieren Sie den Code ausführlich, um zu erklären, was jedes Stück macht und warum es so geschrieben ist. |
Fassen Sie die Besprechungsnotizen zusammen. | Fassen Sie die Besprechungsnotizen in einem einzigen Absatz zusammen. Erstellen Sie dann eine Markdown-Liste der Sprecher und jeweils ihrer Schlüsselpunkte. Listen Sie schließlich die nächsten Schritte oder Handlungsempfehlungen auf, die von den Sprechern vorgeschlagen wurden, falls vorhanden. |
Taktik: Bitten Sie das Modell, eine Rolle anzunehmen
Die Systemnachricht kann verwendet werden, um die Rolle festzulegen, die das Modell in seinen Antworten einnehmen soll.
// SYSTEM Nachricht
Wenn ich um Hilfe bitte, einen Text zu verfassen, antwortest du mit einem Dokument, das in jedem Absatz mindestens einen Witz oder einen spielerischen Kommentar enthält.
// BENUTZER Nachricht
Schreiben Sie einen Dankesbrief an meinen Stahlbolzen-Lieferanten, dass die Lieferung rechtzeitig und kurzfristig erfolgt ist. Dadurch war es uns möglich, eine wichtige Bestellung auszuliefern.
Taktik: Verwenden Sie Trennzeichen, um deutlich unterschiedliche Teile der Eingabe zu kennzeichnen
Trennzeichen wie dreifache Anführungszeichen, XML-Tags, Abschnittstitel usw. können dazu beitragen, Abschnitte des Textes klar voneinander zu trennen und unterschiedlich zu behandeln.
// BENUTZER Nachricht
Fassen Sie den mit drei Anführungszeichen abgegrenzten Text in einem Haiku zusammen.
"""fügen Sie hier den Text ein"""
// SYSTEM Nachricht
Es werden Ihnen ein Paar Artikel (abgegrenzt mit XML-Tags) zum gleichen Thema zur Verfügung gestellt. Fassen Sie zunächst die Argumente jedes Artikels zusammen. Geben Sie dann an, welcher davon das bessere Argument darstellt, und erläutern Sie warum.
// BENUTZER Nachricht
<article>fügen Sie hier den ersten Artikel ein</article>
<article>fügen Sie hier den zweiten Artikel ein</article>
// SYSTEM Nachricht
Es steht Ihnen ein Abstract einer Arbeit und ein vorgeschlagener Titel zur Verfügung. Der Arbeitstitel sollte dem Leser eine gute Vorstellung vom Thema der Arbeit vermitteln, aber auch einprägsam sein. Falls der Titel diese Kriterien nicht erfüllt, schlagen Sie 5 Alternativen vor.
// BENUTZER Nachricht
Abstract: fügen Sie hier das Abstract ein
Titel: fügen Sie hier den Titel ein
Taktik: Schritte zur Durchführung einer Aufgabe festlegen
Einige Aufgaben lassen sich am besten als eine Sequenz von Schritten definieren. Das explizite Festhalten der Schritte kann es dem Modell erleichtern, sie zu befolgen.
// SYSTEM Nachricht
Folge diesen schrittweisen Anweisungen, um auf Benutzereingaben zu reagieren.
Schritt 1 - Der Benutzer wird dir Text in drei Anführungszeichen zur Verfügung stellen. Fasse diesen Text in einem Satz zusammen, der mit "Zusammenfassung: " beginnt.
Schritt 2 - Übersetze die Zusammenfassung aus Schritt 1 ins Spanische, mit einem Präfix, der "Übersetzung: " lautet.
// BENUTZER Nachricht
"""füge hier den Text ein"""
Taktik: Beispiele bereitstellen
Im Allgemeinen ist es effizienter, allgemeine Anweisungen zu geben, die auf alle Beispiele anwendbar sind, anstatt alle möglichen Varianten einer Aufgabe anhand von Beispielen zu demonstrieren. In einigen Fällen kann es jedoch einfacher sein, Beispiele zu geben, insbesondere wenn das Modell einen bestimmten Stil der Beantwortung von Benutzeranfragen kopieren soll, der schwer explizit zu beschreiben ist. Dies wird als "few-shot" Aufforderung bezeichnet.
// SYSTEM Nachricht
Antworte in einem konsistenten Stil.
// BENUTZER Nachricht
Lehre mich Geduld.
// ASSISTANT Nachricht
Der Fluss, der das tiefste Tal schafft, fließt aus einer bescheidenen Quelle; die großartigste Symphonie hat ihren Ursprung in einer einzigen Note; der komplexeste Wandteppich entsteht aus einem einsamen Faden.
// BENUTZER Nachricht
Lehre mich über den Ozean.
Taktik: Die gewünschte Länge der Ausgabe festlegen
Du kannst das Modell bitten, Ausgaben mit einer bestimmten Zielgrößen zu erstellen. Die Zielgröße kann in Bezug auf die Anzahl der Wörter, Sätze, Absätze, Punkte usw. angegeben werden. Beachte jedoch, dass die Anweisung des Modells, eine bestimmte Anzahl von Wörtern zu generieren, nicht besonders präzise funktioniert. Das Modell kann zuverlässiger Ausgaben mit einer bestimmten Anzahl von Absätzen oder Aufzählungspunkten generieren.
// BENUTZER Nachricht
Fasse den Text in drei Anführungszeichen in etwa 50 Wörtern zusammen.
"""füge hier den Text ein"""
// BENUTZER Nachricht
Fasse den Text in drei Anführungszeichen in 2 Absätzen zusammen.
"""füge hier den Text ein"""
// BENUTZER Nachricht
Fasse den Text in drei Anführungszeichen in 3 Aufzählungspunkten zusammen.
"""füge hier den Text ein"""
Strategie: Referenztext bereitstellen
Taktik: Das Modell anweisen, eine Antwort unter Verwendung eines Referenztextes zu geben
Wenn wir das Modell mit vertrauenswürdigen Informationen versorgen können, die für die aktuelle Abfrage relevant sind, können wir das Modell anweisen, die bereitgestellten Informationen zur Formulierung seiner Antwort zu verwenden.
// SYSTEM Nachricht
Verwende die bereitgestellten Artikel in drei Anführungszeichen, um Fragen zu beantworten. Wenn die Antwort in den Artikeln nicht gefunden werden kann, schreibe "Ich konnte keine Antwort finden."
// BENUTZER Nachricht
<für jeden Artikel drei Anführungszeichen verwenden>
Frage: <hier Frage einfügen>
Da alle Modelle über begrenzte Kontextfenster verfügen, benötigen wir eine Möglichkeit, Informationen dynamisch nachzuschlagen, die für die gestellte Frage relevant sind. Embeddings können verwendet werden, um eine effiziente Wissensabfrage zu implementieren. Weitere Details zur Implementierung findest du in der Taktik "Verwende Embeddings-basierte Suche, um eine effiziente Wissensabfrage zu implementieren".
Taktik: Das Modell anweisen, Antworten mit Zitaten aus einem Referenztext zu versehen
Wenn die Eingabe um relevante Informationen ergänzt wurde, ist es einfach, das Modell aufzufordern, seinen Antworten Zitate hinzuzufügen, indem es Passagen aus den bereitgestellten Dokumenten referenziert. Beachte, dass Zitate in der Ausgabe programmatisch anhand eines String-Matching innerhalb der bereitgestellten Dokumente überprüft werden können.
// SYSTEM Nachricht
Dir wird ein Dokument in drei Anführungszeichen und eine Frage bereitgestellt. Deine Aufgabe ist es, die Frage nur unter Verwendung des bereitgestellten Dokuments zu beantworten und die verwendeten Passagen des Dokuments anzugeben. Wenn das Dokument nicht die Informationen enthält, die für die Beantwortung dieser Frage erforderlich sind, schreibe einfach: "Unzureichende Informationen." Wenn eine Antwort auf die Frage gegeben wird, muss sie mit einem Zitat versehen sein. Verwende das folgende Format, um relevante Passagen anzugeben ({"Zitat": …}).
// BENUTZER Nachricht
"""<füge hier das Dokument ein>"""
Frage: <hier Frage einfügen>
Strategie: Komplexe Aufgaben in einfachere Teilaufgaben aufteilen
Taktik: Verwende die Absichtsklassifizierung, um die relevantesten Anweisungen für eine Benutzeranfrage zu identifizieren
Bei Aufgaben, die viele unabhängige Anweisungssets erfordern, um verschiedene Fälle zu handhaben, kann es vorteilhaft sein, zuerst den Typ der Anfrage zu klassifizieren und diese Klassifizierung zu verwenden, um festzustellen, welche Anweisungen erforderlich sind. Dies kann erreicht werden, indem feste Kategorien definiert und Anweisungen fest codiert werden, die für die Bearbeitung von Aufgaben in einer bestimmten Kategorie relevant sind. Dieser Prozess kann auch rekursiv angewendet werden, um eine Aufgabe in eine Abfolge von Schritten zu zerlegen. Der Vorteil dieses Ansatzes ist, dass jede Anfrage nur diejenigen Anweisungen enthält, die erforderlich sind, um den nächsten Schritt einer Aufgabe auszuführen, was im Vergleich zur Verwendung einer einzelnen Anfrage zur Ausführung der gesamten Aufgabe zu niedrigeren Fehlerraten führen kann. Dies kann auch zu geringeren Kosten führen, da größere Aufforderungen teurer sind.
Angenommen, für eine Kundenbetreuungsanwendung könnten Anfragen nützlich wie folgt klassifiziert werden:
// SYSTEM-Nachricht
Sie erhalten Kundendienstanfragen. Klassifizieren Sie jede Anfrage in eine Hauptkategorie und eine sekundäre Kategorie. Geben Sie Ihre Ausgabe im JSON-Format mit den Schlüsseln: Hauptkategorie und Sekundärkategorie an.
Hauptkategorien: Abrechnung, technischer Support, Kontoverwaltung oder allgemeine Anfrage.
Sekundäre Kategorien für Abrechnung:
- Abbestellen oder Upgrade
- Zahlungsmethode hinzufügen
- Erklärung für Gebühr
- Eine Gebühr beanstanden
Sekundäre Kategorien für technischen Support:
- Fehlerbehebung
- Gerätekompatibilität
- Software-Updates
Sekundäre Kategorien für Kontoverwaltung:
- Zurücksetzen des Passworts
- Persönliche Informationen aktualisieren
- Konto schließen
- Kontosicherheit
Sekundäre Kategorien für allgemeine Anfragen:
- Produktinformationen
- Preisgestaltung
- Feedback
- Mit einem Mitarbeiter sprechen
// BENUTZER-Nachricht
Ich muss mein Internet wieder zum Laufen bringen.
Basierend auf der Klassifizierung der Kundenanfrage können einem Modell eine Reihe spezifischerer Anweisungen bereitgestellt werden, die es für die nächsten Schritte handhaben soll. Angenommen, der Kunde benötigt beispielsweise Hilfe bei der "Fehlerbehebung".
// SYSTEM-Nachricht
Sie erhalten Kundendienstanfragen, die in einem technischen Supportkontext eine Fehlerbehebung erfordern. Helfen Sie dem Benutzer, indem Sie:
- Bitten Sie sie zu überprüfen, ob alle Kabel zum/vom Router verbunden sind. Beachten Sie, dass es häufig vorkommt, dass Kabel im Laufe der Zeit locker werden.
- Wenn alle Kabel verbunden sind und das Problem weiterhin besteht, fragen Sie sie, welches Routermodell sie verwenden.
- Nun werden Sie sie anweisen, wie sie ihr Gerät neu starten sollen:
-- Wenn die Modellnummer MTD-327J ist, empfehlen Sie ihnen, die rote Taste zu drücken und 5 Sekunden lang gedrückt zu halten, dann warten Sie 5 Minuten, bevor Sie die Verbindung testen.
-- Wenn die Modellnummer MTD-327S ist, empfehlen Sie ihnen, sie aus- und wieder einzustecken, dann warten Sie 5 Minuten, bevor Sie die Verbindung testen.
- Wenn das Problem des Kunden nach dem Neustart des Geräts und dem Warten von 5 Minuten weiterhin besteht, stellen Sie eine Verbindung zum IT-Support her, indem Sie {"IT-Support angefordert"} ausgeben.
- Wenn der Benutzer anfängt, Fragen zu stellen, die nicht mit diesem Thema zusammenhängen, bestätigen Sie, ob sie das aktuelle Chat über die Fehlerbehebung beenden möchten und klassifizieren Sie ihre Anfrage gemäß dem folgenden Schema:
<Einfügen Sie hier das Primär-/Sekundärklassifizierungsschema von oben ein>
// BENUTZER-Nachricht
Ich muss mein Internet wieder zum Laufen bringen.
Beachten Sie, dass dem Modell angewiesen wurde, spezielle Zeichenfolgen auszugeben, um anzuzeigen, wann sich der Zustand des Gesprächs ändert. Dadurch können wir unser System in eine Zustandsmaschine umwandeln, in der der Zustand bestimmt, welche Anweisungen eingefügt werden. Indem wir den Zustand, relevante Anweisungen in diesem Zustand und optional auch zulässige Zustandsübergänge von diesem Zustand aus verfolgen, können wir Leitplanken um das Benutzererlebnis legen, die mit einem weniger strukturierten Ansatz schwer zu erreichen wären.
Taktik: Bei Dialoganwendungen, die sehr lange Gespräche erfordern, vorherige Dialoge zusammenfassen oder filtern
Da Modelle eine feste Kontextlänge haben, kann ein Dialog zwischen einem Benutzer und einem Assistenten, bei dem das gesamte Gespräch im Kontextfenster enthalten ist, nicht unbegrenzt fortgesetzt werden.
Es gibt verschiedene Lösungsansätze für dieses Problem, einer davon besteht darin, vorherige Wendungen im Gespräch zusammenzufassen. Sobald die Größe des Eingangs eine vorher festgelegte Schwellenlänge erreicht, könnte dies eine Abfrage auslösen, die einen Teil des Gesprächs zusammenfasst, und die Zusammenfassung des vorherigen Gesprächs könnte als Teil der Systemnachricht enthalten sein. Alternativ könnte das vorherige Gespräch im Hintergrund asynchron zusammengefasst werden.
Eine alternative Lösung besteht darin, dynamisch vorherige Teile des Gesprächs auszuwählen, die für die aktuelle Anfrage am relevantesten sind. Siehe die Taktik "Verwenden von Embeddings-basierter Suche zur Implementierung einer effizienten Wissensabfrage".
Taktik: Langer Dokumente in Abschnitten zusammenfassen und rekursiv eine Gesamtzusammenfassung erstellen
Da Modelle eine feste Kontextlänge haben, können sie nicht verwendet werden, um einen Text zu summarisieren, der länger ist als die Kontextlänge minus die Länge der generierten Zusammenfassung in einer einzelnen Abfrage.
Um ein sehr langes Dokument wie ein Buch zusammenzufassen, können wir eine Sequenz von Abfragen verwenden, um jeden Abschnitt des Dokuments zusammenzufassen. Die Abschnittszusammenfassungen können verkettet und zusammengefasst werden, um Zusammenfassungen von Zusammenfassungen zu erstellen. Dieser Prozess kann rekursiv fortgesetzt werden, bis ein vollständiges Dokument zusammengefasst ist. Wenn es notwendig ist, Informationen über frühere Abschnitte zu verwenden, um spätere Abschnitte zu verstehen, kann ein weiterer Trick hilfreich sein: eine fortlaufende Zusammenfassung des Textes, der jedem Punkt im Buch vorausgeht, während der Inhalt an diesem Punkt zusammengefasst wird. Die Wirksamkeit dieses Verfahrens zur Zusammenfassung von Büchern wurde in früheren Forschungsarbeiten von OpenAI unter Verwendung von Varianten von GPT-3 untersucht.
Strategie: Lassen Sie den Modellen Zeit zum "Nachdenken"
Taktik: Fordern Sie das Modell auf, seine eigene Lösung zu erarbeiten, bevor es zu einem Schluss kommt
Manchmal erzielen wir bessere Ergebnisse, wenn wir das Modell explizit anweisen, von ersten Prinzipien aus zu denken, bevor es zu einem Schluss kommt. Nehmen wir zum Beispiel an, wir möchten, dass ein Modell die Lösung eines Schülers für ein mathematisches Problem bewertet. Der offensichtlichste Weg, dies anzugehen, ist einfach das Modell zu fragen, ob die Lösung des Schülers richtig ist oder nicht.
// SYSTEM Nachricht
Bestimmen, ob die Lösung des Schülers korrekt ist oder nicht.
// BENUTZER Nachricht
Problemstellung: Ich baue eine Solaranlage und brauche Hilfe bei der Berechnung der finanziellen Aspekte.
- Grundstückskosten: 100 $ pro Quadratfuß
- Ich kann Solarpaneele für 250 $ pro Quadratfuß kaufen
- Ich habe einen Wartungsvertrag ausgehandelt, der mich jährlich einen Pauschalbetrag von 100.000 $ und zusätzlich 10 $ pro Quadratfuß kostet.
Was ist die Gesamtkosten für das erste Betriebsjahr als Funktion der Anzahl der Quadratfuß.
Lösung des Schülers: Sei x die Größe der Anlage in Quadratfuß.
1. Grundstückskosten: 100x
2. Kosten für Solarpaneele: 250x
3. Wartungskosten: 100.000 + 100x
Gesamtkosten: 100x + 250x + 100.000 + 100x = 450x + 100.000
// ASSISTENT Nachricht
Die Lösung des Schülers ist korrekt.
Aber die Lösung des Schülers ist tatsächlich nicht korrekt! Wir können das Modell erfolgreich dazu bringen, dies zu bemerken, indem wir das Modell auffordern, zuerst seine eigene Lösung zu generieren.
// SYSTEM Nachricht
Erarbeiten Sie zuerst Ihre eigene Lösung für das Problem. Vergleichen Sie dann Ihre Lösung mit der des Schülers und bewerten Sie, ob die Lösung des Schülers korrekt ist oder nicht. Treffen Sie keine Entscheidung, ob die Lösung des Schülers korrekt ist, bevor Sie das Problem selbst gelöst haben.
// BENUTZER Nachricht
Problemstellung: Ich baue eine Solaranlage und brauche Hilfe bei der Berechnung der finanziellen Aspekte.
- Grundstückskosten: 100 $ pro Quadratfuß
- Ich kann Solarpaneele für 250 $ pro Quadratfuß kaufen
- Ich habe einen Wartungsvertrag ausgehandelt, der mich jährlich einen Pauschalbetrag von 100.000 $ und zusätzlich 10 $ pro Quadratfuß kostet.
Was ist die Gesamtkosten für das erste Betriebsjahr als Funktion der Anzahl der Quadratfuß.
Lösung des Schülers: Sei x die Größe der Anlage in Quadratfuß.
1. Grundstückskosten: 100x
2. Kosten für Solarpaneele: 250x
3. Wartungskosten: 100.000 + 100x
Gesamtkosten: 100x + 250x + 100.000 + 100x = 450x + 100.000
// ASSISTENT Nachricht
Sei x die Größe der Anlage in Quadratfuß.
1. Grundstückskosten: 100x
2. Kosten für Solarpaneele: 250x
3. Wartungskosten: 100.000 + 10x
Gesamtkosten: 100x + 250x + 100.000 + 10x = 360x + 100.000
Die Lösung des Schülers ist inkorrekt. Sie haben einen Fehler bei der Berechnung der Wartungskosten gemacht, indem sie 100x anstelle von 10x verwendet haben. Die korrekten Gesamtkosten für das erste Betriebsjahr betragen 360x + 100.000.
Taktik: Verwende innere Monologe oder eine Abfolge von Anfragen, um den Denkprozess des Modells zu verbergen
Die vorherige Taktik zeigt, dass es manchmal wichtig ist, dass das Modell detailliert über ein Problem nachdenkt, bevor es eine spezifische Frage beantwortet. Für einige Anwendungen wäre es jedoch unangemessen, den Denkprozess, den ein Modell zur finalen Antwort nutzt, mit dem Benutzer zu teilen. Zum Beispiel möchten wir in Lernanwendungen die Schüler dazu ermutigen, ihre eigenen Antworten zu finden, aber der Denkprozess eines Modells über die Lösung des Schülers könnte dem Schüler die Antwort verraten.
Die innere Monologe ist eine Taktik, die zur Minderung dieses Problems eingesetzt werden kann. Die Idee des inneren Monologs besteht darin, das Modell anzuweisen, Teile der Ausgabe, die vor dem Benutzer verborgen bleiben sollen, in einem strukturierten Format zu platzieren, das das Parsen erleichtert. Bevor die Ausgabe dem Benutzer präsentiert wird, wird die Ausgabe geparst und nur ein Teil davon wird sichtbar gemacht.
// SYSTEM Nachricht
Befolgen Sie diese Schritte, um die Benutzeranfragen zu beantworten.
Schritt 1 - Arbeiten Sie zuerst Ihre eigene Lösung für das Problem aus. Verlassen Sie sich nicht auf die Lösung des Schülers, da sie möglicherweise falsch ist. Verschließen Sie Ihre Arbeit für diesen Schritt in drei Anführungszeichen (""").
Schritt 2 - Vergleichen Sie Ihre Lösung mit der Lösung des Schülers und bewerten Sie, ob die Lösung des Schülers richtig ist oder nicht. Verschließen Sie Ihre Arbeit für diesen Schritt in drei Anführungszeichen (""").
Schritt 3 - Wenn der Schüler einen Fehler gemacht hat, überlegen Sie, welchen Hinweis Sie dem Schüler geben könnten, ohne die Antwort preiszugeben. Verschließen Sie Ihre Arbeit für diesen Schritt in drei Anführungszeichen (""").
Schritt 4 - Wenn der Schüler einen Fehler gemacht hat, geben Sie dem Schüler den Hinweis aus dem vorherigen Schritt (außerhalb der drei Anführungszeichen). Schreiben Sie anstelle von "Schritt 4 - ..." "Hinweis:".
// BENUTZER Nachricht
Problemstellung: <Problemstellung einfügen>
Lösung des Schülers: <Lösung des Schülers einfügen>
Alternativ kann dies mit einer Abfolge von Anfragen erreicht werden, bei der alle außer der letzten ihre Ausgabe vor dem Endbenutzer verbergen.
Zunächst bitten wir das Modell, das Problem selbst zu lösen. Da diese anfängliche Abfrage die Lösung des Schülers nicht erfordert, kann sie ausgelassen werden. Dies hat den zusätzlichen Vorteil, dass keine Chance besteht, dass die Lösung des Modells durch die versuchte Lösung des Schülers beeinflusst wird.
// BENUTZER Nachricht
<Problemstellung einfügen>
Als nächstes lassen wir das Modell alle verfügbaren Informationen verwenden, um die Richtigkeit der Lösung des Schülers zu bewerten.
// SYSTEM Nachricht
Vergleichen Sie Ihre Lösung mit der Lösung des Schülers und bewerten Sie, ob die Lösung des Schülers richtig ist oder nicht.
// BENUTZER Nachricht
Problemstellung: """<Problemstellung einfügen>"""
Ihre Lösung: """<vom Modell generierte Lösung einfügen>"""
Lösung des Schülers: """<Lösung des Schülers einfügen>"""
Schließlich lassen wir das Modell seine eigene Analyse nutzen, um in der Rolle eines hilfsbereiten Lehrers zu antworten.
// SYSTEM Nachricht
Sie sind ein Mathelehrer. Wenn der Schüler einen Fehler gemacht hat, bieten Sie dem Schüler einen Hinweis, ohne die Antwort preiszugeben. Wenn der Schüler keinen Fehler gemacht hat, geben Sie ihm einfach einen ermutigenden Kommentar.
// BENUTZER Nachricht
Problemstellung: """<Problemstellung einfügen>"""
Ihre Lösung: """<vom Modell generierte Lösung einfügen>"""
Lösung des Schülers: """<Lösung des Schülers einfügen>"""
Analyse: """<vom Modell generierte Analyse aus dem vorherigen Schritt einfügen>"""
Taktik: Frag das Modell, ob es bei vorherigen Durchläufen etwas übersehen hat
Angenommen, wir verwenden ein Modell, um Auszüge aus einer Quelle aufzulisten, die sich auf eine bestimmte Frage beziehen. Nachdem jeder Auszug aufgelistet ist, muss das Modell bestimmen, ob es einen weiteren schreiben soll oder ob es aufhören soll. Wenn das Quelldokument umfangreich ist, besteht häufig die Gefahr, dass das Modell zu früh aufhört und nicht alle relevanten Auszüge auflistet. In diesem Fall kann eine bessere Leistung häufig erreicht werden, indem das Modell mit Folgeanfragen dazu aufgefordert wird, alle Auszüge zu finden, die es bei vorherigen Durchläufen übersehen hat.
// SYSTEM Nachricht
Sie erhalten ein Dokument, das von drei Anführungszeichen begrenzt ist. Ihre Aufgabe besteht darin, Auszüge auszuwählen, die sich auf die folgende Frage beziehen: "Welche bedeutenden Paradigmenwechsel haben in der Geschichte der künstlichen Intelligenz stattgefunden?"
Stellen Sie sicher, dass die Auszüge alle relevanten Kontextinformationen enthalten, die zu ihrer Interpretation benötigt werden – mit anderen Worten, extrahieren Sie keine kleinen Schnipsel, die wichtige Kontextinformationen vermissen lassen. Geben Sie die Ausgabe im JSON-Format folgendermaßen an:
[{"auszug": "..."},
...
{"auszug": "..."}]
// BENUTZER Nachricht
"""<Dokument hier einfügen>"""
// ASSISTANT Nachricht
[{"auszug": "Das Modell schreibt hier einen Auszug"},
...
{"auszug": "Das Modell schreibt hier einen weiteren Auszug"}]
// BENUTZER Nachricht
Gibt es noch weitere relevante Auszüge? Achten Sie darauf, keine Auszüge zu wiederholen. Stellen Sie auch sicher, dass die Auszüge alle relevanten Kontextinformationen enthalten, die zu ihrer Interpretation benötigt werden – extrahieren Sie also keine kleinen Schnipsel, die wichtige Kontextinformationen vermissen lassen.
Strategie: Verwendung externer Tools
Taktik: Verwenden von Embeddings-basierten Suchen zur Implementierung effizienter Wissensabrufe
Ein Modell kann externe Informationsquellen nutzen, wenn sie als Teil seiner Eingabe bereitgestellt werden. Dies kann dem Modell helfen, informiertere und aktuellere Antworten zu generieren. Wenn ein Benutzer beispielsweise eine Frage zu einem bestimmten Film stellt, kann es nützlich sein, hochwertige Informationen über den Film (z.B. Schauspieler, Regisseur, etc.) der Eingabe des Modells hinzuzufügen. Embeddings können verwendet werden, um effiziente Wissensabrufe zu implementieren, damit relevante Informationen dynamisch zur Laufzeit der Eingabe des Modells hinzugefügt werden können.
Ein Text-Embedding ist ein Vektor, der die Beziehung zwischen Textzeichenfolgen messen kann. Ähnliche oder relevante Zeichenfolgen liegen näher beieinander als nicht verwandte Zeichenfolgen. Dies, zusammen mit der Existenz schneller Vektorsuchalgorithmen, bedeutet, dass Embeddings verwendet werden können, um effiziente Wissensabrufe zu implementieren. Insbesondere kann ein Textkorpus in Abschnitte aufgeteilt und jeder Abschnitt eingebettet und gespeichert werden. Anschließend kann eine gegebene Abfrage eingebettet und eine Vektorsuche durchgeführt werden, um die eingebetteten Textabschnitte des Korpus zu finden, die am engsten mit der Abfrage verbunden sind (d.h. im Embedding-Raum am nächsten beieinander liegen).
Taktik: Verwendung der Code-Ausführung zur Durchführung genauerer Berechnungen oder zum Aufruf externer APIs
Sprachmodelle können nicht darauf vertraut werden, selbständig genaue arithmetische Berechnungen oder lange Berechnungen durchzuführen. In Fällen, in denen dies erforderlich ist, kann ein Modell angewiesen werden, Code zu schreiben und auszuführen, anstatt seine eigenen Berechnungen durchzuführen. Insbesondere kann ein Modell angewiesen werden, den Code, der ausgeführt werden soll, in einem bestimmten Format wie dreifachem Backtick zu platzieren. Nachdem eine Ausgabe erzeugt wurde, kann der Code extrahiert und ausgeführt werden. Schließlich kann die Ausgabe des Code-Ausführungsmotors (d.h. des Python-Interpreters) gegebenenfalls als Eingabe für das Modell für die nächste Abfrage bereitgestellt werden.
// SYSTEM Meldung
Sie können Python-Code schreiben und ausführen, indem Sie ihn in dreifache Backticks einschließen, z.B. ```Code hier einfügen```. Verwenden Sie dies, um Berechnungen durchzuführen.
// BENUTZER Meldung
Finde alle reellwertigen Nullstellen des folgenden Polynoms: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10.
Ein weiterer guter Anwendungsfall für die Code-Ausführung ist der Aufruf externer APIs. Wenn ein Modell entsprechend der korrekten Verwendung einer API angewiesen wird, kann es Code schreiben, der diese nutzt. Das Modell kann angewiesen werden, wie man eine API verwendet, indem ihm Dokumentation und/oder Codebeispiele zur Verwendung der API bereitgestellt werden.
// SYSTEM Meldung
Sie können Python-Code schreiben und ausführen, indem Sie ihn in dreifache Backticks einschließen. Beachten Sie auch, dass Sie auf das folgende Modul zugreifen können, um Benutzern zu helfen, Nachrichten an ihre Freunde zu senden:
\`\`\`python
import message
message.write(to="John", message="Hey, willst du dich nach der Arbeit treffen?")\`\`\`
WARNUNG: Das Ausführen von Code, der von einem Modell erstellt wurde, ist nicht von Natur aus sicher, und es sollten Vorkehrungen in jeder Anwendung getroffen werden, die dies tun möchte. Insbesondere ist eine abgesicherte Code-Ausführungsumgebung erforderlich, um den Schaden zu begrenzen, den nicht vertrauenswürdiger Code verursachen könnte.
Taktik: Dem Modell Zugriff auf spezifische Funktionen geben
Die Chat Completions API ermöglicht das Übergeben einer Liste von Funktionsbeschreibungen in Anfragen. Dies ermöglicht es Modellen, Funktionsargumente gemäß den bereitgestellten Schemata zu generieren. Die generierten Funktionsargumente werden von der API im JSON-Format zurückgegeben und können zum Ausführen von Funktionsaufrufen verwendet werden. Die vom Funktionsaufruf bereitgestellte Ausgabe kann dann in der folgenden Anfrage an ein Modell zurückgeführt werden, um den Kreis zu schließen. Dies ist die empfohlene Methode zur Verwendung von OpenAI-Modellen zum Aufruf externer Funktionen.
Strategie: Systematisches Testen von Änderungen
Manchmal kann es schwierig sein zu erkennen, ob eine Veränderung - zum Beispiel eine neue Anweisung oder ein neues Design - Ihr System verbessert oder verschlechtert. Ein paar Beispiele anzusehen, kann Hinweise darauf geben, was besser ist. Doch bei kleinen Stichproben kann es schwierig sein, zwischen einer tatsächlichen Verbesserung und zufälligem Glück zu unterscheiden. Vielleicht verbessert die Änderung die Leistung bei einigen Eingaben, verschlechtert sie jedoch bei anderen.
Bewertungsverfahren (oder "Evals") sind nützlich zur Optimierung von Systementwürfen. Gute Evals sind:
- Repräsentativ für die reale Nutzung (oder zumindest vielfältig)
- Enthalten viele Testfälle für eine größere statistische Aussagekraft (siehe Tabelle unten für Richtlinien)
- Einfach zu automatisieren oder zu wiederholen
Zu erkennender Unterschied | Stichprobengröße für 95% Konfidenz |
---|---|
30% | ~10 |
10% | ~100 |
3% | ~1.000 |
1% | ~10.000 |
Die Evaluation von Ausgaben kann von Computern, Menschen oder einer Mischung aus beidem durchgeführt werden. Computer können Evals mit objektiven Kriterien automatisieren (z.B. Fragen mit eindeutig richtigen Antworten), sowie einige subjektive oder vage Kriterien, bei denen die Modellausgaben von anderen Modellabfragen bewertet werden. OpenAI Evals ist ein Open-Source-Software-Framework, das Werkzeuge zur Erstellung automatisierter Evals bereitstellt.
Modellbasierte Evals können nützlich sein, wenn es eine Reihe von möglichen Ausgaben gibt, die als gleichwertig hochwertig angesehen werden (z.B. bei Fragen mit langen Antworten). Die Grenze zwischen dem, was realistisch mit einem modellbasierten Eval bewertet werden kann, und dem, was eine menschliche Bewertung erfordert, ist unklar und verschiebt sich ständig, je nachdem, wie leistungsfähig die Modelle werden. Wir ermutigen zu Experimenten, um herauszufinden, wie gut modellbasierte Evals für Ihren Anwendungsfall funktionieren können.
Taktik: Bewertung von Modellausgaben im Vergleich zu Referenzantworten
Angenommen, es ist bekannt, dass die richtige Antwort auf eine Frage sich auf einen bestimmten Satz bekannter Fakten beziehen sollte. Dann können wir mithilfe einer Modellabfrage zählen, wie viele der erforderlichen Fakten in der Antwort enthalten sind.
Zum Beispiel wird mit der folgenden Systemmeldung gearbeitet:
// SYSTEM Nachricht
Es wird Ihnen ein Text geliefert, der durch drei Anführungszeichen begrenzt ist und als Antwort auf eine Frage gedacht ist. Überprüfen Sie, ob die folgenden Informationen direkt in der Antwort enthalten sind:
- Neil Armstrong war der erste Mensch, der auf dem Mond spazierte.
- Das Datum, an dem Neil Armstrong zum ersten Mal auf dem Mond spazierte, war der 21. Juli 1969.
Führen Sie für jeden dieser Punkte die folgenden Schritte durch:
1 - Wiederholen Sie den Punkt.
2 - Geben Sie eine Zitatstelle aus der Antwort an, die diesem Punkt am nächsten kommt.
3 - Überlegen Sie, ob jemand, der den Text liest und das Thema nicht kennt, den Punkt direkt ableiten könnte. Erklären Sie, warum oder warum nicht, bevor Sie eine Entscheidung treffen.
4 - Schreiben Sie "ja", wenn die Antwort auf 3 Ja war, ansonsten schreiben Sie "nein".
Geben Sie schließlich an, wie viele "ja"-Antworten es gibt. Geben Sie diese Anzahl als {"count": <hier Anzahl einfügen>} an.
Hier ist ein Beispiel-Eingabe, bei dem beide Punkte erfüllt sind:
// SYSTEM Nachricht
<fügen Sie oben stehende Systemnachricht ein>
// BENUTZER Nachricht
"""Neil Armstrong ist bekannt dafür, der erste Mensch auf dem Mond gewesen zu sein. Dieses historische Ereignis fand am 21. Juli 1969 während der Apollo-11-Mission statt."""
Hier ist ein Beispiel-Eingabe, bei dem nur ein Punkt erfüllt ist:
// SYSTEM Nachricht
<fügen Sie oben stehende Systemnachricht ein>
// BENUTZER Nachricht
"""Neil Armstrong schrieb Geschichte, als er aus dem Mondmodul stieg und damit der erste Mensch wurde, der auf dem Mond spazierte."""
Hier ist ein Beispiel-Eingabe, bei dem keiner erfüllt ist:
// SYSTEM Nachricht
<fügen Sie oben stehende Systemnachricht ein>
// BENUTZER Nachricht
"""Im Sommer '69, eine großartige Reise,
Apollo 11, kühn wie die Hand der Legende.
Armstrong machte einen Schritt, die Geschichte entfaltete sich,
"Einen kleinen Schritt", sagte er, für eine neue Welt."""
Es gibt viele mögliche Varianten dieser Art der modellbasierten Bewertung. Berücksichtigen Sie die folgende Variation, die den Grad der Überlappung zwischen der Kandidatenantwort und der Goldstandardantwort verfolgt und auch festhält, ob die Kandidatenantwort einem Teil der Goldstandardantwort widerspricht.
// SYSTEM Nachricht
Verwenden Sie die folgenden Schritte, um auf Benutzereingaben zu reagieren. Wiederholen Sie jeden Schritt vollständig, bevor Sie fortfahren. z.B. "Schritt 1: Begründe...".
Schritt 1: Begründen Sie schrittweise, ob die Informationen in der eingereichten Antwort im Vergleich zur Expertenantwort entweder: disjunkt, gleich, eine Teilmenge, eine Obermenge oder sich überschneiden (d.h. einige Schnittmengen, aber nicht Teilmenge/Obermenge).
Schritt 2: Begründen Sie schrittweise, ob die eingereichte Antwort einem Aspekt der Expertenantwort widerspricht.
Schritt 3: Geben Sie ein JSON-Objekt aus, das folgendermaßen strukturiert ist: {"type_of_overlap": "disjunkt" oder "gleich" oder "Teilmenge" oder "Obermenge" oder "überschneidend", "Widerspruch": true oder false}
Hier ist ein Beispiel-Eingabe mit einer unzureichenden Antwort, die jedoch nicht im Widerspruch zur Expertenantwort steht:
// SYSTEM Nachricht
<fügen Sie oben stehende Systemnachricht ein>
// BENUTZER Nachricht
Frage: """Wofür ist Neil Armstrong am bekanntesten und an welchem Datum ist es passiert? Nehmen Sie die UTC-Zeit an."""
Eingereichte Antwort: """Ist er nicht auf dem Mond spazieren gegangen oder so etwas?"""
Expertenantwort: """Neil Armstrong ist am bekanntesten dafür, der erste Mensch zu sein, der auf dem Mond spazierte. Dieses historische Ereignis fand am 21. Juli 1969 statt."""
Hier ist ein Beispiel-Eingabe mit einer Antwort, die der Expertenantwort direkt widerspricht:
// SYSTEM Nachricht
<fügen Sie oben stehende Systemnachricht ein>
// BENUTZER Nachricht
Frage: """Wofür ist Neil Armstrong am bekanntesten und an welchem Datum ist es passiert? Nehmen Sie die UTC-Zeit an."""
Eingereichte Antwort: """Am 21. Juli 1969 wurde Neil Armstrong der zweite Mensch, der auf dem Mond spazierte, nach Buzz Aldrin."""
Expertenantwort: """Neil Armstrong ist am bekanntesten dafür, der erste Mensch zu sein, der auf dem Mond spazierte. Dieses historische Ereignis fand am 21. Juli 1969 statt."""
Hier ist ein Beispiel-Eingabe mit einer korrekten Antwort, die auch etwas mehr Details liefert als notwendig:
// SYSTEM Nachricht
<oben Systemnachricht einfügen>
// BENUTZER Nachricht
Frage: """Für welche Veranstaltung ist Neil Armstrong am bekanntesten und an welchem Datum ist sie aufgetreten? Nehmen Sie die UTC-Zeit an."""
Eingereichte Antwort: """Etwa um 02:56 UTC am 21. Juli 1969 wurde Neil Armstrong zum ersten Menschen, der den Mond betrat, und markierte damit einen monumentalen Meilenstein in der Menschheitsgeschichte."""
Expertenantwort: """Neil Armstrong ist am bekanntesten dafür, der erste Mensch gewesen zu sein, der auf dem Mond spazieren gegangen ist. Dieses historische Ereignis ereignete sich am 21. Juli 1969."""