Partage via


Étendre OpenAI à l’aide d’Outils et exécuter une fonction locale avec .NET

Prise en main de l’IA en créant une application de conversation de console .NET 8 simple. L’application s’exécute localement et utilise le modèle gpt-3.5-turbo OpenAI, à l’aide d’Outils pour étendre ses fonctionnalités en appelant une méthode .NET locale. Suivez ces étapes pour obtenir l’accès à OpenAI et découvrir comment utiliser Semantic Kernel.

Prérequis

  • Kit de développement logiciel (SDK) .NET 8.0 : installez le Kit de développement logiciel (SDK) .NET 8.0.
  • Une clé API d’OpenAI pour pouvoir exécuter cet échantillon.
  • Sur Windows, PowerShell v7+ est requis. Pour valider votre version, exécutez pwsh dans un terminal. Elle doit retourner la version actuelle. Si une erreur est retournée, exécutez la commande suivante : dotnet tool update --global PowerShell.

Démarrez avec l’IA en créant une application de conversation de console .NET 8 simple. L’application s’exécute localement et utilise le modèle OpenAI gpt-35-turbo déployé dans un compte Azure OpenAI. Elle utilise Tools pour étendre les fonctionnalités du modèle en appelant une méthode .NET locale. Suivez ces étapes pour approvisionner Azure OpenAI et apprendre à utiliser Semantic Kernel.

Prérequis

Récupération de l’exemple de projet

Clonez le référentiel GitHub contenant les exemples d’applications pour tous les démarrages rapides :

git clone https://github.com/dotnet/ai-samples.git

Créer le service Azure OpenAI

L’exemple de référentiel GitHub est structuré en tant que modèle Azure Developer CLI (azd), que azd peut utiliser pour approvisionner le service et le modèle Azure OpenAI pour vous.

  1. Depuis un terminal ou une invite de commandes, accédez au répertoire src\quickstarts\azure-openai de l’exemple de référentiel.

  2. Exécutez la commande azd up pour approvisionner les ressources Azure OpenAI. La création du service Azure OpenAI et le déploiement du modèle peuvent prendre plusieurs minutes.

    azd up
    

    azd configure également les secrets utilisateur requis pour l’exemple d’application, comme la clé d’accès OpenAI.

    Remarque

    Si vous rencontrez une erreur pendant le déploiement azd up, consultez la section Résolution des problèmes.

Essayez l’échantillon hiker pro

  1. À partir d’un terminal ou d’une invite de commandes, accédez au répertoire azure-openai\04-HikerAIPro.

  2. Exécutez les commandes suivantes pour configurer votre clé API OpenAI en tant que secret pour l’exemple d’application :

    dotnet user-secrets init
    dotnet user-secrets set OpenAIKey <your-openai-key>
    
  3. Utilisez la commande dotnet run pour exécuter l’application :

    dotnet run
    
  1. À partir d’un terminal ou d’une invite de commandes, accédez au répertoire azure-openai\04-HikerAIPro.

  2. Utilisez la commande dotnet run pour exécuter l’application :

    dotnet run
    

    Conseil

    Si vous recevez un message d’erreur, c’est que le déploiement des ressources Azure OpenAI n’est peut-être pas terminé. Attendez quelques minutes et réessayez.

Comprendre le code

L’application utilise le package Microsoft.SemanticKernel pour envoyer et recevoir des demandes au service OpenAI.

Toute l’application est contenue dans le fichier Program.cs. Les premières lignes de code définissent les valeurs de la configuration et obtiennent la clé OpenAI qui a été précédemment définie en utilisant la commande dotnet user-secrets.

var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string model = "gpt-3.5-turbo";
string key = config["OpenAIKey"];

La classe Kernel facilite les requêtes et les réponses à l’aide du service AddOpenAIChatCompletion.

// Create a Kernel containing the OpenAI Chat Completion Service
IKernelBuilder b = Kernel.CreateBuilder();

Kernel kernel = b
    .AddOpenAIChatCompletion(model, key)
    .Build();

L’application utilise le package Microsoft.SemanticKernel pour envoyer et recevoir des demandes au service OpenAI.

Toute l’application est contenue dans le fichier Program.cs. Les premières lignes de code chargent les secrets et les valeurs de configuration qui ont été définis pour vous dans le dotnet user-secrets pendant l’approvisionnement de l’application.

