Prompts voor bestanden opslaan
In de vorige lessen hebt u geleerd hoe u herbruikbare prompts kunt maken door aan te roepen kernel.InvokePromptAsync
. Voorbeeld:
Console.WriteLine(
await kernel.InvokePromptAsync(generateNamesOfPrompt, new() {{ "input", "fantasy characters" }})
);
Het maken van inlineprompts is handig, maar voor grotere projecten kunt u uw prompts in afzonderlijke bestanden ordenen en deze in de kernel importeren. Dit is vergelijkbaar met de manier waarop ingebouwde invoegtoepassingen worden gebruikt. Als u uw eigen promptinvoegtoepassingen wilt maken, kunt u het beste afzonderlijke mappen maken voor uw prompts.'
Semantische invoegtoepassingen maken
Semantic Kernel SDK ondersteunt een prompt temping language met enkele eenvoudige syntaxisregels. U hoeft geen code te schrijven of externe bibliotheken te importeren. Gebruik alleen de accolades {{...}} om expressies in te sluiten in uw prompts.
Als u een semantische invoegtoepassing wilt maken, hebt u een map met twee bestanden nodig: een skprompt.txt
bestand en een config.json
bestand. Het skprompt.txt
bestand bevat de prompt voor het grote taalmodel (LLM), vergelijkbaar met alle prompts die u tot nu toe hebt geschreven. Het config.json
bestand bevat de configuratiegegevens voor de prompt.
Het config.json
bestand ondersteunt de volgende parameters:
type
: het type prompt. Doorgaans gebruikt u het type chatvoltooiingsprompt.description
: Een beschrijving van wat de prompt doet. Deze beschrijving kan door de kernel worden gebruikt om de prompt automatisch aan te roepen.input_variables
: Definieert de variabelen die in de prompt worden gebruikt.execution_settings
: De instellingen voor voltooiingsmodellen. Voor OpenAI-modellen omvatten deze instellingen demax_tokens
entemperature
eigenschappen.
Stel dat u een muziekleraaragent wilt maken. Mogelijk wilt u een functie ondersteunen die akkoorden voorstelt om toe te voegen aan een mogelijke chord progressie. In dit geval biedt de gebruiker start-akkoorden en de plugin raadt akkoorden aan die geschikt zijn.
Als u deze invoegtoepassing wilt maken, maakt u eerst een map Prompts in uw project en vervolgens een submap met de naam 'SuggestChords'. Daarna voegt u de bestanden 'skprompt.txt' en 'config.json' toe aan de map 'SuggestChords'.
Voorbeeld van het bestand '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>
Voorbeeld van het bestand '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 dit voorbeeld is het temperature
een parameter die bepaalt hoeveel de gegenereerde tekst willekeurig moet worden gemaakt. De waarden moeten tussen 0 en 2 zijn. Een lagere temperatuur resulteert in meer gerichte en nauwkeurige uitvoer, en een hogere temperatuur resulteert in diversere en creatieve uitvoer.
In het huidige model kunnen aanvragen maximaal 4097 tokens gebruiken die worden gedeeld tussen prompt en voltooiing. Dit betekent dat als de prompt 4000 tokens is, de voltooiing van de chat maximaal 97 tokens kan zijn. Meer informatie over het afstemmen van parameters vindt u in de documentatie van uw LLM.
Als u uw aangepaste semantische invoegtoepassing wilt gebruiken, importeert u de promptmap in de kernel en roept u de invoegtoepassing aan op basis van de mapnaam. Voorbeeld:
var plugins = kernel.CreatePluginFromPromptDirectory("Prompts");
string input = "G, C";
var result = await kernel.InvokeAsync(
plugins["SuggestChords"],
new() {{ "startingChords", input }});
Console.WriteLine(result);
In dit voorbeeld CreatePluginFromPromptDirectory
wordt een KernelPlugin
object geretourneerd. Dit object vertegenwoordigt een verzameling functies. CreatePluginFromPromptDirectory
accepteert het pad van de aangewezen map van de invoegtoepassing en de naam van elke submap wordt gebruikt als functienaam.
Als u bijvoorbeeld 'SuggestChords' in een map met de naam 'ChordProgressions' hebt genest, gebruikt u de promptmap Prompts/ChordProgressions en blijft de functienaam hetzelfde. U kunt ook de map Prompt en de verwijzing 'ChordProgressions/SuggestChords' gebruiken als de functienaam.
// 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);
Als u deze code uitvoert, moet er een antwoord worden gegenereerd dat lijkt op de volgende uitvoer:
D major, A minor, E minor, B minor, F major, G7
Het opslaan van uw prompts naar bestanden is een uitstekende manier om uw code te ordenen en deze beter te onderhouden. Met de configuratiebestanden kunt u uw prompts verder afstemmen op een meer voorspelbare gebruikerservaring.