Fonctions d'appel et de chaînage
Dans Semantic Kernel, les fonctions d’appel et de chaînage permettent d’orchestrer plusieurs tâches ou fonctions pour créer des workflows complexes. Cela est essentiel pour combiner les résultats d’une fonction et les passer à une autre, automatisant ainsi des processus multi-étapes.
1. Fonction d’appel directe
Une fonction d’appel directe exécute une seule tâche en utilisant les données d’entrée fournies.
Exemple : Appel direct à une fonction
Créons une fonction simple pour transformer un texte en majuscules :
using Microsoft.SemanticKernel;using Microsoft.SemanticKernel.Orchestration;
var kernel = Kernel.Builder.Build();
// Définir une fonction nativevar uppercaseFunction = kernel.CreateSemanticFunction("Convertir en majuscules : {{input}}");
// Exécuter la fonction avec un paramètrevar result = await uppercaseFunction.InvokeAsync(new(){ ["input"] = "Ceci est un test."});
Console.WriteLine(result); // Résultat : "CONVERTIR EN MAJUSCULES : CECI EST UN TEST."
2. Chaînage de fonctions
Le chaînage vous permet d’exécuter une série de fonctions en séquence. La sortie d’une fonction devient l’entrée de la suivante.
Étape 1 : Créer plusieurs fonctions
- Une fonction pour transformer le texte en majuscules.
- Une autre pour calculer la longueur du texte.
var kernel = Kernel.Builder.Build();
// Fonction 1 : Transformer en majusculesvar uppercaseFunction = kernel.CreateSemanticFunction("Convertir en majuscules : {{input}}");
// Fonction 2 : Calculer la longueurvar lengthFunction = kernel.CreateSemanticFunction("La longueur du texte est : {{input.Length}}");
Étape 2 : Chaînage manuel
Appeler chaque fonction séquentiellement :
// Étape 1 : Convertir en majusculesvar step1Result = await uppercaseFunction.InvokeAsync(new(){ ["input"] = "Ceci est un exemple."});
// Étape 2 : Calculer la longueurvar step2Result = await lengthFunction.InvokeAsync(new(){ ["input"] = step1Result.Result});
Console.WriteLine(step2Result.Result);// Résultat : "La longueur du texte est : 21"
3. Utilisation du moteur d’orchestration
Le moteur d’orchestration permet de configurer des workflows complexes en combinant des compétences et des fonctions.
Étape 1 : Importer des compétences
Les compétences (skills) sont des collections de fonctions logiques ou de modèles d’invite.
var kernel = Kernel.Builder.Build();
// Charger des compétences natives ou définies dans des pluginsvar textSkill = kernel.ImportSkillFromDirectory("Plugins", "TextSkill");
Étape 2 : Exécuter un pipeline
Un pipeline enchaîne plusieurs compétences. Par exemple, résumer un texte, puis le traduire :
// Compétences de résumé et de traductionvar summarizeSkill = kernel.ImportSkillFromDirectory("Plugins", "SummarySkill");var translateSkill = kernel.ImportSkillFromDirectory("Plugins", "TranslateSkill");
// Texte d'entréevar text = "Semantic Kernel est une bibliothèque puissante pour intégrer des modèles d'IA dans des applications modernes.";
// Étape 1 : Résumer le textevar summary = await kernel.RunAsync(summarizeSkill["Summarize"], new(){ ["text"] = text, ["length"] = "50"});
// Étape 2 : Traduire le résumévar translation = await kernel.RunAsync(translateSkill["Translate"], new(){ ["input"] = summary.Result, ["language"] = "fr"});
Console.WriteLine($"Texte résumé traduit : {translation}");
4. Chaînage dynamique avec le contexte
Le contexte (context variables) permet de passer automatiquement les résultats d’une fonction à une autre sans écrire de code explicite pour chaque transition.
Exemple : Utilisation du contexte
var kernel = Kernel.Builder.Build();
// Créer deux fonctionsvar uppercaseFunction = kernel.CreateSemanticFunction("Transforme en majuscules : {{input}}");var lengthFunction = kernel.CreateSemanticFunction("Longueur du texte : {{input.Length}}");
// Définir un contexte initialvar context = new ContextVariables();context["input"] = "Ceci est un test.";
// Chaînage dynamiquevar result = await kernel.RunAsync(context, uppercaseFunction, lengthFunction);
Console.WriteLine(result.Result);// Résultat : "Longueur du texte : 21"
5. Gestion avancée avec des workflows personnalisés
Vous pouvez orchestrer des workflows plus complexes où des fonctions conditionnelles ou parallèles sont nécessaires.
Exemple : Workflow avec condition
Si le texte dépasse une certaine longueur, un résumé est créé :
var summarizeFunction = kernel.CreateSemanticFunction("Résumé : {{text}}");var lengthCheckFunction = kernel.CreateSemanticFunction(@"{{#if text.Length > 100}}Résumé nécessaire : {{text}}{{else}}Pas besoin de résumé.{{/if}}");
var context = new ContextVariables();context["text"] = "Ceci est un texte relativement long qui pourrait nécessiter un résumé pour être compris rapidement.";
var decision = await lengthCheckFunction.InvokeAsync(context);
if (decision.Result.Contains("Résumé nécessaire")){ var summary = await summarizeFunction.InvokeAsync(context); Console.WriteLine($"Résumé : {summary.Result}");}else{ Console.WriteLine("Résumé non nécessaire.");}
6. Cas pratiques pour l’appel et le chaînage
- Chatbot : Enchaînez des fonctions pour comprendre une requête, la classer, et y répondre.
- Automatisation de documents : Extraire des données, résumer, et envoyer un e-mail.
- Analyse de texte : Enrichir un texte avec plusieurs fonctions : analyse de sentiments, résumé, traduction.
- Pipelines AI/ML : Connecter des modèles pour prétraiter les données, les analyser, puis retourner les résultats.
Le chaînage rend Semantic Kernel particulièrement puissant pour des scénarios multi-étapes, permettant de développer des solutions robustes et dynamiques avec des modèles d’IA.