Prompt Engineering in .NET
In diesem Artikel untersuchen Sie grundlegende Konzepte beim Prompt Engineering. Viele KI-Modelle sind promptbasiert, d. h., sie reagieren auf Benutzereingabetext (einen Prompt) mit einer Antwort, die von Vorhersagealgorithmen (einem Abschluss) generiert wird. Neuere Modelle unterstützen häufig auch Vervollständigungen in Chatformularen, deren Nachrichten auf Rollen („System“, „Benutzer“, „Assistent“) und dem Chatverlauf basieren, um Unterhaltungen aufrechtzuerhalten.
Verwenden von Prompts
Betrachten Sie dieses Beispiel für Textgenerierung, bei dem der Prompt die Benutzereingabe und die Vervollständigung die Modellausgabe ist:
Prompt: „Der Präsident, der die kürzeste Amtszeit hatte, war “
Vervollständigung: „Pedro Lascurain.“
Der Abschluss scheint richtig zu sein, aber was geschieht, wenn Ihre App US-Geschichtsstudierenden helfen soll? Die 45-minütige Amtszeit von Pedro Lascurains ist die kürzeste für jeden Präsidenten, aber er war Präsident von Mexiko. Die US-Geschichtsstudierenden suchen wahrscheinlich nach William Henry Harrison. Die App könnte ihren vorgesehenen Benutzern eindeutig mehr helfen, wenn Sie ihr etwas Kontext geben würden.
Prompt Engineering ergänzt den Prompt um Kontext, indem Anweisungen, Beispiele und Hinweise bereitgestellt werden, um das Modell zu verbessern und bessere Abschlüsse zu generieren.
Modelle, die eine Textgenerierung unterstützen, erfordern häufig kein bestimmtes Format, aber Sie sollten Ihre Prompts so organisieren, dass klar ist, was eine Anweisung und was ein Beispiel ist. Modelle, die chatbasierte Apps unterstützen, verwenden drei Rollen, um Vervollständigungen zu organisieren: eine Systemrolle, die den Chat steuert, eine Benutzerrolle, um Benutzereingaben darzustellen, und eine Assistentenrolle, um Benutzer:innen zu antworten. Sie unterteilen Ihre Prompts in Nachrichten für jede Rolle:
- Systemnachrichten geben dem Modell Anleitungen über den Assistenten. Ein Prompt kann nur eine Systemnachricht enthalten, und diese muss die erste Nachricht sein.
- Benutzernachrichten enthalten Prompts der Benutzer:innen und zeigen Beispiele, frühere Prompts oder Anweisungen für den Assistenten an. Ein Beispiel für eine Chatvervollständigung muss mindestens eine Benutzernachricht enthalten.
- Assistentennachrichten zeigen Beispielvervollständigungen oder frühere Vervollständigungen an und müssen eine Antwort auf die vorangegangene Benutzernachricht enthalten. Assistentennachrichten sind nicht erforderlich, aber wenn Sie eine einfügen, muss sie mit einer Benutzernachricht gekoppelt sein, um ein Beispiel zu bilden.
Verwenden von Anweisungen zur Verbesserung des Abschlusses
Eine Anleitung ist ein Text, der dem Modell sagt, wie es reagieren soll. Eine Anleitung kann eine Anweisung oder ein Imperativ sein:
- Anweisungen teilen dem Modell mit, wie es sich verhalten soll, sind aber keine einfachen Befehle – denken Sie an die Erstellung eines Charakters für einen Improvisationsschauspieler: „Sie helfen Schülern dabei, etwas über die Geschichte der USA zu lernen, also sprechen Sie über die USA, es sei denn, sie fragen ausdrücklich nach anderen Ländern.“
- Imperative sind eindeutige Befehle, die das Modell befolgen muss. „Übersetzen Sie in Tagalog:“
Direktiven sind offener und flexibler als Imperative:
- Sie können mehrere Anweisungen in einer Anleitung kombinieren.
- Anleitungen funktionieren in der Regel besser, wenn Sie sie mit Beispielen verwenden. Da es sich bei Imperativen jedoch um eindeutige Befehle handelt, benötigen Modelle keine Beispiele, um sie zu verstehen (auch wenn Sie dem Modell anhand eines Beispiels zeigen können, wie Antworten zu formatieren sind). Da eine Anweisung dem Modell nicht genau sagt, was zu tun ist, kann jedes Beispiel dazu beitragen, dass das Modell besser funktioniert.
- In der Regel ist es besser, eine schwierige Anleitung in eine Reihe von Schritten aufzuteilen, die Sie mit einer Abfolge von Anweisungen ausführen können. Sie sollten das Modell auch anweisen, das Ergebnis jedes Schritts auszugeben, damit Sie präzise Anpassungen vornehmen können. Sie können die Anleitung zwar selbst in Schritte aufteilen, aber es ist einfacher, das Modell dazu anzuweisen und das Ergebnis jedes Schritts auszugeben. Dieser Ansatz wird als Chain of Thought Prompting bezeichnet.
Primärer und unterstützender Inhalt fügen Kontext hinzu.
Sie können Inhalte angeben, um den Anweisungen mehr Kontext zu geben.
Primäre Inhalte sind Texte, die das Modell mit einer Anleitung verarbeiten soll. Welche Aktion die Anleitung auch immer nach sich zieht, das Modell führt sie mit dem primären Inhalt aus, um eine Vervollständigung zu erzeugen.
Unterstützende Inhalte sind Texte, auf die Sie sich in einer Anleitung beziehen, die aber nicht das Ziel der Anleitung sind. Das Modell verwendet den unterstützenden Inhalt, um die Anleitung zu vervollständigen, was bedeutet, dass der unterstützende Inhalt auch in den Vervollständigungen erscheint, typischerweise als eine Art Struktur (z. B. in Überschriften oder Spaltenbeschriftungen).
Verwenden Sie Bezeichnungen mit Ihren Anleitungsinhalten, um dem Modell zu helfen, herauszufinden, wie sie mit der Anleitung zu verwenden sind. Machen Sie sich nicht zu viele Gedanken über die Genauigkeit – die Bezeichnungen müssen nicht genau mit den Anleitung übereinstimmen, da das Modell Dinge wie Wortform und Großschreibung handhabt.
Angenommen, Sie verwenden die Anleitung „Fassen Sie die Errungenschaften der US-Präsidenten zusammen“, um eine Liste zu erstellen. Das Modell könnte die Liste auf jede beliebige Weise organisieren und anordnen. Was aber, wenn Sie möchten, dass die Liste die Leistungen nach bestimmten Kategorien gruppiert? Verwenden Sie unterstützende Inhalte, um der Anleitung diese Informationen hinzuzufügen.
Passen Sie Ihre Anleitung so an, dass das Modell nach Kategorien gruppiert, und fügen Sie unterstützende Inhalte hinzu, die diese Kategorien angeben:
prompt = """
Instructions: Summarize US Presidential accomplishments, grouped by category.
Categories: Domestic Policy, US Economy, Foreign Affairs, Space Exploration.
Accomplishments: 'George Washington
- First president of the United States.
- First president to have been a military veteran.
- First president to be elected to a second term in office.
- Received votes from every presidential elector in an election.
- Filled the entire body of the United States federal judges; including the Supreme Court.
- First president to be declared an honorary citizen of a foreign country, and an honorary citizen of France.
John Adams ...' ///Text truncated
""";
Verwenden von Beispielen zum Steuern des Modells
Ein Beispiel ist Text, der dem Modell zeigt, wie es reagieren soll, indem Beispiele für Benutzereingaben und Modellausgaben bereitgestellt werden. Das Modell verwendet Beispiele, um abzuleiten, was in Vervollständigungen aufgenommen werden soll. Beispiele können entweder vor oder nach den Anleitungen in einem entwickelten Prompt kommen, aber die beiden sollten nicht miteinander vermischt werden.
Ein Beispiel beginnt mit einem Prompt und kann optional einen Abschluss enthalten. Eine Vervollständigung in einem Beispiel muss nicht die wortwörtliche Antwort enthalten, sondern kann lediglich ein formatiertes Wort, den ersten Punkt einer ungeordneten Liste oder etwas Ähnliches enthalten, um anzugeben, wie jede Vervollständigung beginnen soll.
Beispiele werden basierend darauf, ob sie wortwörtliche Vervollständigungen enthalten, als Zero-Shot-Learning oder Few-Shot-Learning klassifiziert.
- Beispiele für Zero-Shot-Learning enthalten einen Prompt ohne wortwörtliche Vervollständigung. Bei diesem Ansatz wird die Antworten eines Modells getestet, ohne ihm eine Beispieldatenausgabe bereitzustellen. (Zero-Shot-Prompts können Vervollständigungen haben, die Hinweise enthalten, z. B. die Angabe, dass das Modell eine geordnete Liste ausgeben soll, indem „1.“ als Vervollständigung angegeben wird.)
- Beispiele für Few-Shot-Learning umfassen mehrere Paare von Prompts mit wortwörtlichen Vervollständigungen. Few-Shot-Learning kann das Verhalten des Modells ändern, indem es sein vorhandenes Wissen erweitert.
Grundlegendes zu Hinweisen
Ein Cue ist Text, der die gewünschte Struktur oder das Format der Ausgabe vermittelt. Wie eine Anleitung wird ein Cue vom Modell nicht wie eine Benutzereingabe verarbeitet. Wie ein Beispiel zeigt ein Cue dem Modell, was Sie möchten, anstatt ihm mitzuteilen, was es tun soll. Sie können beliebig viele Cues hinzufügen, sodass Sie das gewünschte Ergebnis durch Iteration erzielen können. Cues werden zusammen mit einer Anleitung oder einem Beispiel verwendet und sollten am Ende des Prompts stehen.
Angenommen, Sie verwenden eine Anleitung, mit der Sie das Modell anweisen, eine Liste der Leistungen von Präsidenten nach Kategorien zu erstellen, zusammen mit unterstützendem Inhalt, der dem Modell mitteilt, welche Kategorien es verwenden soll. Sie entscheiden, dass das Modell eine geschachtelte Liste mit Großbuchstaben für die Kategorien erstellen soll, in der die Leistungen jedes Präsidenten in jeder Kategorie in einer Zeile aufgeführt sind, die mit dem Namen des Präsidenten beginnt, wobei die Präsidenten chronologisch aufgelistet sind. Nach Ihrer Anleitung und dem unterstützenden Inhalt könnten Sie drei Cues hinzufügen, um dem Modell zu zeigen, wie es die Liste strukturieren und formatieren soll:
prompt = """
Instructions: Summarize US Presidential accomplishments, grouped by category.
Categories: Domestic Policy, US Economy, Foreign Affairs, Space Exploration.
Accomplishments: George Washington
First president of the United States.
First president to have been a military veteran.
First president to be elected to a second term in office.
First president to receive votes from every presidential elector in an election.
First president to fill the entire body of the United States federal judges; including the Supreme Court.
First president to be declared an honorary citizen of a foreign country, and an honorary citizen of France.
John Adams ... /// Text truncated
DOMESTIC POLICY
- George Washington:
- John Adams:
""";
- DOMESTIC POLICY zeigt dem Modell, dass es jede Gruppe mit der Kategorie in Großbuchstaben beginnen soll.
- - George Washington: zeigt dem Modell, dass jeder Abschnitt mit George Washingtons Errungenschaften in einer Zeile beginnen soll.
- - John Adams: zeigt dem Modell, dass es die übrigen Präsidenten in chronologischer Reihenfolge auflisten soll.
Beispielprompt mit .NET
.NET bietet verschiedene Tools für Prompts und Chats mit verschiedenen KI-Modellen. Verwenden Sie den Semantic Kernel, um eine Verbindung mit einer Vielzahl von KI-Modellen und -Diensten sowie anderen SDKs wie der offiziellen OpenAI .NET-Bibliothek herzustellen. Der Semantic Kernel enthält Tools zum Erstellen von Prompts mit unterschiedlichen Rollen und zum Verwalten des Chatverlaufs sowie viele andere Features.
Betrachten Sie das folgende Codebeispiel:
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
// Create a kernel with OpenAI chat completion
#pragma warning disable SKEXP0010
Kernel kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
modelId: "phi3:mini",
endpoint: new Uri("http://localhost:11434"),
apiKey: "")
.Build();
var aiChatService = kernel.GetRequiredService<IChatCompletionService>();
var chatHistory = new ChatHistory();
chatHistory.Add(
new ChatMessageContent(AuthorRole.System, "You are a helpful AI Assistant."));
while (true)
{
// Get user prompt and add to chat history
Console.WriteLine("Your prompt:");
chatHistory.Add(new ChatMessageContent(AuthorRole.User, Console.ReadLine()));
// Stream the AI response and add to chat history
Console.WriteLine("AI Response:");
var response = "";
await foreach (var item in
aiChatService.GetStreamingChatMessageContentsAsync(chatHistory))
{
Console.Write(item.Content);
response += item.Content;
}
chatHistory.Add(new ChatMessageContent(AuthorRole.Assistant, response));
Console.WriteLine();
}
Der obige Code enthält Beispiele für die folgenden Konzepte:
- Erstellt einen Chatverlaufsdienst, um dem KI-Modell Prompts basierend auf Erstellerrollen bereitzustellen.
- Konfiguriert die KI mit einer
AuthorRole.System
-Nachricht. - Akzeptiert Benutzereingaben, um verschiedene Prompttypen im Kontext einer
AuthorRole.User
zuzulassen. - Streamt den Abschluss von der KI asynchron, um eine dynamische Chaterfahrung bereitzustellen.
Erweitern Ihrer Prompt Engineering-Techniken
Sie können auch die Leistungsfähigkeit Ihrer Prompts mit komplexeren Prompt Engineering-Techniken erhöhen, die in eigenen Artikeln ausführlich behandelt werden.
- LLMs haben Grenzwerte für die Tokeneingabe, die die Menge an Text, die in einen Prompt passt, einschränken. Sie können Einbettungen und Vektordatenbanklösungen verwenden, um die Anzahl der Token zu verringern, die Sie für einen bestimmten Textabschnitt benötigen.
- LLMs werden nicht für Ihre Daten trainiert, es sei denn, Sie trainieren sie selbst, was kostspielig und zeitaufwändig sein kann. Sie können RAG (Retrieval-Augmented Generation) verwenden, um Ihre Daten für ein LLM verfügbar zu machen, ohne es zu trainieren.