IBM Watson Assistant: Как научить чат-бота выбирать правильные намерения? - PullRequest
1 голос
/ 08 марта 2019

При разработке и тестировании беседы IBM Watson Assistant выявляет несколько намерений и отвечает на них с наивысшим уровнем достоверности. Иногда я хочу, чтобы оно отвечало второму намерению, а не первому, потому что оно более соответствует текущему контексту разговора. Например, если диалог содержит узлы для обработки перевода или платежа, во время сценария передачи пользователь может сказать «выполнить», что будет соответствовать как выполнению передачи, так и выполнению платежа. Поэтому я хочу, чтобы Уотсон всегда отвечал на перевод выполнения, который является текущим контекстом, даже если он идентифицирует платеж выполнения с большей уверенностью.

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

Например, предположим, что я разрабатываю бота FAQ, чтобы ответить на вопросы о 2 программах Loyalty и Saving. Для простоты я предполагаю, что есть 4 намерения

(Определение лояльности - примеры, связанные с программой лояльности) (Loyality-Join - примеры, связанные с тем, как присоединиться к программе лояльности) (Saving-Define - у которого есть примеры, связанные с тем, что такое программа сохранения) (Saving-Join - примеры, связанные с тем, как присоединиться к программе сохранения)

чтобы пользователи могли начать разговор с высказывания типа «расскажи мне о программе лояльности». затем они спросят «как присоединиться» (без упоминания программы, предполагающей, что бот знает). В этом случае Уотсон определит 2 намерения (Loyalty-Join, Saving-Join) и намерение Saving-Join может иметь более высокую степень достоверности.

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

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

Ответы [ 2 ]

1 голос
/ 08 марта 2019

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

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

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

Пример:

User: tell me about the loyalty program
WA-> Found #Loyality-Define
     Set $topic to "loyalty"
     Return answer. 

User: how to join
 WA-> No intent found. 
      $topic is not blank. 
      Set $reask to "$topic !! how to join"
APP-> $reask is set. 
      Ask question "loyalty !! how to join"
      Clear $reask and $topic
 WA-> Found #Loyalty-join
      $topic set to "loyalty"
      Return answer

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

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

ПРИМЕЧАНИЕ: Вопрос был изменен, так что это технически другой вопрос. Оставляя предыдущий ответ ниже


Вы можете использовать объект intents[] для анализа возвращаемых результатов.

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

Пример условия:

intents[0] > 0.24 && intents.[1] - intents[0] > 0.05

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

Возможно, вы захотите поиграть с этим порогом.

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

enter image description here enter image description here


Для фактического действия лучше иметь закрытую папку (условие = false). В этой папке вы ищете совпадения intents[1]. Это снизит сложность в диалоге.


Если вы хотите что-то более сложное, вы можете использовать k-means на уровне приложений. Затем верните второе намерение на прикладном уровне, чтобы логика диалога начала действовать. Здесь есть пример .

Watson Assistant Plus также делает это автоматически с помощью функции устранения неоднозначности.

0 голосов
/ 08 марта 2019

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

Кроме того, вы можете вернуться к тому, как вы определяете намерения.Эти примеры похожи на реальные сообщения пользователя?Не могли бы вы предоставить больше вариантов?Какие конфликты заставляют Watson Assistant выбрать одно, а не другое намерение?

Добавлено:

Если вы хотите, чтобы Watson Assistant «знал» о контексте, вы можете извлечь текущийнамерение и сохранить его как тему в контекстной переменной.Затем, если намерение «присоединиться» обнаружено, переключитесь на узел диалога на основе намерения «присоединиться» и определенной темы.Для этого я бы порекомендовал либо иметь только одно намерение для «присоединения к программе», либо, если это действительно необходимо, добавить подробности об особенностях в намерение.Скорее всего, нет большой разницы, и у вас останется только одно намерение.

...