Создание агента RBM на базе Dialogflow (дополнительно)

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

Что вы собираетесь создавать в этой кодлабе?

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

Что вы узнаете

  • Как использовать три основные конструкции Dialogflow (намерения, сущности и контексты) для создания диалогового интерфейса
  • Как подключить ваш диалоговый интерфейс к вашим собственным службам и API-интерфейсам с помощью Dialogflow и встроенного редактора (на основе облачных функций для Firebase)
  • Как создать типы ответов RBM из Dialogflow, чтобы предоставить пользователям богатый опыт RBM.

Что вам понадобится

  • Аккаунт Google

Создайте и запросите своего первого агента

Продолжительность: 10:00

Создайте свой первый агент Dialogflow

Чтобы создать агент Dialogflow:

  1. Откройте новую вкладку и войдите в Dialogflow .
  2. Нажмите Создать агента в левой панели навигации.

  3. Введите «CodelabRBMBikeShop» в качестве имени вашего агента, «английский» в качестве языка по умолчанию и установите часовой пояс по умолчанию на свой часовой пояс. Затем нажмите «Создать» .

Консоль диалогового потока

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

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

Справа — симулятор Dialogflow. Это позволяет вам опробовать своего агента, говоря или печатая сообщения.

Запрос вашего агента

Агенты Dialogflow лучше всего описываются как модули NLU (Natural Language Understanding). Их можно включить в ваше приложение, продукт или услугу, чтобы преобразовать естественные запросы пользователей в данные, которые можно использовать.

Пора попробовать своего агента! В симуляторе справа щелкните текстовое поле с надписью « Попробовать сейчас », введите «Привет» и нажмите Enter.

Dialogflow идентифицирует запрос, соответствует намерению приветствия по умолчанию и отвечает общим приветствием. Это работает, потому что Dialogflow автоматически обучает намерение приветствия по умолчанию с некоторыми примерами приветствия.

Создать агента RBM

Войдите в консоль разработчика Business Communications , затем щелкните Создать агента .

В поле «Имя» введите «Магазин велосипедов на ваше имя» (например, «Агент велосипедов Шона»), выберите регион и нажмите « Создать агента» .

Подключите своего агента RBM к Dialogflow

После создания агента RBM щелкните его, чтобы просмотреть страницу обзора агента. Щелкните ссылку « Интеграции » в левой панели навигации.

По умолчанию агент RBM использует Google Cloud Pub/Sub для обработки пользовательских сообщений. Чтобы подключить агент RBM к агенту Dialogflow, который вы создали ранее, щелкните интеграцию Dialogflow .

В диалоговом окне нажмите Подключить существующую модель . Следуйте инструкциям, чтобы предоставить вашему агенту RBM разрешения на вызов вашего агента Dialogflow, затем нажмите « Далее ».

Наконец, вам нужно указать идентификатор проекта Dialogflow. На вкладке браузера, отличной от консоли разработчика Business Communications, перейдите к Dialogflow и откройте созданный ранее агент CodelabRBMBikeShop. Щелкните значок шестеренки рядом с названием проекта в левой панели навигации.

Нажав на нее, вы попадете в настройки модели. В разделе GOOGLE PROJECT найдите и скопируйте идентификатор проекта .

Вернитесь на свою вкладку с открытой консолью разработчика Business Communications, вставьте идентификатор проекта в диалоговое окно и нажмите « Начать интеграцию » .

Этот процесс занимает около двух минут. После завершения вы должны увидеть выделенную опцию интеграции Dialogflow и доступную ссылку « Просмотреть агент» .

Все сообщения от вашего агента теперь обрабатываются агентом CodelabRBMBikeShop Dialogflow.

Пригласите свое тестовое устройство и отправьте сообщение

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

В консоли разработчика Business Communications щелкните Устройства в левой области навигации. В форме введите полный номер телефона вашего устройства в формате E.164 (например, +12223334444) и нажмите Добавить .

На ваше устройство вы получите тестовое приглашение. Коснитесь Сделать меня тестировщиком .

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

Создание приветственного намерения

