Добавление возможности распознавания естественного языка в функционал бота

ОБЛАСТЬ ПРИМЕНЕНИЯ: ПАКЕТ SDK версии 4

Примечание.

Распознавание речи (LUIS) будет прекращен 1 октября 2025 года. Начиная с 1 апреля 2023 года вы не сможете создавать новые ресурсы LUIS. Новая версия распознавания речи теперь доступна как часть языка ИИ Azure.

Распознавание речи (CLU) — это обновленная версия LUIS. Дополнительные сведения о поддержке распознавания речи в пакете SDK Bot Framework см. в разделе "Распознавание естественного языка".

Возможность понимать, что пользователь хочет сказать и какой вкладывает контекст, может быть сложной задачей, но также может способствовать более естественной беседе с ботом. API распознавания речи — это облачная служба API, которая позволяет сделать так, чтобы бот мог распознавать намерения пользовательских сообщений, использовать более естественный язык пользователя и лучше направлять поток общения.

В этом разделе рассматривается добавление LUIS в приложение для бронирования авиабилетов, чтобы распознавать намерения и сущности в введенных пользователем данных.

Примечание.

Пакеты SDK для JavaScript, C# и Python для Bot Framework по-прежнему будут поддерживаться, однако пакет SDK java отменяется с окончательной долгосрочной поддержкой, заканчивающейся в ноябре 2023 года. В этом репозитории будут выполняться только критически важные исправления безопасности и ошибок.

Существующие боты, созданные с помощью пакета SDK для Java, будут продолжать функционировать.

Для создания нового бота рекомендуется использовать Power Virtual Agent и ознакомиться с выбором подходящего решения чат-бота.

Дополнительные сведения см. в статье "Будущее создания бота".

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

  • Учетная запись LUIS.
  • Копия примера Core Bot в C#, JavaScript, JavaScript или Python.
  • Знания об основах бота и обработке естественного языка.

Об этом примере

Этот пример основного бота реализует логику приложения для бронирования авиабилетов. С помощью службы LUIS он распознает пользовательский ввод и возвращает наиболее вероятное из обнаруженных LUIS намерений.

Языковая модель содержит три намерения: Book Flight, Cancel и None. Служба LUIS будет использовать эти намерения для распознавания желаний пользователя в полученном от него сообщении. Языковая модель также определяет сущности, которые LUIS может извлекать из входных данных пользователя, таких как аэропорты вылета или назначения.

После каждой обработки введенных пользователем данных DialogBot сохраняет текущее состояние UserState и ConversationState. После сбора всех необходимых сведений пример кода создает демонстрационное резервирование для бронирования рейсов. В этой статье мы рассмотрим аспекты LUIS этого примера. Однако общий поток примера состоит в следующем:

  • Когда подключается новый пользователь, вызывается OnMembersAddedAsync и отображается приветственная карточка.
  • OnMessageActivityAsync вызывается для каждого полученного блока данных, введенных пользователем.

Class diagram outlining the structure of the C# sample.

Модуль OnMessageActivityAsync запускает соответствующий диалог с помощью метода расширения диалога Run. Затем главный диалог вызывает вспомогательного метода LUIS для поиска самого вероятного намерения пользователя. Если таким намерением является BookFlight (бронирование авиабилетов), вспомогательный метод сохраняет полученные от LUIS данные пользователя. Затем главный диалог запускает BookingDialog для сбора требуемых дополнительных сведений от пользователя, например:

  • Origin — город вылета;
  • TravelDate — дата для бронирования авиабилетов;
  • Destination — город прилета;

В этой статье описывается добавление LUIS в бот. Дополнительные сведения об использовании диалогов или состояния можно получить, ознакомившись со сбором данных, которые вводит пользователь, с помощью запроса в диалоге или сохранением данных пользователя и диалога.

Создание приложения LUIS на портале LUIS

  1. Войдите на портал LUIS и при необходимости создайте учетную запись и ресурс разработки.
  2. На странице "Приложения беседы" в LUIS выберите "Импорт", а затем импорт в формате JSON.
  3. В диалоговом окне импорта нового приложения :
    1. Выберите файл FlightBooking.json в папке CognitiveModels примера.
    2. Введите FlightBooking необязательное имя приложения и нажмите кнопку "Готово".
  4. Сайт может отобразить , как создать эффективное приложение LUIS и обновить диалоговые окна составных сущностей . Эти диалоги можно закрыть и продолжить.
  5. Обучите свое приложение, а затем опубликуйте приложение в рабочей среде. Дополнительные сведения см. в документации LUIS по обучению и публикации приложения.

Для чего нужны сущности

Сущности LUIS позволяют боту понимать события за пределами стандартных намерений. Это позволяет собирать дополнительные сведения от пользователей, чтобы бот мог задавать вопросы и отвечать более интеллектуально. Наряду с определениями для трех намерений LUIS Book Flight, Cancel и None, файл FlightBooking.json также содержит набор сущностей, таких как From.Airport и To.Airport. Эти сущности позволяют LUIS обнаруживать и возвращать дополнительные сведения из данных, которые пользователь предоставляет при запросе нового бронирования.

Получение значений для подключения к приложению LUIS

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

Получение сведений о приложении на портале LUIS.ai

