Spara frågor till filer

Slutförd

I föregående enheter lärde du dig att skapa återanvändbara frågor genom att anropa kernel.InvokePromptAsync. Till exempel:

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

Det är användbart att skapa infogade frågor, men för större projekt kanske du vill ordna dina frågor i separata filer och importera dem till kerneln. Detta liknar hur inbyggda plugin-program används. Om du vill skapa dina egna plugin-program för frågor är det bästa sättet att skapa separata mappar för dina frågor.''

Så här skapar du semantiska plugin-program

Semantisk kernel-SDK stöder ett språk för snabb templating med några enkla syntaxregler. Du behöver inte skriva kod eller importera några externa bibliotek. Använd bara klammerparenteserna {{...}} för att bädda in uttryck i dina frågor.

För att skapa ett semantiskt plugin-program behöver du en mapp som innehåller två filer: en skprompt.txt fil och en config.json fil. Filen skprompt.txt innehåller uppmaningen till den stora språkmodellen (LLM), ungefär som alla frågor som du har skrivit hittills. Filen config.json innehåller konfigurationsinformationen för prompten.

Filen config.json stöder följande parametrar:

  • type: Typ av fråga. Du använder vanligtvis prompttypen för chattens slutförande.
  • description: En beskrivning av vad uppmaningen gör. Den här beskrivningen kan användas av kerneln för att automatiskt anropa prompten.
  • input_variables: Definierar de variabler som används i prompten.
  • execution_settings: Inställningarna för slutförandemodeller. För OpenAI-modeller innehåller max_tokens de här inställningarna egenskaperna och temperature .

Anta till exempel att du vill skapa en agent för musikhandledare. Du kanske vill ha stöd för en funktion som föreslår ackord att lägga till i en potentiell ackordprogression. I det här fallet tillhandahåller användaren startackord och plugin-programmet rekommenderar ackord som passar bra.

Om du vill skapa det här plugin-programmet skapar du först mappen "Prompts" i projektet och sedan en undermapp med namnet "SuggestChords". Efteråt lägger du till filerna "skprompt.txt" och "config.json" i mappen "SuggestChords".

Exempel på filen "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>

Exempel på filen "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
        },
    ]
}

I det här exemplet temperature är en parameter som styr hur mycket som ska randomisera den genererade texten. Värdena måste vara mellan 0 och 2. En lägre temperatur resulterar i mer fokuserade och exakta utdata, och en högre temperatur resulterar i mer varierad och kreativ utdata.

I den aktuella modellen kan begäranden använda upp till 4 097 token som delas mellan prompt och slutförande. Det innebär att om prompten är 4 000 token kan chatten vara högst 97 token. Mer information om finjusteringsparametrar finns i dokumentationen för din LLM.

Om du vill använda ditt anpassade semantiska plugin-program importerar du promptkatalogen till kerneln och anropar plugin-programmet med dess mappnamn. Till exempel:

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

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

Console.WriteLine(result);

I det här exemplet CreatePluginFromPromptDirectory returnerar ett KernelPlugin objekt. Det här objektet representerar en samling funktioner. CreatePluginFromPromptDirectory accepterar sökvägen till din avsedda plugin-katalog och varje undermapps namn används som funktionsnamn.

Om du till exempel kapslade "SuggestChords" i en mapp med namnet "ChordProgressions" använder du promptkatalogen "Prompts/ChordProgressions" och funktionsnamnet förblir detsamma. Du kan också använda katalogen "Prompt" och referera till "ChordProgressions/SuggestChords" som funktionsnamn.

// 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);

När du kör den här koden bör ett svar som liknar följande utdata genereras:

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

Att spara dina frågor till filer är ett bra sätt att organisera koden och göra den mer underhållsbar. Med konfigurationsfilerna kan du också finjustera dina frågor ytterligare för en mer förutsägbar användarupplevelse.