Обычно с агентом RBM на базе Dialogflow, чтобы начать разговор, вы делаете вызов API, который указывает номер телефона пользователя и намерение Dialogflow, с которого начинается разговор (обычно приветственное намерение вашего агента). Для этой лаборатории кода мы пропустим этот шаг и вместо этого воспользуемся диалоговым потоком, который мы уже создали на предыдущем шаге с тестовым устройством из консоли разработчика Business Communications. Однако, если вы хотите узнать больше об этой функции API, ознакомьтесь с этим руководством .

Давайте начнем с добавления ответов RBM в намерение приветствия по умолчанию , чтобы Dialogflow мог использовать его с вашим агентом RBM. Сначала перейдите на вкладку браузера, на которой открыт Dialogflow. Нажмите Приветствие по умолчанию , прокрутите вниз до раздела Ответы , нажмите + в списке типов ответов и выберите RCS Business Messaging (RBM) .

Нажмите «Добавить ответы » и выберите «Простой ответ ». В текстовом поле для простого ответа введите «Привет, добро пожаловать в магазин велосипедов Хогарта. Чем я могу помочь?» (замените Hogarth своим именем), затем нажмите «Сохранить » .

Начало разговора

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

Обновите приветственное намерение

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

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

В разделе « Ответы приветствия по умолчанию » выберите вкладку RCS Business Messaging (RBM) . Удалите существующий простой ответ , щелкнув значок корзины. Затем нажмите «Добавить ответы » и выберите «Автономная расширенная карта » .

В форме Standalone Rich Card введите следующее:

  • Название карты : Привет, добро пожаловать в магазин велосипедов Хогарта.
  • Описание карты : Чем я могу вам помочь? Выберите один из вариантов ниже:
  • Выберите ориентацию карты : вертикальная
  • URL-адрес изображения/видео : https://storage.googleapis.com/df-rbm-codelab/bike-shop.jpg
  • Выберите высоту носителя : средний

Нажмите « Добавить предложение» и введите следующее:

  • Текст предложения : Сколько у вас часов?
  • Постбэк предложения : answer_hours

Добавьте еще одно предложение, нажав « Добавить предложение » и введя следующее:

  • Текст предложения : Назначить встречу
  • Постбэк предложения : answer_appointment

Нажмите Сохранить .

Попробуйте!

Как только модель скажет «Обучение агента завершено», вернитесь к своему устройству и отправьте сообщение «Привет» своему агенту. Теперь вы должны увидеть автономную расширенную карту , которую вы только что создали.

Попробуйте нажать Сколько у вас часов? . Обратите внимание, что срабатывает резервное намерение по умолчанию . Это связано с тем, что ваш агент Dialogflow не знает, как обрабатывать данные обратной передачи, которые вы настроили для этого предложения, "reply_hours".

Давайте исправим это.

Создание намерения «Часы»

Dialogflow использует намерения для классификации намерений пользователя. У намерений есть обучающие фразы, которые являются примерами того, что пользователь может сказать вашему агенту. Например, кто-то, желающий узнать часы работы нашего веломагазина, может спросить: «Когда вы открываете?», «Какие у вас часы?» или «Как поздно я могу прийти?».

Все эти запросы уникальны, но преследуют одну цель: получить информацию о том, когда открыт наш веломагазин.

Чтобы покрыть этот запрос, создайте намерение «Часы»:

  1. В левой навигационной панели нажмите + рядом с Intents .
  2. В поле Имя намерения введите «Часы».
  3. В разделе « Тренировочные фразы » нажмите « Добавить выражение пользователя » и введите следующее, нажимая клавишу «Ввод» после каждого ввода:

    • When do you open?
    • What are your hours?
    • How late can I come in?
    • reply_hours .

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

  4. В разделе « Ответы » нажмите + и выберите RCS Business Messaging (RBM) .

  5. Нажмите «Добавить ответы» и выберите «Простой ответ» .

  6. В текстовом поле для простого ответа введите «Мы открыты каждый будний день с 9:00 до 17:30».

  7. Нажмите Сохранить .

Попробуйте!

Теперь попробуйте узнать часы работы у своего агента. На вашем устройстве в беседе для вашего агента RBM введите «Когда вы открыты?» и отправьте сообщение своему агенту.

