Udostępnij za pośrednictwem


Tworzenie aplikacji do czatu usługi Azure AI za pomocą platformy .NET

Rozpocznij pracę z jądrem semantycznym, tworząc prostą aplikację do czatu konsolowego platformy .NET 8. Aplikacja zostanie uruchomiona lokalnie i będzie używać modelu OpenAI gpt-35-turbo wdrożonego na koncie usługi Azure OpenAI. Wykonaj następujące kroki, aby aprowizować usługę Azure OpenAI i dowiedzieć się, jak używać jądra semantycznego.

Rozpocznij pracę z zestawem .NET Azure OpenAI SDK, tworząc prostą aplikację do czatu konsolowego platformy .NET 8. Aplikacja zostanie uruchomiona lokalnie i będzie używać modelu OpenAI gpt-35-turbo wdrożonego na koncie usługi Azure OpenAI. Wykonaj następujące kroki, aby aprowizować usługę Azure OpenAI i dowiedzieć się, jak używać zestawu .NET Azure OpenAI SDK.

Wymagania wstępne

Wdrażanie zasobów platformy Azure

Upewnij się, że postępuj zgodnie z wymaganiami wstępnymi , aby mieć dostęp do usługi Azure OpenAI Service oraz interfejsu wiersza polecenia dla deweloperów platformy Azure, a następnie postępuj zgodnie z poniższym przewodnikiem, aby ustawić rozpoczęcie pracy z przykładową aplikacją.

  1. Sklonuj repozytorium: dotnet/ai-samples

  2. W terminalu lub wierszu polecenia przejdź do katalogu Szybki start.

  3. Spowoduje to aprowizowanie zasobów usługi Azure OpenAI. Utworzenie usługi Azure OpenAI i wdrożenie modelu może potrwać kilka minut.

    azd up
    

Uwaga

Jeśli masz już dostępną usługę Azure OpenAI, możesz pominąć wdrożenie i użyć tej wartości w Program.cs, najlepiej z poziomu elementu IConfiguration.

Rozwiązywanie problemów

W systemie Windows po uruchomieniu azd upprogramu mogą zostać wyświetlone następujące komunikaty o błędach:

postprovision.ps1 nie jest podpisany cyfrowo. Skrypt nie zostanie wykonany w systemie

Skrypt postprovision.ps1 jest wykonywany w celu ustawienia wpisów tajnych użytkownika platformy .NET używanych w aplikacji. Aby uniknąć tego błędu, uruchom następujące polecenie programu PowerShell:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Następnie uruchom azd up ponownie polecenie.

Inny możliwy błąd:

Polecenie "pwsh" nie jest rozpoznawane jako wewnętrzne lub zewnętrzne polecenie, program operacyjny lub plik wsadowy. OSTRZEŻENIE: hak "postprovision" nie powiódł się z kodem zakończenia: "1", ścieżka: ".\infra\post-script\postprovision.ps1". : kod zakończenia: 1 Wykonanie będzie kontynuowane, ponieważ właściwość ContinueOnError została ustawiona na wartość true.

Skrypt postprovision.ps1 jest wykonywany w celu ustawienia wpisów tajnych użytkownika platformy .NET używanych w aplikacji. Aby uniknąć tego błędu, ręcznie uruchom skrypt przy użyciu następującego polecenia programu PowerShell:

.\infra\post-script\postprovision.ps1

Aplikacje sztucznej inteligencji platformy .NET mają teraz skonfigurowane wpisy tajne użytkownika i można je przetestować.

Próba przykładu HikerAI

  1. W terminalu lub wierszu polecenia przejdź do semantic-kernel\02-HikerAI katalogu.
  1. W terminalu lub wierszu polecenia przejdź do azure-openai-sdk\02-HikerAI katalogu.
  1. Nadszedł czas na wypróbowanie aplikacji konsolowej. Wpisz następujące polecenie, aby uruchomić aplikację:

    dotnet run
    

    Jeśli zostanie wyświetlony komunikat o błędzie, zasoby usługi Azure OpenAI mogą nie zakończyć wdrażania. Poczekaj kilka minut i spróbuj ponownie.

Omówienie kodu

Nasza aplikacja używa Microsoft.SemanticKernel pakietu, który jest dostępny w pakiecie NuGet, do wysyłania i odbierania żądań do usługi Azure OpenAI wdrożonej na platformie Azure.

Cała aplikacja znajduje się w pliku Program.cs . Pierwsze kilka wierszy kodu ładuje wpisy tajne i wartości konfiguracji, które zostały ustawione dla dotnet user-secrets Ciebie podczas aprowizacji aplikacji.

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

Usługa AzureOpenAIChatCompletionService ułatwia żądania i odpowiedzi.

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

Po utworzeniu AzureOpenAIChatCompletionService usługi udostępniamy więcej kontekstu do modelu, dodając monit systemowy. Spowoduje to poinstruowanie modelu, jak chcesz, aby działał podczas konwersacji.

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

Następnie możesz dodać komunikat użytkownika do modelu przy użyciu AddUserMessage funkcji .

Aby model wygenerował odpowiedź na podstawie monitu systemowego i żądania użytkownika, użyj GetChatMessageContentAsync funkcji .


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

Aby zachować historię czatów, upewnij się, że dodano odpowiedź z modelu.

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

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

Dostosuj monit systemowy i komunikat użytkownika, aby zobaczyć, jak model reaguje, aby ułatwić znalezienie takiej podwyżki.

Omówienie kodu

Nasza aplikacja używa zestawu SDK klienta, który jest dostępny w rozwiązaniu Azure.AI.OpenAINuGet, do wysyłania i odbierania żądań do usługi Azure OpenAI wdrożonej na platformie Azure.

Cała aplikacja znajduje się w pliku Program.cs . Pierwsze kilka wierszy kodu ładuje wpisy tajne i wartości konfiguracji, które zostały ustawione dla dotnet user-secrets Ciebie podczas aprowizacji aplikacji.

// == 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);

Klasa OpenAIClient ułatwia żądania i odpowiedzi. ChatCompletionOptions określa parametry sposobu reagowania modelu.

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

Po utworzeniu OpenAIClient klienta udostępniamy więcej kontekstu do modelu, dodając monit systemowy. Spowoduje to poinstruowanie modelu, jak chcesz, aby działał podczas konwersacji.

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

Następnie możesz dodać komunikat użytkownika do modelu przy użyciu ChatRequestUserMessage klasy .

Aby model wygenerował odpowiedź na podstawie monitu systemowego i żądania użytkownika, użyj GetChatCompletionsAsync funkcji .

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

Aby zachować historię czatu lub kontekst, upewnij się, że dodano odpowiedź z modelu jako ChatRequestAssistantMessage.

Dostosuj monit systemowy i komunikat użytkownika, aby zobaczyć, jak model reaguje, aby ułatwić znalezienie takiej podwyżki.

Czyszczenie zasobów

Jeśli nie potrzebujesz już przykładowej aplikacji lub zasobów, usuń odpowiednie wdrożenie i wszystkie zasoby.

azd down

Następne kroki