Хочу поделится с вами своим опытом работы с сервисом Dialogflow и рассказать о некоторых не самых очевидных вещах.
image
Dialogflow — это сервис, позволяющий создавать чат-ботов для разных платформ и языков на разных устройствах.

Сервис возможно использовать абсолютно бесплатно, так что не теряем времени и приступаем к работе.

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

Шаг 0. Задача


Бот должен принимать от пользователя запрос, состоящий из трех параметров: имя, город и адрес. При этом, если пользователь ранее упоминал один из этих параметров — помнить его в рамках контекста.

Шаг 1. Первичная настройка


Для начала нужно зарегистрироваться и создать нового агента:



  • Название агента можно указать любое.
  • Язык я выбрал русский. Но в дальнейшем можно добавить и другие.
  • Временная зона важна, так как по ней будут определятся такие фразы как «Сегодня», «3 дня назад»
  • Создадим новый Google проект
  • Я буду использовать первую версию API

После создания агента переходим на вкладку «Integrations» и подключаем те платформы, которые нам нужны.



На этом этапе наш бот уже запущен и может общаться с пользователями. Теперь нужно научить его правильно понимать фразы.

Шаг 2. Создание назначений


Назначение — это обработчик определённого запроса от пользователя.
Переходим на вкладку «Intents». После создания агента здесь будут два стандартных назначения:

  1. Default Welcome Intent — запускается для приветствия пользователя (отправит ответное приветствие)
  2. Default Fallback Intent — запускается в том случае, если ни одно из других назначений не подходит. Отправит сообщение, что пользователя не поняли («Вот эта последняя фраза мне не ясна», «Попробуй, пожалуйста, выразить свою мысль по-другому» и т.д.).

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

Добавим в приветствие вопрос о пользователе


Открываем «Default Welcome Intent». Здесь есть несколько секций:

  • Contexts
  • User says
  • Events
  • Action
  • Response

Обратите внимание на секцию «Events»: здесь указано одно служебное событие «WELCOME».
Назначение можно запустить двумя способами: как реакцию на текст пользователя или по событию.

В нашем случае назначение «Default Welcome Intent» реагирует не на какой-то текст от пользователя, а на служебное событие WELCOME. Например, для Telegram это запуск бота командой /start. Подробнее про события.

Итак, рассмотрим секцию «Response». Здесь перечислены сообщения, которые будут отправлены в ответ пользователю. Каждое сообщение может состоять из нескольких строк. Каждая строка — отдельные варианты сообщения. Для ответа будет выбран один из этих вариантов. И чем их больше, тем реже ваш бот будет повторяться.

Добавим сюда сообщение с просьбой рассказать о себе.



Реакция на ответ


Теперь создадим назначение, которое будет реагировать на последующее сообщение.
На вкладке «Intents» наводим курсор на «Default Welcome Intent» и нажимаем «Add follow-up intent». В выпадающем списке, нам предложат несколько предустановленных вариантов. Нас они не интересуют — выбираем «Custom»

Перейдём к секции «User says» и добавим несколько вариантов сообщений от пользователя.

Теперь нужно указать, какие данные в этих сообщениях нам нужны. Для этого следует выбрать фрагмент текста и в выпадающем меню выбрать тип данных. В Dialogflow есть ряд предустановленных типов, в частности для имён и адресов. Но вы можете создавать и собственные. Подробнее.

Теперь обратите внимание на секцию «Action». Здесь перечислены все параметры, которые собирает это назначение. Параметры, которыми мы размечали текстовые сообщения, автоматически импортировались.


Обозначим имя пользователя как обязательный параметр. Изменим название параметра с «given-name» на «name» для большего удобства. И в колонке «Prompts» укажем вопрос «Как вас зовут?». Теперь, так как «name» это обязательный параметр, в случае если в сообщении не будет этого параметра, пользователю будет отправлен один из вопросов в «Prompts» для получения имени.

И, наконец, добавим ответ пользователю в секцию «Response».



Работа с контекстом


Каждое назначение может работать с входящим контекстом и создавать исходящий контекст.

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

Рассмотрим по порядку:

Default Welcome Intent — входящего контекста нет. Поэтому назначение может запуститься для любого запроса. Назначение создаёт новый пустой контекст «DefaultWelcomeIntent-followup» (добавится автоматически).

Default Welcome Intent — custom — имеет входящий контекст «DefaultWelcomeIntent-followup» (добавился автоматически). Это назначение может запустится только в тех случаях, когда этот контекст существует (когда пользователь поприветствовался). Исходящего контекста здесь пока-что нет.

Добавим исходящий контекст для «Default Welcome Intent — custom» с названием «UserData». Теперь, когда после приветствия пользователь представится, информация о нем будет записана в новый контекст «UserData».

Оформление заказа пользователем


Создадим новое назначение «Order» с исходящим контекстом «UserData». Это назначение может запускаться в любое время, и оно может изменять контекст «UserData».
В тексте заказа нам нужно Имя, Город и Адрес.

Добавим фразы и разметим их. Дублируем все параметры, но в этот раз отметим все как обязательные.



Использование уже известных данных


Наше назначение может работать как в случае отсутствия контекста «UserData», так и при его наличии. В первом случае бот спросит у пользователя все недостающие данные. А во втором он должен использовать уже известные.

Для этого:

  • Для параметра name устанавливаем значение по умолчанию #UserData.name
  • Для параметра address устанавливаем значение по умолчанию #UserData.address
  • Для параметра city устанавливаем значение по умолчанию #UserData.city

Теперь, если пользователь ранее представился (его имя хранится в контексте UserData), то при оформлении заказа его имя подставится автоматически. Если нет — то бот спросит у пользователя имя.

