Упражнение. Реализация службы Azure OpenAI

Завершено

Начнем с простейшей службы. OpenAiService Эта служба содержит только два метода, которые необходимо реализовать, чтобы мы могли сразу реализовать базовые запросы и завершения. Мы не реализуем службу данных Azure Cosmos DB для NoSQL до тех пор, пока не удается сохранить наши сеансы в сеансах отладки.

В этом упражнении у нас есть несколько ключевых требований:

  • Отправьте вопрос от пользователя в помощник ИИ и попросите ответ.
  • Отправьте ряд запросов в помощник ИИ и попросите сводные сведения о беседе.

Задать вопрос модели ИИ

Во-первых, реализуйте беседу с вопросом и ответами, отправив системный запрос, вопрос и идентификатор сеанса, чтобы модель ИИ может предоставить ответ в контексте текущей беседы. Убедитесь, что вы измеряете количество маркеров, которые требуется для анализа запроса и возврата ответа (или завершения в этом контексте).

  1. Откройте файл Services/OpenAiService.cs.

  2. В методе удалите любой существующий GetChatCompletionAsync код заполнителя.

    public async Task<(string completionText, int completionTokens)> GetChatCompletionAsync(string sessionId, string userPrompt)
    {
    }
    
  3. Создайте переменную ChatRequestSystemMessage с именем systemMessage. Для этой переменной User используйте роль и переменную для содержимого _systemPrompt .

    ChatRequestSystemMessage systemMessage = new(_systemPrompt);
    
  4. Создайте переменную ChatRequestUserMessage с именем userMessage. Для этой переменной роль должна быть ChatRole.User и использовать userPrompt параметр конструктора для содержимого сообщения.

    ChatRequestUserMessage userMessage = new(userPrompt);
    
  5. Создайте новую переменную с именем 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 . Мы просто округляем здесь, чтобы упростить вещи.

  6. Асинхронно вызывает GetChatCompletionsAsync метод переменной клиента Azure OpenAI (_client). Передайте созданную переменную options . Сохраните результат в переменной с именем completions типа ChatCompletions.

    ChatCompletions completions = await _client.GetChatCompletionsAsync(options);
    

    Совет

    Метод GetChatCompletionsAsync возвращает объект типа Task<Response<ChatCompletions>>. Класс Response<T> содержит неявное преобразование в тип T , позволяющий выбрать тип в зависимости от потребностей приложения. Результат можно сохранить либо для получения полных метаданных из ответа, либо Response<ChatCompletions> только ChatCompletions если вы заботитесь о содержимом самого результата.

  7. Наконец, верните кортеж в результате GetChatCompletionAsync метода с содержимым завершения в виде строки, количество маркеров, связанных с запросом, и количество маркеров для ответа.

    return (
        response: completions.Choices[0].Message.Content,
        promptTokens: completions.Usage.PromptTokens,
        responseTokens: completions.Usage.CompletionTokens
    );
    
  8. Сохраните файл Services/OpenAiService.cs .

Попросите модель ИИ обобщать беседу

Теперь отправьте модель ИИ другого системного запроса, текущего диалога и идентификатора сеанса, чтобы модель ИИ может суммировать беседу несколькими словами.

  1. В методе удалите любой существующий SummarizeAsync код заполнителя.

    public async Task<string> SummarizeAsync(string sessionId, string conversationText)
    {
    }
    
  2. Создайте переменную ChatRequestSystemMessage с именем systemMessage. Для этой переменной User используйте роль и переменную для содержимого _summarizePrompt .

    ChatRequestSystemMessage systemMessage = new(_summarizePrompt);
    
  3. Создайте другую ChatRequestUserMessage переменную с именем userMessage. User Используйте роль еще раз и используйте conversationText параметр конструктора для содержимого сообщения.

    ChatRequestUserMessage userMessage = new(conversationText);
    
  4. 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
    };
    
  5. _client.GetChatCompletionsAsync Вызывается асинхронно с помощью переменной options в качестве параметра. Сохраните результат в переменной с именем completions типа ChatCompletions.

    ChatCompletions completions = await _client.GetChatCompletionsAsync(options);
    
  6. Возвращает содержимое завершения в виде строки в результате SummarizeAsync метода.

    return completions.Choices[0].Message.Content;
    
  7. Сохраните файл Services/OpenAiService.cs .

Проверьте свою работу

На этом этапе приложение должно иметь достаточно тщательную реализацию службы Azure OpenAI, которую можно протестировать. Помните, что у вас еще нет реализации хранилища данных, поэтому беседы не сохраняются между сеансами отладки.

  1. Откройте новый терминал.

  2. Запустите приложение с включенной горячей перезагрузкой.dotnet watch

    dotnet watch run --non-interactive
    

    Совет

    Функция Горячая перезагрузка включена здесь, если необходимо внести небольшое исправление в код приложения. Дополнительные сведения см. в разделе Поддержка Горячей загрузки .NET для ASP.NET Core.

  3. Visual Studio Code снова запускает простой браузер с веб-приложением, запущенным. В веб-приложении создайте новый сеанс чата и попросите ИИ помощник вопрос. Теперь помощник ИИ реагирует на завершение, созданное моделью. Вы также должны заметить, что поля пользовательского интерфейса маркера теперь заполняются реальным использованием маркеров для каждого завершения и запроса.

    Screenshot of the application running with a connection Azure OpenAI.

  4. Закройте терминал.