Megosztás a következőn keresztül:


Betekintés az adataiba egy .NET Azure AI-csevegőalkalmazásból

Első lépések a Szemantic Kernel és a gpt-35-turbo modell használatában egy egyszerű .NET 8.0-s konzolalkalmazásból. Az AI-modell használatával elemzéseket és információkat kaphat az előző túrákról. Ez egy helyileg futó egyszerű konzolalkalmazásból áll, amely felolvassa a fájlt hikes.md , és elküldi a kérést egy Azure-előfizetésben üzembe helyezett Azure OpenAI-szolgáltatásnak, és megadja az eredményt a konzolon. Kövesse ezeket a lépéseket az Azure OpenAI kiépítéséhez, és ismerje meg a Szemantic Kernel használatát.

A .NET Azure OpenAI használatának első lépései egy gpt-35-turbo egyszerű .NET 8.0-s konzolalkalmazásból származó modellel. Az AI-modell használatával elemzéseket és információkat kaphat az előző túrákról. Ez egy helyileg futó egyszerű konzolalkalmazásból áll, amely felolvassa a fájlt hikes.md , és elküldi a kérést egy Azure-előfizetésben üzembe helyezett Azure OpenAI-szolgáltatásnak, és megadja az eredményt a konzolon. Kövesse az alábbi lépéseket az Azure OpenAI kiépítéséhez, és ismerje meg a .NET Azure OpenAI SDK használatát.

Előfeltételek

Az Azure-erőforrások üzembe helyezése

Győződjön meg arról, hogy az Azure OpenAI szolgáltatáshoz és az Azure Developer CLI-hez való hozzáférés előfeltételeit követi, majd a mintaalkalmazással való kezdéshez kövesse az alábbi útmutatót.

  1. Az adattár klónozása: dotnet/ai-samples

  2. Egy terminálból vagy parancssorból lépjen a rövid útmutatók könyvtárába .

  3. Ez kiépítja az Azure OpenAI-erőforrásokat. Az Azure OpenAI szolgáltatás létrehozása és a modell üzembe helyezése több percet is igénybe vehet.

    azd up
    

Feljegyzés

Ha már rendelkezik elérhető Azure OpenAI szolgáltatással, kihagyhatja az üzembe helyezést, és ezt az értéket használhatja a Program.cs, lehetőleg egy IConfiguration.

Hibaelhárítás

Windows rendszeren a következő hibaüzenetek jelenhetnek meg a futtatás azd upután:

A postprovision.ps1 nincs digitálisan aláírva. A szkript nem lesz végrehajtva a rendszeren

A postprovision.ps1 szkript végrehajtása az alkalmazásban használt .NET-felhasználói titkos kódok beállításához történik. A hiba elkerülése érdekében futtassa a következő PowerShell-parancsot:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Ezután futtassa újra a azd up parancsot.

Egy másik lehetséges hiba:

A "pwsh" nem ismerhető fel belső vagy külső parancsként, kezelhető programként vagy kötegelt fájlként. FIGYELMEZTETÉS: A "postprovision" horog a következő kilépési kóddal meghiúsult: '1', Elérési út: '.\infra\post-script\postprovision.ps1'. : kilépési kód: 1 A végrehajtás folytatódik, mivel a ContinueOnError értéke igaz.

A postprovision.ps1 szkript végrehajtása az alkalmazásban használt .NET-felhasználói titkos kódok beállításához történik. A hiba elkerülése érdekében futtassa manuálisan a szkriptet a következő PowerShell-paranccsal:

.\infra\post-script\postprovision.ps1

A .NET AI-alkalmazások most már konfigurálva vannak a felhasználói titkos kulcsokkal, és tesztelhetők.

Próbálja ki a "Csevegés az előző túrákról" mintát

  1. Nyissa meg a semantic-kernel\03-ChattingAboutMyHikes könyvtárat egy terminálból vagy parancssorból.
  1. Nyissa meg a azure-openai-sdk\03-ChattingAboutMyHikes könyvtárat egy terminálból vagy parancssorból.
  1. Itt az ideje kipróbálni a konzolalkalmazást. Az alkalmazás futtatásához írja be a következőt:

    dotnet run
    

    Ha hibaüzenetet kap, előfordulhat, hogy az Azure OpenAI-erőforrások nem fejezték be az üzembe helyezést. Várjon néhány percet, és próbálkozzon újra.

