Sdílet prostřednictvím


Vytvoření chatovací aplikace Azure AI pomocí .NET

Začněte se sémantickým jádrem vytvořením jednoduché konzolové chatovací aplikace .NET 8. Aplikace se spustí místně a použije model OpenAI gpt-35-turbo nasazený do účtu Azure OpenAI. Pomocí těchto kroků zřiďte Azure OpenAI a zjistěte, jak používat sémantické jádro.

Začněte se sadou .NET Azure OpenAI SDK vytvořením jednoduché konzolové chatovací aplikace .NET 8. Aplikace se spustí místně a použije model OpenAI gpt-35-turbo nasazený do účtu Azure OpenAI. Pomocí těchto kroků zřiďte Azure OpenAI a zjistěte, jak používat sadu .NET Azure OpenAI SDK.

Požadavky

Nasazení prostředků Azure

Ujistěte se, že dodržujete požadavky , abyste měli přístup ke službě Azure OpenAI a rozhraní příkazového řádku Azure Developer CLI, a pak postupujte podle následujícího průvodce a nastavte ji s ukázkovou aplikací.

  1. Klonování úložiště: dotnet/ai-samples

  2. Z terminálu nebo příkazového řádku přejděte do adresáře Rychlý start .

  3. Tím se zřídí prostředky Azure OpenAI. Vytvoření služby Azure OpenAI a nasazení modelu může trvat několik minut.

    azd up
    

Poznámka:

Pokud už máte k dispozici službu Azure OpenAI, můžete nasazení přeskočit a použít tuto hodnotu v Program.cs, nejlépe z některého IConfiguration.

Odstraňování potíží

Ve Windows se můžou po spuštění azd upzobrazit následující chybové zprávy:

postprovision.ps1 není digitálně podepsán. Skript se v systému nespustí.

Skript postprovision.ps1 se spustí a nastaví tajné kódy uživatele .NET používané v aplikaci. Pokud se chcete této chybě vyhnout, spusťte následující příkaz PowerShellu:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Pak příkaz spusťte azd up znovu.

Další možná chyba:

"pwsh" není rozpoznán jako interní nebo externí příkaz, operovatelný program nebo dávkový soubor. UPOZORNĚNÍ: "postprovision" hook selhal s ukončovacím kódem: '1', Cesta: '.\infra\post-script\postprovision.ps1'. : ukončovací kód: 1 Provádění bude pokračovat, protože ContinueOnError byl nastaven na hodnotu true.

Skript postprovision.ps1 se spustí a nastaví tajné kódy uživatele .NET používané v aplikaci. Pokud se chcete této chybě vyhnout, spusťte skript ručně pomocí následujícího příkazu PowerShellu:

.\infra\post-script\postprovision.ps1

Aplikace .NET AI teď mají nakonfigurované tajné kódy uživatelů a dají se testovat.

Vyzkoušení ukázky HikerAI

  1. Z terminálu nebo příkazového řádku přejděte do semantic-kernel\02-HikerAI adresáře.
  1. Z terminálu nebo příkazového řádku přejděte do azure-openai-sdk\02-HikerAI adresáře.
  1. Teď je čas vyzkoušet konzolovou aplikaci. Zadáním následujícího příkazu spusťte aplikaci:

    dotnet run
    

    Pokud se zobrazí chybová zpráva, že se nasazení prostředků Azure OpenAI nedokončily. Počkejte několik minut a zkuste to znovu.

Vysvětlení kódu

Naše aplikace používá Microsoft.SemanticKernel balíček, který je k dispozici na NuGetu, k odesílání a přijímání požadavků do služby Azure OpenAI nasazené v Azure.

Celá aplikace je obsažena v souboru Program.cs . Prvních několik řádků kódu načte tajné kódy a konfigurační hodnoty, které byly nastaveny ve dotnet user-secrets vámi během zřizování aplikace.

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

Služba AzureOpenAIChatCompletionService usnadňuje požadavky a odpovědi.

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

AzureOpenAIChatCompletionService Po vytvoření služby poskytneme modelu další kontext přidáním systémové výzvy. Tím dáte modelu pokyn, jak se má během konverzace chovat.

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

Pak můžete do modelu přidat uživatelskou zprávu pomocí AddUserMessage funkce.

Pokud chcete, aby model vygeneroval odpověď na základě systémové výzvy a požadavku uživatele, použijte GetChatMessageContentAsync funkci.


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

Pokud chcete zachovat historii chatu, nezapomeňte přidat odpověď z modelu.

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

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

Přizpůsobte si výzvu systému a uživatelskou zprávu, abyste viděli, jak model reaguje, aby vám pomohl najít trasu, která se vám bude líbit.

Vysvětlení kódu

Naše aplikace používá klientskou Azure.AI.OpenAI sadu SDK, která je k dispozici na NuGetu, k odesílání a přijímání požadavků do služby Azure OpenAI nasazené v Azure.

Celá aplikace je obsažena v souboru Program.cs . Prvních několik řádků kódu načte tajné kódy a konfigurační hodnoty, které byly nastaveny ve dotnet user-secrets vámi během zřizování aplikace.

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

Třída OpenAIClient usnadňuje požadavky a odpovědi. ChatCompletionOptions určuje parametry, jak bude model reagovat.

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

OpenAIClient Po vytvoření klienta poskytneme modelu další kontext přidáním systémové výzvy. Tím dáte modelu pokyn, jak se má během konverzace chovat.

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

Pak můžete do modelu přidat zprávu uživatele pomocí ChatRequestUserMessage třídy.

Pokud chcete, aby model vygeneroval odpověď na základě systémové výzvy a požadavku uživatele, použijte GetChatCompletionsAsync funkci.

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

Pokud chcete zachovat historii chatu nebo kontext, nezapomeňte přidat odpověď z modelu jako ChatRequestAssistantMessage.

Přizpůsobte si výzvu systému a uživatelskou zprávu, abyste viděli, jak model reaguje, aby vám pomohl najít trasu, která se vám bude líbit.

Vyčištění prostředků

Pokud už ukázkovou aplikaci nebo prostředky nepotřebujete, odeberte odpovídající nasazení a všechny prostředky.

azd down

Další kroky