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


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

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

Примечание.

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

Понимание разговорного языка (CLU), функция Azure AI Language, является обновленной версией LUIS. Дополнительные сведения о поддержке распознавания речи в пакете SDK Bot Framework см. в разделе "Распознавание естественного языка".

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

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

Это важно

Пакет SDK Bot Framework и эмулятор Bot Framework были архивированы на GitHub. Проект больше не обновляется или не поддерживается. Запросы на поддержку пакета SDK Bot Framework больше не будут обслуживаться с 31 декабря 2025 г.

Чтобы создавать агенты с помощью выбранной службы ИИ, оркестрации и знаний, рекомендуется использовать пакет SDK для агентов Microsoft 365. Пакет SDK для агентов поддерживает язык C#, JavaScript или Python. Дополнительные сведения о пакете SDK для агентов см. в aka.ms/agents. Если у вас есть существующий бот, созданный с помощью пакета SDK Bot Framework, вы можете обновить бота до пакета SDK для агентов. Ознакомьтесь с основными изменениями и обновлениями в руководстве по миграции с Bot Framework SDK на Agents SDK.

Если вы ищете платформу агента на основе SaaS, рассмотрите microsoft Copilot Studio.

Предварительные условия

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

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

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

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

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

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

Схема классов, выстраивающая структуру примера C#.

Модуль 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", "Отмена" и "Нет", файл 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.<>

    Снимок экрана: страница

  4. Выберите Azure Resources, а затем Prediction Resource. Запишите значение, отображаемое для расположения как <YOUR_REGION>, и первичный ключ как <YOUR_AUTHORING_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 для обучения намерения "Бронирование рейса".

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

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

Дополнительная информация:

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

Совет

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