Перейти к содержанию

Создание пользовательских действий

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

Поскольку Wisebot основан на Rasa, пользовательские действия в Wisebot и Rasa идентичны.

Пример пользовательского действия

Ниже приведен пример пользовательского действия на Python:

from typing import Any, Text, Dict, List
from rasa_sdk import Action, Tracker
from rasa_sdk.events import SlotSet
import requests

class FetchStatus(Action):

   def name(self) -> Text:
      return 'action_fetch_status'

   def run(self, dispatcher, tracker: Tracker, domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
      url = "https://some.api.com/user/xxx/status"
      response = requests.get(url)
      status = response.json()
      return [SlotSet("status", status)]

Метод run выполняет произвольное действие и возвращает список событий, обычно объектов SlotSet. В приведенном выше примере действие получает статус из внешнего API и сохраняет его в слот status, который затем может быть использован в разговоре.

Вызов пользовательского действия

Пользовательское действие можно вызвать из конструктора бесед следующим образом:

  1. Выберите Действие и введите название action-скрипта:

Image

  1. Добавьте созданное действие в секцию Настройки -> Домен по умолчанию:

Image

Методы и свойства

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

  • tracker.get_slot(slot_name): Получить значение слота.
  • tracker.latest_message: Получить последнее сообщение, отправленное пользователем, включая намерение и сущности.
  • dispatcher.utter_message(template="utter_whatever"): Отправить ответ пользователю.

Дополнительную информацию можно найти в документации Rasa SDK.

Примеры разработки Action-скриптов

Действия по умолчанию

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

Каждое из этих действий обладает поведением по умолчанию, описанным ниже. Чтобы изменить это поведение, создайте пользовательское действие, в котором метод name() возвращает то же имя, что и действие по умолчанию:

class ActionRestart(Action):

   def name(self) -> Text:
      return "action_restart"

   async def run(
      self, dispatcher, tracker: Tracker, domain: Dict[Text, Any]
   ) -> List[Dict[Text, Any]]:
      # custom behavior
      return [...]

Добавьте это действие в раздел actions вашего файла домена, чтобы ваш помощник использовал пользовательское определение вместо стандартного:

actions:
  - action_restart

После добавления этого действия в файл домена повторно обучите модель с помощью rasa train --force, иначе Rasa может не распознать изменения и пропустить переобучение модели диалога.

Описание стандартных действий

action_listen

Ожидает ввода пользователя и не выполняет никаких действий.

action_restart

Сбрасывает всю историю разговора, включая установленные слоты. Может быть активировано командой /restart, если включен RulePolicy. Если определить utter_restart в домене, оно будет отправлено пользователю при активации.

action_session_start

Запускает новый сеанс разговора в следующих случаях:

  • В начале нового разговора.
  • После неактивности пользователя, определяемой параметром session_expiration_time в конфигурации сеанса.
  • Когда пользователь отправляет сообщение /session_start во время разговора.

По умолчанию действие сбрасывает счётчик разговоров, но не очищает установленные слоты.

Настройка action_session_start

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

class ActionSessionStart(Action):

   def name(self) -> Text:
      return "action_session_start"

   @staticmethod
   def fetch_slots(tracker: Tracker) -> List[EventType]:
      """Собирает слоты с именем пользователя и номером телефона."""
      slots = []
      for key in ("name", "phone_number"):
         value = tracker.get_slot(key)
         if value is not None:
            slots.append(SlotSet(key=key, value=value))
      return slots

   async def run(
      self, dispatcher, tracker: Tracker, domain: Dict[Text, Any]
   ) -> List[Dict[Text, Any]]:
      events = [SessionStarted()]
      events.extend(self.fetch_slots(tracker))
      events.append(ActionExecuted("action_listen"))
      return events

Для доступа к метаданным, отправленным с пользовательским сообщением, используйте слот session_started_metadata:

from typing import Any, Text, Dict, List
from rasa_sdk import Action, Tracker
from rasa_sdk.events import SessionStarted, ActionExecuted

class ActionSessionStart(Action):

   def name(self) -> Text:
      return "action_session_start"

   async def run(
      self, dispatcher, tracker: Tracker, domain: Dict[Text, Any]
   ) -> List[Dict[Text, Any]]:
      metadata = tracker.get_slot("session_started_metadata")
      # Обработка метаданных
      print(metadata)
      return [SessionStarted(), ActionExecuted("action_listen")]

action_default_fallback

Отменяет последнее взаимодействие пользователя и отправляет utter_default, если оно определено. Вызывается при низкой достоверности прогнозирования действий.

action_deactivate_loop

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

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

action_two_stage_fallback

Резервный цикл для обработки низкой достоверности NLU.

action_default_ask_affirmation

Используется в цикле action_two_stage_fallback для запроса подтверждения намерения пользователя. Можно настроить для конкретных случаев использования.

action_default_ask_rephrase

Используется циклом, если пользователь отклоняет намерение action_two_stage_fallback. Просит пользователя перефразировать сообщение.

action_back

Отменяет последнее взаимодействие пользователя. Активируется командой /back, если настроен RulePolicy.

Устранение неоднозначности пользовательского ввода

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

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

  1. Настройка политик и конвейеров.
  2. Установка канонических значений.
  3. Создание резервной истории и ответа на неоднозначность.

Наконец, мы рассмотрим более продвинутые параметры конфигурации.

Настройка политик и конвейеров

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

Добавьте следующий компонент ко всем (для каждого языка) конвейерам NLU (NLU -> Настройки). Позиция не имеет значения.

pipeline:

Image

  • Выбор канонического значения для каждого намерения

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

Image

  • Ответ на неоднозначность

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

Image