Теперь ваш агент правильно отвечает на запрос. Обратите внимание, что даже несмотря на то, что ваш запрос немного отличался от обучающей фразы («Когда вы открыты?» по сравнению с «Когда вы открываете?»), Dialogflow все же сопоставил запрос с правильным намерением. Вы также можете попробовать нажать Сколько у вас часов? в богатой карточке.

Dialogflow использует обучающие фразы в качестве примеров для модели машинного обучения, чтобы сопоставлять запросы пользователей с правильными намерениями. Модель машинного обучения проверяет соответствие запроса каждому намерению в агенте, каждому намерению присваивается оценка, и сопоставляется намерение с наивысшей оценкой. Если намерение с наивысшей оценкой имеет очень низкий балл, резервное намерение соответствует.

Добавление выполнения

Пока он работает, созданный нами агент ведет себя немного неестественно. Когда пользователь спрашивает что-то вроде «Вы открыты?», агент отвечает: «Мы открыты каждый будний день с 9:00 до 17:30». Было бы гораздо естественнее и полезнее, если бы агент прямо сообщил нам, открыт ли магазин.

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

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

Теперь мы пройдем процесс развертывания веб-перехватчика выполнения, который заставит нашего агента реагировать более полезно.

Настройка: развертывание и включение выполнения

В Dialogflow есть встроенный редактор Cloud Functions for Firebase , который позволяет вам писать и развертывать код JavaScript, который будет выполнять ваши задачи.

В левой панели навигации Dialogflow нажмите Выполнение , чтобы открыть страницу выполнения. Нажмите на переключатель рядом с Inline Editor , чтобы включить редактор Cloud Functions for Firebase.

Вы заметите, что редактор содержит два файла: «index.js», который содержит основной код для выполнения, и «package.json», в котором подробно описаны необходимые зависимости.

Теперь мы собираемся импортировать некоторый пример кода, который будет способствовать вашему исполнению.

Скопируйте и вставьте текст этого файла в «index.js», заменив все его текущее содержимое:

https://storage.googleapis.com/df-rbm-codelab/index.js

Теперь прокрутите страницу вниз и нажмите DEPLOY . Примерно через минуту ваш код будет развернут в Cloud Functions for Firebase.

После развертывания функции вы увидите дату и время развертывания внизу страницы:

Взгляните на код выполнения. Функция hoursHandler вызывает currentlyOpen , чтобы определить, открыт ли магазин в данный момент, и добавляет другой ответ RBM в зависимости от условия.

function hoursHandler(agent) {
    let responseText = 'We\'re currently closed, but we open every weekday at 9am!';
    if (currentlyOpen()) {
      responseText = 'We\'re open now!! We close at 5pm today.';
    }

    let payload = {
    "fulfillmentMessages": [
        {
          "platform": "GOOGLE_RBM",
          "rbmText": {
              "text": responseText
          }
        }
      ]
    };

    return response.status(200).json(payload);
}

Строка intentMap.set('Hours', hoursHandler); сообщает библиотеке выполнения, что функция hoursHandler должна запускаться, когда совпало намерение «Часы». Однако нам также нужно сообщить Dialogflow, чтобы он разрешил выполнение нашего намерения «Часы».

В левой панели навигации нажмите « Намерения » и откройте намерение «Часы». Откройте раздел « Выполнение » внизу и выберите «Включить вызов веб-перехватчика для этого намерения », чтобы он был включен.

Как только вы сохраните намерение, вы можете попробовать. В симуляторе справа введите «Вы открыты?». Если вы нажмете « Диагностическая информация » и проверите ответ API, вы должны увидеть ответ о выполнении. Обратите внимание, что часовой пояс, используемый облачными функциями для сервера Firebase, будет UTC, поэтому ответ может не соответствовать вашему текущему местному времени.

Если в вашем выполнении есть ошибка, Dialogflow использует любой ответ, определенный в разделе « Ответы » на странице « Намерение », позволяя вашему агенту корректно восстановиться.

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

Извлечение данных с сущностями

Продолжительность: 12:00

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

