Sdílet prostřednictvím


Získání přehledu o datech z chatovací aplikace .NET Azure AI

Začněte se sémantickým jádrem a modelem gpt-35-turbo z jednoduché konzolové aplikace .NET 8.0. Pomocí modelu AI můžete získat analýzy a informace o předchozích túrách. Skládá se z jednoduché konzolové aplikace spuštěné místně, která přečte soubor hikes.md a odešle žádost službě Azure OpenAI nasazené ve vašem předplatném Azure a poskytne výsledek v konzole. Pomocí těchto kroků zřiďte Azure OpenAI a zjistěte, jak používat sémantické jádro.

Začínáme s .NET Azure OpenAI s modelem gpt-35-turbo z jednoduché konzolové aplikace .NET 8.0 Pomocí modelu AI můžete získat analýzy a informace o předchozích túrách. Skládá se z jednoduché konzolové aplikace spuštěné místně, která přečte soubor hikes.md a odešle žádost službě Azure OpenAI nasazené ve vašem předplatném Azure a poskytne výsledek v konzole. 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šejte ukázku Chatování o mých předchozích pěších trasách.

  1. Z terminálu nebo příkazového řádku přejděte do semantic-kernel\03-ChattingAboutMyHikes adresáře.
  1. Z terminálu nebo příkazového řádku přejděte do azure-openai-sdk\03-ChattingAboutMyHikes 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.

Prozkoumání 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í klienta si přečteme obsah souboru hikes.md a použijeme ho k poskytnutí dalšího kontextu modelu přidáním systémové výzvy. Tím dáte modelu pokyn, jak se má během konverzace chovat.

// Provide context for the AI model
ChatHistory chatHistory = new($"""
    You are upbeat and friendly. You introduce yourself when first saying hello. 
    Provide a short answer only based on the user hiking records below:  

    {File.ReadAllText("hikes.md")}
    """);
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

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.

// Start the conversation
chatHistory.AddUserMessage("Hi!");
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}");

Pokud chcete zachovat historii chatu nebo kontext, nezapomeňte do chatHistorymodelu přidat odpověď z modelu . Je čas, aby uživatel znovu požádal o naše data pomocí AddUserMessage funkce a GetChatMessageContentAsync funkce.

// Continue the conversation with a question.
chatHistory.AddUserMessage("I would like to know the ratio of the hikes I've done in Canada compared to other countries.");
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}");

Přizpůsobte si výzvu k systému a změňte žádost a požádejte o různé otázky (např. kolikrát jste se vycházali, když pršelo? Kolikrát jste se v roce 2021 chytli? atd.) a podívejte se, jak model reaguje.

Prozkoumání 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 si přečteme obsah souboru hikes.md a použijeme ho k poskytnutí dalšího kontextu modelu 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 upbeat and friendly. You introduce yourself when first saying hello. 
Provide a short answer only based on the user hiking records below:  

""" + markdown;

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

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. Je čas, aby uživatel znovu požádal o naše data pomocí ChatRequestUserMessage funkce a GetChatCompletionsAsync funkce.

var hikeRequest = 
"""
I would like to know the ration of hike I did in Canada compare to hikes done in other countries.
""";

Console.WriteLine($"\n\nUser >>> {hikeRequest}");
completionOptions.Messages.Add(new ChatRequestUserMessage(hikeRequest));
response = await openAIClient.GetChatCompletionsAsync(completionOptions);

Přizpůsobte si výzvu k systému a změňte žádost a požádejte o různé otázky (např. kolikrát jste se vycházali, když pršelo? Kolikrát jste se v roce 2021 chytli? atd.) a podívejte se, jak model reaguje.

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