Поделиться через


Получение аналитических сведений о данных из приложения чата искусственного интеллекта .NET Azure

Начало работы с семантической ядром и моделью gpt-35-turbo из простого консольного приложения .NET 8.0. Используйте модель ИИ, чтобы получить аналитические сведения о предыдущих походах. Он состоит из простого консольного приложения, работающего локально, которое считывает файл hikes.md и отправляет запрос в службу Azure OpenAI, развернутую в подписке Azure, и предоставляет результат в консоли. Выполните следующие действия, чтобы подготовить Azure OpenAI и узнать, как использовать семантические ядра.

Начало работы с .NET Azure OpenAI с gpt-35-turbo моделью из простого консольного приложения .NET 8.0. Используйте модель ИИ, чтобы получить аналитические сведения о предыдущих походах. Он состоит из простого консольного приложения, работающего локально, которое считывает файл hikes.md и отправляет запрос в службу Azure OpenAI, развернутую в подписке Azure, и предоставляет результат в консоли. Выполните следующие действия, чтобы подготовить Azure OpenAI и узнать, как использовать пакет SDK для .NET Azure OpenAI.

Необходимые компоненты

Развертывание ресурсов Azure

Убедитесь, что вы следуйте предварительным требованиям, чтобы иметь доступ к Службе Azure OpenAI, а также интерфейс командной строки разработчика Azure, а затем следуйте приведенному ниже руководству, чтобы настроить начало работы с примером приложения.

  1. Клонирование репозитория: dotnet/ai-samples

  2. В терминале или командной строке перейдите в каталог кратких руководств.

  3. Это подготавливает ресурсы Azure OpenAI. Для создания службы Azure OpenAI и развертывания модели может потребоваться несколько минут.

    azd up
    

Примечание.

Если у вас уже есть доступная служба Azure OpenAI, можно пропустить развертывание и использовать это значение в Program.cs, предпочтительно из IConfiguration.

Устранение неполадок

В Windows после выполнения azd upмогут появиться следующие сообщения об ошибках:

postprovision.ps1 не имеет цифровой подписи. Сценарий не будет выполняться в системе

Скрипт postprovision.ps1 выполняется для задания секретов пользователей .NET, используемых в приложении. Чтобы избежать этой ошибки, выполните следующую команду PowerShell:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Затем повторно запустите azd up команду.

Еще одна возможная ошибка:

Pwsh не распознается как внутренняя или внешняя команда, операблирование программы или пакетного файла. ПРЕДУПРЕЖДЕНИЕ: сбой перехватчика postprovision с кодом выхода: "1", путь: ".\infra\post-script\postprovision.ps1". : код выхода: 1 Выполнение будет продолжаться, так как Параметр ContinueOnError имеет значение true.

Скрипт postprovision.ps1 выполняется для задания секретов пользователей .NET, используемых в приложении. Чтобы избежать этой ошибки, вручную запустите скрипт с помощью следующей команды PowerShell:

.\infra\post-script\postprovision.ps1

Теперь приложения .NET AI настроены для пользовательских секретов и их можно протестировать.

Пример "Чат о моих предыдущих походах"

  1. В терминале или командной строке перейдите semantic-kernel\03-ChattingAboutMyHikes в каталог.
  1. В терминале или командной строке перейдите azure-openai-sdk\03-ChattingAboutMyHikes в каталог.
  1. Теперь пора попробовать консольное приложение. Введите следующее, чтобы запустить приложение:

    dotnet run
    

    Если появится сообщение об ошибке, возможно, не завершено развертывание ресурсов Azure OpenAI. Подождите пару минут и повторите попытку.

Обзор кода

В нашем приложении используется Microsoft.SemanticKernel пакет, который доступен в NuGet, для отправки и получения запросов в службу Azure OpenAI, развернутую в Azure.

Все приложение содержится в файле Program.cs . Первые несколько строк кода загружают секреты и значения конфигурации, заданные для dotnet user-secrets вас во время подготовки приложения.

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

AzureOpenAIChatCompletionService Служба упрощает запросы и ответы.

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

AzureOpenAIChatCompletionService После создания клиента мы считываем содержимое файла hikes.md и используем его для предоставления большего контекста модели путем добавления системного запроса. Это указывает модели, как она будет действовать во время беседы.

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

Затем можно добавить в модель сообщение пользователя с помощью AddUserMessage функции.

Чтобы модель создавала ответ на основе системного запроса и запроса пользователя, используйте функцию 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}");

Чтобы сохранить журнал чата или контекст, убедитесь, что вы добавите ответ из модели chatHistoryв . Пришло время снова запросить пользователей о наших данных с помощью AddUserMessage и GetChatMessageContentAsync функции.

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

Настройте системный запрос и измените запрос, задавая различные вопросы (например, сколько раз вы подняли, когда дождь? Сколько раз вы подняли в 2021 году? и т. д.) чтобы узнать, как модель реагирует.

Обзор кода

В нашем приложении используется клиентский Azure.AI.OpenAI пакет SDK, доступный в NuGet, для отправки и получения запросов в службу Azure OpenAI, развернутую в Azure.

Все приложение содержится в файле Program.cs . Первые несколько строк кода загружают секреты и значения конфигурации, заданные для dotnet user-secrets вас во время подготовки приложения.

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

Класс OpenAIClient упрощает запросы и ответы. ChatCompletionOptions указывает параметры реагирования модели.

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 После создания клиента мы считываем содержимое файла hikes.md и используем его для предоставления большего контекста модели путем добавления системного запроса. Это указывает модели, как она будет действовать во время беседы.

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

Затем можно добавить в модель сообщение пользователя с помощью ChatRequestUserMessage класса.

Чтобы модель создавала ответ на основе системного запроса и запроса пользователя, используйте функцию 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)); 

Чтобы сохранить журнал чата или контекст, убедитесь, что вы добавите ответ из модели в качестве ChatRequestAssistantMessage. Пришло время снова запросить пользователей о наших данных с помощью ChatRequestUserMessage и GetChatCompletionsAsync функции.

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

Настройте системный запрос и измените запрос, задавая различные вопросы (например, сколько раз вы подняли, когда дождь? Сколько раз вы подняли в 2021 году? и т. д.) чтобы узнать, как модель реагирует.

Очистка ресурсов

Если вам больше не нужен пример приложения или ресурсов, удалите соответствующее развертывание и все ресурсы.

azd down

Следующие шаги