Создаём чат-ботов для Slack: от простых до обученных ИИ

Заметили популярность чат-ботов ВКонтакте, Telegram, Facebook? В корпоративных сервисах вроде Slack они также способны приносить пользу.

Что это, и почему пора задуматься о создании чат-ботов?

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

Предположим, вы хотите купить пару обуви в интернет-магазине с собственным чат-ботом. Вы можете самостоятельно устанавливать фильтры поиска. Другой вариант − сообщить боту о том, что вы хотите купить, какого бренда, цвета, размера − примерно так, как если бы вы консультировались со специалистом в магазине.

А вот пример работы чат-бота сети кофеен Starbucks:

Можно заказать кофе, а потом уточнить детали с помощью критериев, которые нередко встречаются в заказе.

Чаще всего чат-ботов используют в Facebook, Slack, Telegram.

Устройство нашего чат-бота

От необходимых функций чат-бота зависит путь его разработки. В этой статье мы научимся создавать простейших чат-ботов. Вот как они будут устроены:

Используем API Slack для отправки сообщений в DialogFlow (DF). NLP-движок будет принимать информацию о намерении совершить действие и распознавать смысл сообщения в целом, а затем формировать релевантный ответ для пользователя. Интерфейс Slack и DialogFlow вместе формируют чат-бота. Будем считать, что интерфейс Slack − это лицо, а DF − мозг.

Чат-бот, работающий по алгоритму

Вообще, мы выбрали Slack потому, что он наиболее популярен в корпоративном плане. Есть необходимые API, синхронизация со сторонними сервисами, регулярные обновления. Вот что нужно сделать заранее:

  • Создать Workspace в Slack для тестирования
  • Создать приложение внутри Slack

Создаём рабочую среду

Рабочая среда (пространство) − это то, что объединяет и организует участников команды в Slack. Чтобы новый участник присоединился к такой группе, ему нужно перейти по ссылке, которая обычно выглядит так:

https://workspace-name.slack.com

После создания собственной рабочей среды Slack отправит вам 6-значный код на почту, попросит настроить профиль и группу.

Пока не стоит особо задумываться о названии − мы для примера установили название «something». После выбора URL-адреса Slack предлагает разослать приглашения участникам. Пока стоит пропустить этот шаг. Далее можно пользоваться настроенной средой.

Создание приложения внутри Slack

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

После этого нужно перейти в раздел настройки чат-ботов:

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

Затем Slack запросит несколько разрешений. Одобряйте всё.

Создаём бота с использованием Python

Ещё до подключения сторонних сервисов к Slack-боту, нужно убедиться, что Slack имеет право авторизации для доступа к боту. Для этого Slack предоставляет «токен аутентификации», который используется при попытке установить соединение с ним. Вернитесь к «панели приложений» и выберите опцию «OAuth & Permissions»:

Это настройки прав. Выберите «Bot User OAuth Access Token» и сохраните его.

Теперь, когда у вас все настроено, давайте напишем Python-код. Чтобы упростить подключение к API Slack, мы написали простенькую программу.