Добавьте параметры к своим намерениям

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

  1. Нажмите + рядом с намерениями в левой панели навигации, чтобы создать новое намерение.
  2. В качестве имени намерения введите «Назначить встречу» в верхней части страницы.
  3. Добавьте следующие фразы для обучения:
    • reply_appointment
    • I'd like to schedule an appointment for next Thursday
    • I'd like to get my bike fixed , I have a mountain bike that needs servicing
    • My bike is broken
    • Can I schedule service for 4pm tomorrow?
    • Can you fix my road bike?
    • Can I set up an appointment for noon on Friday?

Dialogflow автоматически определяет известные параметры в ваших обучающих фразах и создает их для вас.

Под Обучающими фразами Dialogflow автоматически заполняет таблицу параметров собранной информацией:

  • параметр является необязательным (не обязательным)
  • назвал дату и время
  • соответствует типу системной сущности @sys.date и @sys.time **
  • имеет значение $date и $time
  • это не список

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

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

В разделе « Ответы » добавьте вкладку RCS Business Messaging, добавьте следующее в « Простой ответ » и нажмите « Сохранить »:

Great! I've set up your appointment for $date at $time.  See you then!

Попробуйте!

Теперь спросите своего агента: «Могу ли я записаться на прием завтра в 14:00?» в симуляторе на правой панели.

Вы можете видеть в нижней части выходных данных симулятора, что Dialogflow правильно извлек параметры «завтра» и «14:00» из запроса и правильно проанализировал их как дату и время. Теперь попробуйте сделать то же самое на своем тестовом устройстве и посмотрите, правильно ли ответ включает проанализированные дату и время.

Создание необходимых параметров

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

Теперь, когда каждый параметр является обязательным, нам нужно создать приглашение для каждого параметра. Подсказки просят пользователя указать значение для любого параметра, который не был указан, когда пользователь изначально указал свое намерение (в данном случае, чтобы назначить встречу). Щелкните Определить подсказки , чтобы создать подсказку для параметра и ввести следующие подсказки для каждого параметра:

Параметр Быстрый
свидание В какой день вы хотите прийти?
время Какое время работает для вас?

После ввода подсказок нажмите Сохранить .

Попробуйте!

На своем устройстве коснитесь предложения « Назначить встречу » или введите «Я хочу, чтобы мой велосипед починили». Вы получаете ответ «В какой день вы хотите прийти?». Укажите дату («завтра»), и вы получите ответ с запросом времени на дату. Ответьте на это, и вы увидите, что ваша встреча назначена.

Запросы, содержащие некоторую информацию в исходном запросе (например, «Я хочу назначить встречу на завтра»), заполняют правильный параметр (дату), пропускают запрос даты («В какой день вы хотите прийти?») и перейти к подсказке времени («В какое время вы работаете?»).

Мы только что использовали объекты и параметры Dialogflow для создания совершенно уникального разговора без кода и с очень небольшой настройкой! Далее мы рассмотрим, как использовать выполнение, чтобы помочь пользователю ответить на вопросы типа «На какую дату вы хотите назначить встречу?».

Настройка: включение выполнения

В левой панели навигации нажмите « Намерения » и откройте намерение «Назначить встречу». Откройте Fulfillment , выберите Включить вызов веб-перехватчика для этого намерения и Включить вызов веб-перехватчика для заполнения слота , чтобы они оба были включены, и нажмите Сохранить .

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

Реализовать выполнение

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

intentMap.set('Hours', hoursHandler);

И добавьте следующее в качестве следующей строки:

intentMap.set('Make Appointment', makeAppointment);

Это сообщает библиотеке выполнения, что функция makeAppointment должна выполняться при совпадении намерения «Назначить встречу».

Затем скопируйте приведенный ниже код и вставьте его ниже функции currentlyOpen . Две функции, getSuggestedTimes и getSuggestedDates , создают полезные списки чипов для облегчения ответов пользователей.

function getSuggestedTimes() {
  return [
        {
          "reply": {
            "text": "9 am",
            "postbackData": "9:00am"
            }
        },
        {
          "reply": {
            "text": "10 am",
            "postbackData": "10:00am"
          }
        },
        {
          "reply": {
            "text": "1 pm",
            "postbackData": "1:00pm"
          }
        },
        {
          "reply": {
            "text": "2 pm",
            "postbackData": "2:00pm"
          }
        }
      ];
}

