Uložit výzvy k souborům
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í vlastnostimax_tokens
atemperature
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í.