Freigeben über


Erstellen einer Azure KI-Chat-App mit .NET

Erste Schritte mit Semantic Kernel durch Erstellen einer einfachen .NET 8-Chat-Konsolenanwendung. Die Anwendung wird lokal ausgeführt und verwendet das in einem Azure OpenAI-Konto bereitgestellte gpt-35-turbo-OpenAI-Modell. Führen Sie die folgenden Schritte aus, um Azure OpenAI bereitzustellen und zu erfahren, wie Sie Semantic Kernel verwenden.

Erste Schritte mit dem .NET Azure OpenAI SDK durch Erstellen einer einfachen .NET 8-Chat-Konsolenanwendung. Die Anwendung wird lokal ausgeführt und verwendet das in einem Azure OpenAI-Konto bereitgestellte gpt-35-turbo-OpenAI-Modell. Führen Sie die folgenden Schritte aus, um Azure OpenAI bereitzustellen und zu erfahren, wie Sie das .NET Azure OpenAI SDK verwenden.

Voraussetzungen

Bereitstellen der Azure-Ressourcen

Stellen Sie sicher, dass Sie die Voraussetzungen erfüllen, um Zugriff auf Azure OpenAI Service sowie auf die Azure Developer CLI zu haben. Befolgen Sie dann den folgenden Leitfaden, um die ersten Schritte mit der Beispielanwendung zu machen.

  1. Klonen Sie das Repository dotnet/ai-samples.

  2. Navigieren Sie mithilfe eines Terminals oder einer Eingabeaufforderung zum Verzeichnis Schnellstart.

  3. Dadurch werden die Azure OpenAI-Ressourcen bereitgestellt. Es kann mehrere Minuten dauern, bis der Azure OpenAI-Dienst erstellt und das Modell bereitgestellt ist.

    azd up
    

Hinweis

Wenn Sie bereits über einen OpenAI-Dienst verfügen, können Sie die Bereitstellung überspringen und diesen Wert in der Datei Program.cs verwenden (vorzugsweise von einer IConfiguration).

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 haben jetzt die geheimen Benutzerschlüssel konfiguriert und können getestet werden.

Testen der HikerAI-Beispielanwendung

  1. Navigieren Sie mithilfe eines Terminals oder einer Eingabeaufforderung zum Verzeichnis semantic-kernel\02-HikerAI.
  1. Navigieren Sie mithilfe eines Terminals oder einer Eingabeaufforderung zum Verzeichnis azure-openai-sdk\02-HikerAI.
  1. Es ist jetzt an der Zeit, die Konsolenanwendung auszuprobieren. Geben Sie Folgendes ein, um die App auszuführen:

    dotnet run
    

    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

Unsere Anwendung verwendet das Microsoft.SemanticKernel-Paket, das auf NuGetverfügbar ist, um Anforderungen an einen Azure OpenAI-Dienst, der in Azure bereitgestellt wird, zu senden und von ihm zu empfangen.

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.

// == Retrieve the local secrets saved during the Azure deployment ==========
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"];

Der AzureOpenAIChatCompletionService-Dienst unterstützt die Anforderungen und Antworten.

// == Create the Azure OpenAI Chat Completion Service  ==========
AzureOpenAIChatCompletionService service = new(deployment, endpoint, key);

Nachdem der AzureOpenAIChatCompletionService-Dienst erstellt wurde, stellen wir mehr Kontext für das Modell bereit, indem eine Systemaufforderung hinzugefügt wird. Dadurch wird das Modell angewiesen, wie es sich während der Unterhaltung verhalten soll.

// Start the conversation with context for the AI model
ChatHistory chatHistory = new("""
    You are a hiking enthusiast who helps people discover fun hikes in their area. You are upbeat and friendly. 
    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.
    """);

Anschließend können Sie mithilfe der AddUserMessage-Funktion eine Benutzernachricht zum Modell hinzufügen.

Verwenden Sie die GetChatMessageContentAsync-Funktion, damit das Modell eine Antwort basierend auf der Systemaufforderung und der Benutzeranforderung generiert.


// Add user message to chat history
chatHistory.AddUserMessage("Hi! Apparently you can help me find a hike that I will like?");

// Print User Message to console
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

// Get response
var response = await service.GetChatMessageContentAsync(chatHistory, new OpenAIPromptExecutionSettings() { MaxTokens = 400 });

Um den Chatverlauf beizubehalten, stellen Sie sicher, dass Sie die Antwort aus dem Modell hinzufügen.

// Add response to chat history
chatHistory.Add(response);

// Print Response to console
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.

Grundlegendes zum Code

Unsere Anwendung verwendet das Azure.AI.OpenAI-Client-SDK, das auf NuGetverfügbar ist, um Anforderungen an einen Azure OpenAI-Dienst, der in Azure bereitgestellt wird, zu senden und von ihm zu empfangen.

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.

// == Retrieve the local secrets saved during the Azure deployment ==========
var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string openAIEndpoint = config["AZURE_OPENAI_ENDPOINT"];
string openAIDeploymentName = config["AZURE_OPENAI_GPT_NAME"];
string openAiKey = config["AZURE_OPENAI_KEY"];

// == Creating the AIClient ==========
var endpoint = new Uri(openAIEndpoint);
var credentials = new AzureKeyCredential(openAiKey);

Die OpenAIClient-Klasse unterstützt die Anforderungen und Antworten. ChatCompletionOptions gibt Parameter an, wie das Modell reagieren wird.

var openAIClient = new OpenAIClient(endpoint, credentials);

var completionOptions = new ChatCompletionsOptions
{
    MaxTokens = 400,
    Temperature = 1f,
    FrequencyPenalty = 0.0f,
    PresencePenalty = 0.0f,
    NucleusSamplingFactor = 0.95f, // Top P
    DeploymentName = openAIDeploymentName
};

Nachdem der OpenAIClient-Client erstellt wurde, stellen wir mehr Kontext für das Modell bereit, indem eine Systemaufforderung hinzugefügt wird. Dadurch wird das Modell angewiesen, wie es sich während der Unterhaltung verhalten soll.

var systemPrompt = 
"""
You are a hiking enthusiast who helps people discover fun hikes in their area. You are upbeat and friendly. 
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.
""";

completionOptions.Messages.Add(new ChatRequestSystemMessage(systemPrompt));

Anschließend können Sie mithilfe der ChatRequestUserMessage-Klasse eine Benutzernachricht zum Modell hinzufügen.

Verwenden Sie die GetChatCompletionsAsync-Funktion, damit das Modell eine Antwort basierend auf der Systemaufforderung und der Benutzeranforderung generiert.

string userGreeting = """
Hi! 
Apparently you can help me find a hike that I will like?
""";

completionOptions.Messages.Add(new ChatRequestUserMessage(userGreeting));
Console.WriteLine($"\n\nUser >>> {userGreeting}");

ChatCompletions response = await openAIClient.GetChatCompletionsAsync(completionOptions);
ChatResponseMessage assistantResponse = response.Choices[0].Message;
Console.WriteLine($"\n\nAI >>> {assistantResponse.Content}");
completionOptions.Messages.Add(new ChatRequestAssisstantMessage(assistantResponse.Content)); 

Um den Chatverlauf oder den Kontext beizubehalten, stellen Sie sicher, dass Sie die Antwort aus dem Modell als ChatRequestAssistantMessage hinzufügen.

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

Nächste Schritte