function getSuggestedDates() {
  return [
        {
          "reply": {
            "text": "Tomorrow",
            "postbackData": "Tomorrow"
          }
        },
        {
          "reply": {
            "text": "A week from now",
            "postbackData": "A week from now"
          }
        },
        {
          "reply": {
            "text": "Two weeks from now",
            "postbackData": "Two weeks from now"
          }
        }
      ];
}

Затем, ниже hoursHandler , скопируйте и вставьте приведенный ниже код, затем нажмите Deploy .

function makeAppointment(agent) {
    // extract required parameters
    const appointmentDate = agent.parameters.date;
    const appointmentTime = agent.parameters.time;

    const gotAppointmentDate = appointmentDate.length > 0;
    const gotAppointmentTime = appointmentTime.length > 0;

    let responseText = '';
    let suggestions = [];

    if(gotAppointmentDate && gotAppointmentTime) {
      // We have all required parameters, return success message
      responseText = 'Great! I\'ve set up your appointment for ' +
          appointmentDate + ' at ' + appointmentTime + '.  See you then!';
    }
    else if(gotAppointmentDate) {
      responseText = 'What time works for you?';
      suggestions = getSuggestedTimes();
    }
    else if(gotAppointmentTime) {
      responseText = 'What day do you want to come in?';
      suggestions = getSuggestedDates();
    }
    else {
      responseText = 'What day do you want to come in?';
      suggestions = getSuggestedDates();
    }

    let payload = {
      "fulfillmentMessages": [
      {
        "platform": "GOOGLE_RBM",
        "rbmText": {
          "text": responseText,
          "rbmSuggestion": suggestions
        }
      }
    ]
    };

    return response.status(200).json(payload);
  }

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

Попробуйте!

На своем устройстве коснитесь предложения « Назначить встречу » или введите «Я хочу, чтобы мой велосипед починили». Вы получаете ответ: «В какой день вы хотите прийти?» вместе с некоторыми полезными предложениями: «Завтра», «Через неделю» и «Через две недели». Укажите дату («завтра»), и вы получите ответ с запросом времени. Ответьте на это, и вы увидите, что ваша встреча назначена.

Управление состоянием с помощью контекстов

Продолжительность: 7:00

Добавить контексты в состояние разговора

После того, как наш пользователь успешно назначит встречу, мы можем захотеть получить от него дополнительную информацию. Представьте, наш веломагазин предлагает два вида записи: ремонт или тюнинг. Мы хотим знать, какие из них нужны пользователю.

Для начала давайте обновим ответ для намерения «Назначить встречу», чтобы спросить пользователя, какой тип встречи ему нужен. Замените ответ об успешном выполнении в функции выполнения makeAppointment приведенным ниже текстом, затем нажмите « Развернуть » .

responseText = 'Great! I\'ve set up your appointment for ' +
    appointmentDate + ' at ' + appointmentTime + '.  Do you need a repair for just a tune-up?';

Чтобы собрать ответ на этот вопрос, нам нужно создать еще один интент. Однако важно, чтобы это новое намерение соответствовало только после того, как на этот вопрос уже был дан ответ. Чтобы обеспечить это, мы можем определить его как последующее намерение.

Последующие намерения — это намерения, которые могут быть сопоставлены только после совпадения их «родительского» намерения (в данном случае с нашим намерением «Назначить встречу»). Нажмите «Намерения» в левой панели навигации (если меню скрыто, нажмите кнопку меню в левом верхнем углу). Затем наведите указатель мыши на намерение «Назначить встречу» и нажмите « Добавить последующее намерение » справа от названия намерения:

Затем нажмите « Пользовательский » в раскрывающемся меню.

Dialogflow автоматически назвал последующее намерение «Назначить встречу — пользовательское», а стрелка указывает на взаимосвязь между намерениями.

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

Чтобы получить ответ на этот вопрос, нам сначала нужно определить некоторые сущности.

Создание вашей первой сущности

