Enregistrer des prompts dans des fichiers

Effectué

Dans les unités précédentes, vous avez appris à créer des prompts réutilisables en appelant kernel.InvokePromptAsync. Par exemple :

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

La création de prompts inline est utile, mais pour les projets plus volumineux, vous souhaiterez peut-être organiser vos prompts en fichiers distincts et les importer dans le noyau. Cela s’apparente à la façon dont les plug-ins intégrés sont utilisés. Pour créer vos propres plug-ins de prompt, nous vous recommandons de créer des dossiers distincts pour vos prompts. »

Comment créer des plug-ins sémantiques

Le kit de développement logiciel (SDK) Noyau sémantique prend en charge un langage de création de modèles de prompts avec certaines règles de syntaxe simples. Vous n’avez pas besoin d’écrire du code ou d’importer des bibliothèques externes ; il vous suffit d’utiliser des accolades {{...}} pour incorporer des expressions dans vos prompts.

Pour créer un plug-in sémantique, vous avez besoin d’un dossier contenant deux fichiers : un fichier skprompt.txt et un fichier config.json. Le fichier skprompt.txt contient le prompt au grand modèle de langage (LLM), similaire à toutes les prompts que vous avez écrites jusqu’à présent. Le fichier config.json contient les détails de configuration du prompt.

Le fichier config.json prend en charge les paramètres suivants :

  • type : type de prompt. Vous utilisez généralement le type du prompt de saisie semi-automatique de conversation.
  • description : description de ce que fait le prompt. Cette description peut être utilisée par le noyau pour appeler automatiquement le prompt.
  • input_variables : définit les variables utilisées à l’intérieur du prompt.
  • execution_settings : paramètres pour les modèles d’achèvement. Pour les modèles OpenAI, ces paramètres incluent les propriétés max_tokens et temperature.

Par exemple, supposons que vous souhaitiez créer un agent de tuteur de musique. Vous pouvez souhaiter prendre en charge une fonctionnalité qui suggère des accords à ajouter à une progression d’accords potentielle. Dans ce cas, l’utilisateur fournit des accords de départ, et le plug-in recommande des accords qui conviendraient pour la suite.

Pour créer ce plug-in, vous devez d’abord créer un dossier « Prompts » dans votre projet, puis un sous-dossier appelé « SuggestChords ». Ensuite, vous ajoutez les fichiers « skprompt.txt » et « config.json » à votre dossier « SuggestChords ».

Exemple de fichier « 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>

Exemple de fichier « 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
        },
    ]
}

Dans cet exemple, temperature est un paramètre qui contrôle le degré de randomisation du texte généré. Les valeurs doivent être comprises entre 0 et 2. Une température inférieure entraîne une sortie plus ciblée et précise, et une température plus élevée entraîne une sortie plus diversifiée et créative.

Dans le modèle actuel, les requêtes peuvent utiliser jusqu’à 4 097 jetons partagés entre le prompt et l’achèvement. Cela signifie que si le prompt fait 4 000 jetons, la saisie semi-automatique de conversation peut faire 97 jetons au maximum. Vous trouverez plus d’informations sur le réglage précis des paramètres dans la documentation de votre LLM.

Pour utiliser votre plug-in sémantique personnalisé, importez le répertoire du prompt dans le noyau et appelez le plug-in par son nom de dossier. Par exemple :

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

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

Console.WriteLine(result);

Dans cet exemple, CreatePluginFromPromptDirectory retourne un objet KernelPlugin. Cet objet représente une collection de fonctions. CreatePluginFromPromptDirectory accepte le chemin d’accès de votre répertoire de plug-in désigné, et le nom de chaque sous-dossier est utilisé comme nom de fonction.

Par exemple, si vous avez imbriqué « SuggestionAccords » dans un dossier appelé « ProgressionsAccords », vous utiliserez le répertoire de prompts « Prompts/ProgressionsAccords » et le nom de la fonction restera identique. Vous pouvez également utiliser le répertoire « Prompt » et référencer « ChordProgressions/SuggestChords » comme nom de fonction.

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

L’exécution de ce code doit produire une réponse similaire à la sortie suivante :

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

L’enregistrement de vos prompts dans des fichiers est un excellent moyen d’organiser votre code et de simplifier sa gestion. Les fichiers de configuration vous permettent également d’optimiser davantage vos prompts, afin de bénéficier d’une expérience utilisateur plus prévisible.