Читать книгу «Машинное обучение и Искусственный Интеллект» онлайн полностью📖 — Тимура Машнина — MyBook.
image

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

Кроме того, вы можете импортировать сущности, нажав кнопку «Импортировать» рядом с «Create entity».

Загрузите файл CSV с двумя новыми сущностями, который прилагается к лекции.

И импортируйте его.

После успешной загрузки и импорта сущностей вы должны увидеть их в списке.

Теперь, давайте, наконец, рассмотрим третий компонент диалогового навыка.

А именно сам диалог.

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

Наш чат-бот может обнаруживать и классифицировать вводимые пользователем данные, но он еще пока не может ответить пользователю.

Например, когда пользователь приветствует нас, мы можем захотеть ответить «Привет! Могу я чем-нибудь помочь?".

То же самое верно и для более сложных запросов.

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

Диалог – это дерево узлов, и каждый узел обычно обрабатывает один конкретный сценарий.

Например, здесь у нас есть три узла.

Первый узел – это Welcome, который обрабатывает приглашение чатбота.

Другими словами, наше приветствие при первом появлении пользователя.

Затем у нас есть узел Greetings для ответа на приветствие пользователя.

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

Welcome и Anything else – это два узла по умолчанию, созданные для вас при первом создании диалога для вашего чат-бота.

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

Каждому такому узлу дается имя.

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

В этом примере, узел будет запущен, если в пользовательском вводе обнаружено намерение #greetings.

Условие может быть как простым, так и сложным логическим выражением.

В большинстве случаев это условие будет проверять намерение, сущность или их комбинацию.

Затем у нас есть блок ответа, где мы указываем, что ответить пользователю.

В этом случае просто: «Привет. Чем я могу вам помочь?»

Этот блок ответа имеет много вариантов.

Ответ может быть изображением или некоторыми параметрами, которые может выбрать пользователь.

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

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

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

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

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

Запуск узлов выполняется сверху вниз в диалоге.

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

Если условие не выполнено, мы перейдем ко второму узлу.

Если и этот узел не соответствует критериям, мы рассмотрим третий узел и так далее.

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

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

Этот узел имеет специальное условие, которое всегда выполняется, даже если все узлы над ним не выполняются.

Это гарантирует, что у нас всегда есть ответ для пользователя, например: «Я не понимаю, не могли бы вы перефразировать?».

По этой же причине у нас есть узел Welcome в самом вверху, приветствующий пользователя.

У этого узла есть специальное условие приветствия, которое выполняется только в начале разговора с пользователем.

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

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

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

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

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

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

Откроем вкладку Диалог навыка.

И нажмем кнопку Create Dialog.

И здесь у нас уже есть два узла Welcome и Anything else.

Открыв панель Try it мы сразу увидим приветствие.

Открыв узел Welcome, мы можем изменить это приветствие.

Теперь, если мы ответим «Привет», Уотсон правильно распознал намерение #greetings, но у него нет нужного узла для обработки приветствий, поэтому выполнился резервный узел Anything else.

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

Причина этого заключается в том, что узел Anything else по умолчанию имеет три варианта ответа.

Это сделано, чтобы чатбот выглядел умнее.

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

В любом другом случае наличие нескольких вариаций делает чатбота умнее.

Давайте добавим четвертый вариант к узлу Anything else со следующим текстом: «Похоже, мы сегодня друг друга не понимаем». Хотели бы вы вместо этого поговорить с человеческом? Если это так, пожалуйста, свяжитесь с нами по телефону или напишите нам по адресу support\@example.org.

Знак \ перед @ необходим для отображения специального символа собака.

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

Если бы этот режим был случайным, мы могли бы обострить ситуацию уже в первый раз.

У нас есть три намерения для чата: #greetings, #thank_you и #goodbyes.

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

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

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

Это самый распространенный и простой подход.

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

Мы будем использовать простой подход.

И мы создадим папку для чата, нажав на три вертикальные точки на узле Welcom, и выбрав команду Add folder.

Далее нажмем на три вертикальные точки на созданной папке и выберем команду Add node to folder.

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

Стоит отметить, что вы можете сделать условие узла сложным.

Например, вы можете использовать оператор OR или AND, чтобы составить сложное условие из нескольких намерений.

Например, #greetings OR #goodbyes.

И для каждого узла, мы введем несколько ответов пользователю.

Например, «Привет. Чем я могу вам помочь?», «Здравствуйте. Как я могу помочь вам?», и так далее.

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

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

И раздел And finally в нижней части узла определяет, что происходит после того, как этот узел был выполнен и пользователю был дан ответ.

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

Теперь, вы можете попробовать панель Try it.

Тоже самое сделайте для других узлов.

Для узла #thank_you. введите что-то вроде:

Пожалуйста, дайте мне знать, если вам нужно что-нибудь еще.

С удовольствием.

Нет проблем. Дайте мне знать, если есть что-то еще, с чем я могу помочь.

Для узла #goodbyes.

Приятно с вами поговорить.

Хорошего дня.

Прощай.

Теперь, ранее мы определили намерение #hours_info для людей, спрашивающих о часах работы и адресах нашей сети магазинов, и даже создали сущность @location, чтобы иметь возможность предоставлять ответы, специфичные для конкретного места.

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