Dialogflow позволяет вам определять сущности разработчика, которые функционируют аналогично системным сущностям Dialogflow. Начнем с создания типа сущности. Поскольку мы хотим, чтобы пользователи могли выбирать, какой тип встречи они хотели бы назначить в нашем магазине, давайте назовем тип сущности AppointmentType . Мы добавим две сущности в тип сущности AppointmentType для двух разных типов встреч: service и fix .

Чтобы создать тип объекта:

  1. Нажмите + рядом с Сущностями в левой навигационной панели.
  2. В качестве имени типа объекта введите «AppointmentType».
  3. Нажмите на текстовое поле и добавьте следующие записи:
    • оказание услуг
    • исправить
  4. Когда вы вводите запись, нажатие клавиши Tab перемещает курсор в поле синонима. Добавьте следующие синонимы для каждой записи. Не забудьте добавить каждое слово по отдельности, а не копировать и вставлять всю строку:
Вход Синоним
оказание услуг
  • оказание услуг
  • капитальный ремонт
  • техническое обслуживание
  • настройка
  • настроиться
исправить
  • исправить
  • ремонт
  • исправить
  • сломанный
  • спущенная шина
  • исправлено
  1. Нажмите Сохранить .

Каждый тип сущности должен иметь следующее:

  • имя для определения категории ("AppointmentType")
  • одна или несколько записей ("service", "fix")
  • один или несколько синонимов («техническое обслуживание», «настройка» и т. д.)

Dialogflow обрабатывает простые вещи, такие как множественность и использование заглавных букв, но не забудьте добавить все возможные синонимы. Чем больше вы добавите, тем лучше ваш агент сможет определить ваши сущности.

Добавление вашей новой сущности

Теперь, когда мы определили наш тип объекта для встречи, мы можем использовать его во фразах обучения нашего намерения «Назначить встречу — пользовательское»:

  1. Нажмите « Намерения » в левой навигационной панели, затем нажмите стрелку рядом с намерением «Назначить встречу», чтобы показать его последующие намерения. Нажмите намерение «Назначить встречу — пользовательское».
  2. Добавьте следующие фразы для обучения:

    • Вы можете обслужить мой велосипед?
    • Мне нужен ремонт.

  3. Вы должны увидеть тип сущности встречи, автоматически аннотированный во введенных фразах обучения . Это добавит параметр AppointmentType в таблицу, которая находится под разделом Обучающие фразы . Установите флажок, чтобы отметить этот параметр как НЕОБХОДИМЫЙ .

  4. Нажмите « Определить подсказки » и введите «Мы можем обслужить или отремонтировать ваш велосипед. Какой из них вы предпочитаете?»

  5. В разделе « Ответы » измените ответ на «Хорошо, мы назначим $AppointmentType.», затем нажмите « Сохранить » .

Попробуйте!

На своем устройстве коснитесь предложения « Назначить встречу » или введите «Я хочу, чтобы мой велосипед починили». Вы получаете ответ: «В какой день вы хотите прийти?» вместе с некоторыми полезными предложениями: «Завтра», «Через неделю» и «Через две недели». Укажите дату («завтра»), и вы получите ответ с запросом времени на дату.

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

Далее введите «Мне нужен ремонт». Вы должны увидеть ответ «Хорошо, мы запланируем исправление», указывающий, что Dialogflow извлек правильный AppointmentType как объект.

Прямо сейчас ответ на это намерение («Хорошо, мы запланируем исправление») довольно бесполезен. Было бы здорово, если бы в ответе была подтверждена дата и время, когда была назначена встреча. Для этого нам нужны дата и время, но параметры даты и времени присутствуют только в намерении «Назначить встречу», а не в намерении «Назначить встречу — пользовательское».

Намерения и контексты

Чтобы ответить параметром, полученным из намерения «Назначить встречу», вам нужно знать, как работают последующие намерения. Последующие намерения используют контексты, чтобы отслеживать, было ли активировано родительское намерение. Если вы проверите намерение «Назначить встречу», вы увидите «MakeAppointment-followup», указанный в качестве контекста вывода, с префиксом 2 :

