Développement de fonctions natives
Le développement de fonctions natives dans Semantic Kernel consiste à créer des compétences (ou plugins) écrites en C# qui encapsulent des fonctionnalités spécifiques. Ces fonctions sont indépendantes des modèles d’IA et sont exécutées directement par le noyau. Elles permettent d’intégrer des traitements métier ou des tâches spécifiques dans votre pipeline d’intelligence artificielle.
1. Qu’est-ce qu’une fonction native dans Semantic Kernel ?
Une fonction native est une méthode définie dans une classe, annotée avec des attributs fournis par Semantic Kernel pour exposer ses fonctionnalités. Ces fonctions sont invoquées par le noyau comme toute autre fonction d’invitation, mais elles n’impliquent pas l’utilisation d’un modèle IA.
Exemple typique : Une fonction qui effectue des calculs, manipule des fichiers, ou interagit avec une API externe.
2. Structure d’une fonction native
Une fonction native est une méthode annotée par [SKFunction]
et peut accepter des paramètres nommés via [SKParameter]
.
Exemple : Fonction simple
using Microsoft.SemanticKernel.SkillDefinition;
public class MathSkill{ [SKFunction("Additionner deux nombres")] public string Add( [SKParameter("x", "Premier nombre à additionner")] double x, [SKParameter("y", "Second nombre à additionner")] double y) { return (x + y).ToString(); }}
- [SKFunction] : Indique que cette méthode est une fonction native exposée au noyau.
- [SKParameter] : Définit les paramètres de la fonction, leurs noms et descriptions.
3. Ajouter une fonction native au noyau
Pour utiliser une fonction native dans le noyau, vous devez :
- Instancier la classe contenant les fonctions.
- L’importer dans le noyau avec
ImportSkill
.
Exemple : Ajouter et exécuter une fonction native
using Microsoft.SemanticKernel;
var kernel = Kernel.Builder.Build();
// Ajouter le pluginvar mathSkill = kernel.ImportSkill(new MathSkill(), "MathSkill");
// Exécuter la fonctionvar result = await kernel.RunAsync(mathSkill["Add"], new(){ ["x"] = "5", ["y"] = "10"});
Console.WriteLine($"Résultat : {result}");
4. Fonctions natives avancées
a) Utilisation de dépendances
Les fonctions natives peuvent utiliser des dépendances, comme des services externes ou des bases de données.
Exemple : Accéder à une API externe
using Microsoft.SemanticKernel.SkillDefinition;using System.Net.Http;using System.Threading.Tasks;
public class WeatherSkill{ private readonly HttpClient _httpClient;
public WeatherSkill(HttpClient httpClient) { _httpClient = httpClient; }
[SKFunction("Obtenir la météo actuelle pour une ville")] public async Task<string> GetWeatherAsync( [SKParameter("city", "Nom de la ville")] string city) { var response = await _httpClient.GetStringAsync($"https://api.weatherapi.com/v1/current.json?key=your-api-key&q={city}"); return response; }}
Ajout de la compétence au noyau
var httpClient = new HttpClient();var weatherSkill = new WeatherSkill(httpClient);
var kernel = Kernel.Builder.Build();kernel.ImportSkill(weatherSkill, "WeatherSkill");
var result = await kernel.RunAsync(weatherSkill["GetWeatherAsync"], new(){ ["city"] = "Paris"});
Console.WriteLine($"Météo : {result}");
b) Combinaison avec des fonctions IA
Les fonctions natives peuvent être utilisées pour prétraiter ou post-traiter les données avant ou après une fonction IA.
Exemple : Prétraiter des données
public class PreprocessingSkill{ [SKFunction("Nettoyer un texte pour une analyse IA")] public string CleanText( [SKParameter("input", "Texte à nettoyer")] string input) { // Exemple de nettoyage basique return input.Replace("\n", " ").Trim(); }}
Pipeline combiné
var preprocessingSkill = kernel.ImportSkill(new PreprocessingSkill(), "PreprocessingSkill");var iaFunction = kernel.CreateSemanticFunction("{{$input}} Résume ce texte en une phrase.");
// Nettoyage avant IAvar cleanedText = await kernel.RunAsync(preprocessingSkill["CleanText"], new() { ["input"] = "Texte avec \n des retours à la ligne." });
// Analyse IA après nettoyagevar result = await kernel.RunAsync(iaFunction, new() { ["input"] = cleanedText });
Console.WriteLine($"Résultat : {result}");
5. Organisation des fonctions natives
Les fonctions natives peuvent être organisées en groupes logiques appelés compétences (skills). Chaque compétence est une classe qui encapsule un ensemble de fonctionnalités liées.
Exemple : Compétence Mathématique
public class MathSkill{ [SKFunction("Additionner deux nombres")] public string Add(double x, double y) => (x + y).ToString();
[SKFunction("Multiplier deux nombres")] public string Multiply(double x, double y) => (x * y).ToString();}
Importer cette compétence :
var mathSkill = kernel.ImportSkill(new MathSkill(), "MathSkill");
// Utiliser les deux fonctionsvar addResult = await kernel.RunAsync(mathSkill["Add"], new() { ["x"] = "5", ["y"] = "10" });var multiplyResult = await kernel.RunAsync(mathSkill["Multiply"], new() { ["x"] = "5", ["y"] = "10" });
Console.WriteLine($"Addition : {addResult}, Multiplication : {multiplyResult}");
6. Cas d’utilisation des fonctions natives
- Interfaçage avec des systèmes existants : Accès aux bases de données, APIs, ou systèmes métier.
- Prétraitement et validation : Vérifier ou nettoyer les entrées avant de les transmettre à un modèle IA.
- Calculs ou transformations rapides : Effectuer des opérations qui ne nécessitent pas de traitement IA.
- Extension du noyau : Ajouter des fonctionnalités spécifiques non prises en charge par défaut.
En combinant des fonctions natives avec des modèles IA, Semantic Kernel vous permet de construire des pipelines intelligents et robustes, tout en exploitant des traitements personnalisés et des capacités d’apprentissage machine avancées.