И мы начнем с создания узла для запроса часов работы.

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

Здесь введем имя узла и укажем намерение #hours_info в качестве условия узла.

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

В качестве ответа введите:

Наши часы работы указаны на нашей странице.

И обратите внимание, что здесь используется HTML-код в ответе.

Затем перейдите в панель Try it и проверьте, работает ли узел, спросив:

When is your Vancouver store open?

Когда ваш магазин в Ванкувере открыт?

Теперь, мы можем улучшить этот ответ, рассмотрев три возможных сценария.

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

Это классический вариант использования дочерних узлов.

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

Поэтому удалим ответ из нашего узла «Часы работы», щелкнув значок удалить.

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

Так как мы позволим дочерним узлам решать, каков правильный ответ.

Далее на узле «Часы работы», нажмем «Добавить дочерний узел».

Это создает первый дочерний узел.

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

Мы назовем этот узел Наши места.

И мы установим условие @location с оператором any для выполнения этого узла.

Это означает, что для пользовательского ввода будут выполняться два условия: намерение #hours_info и ввод будет содержать сущность @location.

И нам нужен способ предложить разные ответы для разных городов, поэтому мы включим опцию Multiple conditioned responses.

Для этого мы нажмем вверху Customize.

И включим Multiple responses и нажмем Apply.

Теперь у нас есть возможность прикрепить условие к каждому ответу.

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

Например, для условия @location: Toronto наш ответ будет -

Наш магазин в Торонто открыт с понедельника по субботу с 9 утра до 18.00, кроме выходных.

Стоит отметить, что, если часы работы одинаковые для всех местоположений, мы могли бы просто включить @location в наш ответ.

Например, наш магазин @location открыт с понедельника по субботу с 9 до 18 часов, кроме выходных.

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

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

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

Здесь укажем сущность @sys-location с оператором any в качестве условия для этого узла.

В качестве ответа введем -

К сожалению, у нас нет магазина в @sys-location. На сегодняшний день у нас есть магазины в Торонто, Монреале, Калгари и Ванкувере.

И обратите внимание, что @sys-location будет вставлять местоположения, однако этот узел никогда не будет выполняться для наших собственных местоположений, так как он идет после узла Our Locations.

При организации вашего диалога всегда размещайте узлы с определенными условиями вверху и узлы с более общими условиями внизу.

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

И установим условие для этого узла true.

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

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

И здесь нам нужен общий ответ, поэтому наш ответ будет -

Наши часы работы перечислены на нашей странице.

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

Для этого откроем родительский узел, и в разделе And finally изменим Ожидание ввода пользователя на пропустить ввод пользователя.

Это передаст выполнение дочерним узлам, которые мы только что создали.

Теперь, откроем панель Try it и попробуем вводы:

Какие у вас часы работы в Торонто?

Какие часы работы в Калгари?

Какие часы работы в Сиэтле?

Какие у вас часы работы?

И вы должны увидеть правильный ответ для каждого из этих вводов.

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

Для этого мы продублируем часы работы и в новых родительских и дочерних узлах для обработки адреса запроса потребуется изменить условие на #location_info вместо #hours_info и изменить ответы с часов работы на адреса.

Например, Our Toronto store is located at 123 Warden Avenue.

Our store locations are listed on our site on the <a href="https://example.org/stores">stores page</a>.

Попробуйте ввести в панели Try it -

hello

where are you stores located?

what are your hours of operations in Montreal?

thank you

bye

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

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

Однако здесь мы увидели, как работать с дочерними узлами.

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

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

Таким образом, мы создали простой, но работающий чатбот.

Проблема в том, что в настоящее время он доступен только в панели Try it после входа в систему.

И нам нужно развернуть нашего чат-бота где-нибудь на сайте.

В панели IBM Watson Assistant есть вкладка помощников Assistants.

И на самом деле, помощник – это и есть чатбот, который может иметь один или несколько навыков Skill.

И мы разработали навык, который позволяет чат-боту понимать и отвечать пользователю.

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

Это позволит развернуть чат-бот по различным каналам, включая сайты WordPress, Facebook Messenger, и так далее.

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

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

Но для начала мы создадим помощника и свяжем его с навыком.

Для этого нажмем кнопку «Create assistant».

Здесь вы введете имя (например, Florence Chatbot), необязательное описание и укажите, хотите ли вы ссылку для предварительного просмотра.

И нажмите кнопку Create assistant, чтобы создать помощника.

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

Нажмем «Добавить навык диалога» и затем выберем «Добавить существующий навык».

Затем выберем навык «Цветочный магазин», нажав на него.

Теперь, помощник Florence Chatbot связан с навыком цветочного магазина.

И ваш помощник чат-бота теперь готов к развертыванию.

Вы можете открыть предварительный просмотр, нажав кнопку «Просмотр ссылки» в разделе «Интеграции».

Откроется страница, содержащая ссылку.

И нажмите на эту ссылку, чтобы увидеть своего чат-бота в действии.

С помощью этой ссылки можно опробовать ваш чат-бот.

И имейте в виду, что каждый раз, когда кто-то отправляет сообщение в чат-бот, выполняется один вызов API, и он учитывается в бесплатной квоте 10 000 вызовов API в месяц.

1
...