Важное примечание! На примере разработка с Python 2.7.

  1. Установите библиотеку slackclient:
    $pip install slackclient
  2. Скопируйте следующие данные:
    $git clone https://github.com/mohdsanadzakirizvi/Slack-AI-ChatBot.git
  3. Настройте токен аутентификации «Bot User OAuth Access Token» и имя вашего бота:
    $export SLACK_TOKEN=your_bot_user_oauth_token_here	 	 
    $export BOTNAME=your_botname_here
  4. Перейдите в каталог Slack-AI-ChatBot:
    $ cd Slack-AI-ChatBot
  5. Запустите бота:
    $ python mainbot.py

    Мы должны получить:

    Бот работает. Обратите внимание, что он будет отвечать только при упоминании @chatbotname:

    Это те параметры ответов, которые задали мы для примера, их можно менять. Если открыть файл mainbot.py, вы увидите следующую функцию:

    def handle_command(slack_api, command, channel):	 	 
     EXAMPLE_COMMAND = 'do'	 	 
     if command.lower().startswith(EXAMPLE_COMMAND) or command.lower().startswith('what'):	 	 
     slack_api.rtm_send_message(channel, 'Yes, code me further to do that!')	 	 
     elif command.lower().startswith('hi') or command.lower().startswith('hey') or command.lower().startswith('hello') or command.lower().startswith('who are you'):	 	 
     slack_api.rtm_send_message(channel, 'Hey, I\'m your slack bot, how may I help you?')	 	 
     else:	 	 
     print 'Invalid Command: Not Understood'	 	 
     slack_api.rtm_send_message(channel, 'Invalid Command: Not Understood')

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

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

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

    Google Dialogflow (api.ai) для NLP и машинного обучения

    Dialogflow мы обошли стороной. Сейчас разберёмся подробнее.

    Настройка DialogFlow

    После регистрации вы получите доступ к консоли:

    Агенты

    DialogFlow работает, создавая агентов − модули NLU (Natural Language Understanding). Они преобразуют естественные пользовательские запросы в управляемые данные.

    Это преобразование происходит, когда введённое пользователем сообщение соответствует команде, которую ожидает программа.

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

    Начнем с создания собственного агента. Для примера возьмем чат-бота пиццерии.

    В левом верхнем углу окна вы увидите вариант «Создать агента». Нажмите на нее и выберите имя для своего агента. Допустим − «pizzaBot».

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

    Намерения и сущности

    Сущность

    Сущности − это группа объектов, которые необходимо распознать агенту. Например, если мы создаем pizzaBot, то некоторыми объектами для работы выступят тесто, сыр или томатная паста.

    Для создания сущности нажмите кнопку «Объекты» слева и выберите «Создать сущность».

    А потом настройте каждый объект:

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

    Намерения

    Простыми словами, намерение − это сопоставление между тем, что говорит пользователь, и какие операции может выполнить бот.

    Сейчас есть всего два намерения: первое − в случае, когда бот не понимает, чего от него хочет пользователь, второе − приветствие.

    Наберите «pizza please!» в демо-поле справа и посмотрите, как отреагирует агент.

    Поскольку мы еще не обучили нашего агента, он ответил одним из многих ответов, что сохранил для неопределённых ситуаций. Давайте создадим намерение приготовить пиццу и назовём ее «makePizza». Нажмите «Создать намерение», выберите название и сохраните его. Вы увидите что-то вроде этого:

    Способ работы DialogFlow заключается в том, что вы можете использовать некоторые примеры пользовательских запросов и обучить систему реагировать на них по-разному в зависимости от контекста. Давайте добавим некоторые базовые фразы для нашего агента:

    Идея состоит в том, чтобы подготовить для агента как можно более разнообразные примеры, тогда и ответы будут более качественными. После настройки обучающих фраз, вам нужно определить, какое действие предпримет агент, при получении этого намерения. Для этого нажмите кнопку «Добавить параметры и действие»:

    Что означают эти имена столбцов?

    • Required − определяет, является ли этот параметр обязательным для действия.
    • Entity  − здесь мы сопоставляем параметры с сущностями.
    • Value − если мы хотим повторно использовать этот параметр в ответе, можно просто использовать имя его значения.
    • Is List  − может ли значение параметра быть списком (например, в заказе может быть более одной начинки).
    • Prompts − клише.

    Пример: нажмите «Определить подсказки» и напишите «Какие начинки добавить?»

    Аналогичным образом добавьте клише для других объектов. Давайте посмотрим, чего мы достигли. Сохраните намерение и вернитесь в демонстрационную среду. Попробуйте заказать агенту пиццу. Поскольку мы показали разные запросы для агента, он должен распознать практически любую фразу, связанную с заказом пиццы, и спросить о начинке, типе сыра, который вы хотите.

    Обратите внимание, насколько естественен разговор. Как только вы активируете намерение, агент пытается извлечь параметры, которые вы отметили как важные для пользователя. Вам нужно всего лишь дать несколько примеров для тренировки, а движок NLP от DialogFlow позаботится обо всем остальном.

    Кроме того, вы можете добавлять ответы для успешно выполненных намерений. Нажмите кнопку «Добавить ответы», она находится ниже кнопки «Действия и параметры». Добавьте следующий ответ и сохраните его:

    Когда пицца будет готова, пользователь получит подобное сообщение:

    Что сделала машина? Когда мы использовали $ cheese и $ toppings в поле ответа, они автоматически заменялись значениями параметров, извлеченными из беседы пользователя. Удобно, не так ли?

    Обучение агента

    Теперь, когда вся работа агента настроена, пора его обучить. Нажмите на значок настроек рядом с именем агента.

    В окне настроек выберите «ML Settings».

    Вот несколько важных замечаний:

    Существует два режима обучения модели: гибридный режим, только ML.

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

    ML Classification Threshold − минимальный показатель доверия, который должна иметь модель. Только тогда он может принять решение по намерению.

    Нажмите кнопку «Train», после окончания обучения сохраните результаты. Перейдем к следующему шагу − интеграции со Slack-приложением.

    Связываем DialogFlow и Slack

    DialogFlow (DF) − отличный сервис, поддерживающий интеграцию с большинством популярных приложений. Для подключения Slack даже не нужно писать код.

    Настройка данных

    В левой части окна нажмите кнопку «Интеграции», выберите значок Slack и задайте настройки:

    Прокрутите вниз, вы увидите поля для ввода учетных данных вашего Slack приложения:

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

    Скопируйте их в соответствующие поля на странице DialogFlow.

    Чтобы скопировать «Client Secret», вы должны сначала нажать кнопку «Show» рядом с ним. После сохранения учётных данных, нажмите «Start» в правом нижнем углу Slack в диалоговом окне.

    Продолжаем настройку Slack

    Теперь, когда мы настроили Slack и Dialogflow, нужно включить OAuth (помогает при аутентификации), URL-адреса запросов (предоставленные Dialogflow) и подписки на события (какие события мы хотим связать с ботом?).

    Добавьте URL OAuth

    1. Скопируйте URL-адрес OAuth со страницы настройки Slack в DialogFlow.
    2. Перейдите в консоль Slack Developer Console и нажмите «OAuth & Permissions» в левом меню.
    3. Нажмите кнопку «Add a new Redirect URL» и вставьте URL-адрес OAuth.
    4. Нажмите «Add».

    Добавьте URL-адрес запроса

    1. Скопируйте URL-адрес запроса событий на странице настроек Slack Dialogflow.
    2. Перейдите в консоль Slack Developer Console и нажмите «Подписка на события» в меню слева.
    3. Включите события, вставьте URL-адрес подписки на события в поле URL-адреса запроса.

    Через несколько секунд вы увидите результат «Verified» над полем запроса URL.

    Включите подписку на события

    Подписка на события − самая важная вещь для чат-ботов. От этого зависит, какие события наш бот будет слушать и запускать.

    1. Нажмите «Event Subscriptions» в меню слева.
    2. Включите опцию.
    3. В разделе «Subscribe to Bot Events» нажмите кнопку «Add Bot User Event».

    Вы увидите текстовое поле и список событий. А вот те события, которые мы рекомендуем добавить:

    После добавления событий сохраните изменения с помощью кнопки в нижней части экрана.

    Добавьте Slack-бота в команду

    1. В консоли Slack Developer Console выберите «Manage Distribution» в меню слева.
    2. Добавьте его в Slack в разделе «Share Your App with Your Team».

    На следующей странице добавьте агента, используя кнопку авторизации.

    Теперь можно вернуться в рабочее пространство.

    Общение с чат-ботом

    Перейдите в свое рабочее пространство, к личному диалогу с ботом или упомяните его имя − @botname.

    Заметили кое-что?

    Кроме ответа на обычные вопросы о пицце, бот также хорошо отвечает на общие сообщения типа «привет» и «спасибо». Это возможно благодаря функции DialogFlow, называемой «SmallTalk».

    Настройка Small Talk

    Если вы нажмете кнопку «Small Talk» на левой панели в диалоговом окне, то увидите множество опций:

    Добавим реакции на общие вопросы, вроде «как дела», «кто ты». Дальнейшая настройка не требует объяснений. Бот работает!

    Понравилась статья о разработке чат-ботов для Slack? Вот ещё материалы по теме:

    Источник: Создание умных чат-ботов для Slack on Medium

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

admin
11 декабря 2018

ООП на Python: концепции, принципы и примеры реализации

Программирование на Python допускает различные методологии, но в его основе...
admin
14 июля 2017

Пишем свою нейросеть: пошаговое руководство

Отличный гайд про нейросеть от теории к практике. Вы узнаете из каких элеме...