Freigeben über


Erweitern von OpenAI mithilfe von Tools und Ausführen einer lokalen Funktion mit .NET

Erstellen Sie für erste Schritte mit KI eine einfache Chatanwendung mit .NET 8-Konsole. Die Anwendung wird lokal ausgeführt und verwendet das gpt-3.5-turbo-Modell von OpenAI, indem Tools verwendet werden, um die Funktionen des Modells durch Aufrufen einer lokalen .NET-Methode zu erweitern. Führen Sie die folgenden Schritte aus, um auf OpenAI zuzugreifen und zu erfahren, wie Sie Semantic Kernel verwenden.

Voraussetzungen

  • .NET 8.0 SDK: Installieren Sie das .NET 8.0 SDK.
  • Ein API-Schlüssel aus OpenAI, damit Sie dieses Beispiel ausführen können
  • Unter Windows ist PowerShell v7+ erforderlich. Um Ihre Version zu überprüfen, führen Sie pwsh in einem Terminal aus. Die aktuelle Version sollte zurückgegeben werden. Wenn ein Fehler zurückgegeben wird, führen Sie den folgenden Befehl aus: dotnet tool update --global PowerShell.

Erstellen Sie für erste Schritte mit KI eine einfache Chatanwendung mit .NET 8-Konsole. Die Anwendung wird lokal ausgeführt und verwendet das in einem Azure OpenAI-Konto bereitgestellte gpt-35-turbo-OpenAI-Modell. Dabei werden Tools verwendet, um die Funktionen des Modells durch Aufrufen einer lokalen .NET-Methode zu erweitern. Führen Sie die folgenden Schritte aus, um Azure OpenAI bereitzustellen und zu erfahren, wie Sie Semantic Kernel verwenden.

Voraussetzungen

Herunterladen des Beispielprojekts

Klonen Sie das GitHub-Repository, das die Beispiel-Apps für alle Schnellstarts enthält:

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

Erstellen des Azure OpenAI-Diensts

Das GitHub-Beispiel-Repository ist als Azure Developer CLI (azd)-Vorlage strukturiert, die azd zum Bereitstellen des Azure OpenAI-Diensts und -Modells für Sie verwenden kann.

  1. Navigieren Sie von einem Terminal oder einer Eingabeaufforderung zum Verzeichnis src\quickstarts\azure-openai des Beispielrepositorys.

  2. Führen Sie den azd up-Befehl aus, um die Azure OpenAI-Ressourcen bereitzustellen. Es kann mehrere Minuten dauern, bis Azure OpenAI Service erstellt und das Modell bereitgestellt ist.

    azd up
    

    azd konfiguriert außerdem die erforderlichen Benutzerschlüssel für die Beispiel-App, z. B. den OpenAI-Zugriffsschlüssel.

    Hinweis

    Wenn während der azd up-Bereitstellung ein Fehler auftritt, lesen Sie den Abschnitt Problembehandlung.

Testen des Beispiels für Wanderprofis

  1. Navigieren Sie mithilfe eines Terminals oder einer Eingabeaufforderung zum Verzeichnis azure-openai\04-HikerAIPro.

  2. Führen Sie die folgenden Befehle aus, um Ihren OpenAI-API-Schlüssel als Geheimnis für die Beispiel-App zu konfigurieren:

    dotnet user-secrets init
    dotnet user-secrets set OpenAIKey <your-openai-key>
    
  3. Verwenden Sie den Befehl dotnet run, um die App auszuführen:

    dotnet run
    
  1. Navigieren Sie mithilfe eines Terminals oder einer Eingabeaufforderung zum Verzeichnis azure-openai\04-HikerAIPro.

  2. Verwenden Sie den Befehl dotnet run, um die App auszuführen:

    dotnet run
    

    Tipp

    Wenn Sie eine Fehlermeldung erhalten, ist die Bereitstellung der Azure OpenAI-Ressourcen möglicherweise noch nicht abgeschlossen. Warten Sie ein paar Minuten, und versuchen Sie es dann noch einmal.

