Создание чат-ботов используя Bot Builder SDK 4 — часть 5

Привет. Это пятый урок из курса "Создание чат-ботов используя Bot Builder SDK" В данном уроке мы рассмотрим, как созданному чат-боту можно быстро и легко добавлять функционал искусственного интеллекта. Узнаем, как можно работать в чат-ботах с естественными языками используя LUIS, и рассмотрим имеющиеся на текущий момент когнитивные сервисы.

Что могут когнитивные сервисы? Сейчас имеется огромное количество возможностей. Работать с естественными языками, делать различные анализы текста, добавлять возможности компьютерного зрения, добавлять распознавание и синтез речи, также в наличии различные возможности Bing-поиска.

Сперва давайте посмотрим, как можно работать с естественными языками используя LUIS. Подключим библиотеку Microsoft.Bot.Builder.Ai.LUIS используя NuGet.

Microsoft.Bot.Builder.Ai.LUIS в NuGet

Сейчас перейдём в файл Startup и добавим новый метод, который будет использоваться для получения данных для подключения к LUIS. Будем получать идентификатор модели, идентификатор подписки и URL к сервису LUIS.

private (string modelId, string subscriptionKey, Uri url) GetLuisConfiguration(IConfiguration configuration)
{
    var modelId = configuration.GetSection("Luis-ModelId")?.Value;
    var subscriptionKey = configuration.GetSection("Luis-SubscriptionId")?.Value;
    var url = configuration.GetSection("Luis-Url")?.Value;
    return (modelId, subscriptionKey, new Uri(url));
}

В файле appsetting.json добавим новые необходимые параметры. Заполним их позже, на этапе добавления сервиса в LUIS.

{
  "MicrosoftAppId": "",
  "MicrosoftAppPassword": "",
  "Luis-ModelId": "",
  "Luis-SubscriptionId": "",
  "Luis-Url": ""
}

В файле Startup перейдём к методу ConfigureServices и добавим новый Middleware, в котором будем подключать использование LUIS. Данные кортежа, полученного методом GetLuisConfiguration передадим в модель LuisModel. И данную модель добавим в Middleware используя LuisRecognizerMiddleware.

var (modelId, subscriptionKey, url) = GetLuisConfiguration(Configuration);
                var model = new LuisModel(modelId, subscriptionKey, url);
                options.Middleware.Add(new LuisRecognizerMiddleware(model));

В файле AllInOneBot в методе OnTurn добавим обработку текста, если он не является какой-то из ранее добавленных команд. Для работы с LUIS добавим 3 команды: "hello", "play_music", "stop_music". В LUIS будет передаваться текст вопроса пользователя, а в ответ возвращать намерение, которое наиболее соответствует полученному тексту.

if (!context.Responded)
{
    var result = context.Services.Get<RecognizerResult>
        (LuisRecognizerMiddleware.LuisRecognizerResultKey);
    var intent = result?.GetTopScoringIntent();
    if (intent != null)
    {
        switch (intent.Value.intent.ToLower())
        {
            case "hello":
                await context.SendActivity($"Hello, {context.Activity.From.Name}!");
                break;
            case "play_music":
                await context.SendActivity($"La la la...la-la-la-la...la");
                break;
            case "stop_music":
                await context.SendActivity($"No more music!");
                break;
            default:
                await context.SendActivity($"Вашу команду не удалось распознать.");
                break;
        }
    }
}

Сейчас нам осталось добавить приложение в LUIS.

Перейдём на сайт luis.ai, авторизуемся и нажмём "Create new app", для создания нового приложения. Запишем название и описание. Так же можно выбрать используемый язык. Языков много, но русского, к сожалению, нет, будем использовать английский.

LUIS выбор языка при создании

В разделе Intents можно работать с имеющимися целями и добавлять новые, по умолчанию уже создана цель "None".

Intents None

Создадим новые намерения. При создании нужно добавить несколько примеров того, что пользователь может ввести при попытке выполнить данное намерение. Например, для намерения "Hello" введём "hello", "good day", "good morning", "good evening", "hi". То же самое сделаем для намерений "play_music" и "stop_music".

Intents Play_music

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

Train в LUIS

Перейдя в раздел Settings можно увидеть идентификатор, который будет использоваться в параметре ModelId в файле конфигурации.

Settings в LUIS

В разделе Publish можно увидеть значения для параметра конфигурации SubscriptionId. А также URL к которому будет необходимо подключаться. Теперь нажмём кнопку Publish, после этого можно будет проверять работу с LUIS в нашем чат-боте.

Publish в LUIS

Поздороваемся с чат-ботом, он приветствует нас в ответ. Попросим его запустить музыку и остановить музыку. Как можно увидеть, не обязательно писать ваши намерения точно в том виде, в котором они были заданы. Сервис вполне неплохо догадывается о том, что вы хотели бы сделать.

Пример использования LUIS в чат-боте

Далее я покажу, как можно работать с сервисом анализа текста. Для примера будем определять язык переданного в чат-боте текста. Зайдём в NuGet и добавим пакет Microsoft.Azure.CognitiveServices.Language.TextAnalytics.

Microsoft.Azure.CognitiveServices.Language.TextAnalytics в NuGet

Добавим в чат-бот новую команду LangDetect. В классе LangDetect добавим метод ProcessHttpRequestAsync, который будет отвечать за идентификацию.

class ApiKeyServiceClientCredentials : ServiceClientCredentials
{
    public override Task ProcessHttpRequestAsync(HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        request.Headers.Add("Ocp-Apim-Subscription-Key", "");
        return base.ProcessHttpRequestAsync(request, cancellationToken);
    }
}

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

ITextAnalyticsClient client = new TextAnalyticsClient(new ApiKeyServiceClientCredentials())
    {Endpoint = "https://westeurope.api.cognitive.microsoft.com"};

var result = client.DetectLanguageAsync(new BatchInput(new List<Input>()
{
    new Input("1", message)
})).Result;

foreach (var document in result.Documents)
{
    await dc.Context.SendActivity(document.DetectedLanguages[0].Name);
}

Перейдём в класс AllInOneBot и добавим работу с диалогом LangDetect по аналогии с имеющимися. Сейчас создадим необходимый когнитивный сервис для анализа текста. Перейдём на сайт перейдём в раздел "API-интерфейсы языка" и получим ключ для сервиса "Анализ текста". Будем использовать существующую учётную запись в Azure, авторизуясь в ней. Перейдя в созданный сервис, получим ключ для его использования. Там же можно получить конечную точку, для отправки данных. В методе ProcessHttpRequestAsync добавим полученный ключ и убедимся, что заданный адрес конечной точки сервиса совпадает с тем, что мы увидели в Azure.

Проверим как это всё работает. Выполняя команду langdetect и передавая текст, мы будем получать в ответ язык, на котором написан переданный текст.

Определения языка сообщения в чат-ботах

Когнитивные сервисы помогут вам значительно расширить функционал ваших чат-ботов. При этом, как вы могли видеть, делается это всё очень просто и быстро, не требуя от вас никаких специальных знаний. Использовать когнитивные сервисы можно не только в чат-ботах, но и в любых ваших приложениях.

Исходный код примера можно увидеть по ссылке.

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

Добавить комментарий