Speichern von Eingabeaufforderungen in Dateien

Abgeschlossen

In den vorherigen Einheiten haben Sie gelernt, wie Sie wiederverwendbare Eingabeaufforderungen durch Aufrufen kernel.InvokePromptAsyncerstellen. Beispiel:

Console.WriteLine(
    await kernel.InvokePromptAsync(generateNamesOfPrompt, new() {{ "input", "fantasy characters" }})
);

Das Erstellen von Inlineaufforderungen ist nützlich, aber für größere Projekte können Sie Ihre Eingabeaufforderungen in separate Dateien organisieren und in den Kernel importieren. Dies ähnelt der Art und Weise, wie integrierte Plug-Ins verwendet werden. Um eigene Prompt-Plug-Ins zu erstellen, empfiehlt es sich, separate Ordner für Ihre Prompts zu erstellen.

So erstellen Sie semantische Plug-Ins

Das semantische Kernel-SDK unterstützt eine Aufforderungs-Vorlagensprache mit einigen einfachen Syntaxregeln. Sie müssen keinen Code schreiben oder externe Bibliotheken importieren. Verwenden Sie einfach die geschweiften Klammern {{...}} um Ausdrücke in Ihre Eingabeaufforderungen einzubetten.

Zum Erstellen eines semantischen Plug-Ins benötigen Sie einen Ordner mit zwei Dateien: eine skprompt.txt-Datei und eine config.json-Datei. Die skprompt.txt-Datei enthält den Prompt für das große Sprachmodell (LLM), ähnlich wie alle Prompts, die Sie bisher geschrieben haben. Die config.json-Datei enthält die Konfigurationsdetails für den Prompt.

Die config.json-Datei unterstützt die folgenden Parameter:

  • type: Der Typ der Eingabeaufforderung. In der Regel verwenden Sie den Prompttyp für den Chat-Abschluss.
  • description: Eine Beschreibung der Funktionsweise der Eingabeaufforderung. Diese Beschreibung kann vom Kernel verwendet werden, um die Eingabeaufforderung automatisch aufzurufen.
  • input_variables: Definiert die Variablen, die innerhalb der Eingabeaufforderung verwendet werden.
  • execution_settings: Die Einstellungen für Abschlussmodelle. Bei OpenAI-Modellen enthalten diese Einstellungen, einschließlich der Eigenschaften temperature und max_tokens.

Nehmen wir an, Sie möchten einen Agent für den Musikunterricht erstellen. Möglicherweise möchten Sie ein Feature unterstützen, das Akkorde für eine potenzielle Akkordprogression vorschlägt. Der Benutzer gibt die ersten Akkorde vor, und das Plug-In empfiehlt Akkorde, die gut dazu passen würden.

Um dieses Plug-In zu erstellen, erstellen Sie in Ihrem Projekt zuerst einen Ordner „Prompts“ und dann einen Unterordner namens „SuggestChords“. Anschließend fügen Sie Ihrem Ordner „SuggestChords“ die Dateien „skprompt.txt“ und „config.json“ hinzu.

Beispiel für die Datei „skprompt.txt“:

<message role="system">Instructions: You are a helpful music theory assistant. 
Provide the user with several chords that they could add to a chord progression 
based on some starting chords they provide</message>
<message role="user">Am Em</message>
<message role="assistant">
C major, F major, G major, D major, E major, B minor
</message>

<message role="user"> {{$startingChords}}</message>

Beispiel für die Datei „config.json“:

{
    "schema": 1,
    "type": "completion",
    "description": "Recommends chords to the user based on starting chords",
    "execution_settings": {
        "default": {
            "max_tokens": 1000,
            "temperature": 0
        }
    },
    "input_variables": [
        {
            "name": "startingChords",
            "description": "The starting chords provided by the user",
            "required": true
        },
    ]
}

In diesem Beispiel handelt es temperature sich um einen Parameter, der steuert, wie viel der generierte Text zufällig formatiert werden soll. Die Werte müssen zwischen 0 und 2 liegen. Eine niedrigere Temperatur führt zu einer fokussierteren und präziseren Ausgabe, und eine höhere Temperatur führt zu einer vielfältigeren und kreativeren Ausgabe.

Im aktuellen Modell können Anforderungen bis zu 4.097 Token verwenden, die zwischen Aufforderung und Abschluss gemeinsam genutzt werden. Das bedeutet, wenn der Prompt 4.000 Token umfasst, der fertige Chat höchstens 97 Token enthalten kann. Weitere Informationen zu Feinabstimmungsparametern finden Sie in der Dokumentation Ihrer LLM.

Wenn Sie Ihr benutzerdefiniertes semantisches Plug-In verwenden möchten, importieren Sie das Promptverzeichnis in den Kernel und rufen das Plug-In anhand des Ordnernamens auf. Zum Beispiel:

var plugins = kernel.CreatePluginFromPromptDirectory("Prompts");
string input = "G, C";

var result = await kernel.InvokeAsync(
    plugins["SuggestChords"],
    new() {{ "startingChords", input }});

Console.WriteLine(result);

In diesem Beispiel CreatePluginFromPromptDirectory wird ein KernelPlugin Objekt zurückgegeben. Dieses Objekt stellt eine Auflistung von Funktionen dar. CreatePluginFromPromptDirectory akzeptiert den Pfad Ihres angegebenen Plug-In-Verzeichnisses. Der Name des jeweiligen Unterordners wird als Funktionsname verwendet.

Wenn Sie beispielsweise "SuggestChords" in einem Ordner mit dem Namen "ChordProgressions" verschachtelt haben, verwenden Sie das Eingabeaufforderungsverzeichnis "Prompts/ChordProgressions", und der Funktionsname bleibt gleich. Alternativ können Sie das Verzeichnis „Prompt“ verwenden und für Funktionsnamen auf „ChordProgressions/SuggestChords“ verweisen.

// Example of nested prompt folders
var chordProgressionPlugin = kernel.CreatePluginFromPromptDirectory("Prompts/ChordProgressions");
string input = "G, C";

var result = await kernel.InvokeAsync(
    chordProgressionPlugin["SuggestChords"],
    new() {{ "startingChords", input }});

Console.WriteLine(result);

Wenn Sie diesen Code ausführen, sollte eine Antwort wie die folgende Ausgabe erzeugt werden:

D major, A minor, E minor, B minor, F major, G7

Das Speichern ihrer Eingabeaufforderungen in Dateien ist eine hervorragende Möglichkeit, Ihren Code zu organisieren und es besser zu verwalten. Mit den Konfigurationsdateien können Sie ihre Eingabeaufforderungen auch weiter optimieren, um eine vorhersehbarere Benutzererfahrung zu erzielen.