После того, как намерение «Назначить встречу» совпало, Dialogflow прикрепляет контекст «Назначить встречу-последующее» к разговору на два хода. Поэтому при ответе пользователя на вопрос («Тебе нужен ремонт или только тюнинг?») активен контекст «Записаться-договориться». Любые намерения, имеющие один и тот же контекст ввода, сильно предпочтительны, когда Dialogflow соответствует намерениям.

Нажмите « Намерения » на панели навигации слева, затем нажмите «Назначить встречу — пользовательское».

Вы можете видеть, что намерение имеет тот же входной контекст ("MakeAppointment-последующее наблюдение"), что и выходной контекст "Make Appointment". Из-за этого «Назначить встречу — пользовательская» соответствует только после совпадения намерения «Назначить встречу».

Контексты и параметры

Контексты хранят значения параметров, что означает, что вы можете получить доступ к значениям параметров, определенных в намерении «Назначить встречу», в других намерениях, таких как «Назначить встречу — пользовательское».

Добавьте следующий ответ к намерению «MakeAppointment — custom» и нажмите « Сохранить »: «Хорошо, мы назначим $AppointmentType, #MakeAppointment-followup.date, на #MakeAppointment-followup.time. Тогда увидимся».

Теперь вы можете снова запросить своего агента и получить правильный ответ. Сначала введите «Могу ли я назначить встречу для обслуживания моего велосипеда завтра в 11 утра?», а затем ответьте на вопрос «Мне нужен ремонт».

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

Улучшение формата ответа

Продолжительность: 5:00

Используйте выполнение для форматирования даты и времени

Как вы, вероятно, заметили, дата и время, отображаемые в сообщении об успешном завершении, не очень удобны для пользователя. Чтобы исправить это, нам нужно снова использовать выполнение, чтобы мы могли использовать JavaScript для форматирования параметров даты и времени таким образом, чтобы пользователь мог легко их прочитать.

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

Перейдите к выполнению, щелкнув ссылку «Выполнение» в левой панели навигации. Скопируйте приведенный ниже код и вставьте его под функцией makeAppointment .

function makeAppointmentFollowUp(agent) {
    let context = agent.getContext('makeappointment-followup');

    // extract required parameters
    const appointmentDate = new Date(context.parameters.date);
    const appointmentTime = new Date(context.parameters.time);
    const appointmentType = agent.parameters.AppointmentType;

    // format date and time to be human-readable
    const dateAsString = appointmentDate.toLocaleDateString('en-US',
        { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });
    const timeAsString = appointmentTime.toLocaleString('en-US',
        { hour: 'numeric', minute: 'numeric', hour12: true });

    // compose response for user
    let responseText = 'Okay, we'll schedule a ' + appointmentType + ', ' + dateAsString +
        ', at ' + timeAsString + '.  We'll see you then.';

    let payload = {
      "fulfillmentMessages": [
      {
        "platform": "GOOGLE_RBM",
        "rbmText": {
          "text": responseText
        }
      }
    ]
    };

    return response.status(200).json(payload);
  }

Под этой функцией найдите строку intentMap.set('Make appointment', makeAppointment); и добавьте intentMap.set('Make appointment - custom', makeAppointmentFollowUp); так что, когда вызывается последующее намерение, вызывается функция, которую вы вставили ранее.

Взгляните на код makeAppointmentFollowUp и посмотрите, как параметры извлекаются как из входящего контекста, так и из этого намерения. Перед созданием responseText код теперь форматирует дату и время, чтобы они были удобочитаемыми.

Попробуйте!

На своем устройстве коснитесь предложения « Назначить встречу » или введите «Я хочу, чтобы мой велосипед починили». Вы получаете ответ: «В какой день вы хотите прийти?» вместе с некоторыми полезными предложениями: «Завтра», «Через неделю» и «Через две недели». Укажите дату («завтра»), и вы получите ответ с запросом времени на дату.

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

Далее введите «Мне нужен ремонт». Вы должны увидеть ответ, подтверждающий встречу с типом встречи, датой и временем в читаемом формате.

Готово!

Продолжительность: 1:00

Хорошо сделано!

Вы прошли все этапы создания агента RBM на базе Dialogflow.

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