Добавляем ответ с подтверждением заказа. В ответе вы можете использовать ваши параметры. Подробнее.



Результат работы


Результат работы бота приведен на скрине ниже. Пообщаться с ним самостоятельно можно в Telegram: @sample_ShopBot или Web Demo



Спустя время контекст будет сброшен. После первого обращения бот будет спрашивать у вас имя и адрес доставки. И заново установит контекст.



Заключение


Таким образом, Dialogflow берёт на себя сбор информации о пользователе, заказе и отправляет на вашу службу только готовый результат. Осталось настроить отправку WebHook на ваш сервер, который отреагирует и реализует доставку. Подробнее.

Ссылки


Веб-демо
Чат бот
Документация

Комментарии (10)


  1. Quiensabe
    21.11.2017 00:25

    Пообщались...
    Я: Тут есть кто-нибудь?
    Бот: Вот сейчас я тебя совсем не понимаю.
    Я: Добрый день!
    Бот: Попробуй, пожалуйста, выразить свою мысль по-другому.
    Я: Hello!
    Бот: Не совсем понимаю, о чём ты.
    Я: я могу сделать заказ?
    Бот: На какое имя?
    Я: Обращайтесь ко мне Мистер X
    Бот: На какое имя?
    Я: У меня нет имени. Я Мистер X
    Бот: На какое имя?
    Я: Ладно, пусть будет Георг
    Бот: На какое имя?
    Я: На имя Георга Карловича
    Бот: На какое имя?
    Я: мр. Георг Карлович
    Бот: На какое имя?
    Я: Ок! Пусть будет просто Георг
    Бот: На какое имя?
    Я: Ты меня убедил. Пусть я буду Вася
    Бот: В какой город?
    Я: Я живу под Стармином, в поселке Топлые Реды
    Бот: В какой город?
    Я: В деревне. Топлые Реды!
    Бот: В какой город?
    Я: Это не город. Это поселок
    Бот: В какой город?
    Я: пусть город… только маленький ок?
    Бот: В какой город?
    Я: Топлые Реды
    Бот: В какой город?
    Я: В Москву!
    Бот: Заказ оформлен на имя Вася и будет отправлен в Москва по адресу город… только


    1. qtask
      21.11.2017 09:49

      Все же не стоит ожидать от Dialogflow человеческой речи и высокого качества распознавания без тонкой настройки. Автор бота не заложил ваши в фразы в настройки определения намерений (Intents), а стандартные метки поиска фактов (@ sys.name, @ sys.address и тд) путаются в названиях городов и именах людей.
      Dialogflow — очень удобная платформа, но чтобы она работала хорошо — придется немного попотеть с настройками и обучающими выборками.


      1. Aracon
        21.11.2017 12:00

        Вот собственно эти тонкости и хотелось бы узнать: что нужно сделать, чтобы получить приемлемый результат. Настроить hello world по документации несложно, интересно узнать, как построить что-то близкое к реальности.


        1. Kozack Автор
          21.11.2017 12:02

          Нужно побольше фраз в User says. Именно на них проходит обучение. И чем их больше, том точнее будет определение.


        1. qtask
          21.11.2017 14:35

          В Dialogflow есть инструменты для обучения, которые повышают точность классификации намерений и вычисления фактов:
          * Intents или Намерения (что хочет пользователь) — можете настроить типовые реплики (User Says), а еще использовать модули машинного обучения и тренировки
          * Чтобы точно извлекать нестандартные факты (ФИО, названия городов и тд) — настройте сущности
          У них все довольно удобно устроено — данные можно загружать через CSV выгрузки, что-то можно через API


  1. Klenov_s
    21.11.2017 11:58
    -1

    С именами у недобота жуткая беда — азиатские ФИО он отказывается воспринимать совсем.


  1. tymtsivV
    21.11.2017 20:10

    А как настроить ветви в зависимости что сказал пользователь? Например, в зависимости что сказал пользователь (да или нет), в дальнейшем система будет задавать другие запроси.


    1. sstepashka
      22.11.2017 08:18

      То что вам нужно называется контекстом: dialogflow.com/docs/contexts

      Ещё похожее это диалоги: dialogflow.com/docs/dialogs
      Это когда несколькими запросами необходимо получить определённый надо данных.

      И в итоге есть Fulfillment (или Webhook), когда можно с помощью торчащего наружу HTTP метода кастомизировать работу бота.


      1. tymtsivV
        22.11.2017 19:38

        Дякую, вже й попробував реалізувати працює!


  1. mbait
    21.11.2017 21:05

    Если кому интересно, то задача распознавания имён называется Named Entity Recognition или сокращённо NER. И пока что для решения не придумали ничего новее Conditional random fields, так что до "понимания человеской речи" как до Луны. Скорее этот подход нужно воспринимать как распознавание, основанное на регулярных выражениях и грамматике, которое будет устойчиво к небольшим возмущениям типа пропуска и перестановки слов или появления незнакомых терминов. То есть, модель будет довольно ограничена в свой возможности обобщать, но зато для небольшого круга задач вполне подойдёт и будет работать значительно лучше чем if (userInput.equals("принеси мне сендвич")) {… }. Единственный минус — для настройки придётся разобраться с алгоритмом обучения, иначе можно "скормить" кучу данных, а точность так и не повысится.


    P.S. Историческая справка. Dialogflow это бывшие Api.ai, они же Assistant.ai, они же Speaktoit он же Гога, он же Жора. В компании преимущественно работают русскоговорящие. Недавно их купил Google, но в далёком 2013-м они копировали практически один в один сервис Wit.ai, который в 2015-м купил Facebook. Сейчас оба сервиса продолжают активно развиваться .