var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string endpoint = config["AZURE_OPENAI_ENDPOINT"];
string deployment = config["AZURE_OPENAI_GPT_NAME"];
string key = config["AZURE_OPENAI_KEY"];

La classe Kernel facilite les requêtes et les réponses à l’aide du service AzureOpenAIChatCompletion.

// Create a Kernel containing the Azure OpenAI Chat Completion Service
IKernelBuilder b = Kernel.CreateBuilder();

Kernel kernel = b
    .AddAzureOpenAIChatCompletion(deployment, endpoint, key)
    .Build();

Les fonctions ImportPluginFromFunctions et CreateFromMethod définissent la fonction locale qui sera appelée par le modèle.

// Add a new plugin with a local .NET function that should be available to the AI model
// For convenience and clarity of into the code, this standalone local method handles tool call responses. It will fake a call to a weather API and return the current weather for the specified location.
kernel.ImportPluginFromFunctions("WeatherPlugin",
[
    KernelFunctionFactory.CreateFromMethod(
        ([Description("The city, e.g. Montreal, Sidney")] string location, string unit = null) =>
    {
        // Here you would call a weather API to get the weather for the location
        return "Periods of rain or drizzle, 15 C";
    }, "get_current_weather", "Get the current weather in a given location")
]);

Une fois le client kernel créé, le code utilise une invite du système pour fournir un contexte et influencer le ton d’achèvement et le contenu. Notez la façon dont la météo est mise en évidence dans l’invite système.

ChatHistory chatHistory = new("""
    You are a hiking enthusiast who helps people discover fun hikes in their area.
    You are upbeat and friendly. Good weather is important for a good hike. 
    Only make recommendations if the weather is good or if people insist.
    You introduce yourself when first saying hello. When helping people out,
    you always ask them for this information to inform the hiking recommendation you provide:

    1. Where they are located
    2. What hiking intensity they are looking for

    You will then provide three suggestions for nearby hikes that vary in length
    after you get that information. You will also share an interesting fact about the local
    nature on the hikes when making a recommendation.
    """);

L’application ajoute également un message utilisateur au modèle à l’aide de la fonction AddUserMessage. La fonction GetChatMessageContentAsync envoie l’historique des conversations au modèle pour générer une réponse basée sur les invites du système et les prompts de l’utilisateur.

chatHistory.AddUserMessage("""
    Is the weather is good today for a hike?
    If yes, I live in the greater Montreal area and would like an easy hike. 
    I don't mind driving a bit to get there. I don't want the hike to be over 10 miles round trip.
    I'd consider a point-to-point hike.
    I want the hike to be as isolated as possible. I don't want to see many people.
    I would like it to be as bug free as possible.
    """);

Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

chatHistory.Add(await service.GetChatMessageContentAsync(
    chatHistory, 
    new OpenAIPromptExecutionSettings()
    { 
        MaxTokens = 400 
    }));

Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

Personnalisez l’invite système et le message utilisateur pour voir comment le modèle répond pour vous aider à trouver une randonnée qui vous plairait.

Nettoyer les ressources

Lorsque vous n’avez plus besoin de l’exemple d’application ou de ressources, supprimez le déploiement correspondant et toutes les ressources.

azd down

Résolution des problèmes

Sur Windows, vous risquez d’obtenir les messages d’erreur suivants après avoir exécuté azd up :

postprovision.ps1 n’est pas signé numériquement. Le script ne s’exécute pas sur le système

Le script postprovision.ps1 est exécuté pour définir les secrets utilisateur .NET utilisés dans l’application. Pour éviter cette erreur, exécutez la commande PowerShell suivante :

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Réexécutez ensuite la commande azd up.

Autre erreur possible :

« pwsh » n’est pas reconnu comme commande interne ou externe, programme exécutable ou fichier batch. AVERTISSEMENT : échec du hook « postprovision » avec le code de sortie : « 1 ». Chemin d’accès : « .\infra\post-script\postprovision.ps1 ». : code de sortie : 1. L’exécution continue puisque ContinueOnError est défini sur true.

Le script postprovision.ps1 est exécuté pour définir les secrets utilisateur .NET utilisés dans l’application. Pour éviter cette erreur, exécutez manuellement le script à l’aide de la commande PowerShell suivante :

.\infra\post-script\postprovision.ps1

Les applications IA .NET ont désormais des secrets utilisateur configurés et vous pouvez les tester.

Étapes suivantes