A kód megismerése

Az alkalmazás a Microsoft.SemanticKernel NuGeten elérhető csomagot használja a kérések Azure-ban üzembe helyezett Azure OpenAI-szolgáltatásba való küldéséhez és fogadásához.

A teljes alkalmazás a Program.cs fájlban található. Az első több sornyi kód betölti azokat a titkos kulcsokat és konfigurációs értékeket, amelyek az dotnet user-secrets alkalmazás kiépítése során lettek beállítva az Ön számára.

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

A AzureOpenAIChatCompletionService szolgáltatás megkönnyíti a kéréseket és a válaszokat.

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

AzureOpenAIChatCompletionService Az ügyfél létrehozása után beolvasjuk a fájl hikes.md tartalmát, és egy rendszerkérés hozzáadásával további kontextust biztosítunk a modellnek. Ez arra utasítja a modellt, hogy hogyan működjön a beszélgetés során.

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

Ezután a függvény használatával hozzáadhat egy felhasználói üzenetet a AddUserMessage modellhez.

Ha azt szeretné, hogy a modell a rendszerkérés és a felhasználói kérés alapján hozzon létre választ, használja a függvényt GetChatMessageContentAsync .

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

A csevegési előzmények vagy környezet fenntartásához adja hozzá a modell válaszát a chatHistory. Itt az ideje, hogy a felhasználói kérést az adatokról ismét az és GetChatMessageContentAsync a AddUserMessage függvény használatával.

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

Testre szabhatja a rendszer kérését, és módosíthatja a kérést, és különböző kérdéseket tehet fel (például: Hányszor túrázott, amikor esett? Hányszor túrázott 2021-ben? stb.) a modell válaszának megtekintéséhez.

A kód megismerése

Az alkalmazás a Azure.AI.OpenAI NuGeten elérhető ügyféloldali SDK használatával küld és fogad kéréseket egy Azure-ban üzembe helyezett Azure OpenAI-szolgáltatásnak.

A teljes alkalmazás a Program.cs fájlban található. Az első több sornyi kód betölti azokat a titkos kulcsokat és konfigurációs értékeket, amelyek az dotnet user-secrets alkalmazás kiépítése során lettek beállítva az Ön számára.

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

Az OpenAIClient osztály megkönnyíti a kéréseket és a válaszokat. ChatCompletionOptions a modell válaszának paramétereit adja meg.

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 Az ügyfél létrehozása után beolvasjuk a fájl hikes.md tartalmát, és egy rendszerkérés hozzáadásával további kontextust biztosítunk a modellnek. Ez arra utasítja a modellt, hogy hogyan működjön a beszélgetés során.

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

Ezután hozzáadhat egy felhasználói üzenetet a modellhez az ChatRequestUserMessage osztály használatával.

Ha azt szeretné, hogy a modell a rendszerkérés és a felhasználói kérés alapján hozzon létre választ, használja a függvényt GetChatCompletionsAsync .

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

A csevegési előzmények vagy környezet fenntartásához adja hozzá a modell válaszát ChatRequestAssistantMessage. Itt az ideje, hogy a felhasználói kérést az adatokról ismét az és GetChatCompletionsAsync a ChatRequestUserMessage függvény használatával.

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

Testre szabhatja a rendszer kérését, és módosíthatja a kérést, és különböző kérdéseket tehet fel (például: Hányszor túrázott, amikor esett? Hányszor túrázott 2021-ben? stb.) a modell válaszának megtekintéséhez.

Az erőforrások eltávolítása

Ha már nincs szüksége a mintaalkalmazásra vagy erőforrásokra, távolítsa el a megfelelő üzembe helyezést és az összes erőforrást.

azd down

Következő lépések