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
- Zestaw .NET 8.0 SDK — instalowanie zestawu .NET 8.0 SDK
- Subskrypcja platformy Azure — utwórz bezpłatnie
- Interfejs wiersza polecenia dla deweloperów platformy Azure — instalowanie lub aktualizowanie interfejsu wiersza polecenia dla deweloperów platformy Azure
- Dostęp do usługi Azure OpenAI.
- W systemie Windows wymagany jest program PowerShell
v7+
. Aby zweryfikować wersję, uruchom poleceniepwsh
w terminalu. Powinna zostać zwrócona bieżąca wersja. Jeśli zwraca błąd, wykonaj następujące polecenie:dotnet tool update --global PowerShell
.
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ą.
Sklonuj repozytorium: dotnet/ai-samples
W terminalu lub wierszu polecenia przejdź do katalogu Szybki start.
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 up
programu 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
- W terminalu lub wierszu polecenia przejdź do
semantic-kernel\02-HikerAI
katalogu.
- W terminalu lub wierszu polecenia przejdź do
azure-openai-sdk\02-HikerAI
katalogu.
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.OpenAI
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 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
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla