Компонент чат-бота :D ialog
МОДУЛЬ 4: Диалог
В этой статье мы, наконец, обратимся к третьему компоненту нашего навыка ведения диалога, а именно к самому диалогу. Компонент диалога позволяет нам выдавать ответ пользователю на основе его намерения и специфики его запроса, который мы зафиксировали через определенные нами сущности. Здорово, что наш чат-бот может обнаруживать и классифицировать вводимые пользователем данные. Тем не менее, до сих пор мы вообще не ответили пользователю. Мы должны быть в состоянии действовать в соответствии с этой правильной классификацией, давая соответствующий ответ. Например, когда пользователь приветствует нас, мы можем захотеть ответить ему в ответ. Привет. Чем я могу вам помочь? То же самое справедливо и для более сложных запросов. Мы должны иметь возможность использовать тонко настроенную классификацию, которую нам позволили сделать намерения и сущности, чтобы обеспечить надлежащий и точный ответ пользователю. В этом случае они поинтересовались часами работы нашего магазина в Торонто, и ответ должен был отражать это и содержать информацию, которую ищет пользователь.
Диалог — это просто дерево узлов, и каждый узел обычно обрабатывает один конкретный сценарий, например, здесь у нас есть три узла. Первый из них приветствуется, он обрабатывает подсказки чат-бота. Другими словами, наше приветствие, когда приходит первый пользователь. Затем у нас есть узел приветствия, который отвечает на приветствие пользователя. Наконец, у нас есть специальный резервный узел, который будет уведомлять пользователя о том, что чат-бот не совсем уверен в том, о чем спрашивает пользователь. Добро пожаловать, и все остальное — это два узла по умолчанию, которые создаются для вас при первом создании диалога для чат-бота. Любой узел, который вы определите, будет находиться между этими двумя, но давайте кратко рассмотрим, как может выглядеть узел. Вы захотите дать каждому узлу имя. Watson на самом деле не заботится о названии узла, но оно полезно для нас, дизайнеров чат-ботов, чтобы нам было проще организовывать и работать с нашими узлами. Далее у нас будет условие, которое определяет, когда должен быть выполнен узел. В этом случае узел будет выполнен, если намерение приветствия будет обнаружено во входных данных пользователя. Условие может быть как простым, как это, так и сложным логическим выражением. В большинстве случаев он будет проверяться на соответствие намерению, сущности или их комбинации. Затем у нас есть блок ответов, где мы, наконец, решаем, что ответить пользователю. В этом случае простое «Здравствуйте. Чем я могу вам помочь?» будет достаточно. У этого блока ответов много-много вариантов. На самом деле, ответ даже не обязательно должен быть текстовым. Это может быть изображение или несколько вариантов на выбор пользователя. Мы можем предоставить несколько вариантов ответов, а затем решить, должны ли они выдаваться в том порядке, в котором они появляются каждый раз при выполнении этого узла, или случайным образом из предоставленного нами списка. У нас даже может быть несколько ответов, в которых мы присоединяем условие к каждому отдельному ответу в пределах одного и того же узла. Это отличная функция, и мы обязательно воспользуемся ею в лабораторных работах этого курса.
Наконец, мы можем указать, что произойдет после того, как мы отправим ответ. Обычно мы просто ждем, пока пользователь скажет что-то еще, и поэтому это действие по умолчанию. Тем не менее, доступны и другие опции, включая возможность перехода к другим узлам в диалоговом окне. Это функция, которая будет полезна в более сложных чат-ботах, но может привести к появлению чат-ботов, о которых будет трудно рассудить, если вы злоупотребляете ею. Выполнение оценивается сверху донизу диалогового окна, поэтому, когда пользователь отправляет свое высказывание, первый узел будет оценен для выполнения. Если условие не выполняется, мы перейдем ко второму узлу. Если и этот не соответствует критериям, мы рассмотрим третий узел и так далее. По сути, мы продолжаем оценивать узлы в том порядке, в котором они появляются, в то время как состояние этих узлов является неисправностью. Мы останавливаемся на первом узле, состояние которого совпадает с пользовательским вводом. Вот почему важно, чтобы резервный узел «что-нибудь еще» находился в самом низу. У этого узла есть специальное условие, которое всегда выполняется всякий раз, когда все узлы над ним не выполняются. Это гарантирует, что у нас будет ответ для пользователя, даже если это будет простое «Я не понимаю, не могли бы вы попробовать перефразировать?». Точно так же именно поэтому у нас есть приветственный узел, приветствующий пользователя, на самом верху. У этого узла есть специальное условие приветствия, которое выполняется только в начале разговора с пользователем. Размещая его сверху, мы гарантируем, что он будет выполнен до того, как будет рассмотрен любой другой узел. Тот факт, что условие истинно только один раз, гарантирует, что мы не будем продолжать приветствовать пользователя каждый раз, когда оцениваем его вводимые данные. Узлы также могут иметь дочерние узлы, и в сложных чат-ботах бывают ситуации, когда использование этой функции позволяет нам создать более тонкого чат-бота. Дочерние узлы рассматриваются для выполнения только после того, как родительский узел был выполнен, если только какой-либо другой узел в диалоговом окне явно не перешел к данному дочернему узлу. Затем дочерние узлы также выполняются сверху вниз, и мы прекращаем выполнение на первом дочернем узле, который удовлетворяет условию. Помощник Watson представил много интересных новых функций, которые на самом деле позволяют нам меньше полагаться на дочерние узлы, значительно упрощая дизайн диалогов. К концу этой статьи вы познакомитесь как с дочерними узлами, так и с более простыми альтернативами, которые можно использовать во многих сценариях.
Преподает: Антонио Канджиано, менеджер по проектированию и специалист по искусственному интеллекту
Сеть навыков разработчиков IBM