Упражнение. Реализация службы Azure OpenAI
Начнем с простейшей службы. OpenAiService
Эта служба содержит только два метода, которые необходимо реализовать, чтобы мы могли сразу реализовать базовые запросы и завершения. Мы не реализуем службу данных Azure Cosmos DB для NoSQL до тех пор, пока не удается сохранить наши сеансы в сеансах отладки.
В этом упражнении у нас есть несколько ключевых требований:
- Отправьте вопрос от пользователя в помощник ИИ и попросите ответ.
- Отправьте ряд запросов в помощник ИИ и попросите сводные сведения о беседе.
Задать вопрос модели ИИ
Во-первых, реализуйте беседу с вопросом и ответами, отправив системный запрос, вопрос и идентификатор сеанса, чтобы модель ИИ может предоставить ответ в контексте текущей беседы. Убедитесь, что вы измеряете количество маркеров, которые требуется для анализа запроса и возврата ответа (или завершения в этом контексте).
Откройте файл Services/OpenAiService.cs.
В методе удалите любой существующий
GetChatCompletionAsync
код заполнителя.public async Task<(string completionText, int completionTokens)> GetChatCompletionAsync(string sessionId, string userPrompt) { }
Создайте переменную
ChatRequestSystemMessage
с именемsystemMessage
. Для этой переменнойUser
используйте роль и переменную для содержимого_systemPrompt
.ChatRequestSystemMessage systemMessage = new(_systemPrompt);
Создайте переменную
ChatRequestUserMessage
с именемuserMessage
. Для этой переменной роль должна бытьChatRole.User
и использоватьuserPrompt
параметр конструктора для содержимого сообщения.ChatRequestUserMessage userMessage = new(userPrompt);
Создайте новую переменную с именем
options
типаChatCompletionsOptions
. Добавьте две переменные сообщения вMessages
список, задайте значениеUser
sessionId
параметра конструктора, задайте значениеMaxTokens
4000
и задайте остальные свойства в рекомендуемые значения здесь.ChatCompletionsOptions options = new() { DeploymentName = _modelName, Messages = { systemMessage, userMessage }, User = sessionId, MaxTokens = 4000, Temperature = 0.3f, NucleusSamplingFactor = 0.5f, FrequencyPenalty = 0, PresencePenalty = 0 };
Совет
4096 — максимальное количество маркеров для модели gpt-35-turbo . Мы просто округляем здесь, чтобы упростить вещи.
Асинхронно вызывает
GetChatCompletionsAsync
метод переменной клиента Azure OpenAI (_client
). Передайте созданную переменнуюoptions
. Сохраните результат в переменной с именемcompletions
типаChatCompletions
.ChatCompletions completions = await _client.GetChatCompletionsAsync(options);
Совет
Метод
GetChatCompletionsAsync
возвращает объект типаTask<Response<ChatCompletions>>
. КлассResponse<T>
содержит неявное преобразование в типT
, позволяющий выбрать тип в зависимости от потребностей приложения. Результат можно сохранить либо для получения полных метаданных из ответа, либоResponse<ChatCompletions>
толькоChatCompletions
если вы заботитесь о содержимом самого результата.Наконец, верните кортеж в результате
GetChatCompletionAsync
метода с содержимым завершения в виде строки, количество маркеров, связанных с запросом, и количество маркеров для ответа.return ( response: completions.Choices[0].Message.Content, promptTokens: completions.Usage.PromptTokens, responseTokens: completions.Usage.CompletionTokens );
Сохраните файл Services/OpenAiService.cs .
Попросите модель ИИ обобщать беседу
Теперь отправьте модель ИИ другого системного запроса, текущего диалога и идентификатора сеанса, чтобы модель ИИ может суммировать беседу несколькими словами.
В методе удалите любой существующий
SummarizeAsync
код заполнителя.public async Task<string> SummarizeAsync(string sessionId, string conversationText) { }
Создайте переменную
ChatRequestSystemMessage
с именемsystemMessage
. Для этой переменнойUser
используйте роль и переменную для содержимого_summarizePrompt
.ChatRequestSystemMessage systemMessage = new(_summarizePrompt);
Создайте другую
ChatRequestUserMessage
переменную с именемuserMessage
.User
Используйте роль еще раз и используйтеconversationText
параметр конструктора для содержимого сообщения.ChatRequestUserMessage userMessage = new(conversationText);
ChatCompletionsOptions
Создайте переменнуюoptions
с двумя переменными сообщения вMessages
списке, задайте параметрsessionId
конструктора,User
MaxTokens
установите200
значение , а остальные свойства — рекомендуемыми значениями.ChatCompletionsOptions options = new() { DeploymentName = _modelName, Messages = { systemMessage, userMessage }, User = sessionId, MaxTokens = 200, Temperature = 0.0f, NucleusSamplingFactor = 1.0f, FrequencyPenalty = 0, PresencePenalty = 0 };
_client.GetChatCompletionsAsync
Вызывается асинхронно с помощью переменнойoptions
в качестве параметра. Сохраните результат в переменной с именемcompletions
типаChatCompletions
.ChatCompletions completions = await _client.GetChatCompletionsAsync(options);
Возвращает содержимое завершения в виде строки в результате
SummarizeAsync
метода.return completions.Choices[0].Message.Content;
Сохраните файл Services/OpenAiService.cs .
Проверьте свою работу
На этом этапе приложение должно иметь достаточно тщательную реализацию службы Azure OpenAI, которую можно протестировать. Помните, что у вас еще нет реализации хранилища данных, поэтому беседы не сохраняются между сеансами отладки.
Откройте новый терминал.
Запустите приложение с включенной горячей перезагрузкой.
dotnet watch
dotnet watch run --non-interactive
Совет
Функция Горячая перезагрузка включена здесь, если необходимо внести небольшое исправление в код приложения. Дополнительные сведения см. в разделе Поддержка Горячей загрузки .NET для ASP.NET Core.
Visual Studio Code снова запускает простой браузер с веб-приложением, запущенным. В веб-приложении создайте новый сеанс чата и попросите ИИ помощник вопрос. Теперь помощник ИИ реагирует на завершение, созданное моделью. Вы также должны заметить, что поля пользовательского интерфейса маркера теперь заполняются реальным использованием маркеров для каждого завершения и запроса.
Закройте терминал.