Grundlegendes zum Code

Die Anwendung verwendet das Microsoft.SemanticKernel-Paket zum Senden und Empfangen von Anforderungen an und von OpenAI Service.

Die gesamte Anwendung ist in der Datei Program.cs enthalten. Die ersten Codezeilen legen Konfigurationswerte fest und rufen den OpenAI-Schlüssel ab, der zuvor mit dem Befehl dotnet user-secrets festgelegt wurde.

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

Die Kernel-Klasse unterstützt die Anforderungen und Antworten mit Hilfe vom AddOpenAIChatCompletion-Dienst.

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

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

Die Anwendung verwendet das Microsoft.SemanticKernel-Paket zum Senden und Empfangen von Anforderungen an und von OpenAI Service.

Die gesamte Anwendung ist in der Datei Program.cs enthalten. Mithilfe der ersten Codezeilen werden Geheimnisse und Konfigurationswerte geladen, die während der Anwendungsbereitstellung in dotnet user-secrets für Sie festgelegt wurden.

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"];

Die Kernel-Klasse unterstützt die Anforderungen und Antworten mit Hilfe vom AzureOpenAIChatCompletion-Dienst.

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

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

Die Funktionen ImportPluginFromFunctions und CreateFromMethod definieren die lokale Funktion, die vom Modell aufgerufen wird.

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

Nachdem der kernel-Client erstellt wurde, verwendet der Code einen Systemprompt, um Kontext bereitzustellen und den Ton und den Inhalt der Completion zu beeinflussen. Beachten Sie, wie das Wetter in der Systemaufforderung hervorgehoben wird.

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.
    """);

Die App fügt dem Modell mithilfe der AddUserMessage-Funktion auch eine Benutzermeldung hinzu. Die GetChatMessageContentAsync-Funktion sendet den Chatverlauf an das Modell, um eine Antwort basierend auf den System- und den Benutzerprompts zu generieren.

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}");

Passen Sie die Systemaufforderung und die Benutzernachricht an, um zu sehen, wie das Modell reagiert, um Ihnen zu helfen, eine Wanderung zu finden, die Ihnen gefällt.

Bereinigen von Ressourcen

Wenn Sie die Beispielanwendung oder Ressourcen nicht mehr benötigen, entfernen Sie die entsprechende Bereitstellung und alle Ressourcen.

azd down

Problembehandlung

Unter Windows werden nach dem Ausführen von azd up möglicherweise die folgenden Fehlermeldungen angezeigt:

postprovision.ps1 ist nicht digital signiert. Das Skript wird nicht auf dem System ausgeführt.

Das Skript postprovision.ps1 wird ausgeführt, um die in der Anwendung verwendeten .NET-Benutzergeheimnisse festzulegen. Führen Sie den folgenden PowerShell-Befehl aus, um diesen Fehler zu vermeiden:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Führen Sie dann den azd up-Befehl erneut aus.

Ein weiterer möglicher Fehler:

„pwsh“ wird nicht als interner oder externer Befehle, als operierbare Programm- oder Batchdatei erkannt. WARNUNG: Fehler beim „postprovision“-Hook mit dem Ausgangscode: „1“, Pfad: „.\infra\post-script\postprovision.ps1“. : Exitcode: 1 Ausführung wird fortgesetzt, da ContinueOnError auf „true“ festgelegt wurde.

Das Skript postprovision.ps1 wird ausgeführt, um die in der Anwendung verwendeten .NET-Benutzergeheimnisse festzulegen. Um diesen Fehler zu vermeiden, führen Sie das Skript mithilfe des folgenden PowerShell-Befehls manuell aus:

.\infra\post-script\postprovision.ps1

Die .NET KI-Apps verfügen jetzt über konfigurierte Benutzergeheimnisse und können getestet werden.

Nächste Schritte