Файл параметров (appsettings.json, .env или config.py) используется, чтобы собрать в одном расположении ссылки на все службы. Полученные данные будут добавлены в этот файл в следующем разделе.

  1. Выберите опубликованное приложение LUIS на сайте luis.ai.

  2. Открыв опубликованное приложение LUIS, выберите в нем вкладку MANAGE (Управление).

  3. Выберите вкладку Параметры слева и запишите значение, отображаемое для идентификатора приложения как <YOUR_APP_ID>.

    Screenshot of the Manage page displaying your application ID.

  4. Выберите ресурсы Azure, а затем ресурс прогнозирования. Запишите значение, отображаемое для расположения как YOUR_REGION> и первичный ключ, как <<YOUR_AUTHORING_KEY>.

    Screenshot of the Manage page displaying your location and primary key.

    Кроме того, можно использовать регион и первичный ключ для ресурса разработки.

Обновление файла параметров

Добавьте сведения, необходимые для доступа к приложению LUIS, включая идентификатор приложения, ключ разработки и регион в appsettings.json файл. На предыдущем шаге вы получили эти значения из опубликованного приложения LUIS. Имя узла API должно быть в формате <your region>.api.cognitive.microsoft.com.

appsetting.json

{
  "MicrosoftAppType": "",
  "MicrosoftAppId": "",
  "MicrosoftAppPassword": "",
  "MicrosoftAppTenantId": "",
  "LuisAppId": "",
  "LuisAPIKey": "",
  "LuisAPIHostName": ""
}

Настройка бота для работы с приложением LUIS

Убедитесь, что для вашего проекта установлен пакет NuGet Microsoft.Bot.Builder.AI.Luis.

Чтобы подключиться к службе LUIS, бот извлекает сведения, добавленные в файл appsetting.json. Класс FlightBookingRecognizer содержит код с параметрами из файла appsetting.json и отправляет запрос к службе LUIS, вызывая метод RecognizeAsync.

FlightBookingRecognizer.cs

public class FlightBookingRecognizer : IRecognizer
{
    private readonly LuisRecognizer _recognizer;

    public FlightBookingRecognizer(IConfiguration configuration)
    {
        var luisIsConfigured = !string.IsNullOrEmpty(configuration["LuisAppId"]) && !string.IsNullOrEmpty(configuration["LuisAPIKey"]) && !string.IsNullOrEmpty(configuration["LuisAPIHostName"]);
        if (luisIsConfigured)
        {
            var luisApplication = new LuisApplication(
                configuration["LuisAppId"],
                configuration["LuisAPIKey"],
                "https://" + configuration["LuisAPIHostName"]);
            // Set the recognizer options depending on which endpoint version you want to use.
            // More details can be found in https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3
            var recognizerOptions = new LuisRecognizerOptionsV3(luisApplication)
            {
                PredictionOptions = new Bot.Builder.AI.LuisV3.LuisPredictionOptions
                {
                    IncludeInstanceData = true,
                }
            };

            _recognizer = new LuisRecognizer(recognizerOptions);
        }
    }

    // Returns true if luis is configured in the appsettings.json and initialized.
    public virtual bool IsConfigured => _recognizer != null;

    public virtual async Task<RecognizerResult> RecognizeAsync(ITurnContext turnContext, CancellationToken cancellationToken)
        => await _recognizer.RecognizeAsync(turnContext, cancellationToken);

    public virtual async Task<T> RecognizeAsync<T>(ITurnContext turnContext, CancellationToken cancellationToken)
        where T : IRecognizerConvert, new()
        => await _recognizer.RecognizeAsync<T>(turnContext, cancellationToken);
}

FlightBookingEx.cs содержит логику для извлечения From, To и TravelDate. Это расширение разделяемого класса FlightBooking.cs, используемого для хранения результатов LUIS при вызове FlightBookingRecognizer.RecognizeAsync<FlightBooking> из MainDialog.cs.

CognitiveModels\FlightBookingEx.cs

// Extends the partial FlightBooking class with methods and properties that simplify accessing entities in the luis results
public partial class FlightBooking
{
    public (string From, string Airport) FromEntities
    {
        get
        {
            var fromValue = Entities?._instance?.From?.FirstOrDefault()?.Text;
            var fromAirportValue = Entities?.From?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
            return (fromValue, fromAirportValue);
        }
    }

    public (string To, string Airport) ToEntities
    {
        get
        {
            var toValue = Entities?._instance?.To?.FirstOrDefault()?.Text;
            var toAirportValue = Entities?.To?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
            return (toValue, toAirportValue);
        }
    }

    // This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the Time part.
    // TIMEX is a format that represents DateTime expressions that include some ambiguity. e.g. missing a Year.
    public string TravelDate
        => Entities.datetime?.FirstOrDefault()?.Expressions.FirstOrDefault()?.Split('T')[0];
}

Теперь служба LUIS для бота полностью настроена и подключена.

Тестирование бота

Скачайте и установите последнюю версию Bot Framework Emulator.

  1. Выполните этот пример на локальном компьютере. Если вам нужны инструкции, ознакомьтесь с файлом README для примера C#, примера JS или Python.

  2. В эмуляторе введите сообщение, например "путешествие в Париж" или "переход из Парижа в Берлин". Используйте все речевые фрагменты, включенные в файл FlightBooking.json, для обучения намерения Book flight (Бронирование авиабилетов).

Если первое намерение, возвращенное из LUIS, разрешает "Бронировать рейс", бот будет задавать дополнительные вопросы, пока не будет достаточно информации, сохраненной для создания резервирования путешествий. После этого он возвращает всю собранную информацию о бронировании пользователю.

На этом этапе логика бота кода сбрасывается, и вы можете продолжать создавать дополнительные резервирования.

Дополнительные сведения

Дополнительные сведения о LUIS см. в документации по LUIS:

Совет

Различные части пакета SDK определяют отдельные классы сущностей или элементы. Сущности сообщений см. в разделе "Сущности и типы действий".