Uložit výzvy k souborům

Dokončeno

V předchozích lekcích jste zjistili, jak vytvořit opakovaně použitelné výzvy voláním kernel.InvokePromptAsync. Příklad:

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

Vytváření vložených výzev je užitečné, ale u větších projektů můžete chtít výzvy uspořádat do samostatných souborů a importovat je do jádra. Podobá se tomu, jak se používají integrované moduly plug-in. Pokud chcete vytvořit vlastní moduly plug-in s výzvou, osvědčeným postupem je vytvořit pro výzvy samostatné složky.

Vytváření sémantických modulů plug-in

Sada SDK sémantického jádra podporuje jazyk šablon výzvy s několika jednoduchými pravidly syntaxe. Nemusíte psát kód ani importovat žádné externí knihovny, stačí použít složené závorky {{...}} k vložení výrazů do výzev.

K vytvoření sémantického modulu plug-in potřebujete složku obsahující dva soubory: skprompt.txt soubor a config.json soubor. Soubor skprompt.txt obsahuje výzvu k rozsáhlému jazykovému modelu (LLM), podobně jako všechny dosud zadané výzvy. Soubor config.json obsahuje podrobnosti o konfiguraci výzvy.

Soubor config.json podporuje následující parametry:

  • type: Typ výzvy. Obvykle používáte typ výzvy k dokončení chatu.
  • description: Popis toho, co výzva dělá. Tento popis může jádro použít k automatickému vyvolání výzvy.
  • input_variables: Definuje proměnné, které se používají uvnitř výzvy.
  • execution_settings: Nastavení pro modely dokončení. U modelů OpenAI tato nastavení zahrnují vlastnosti max_tokens a temperature vlastnosti.

Předpokládejme například, že chcete vytvořit agenta hudebního učitele. Možná budete chtít podporovat funkci, která navrhuje akordy, aby se přidaly k potenciálnímu progresi chordů. V tomto případě uživatel poskytuje počáteční chordy a modul plug-in doporučuje chordy, které by byly vhodné.

Pokud chcete vytvořit tento modul plug-in, nejprve byste ve svém projektu vytvořili složku Prompts a pak podsložku s názvem "SuggestChords". Potom do složky "SuggestChords" přidáte soubory "skprompt.txt" a "config.json".

Příklad souboru 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>

Příklad souboru 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
        },
    ]
}

V tomto příkladu temperature je parametr, který určuje, kolik se má náhodně nagenerovat vygenerovaný text. Hodnoty musí být v rozmezí od 0 do 2. Nižší teplota vede k přesnějšímu a prioritnímu výstupu a vyšší teplota vede k různorodějším a kreativním výstupům.

V aktuálním modelu můžou žádosti používat až 4 097 tokenů sdílených mezi výzvou a dokončením. To znamená, že pokud je výzva 4 000 tokenů, může být dokončení chatu maximálně 97 tokenů. Další informace o parametrech jemného ladění najdete v dokumentaci k LLM.

Pokud chcete použít vlastní sémantický modul plug-in, naimportujete adresář výzvy do jádra a zavoláte modul plug-in podle názvu jeho složky. Příklad:

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

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

Console.WriteLine(result);

V tomto příkladu CreatePluginFromPromptDirectory KernelPlugin vrátí objekt. Tento objekt představuje kolekci funkcí. CreatePluginFromPromptDirectory přijímá cestu k určenému adresáři modulu plug-in a název každé podsložky se používá jako název funkce.

Pokud jste například vnořeli "SuggestChords" do složky s názvem ChordProgressions, použili byste adresář výzvy Prompts/ChordProgressions a název funkce by zůstal stejný. Případně můžete jako název funkce použít adresář Prompt a odkazovat na ChordProgressions/SuggestChords.

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

Spuštění tohoto kódu by mělo vytvořit odpověď podobnou následujícímu výstupu:

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

Uložení výzev k souborům je skvělý způsob, jak uspořádat kód a lépe ho udržovat. Konfigurační soubory také umožňují dále ladit výzvy k předvídatelnějšímu uživatelskému prostředí.