Получить предыдущее имя намерения из действия Раса?

У меня есть намерение под названием intent_yes, которое используется в нескольких различных разговорных потоках. Когда пользователь говорит «Да» или «Да» и т. Д., Он вызывает действие моего веб-перехватчика / Rasa. Мне нужно знать, на что они сказали "да". Как мы можем получить предыдущее имя намерения из действия веб-перехватчика Rasa?


person arao6    schedule 08.04.2019    source источник


Ответы (2)


Это, вероятно, не лучший дизайн - вам лучше писать отдельные истории для каждого потока, а затем иметь соответствующее действие для каждого обстоятельства, однако в методе run настраиваемого действия вы можете получить доступ к tracker. Этот объект содержит все события разговора в списке под названием tracker.events, который будет выглядеть примерно так:

[{'event': 'action', 'timestamp': 1558688062.7624729, 'name': 'action_listen', 'policy': None, 'confidence': None},
{'event': 'user', 'timestamp': 1558688062.7628329, 'text': '/joke', 'parse_data': {'text': '/joke', 'intent': {'name': 'joke', 'confidence': 1.0}, 'intent_ranking': [{'name': 'joke', 'confidence': 1.0}], 'entities': []}, 'input_channel': 'rest'}]

Чтобы получить сообщения пользователя, просто перебирайте этот список в обратном направлении, пока не найдете "event":"user", а намерение будет указано внутри "parse_data"["intent"]

person Tom Metcalfe    schedule 29.05.2019

Думаю, я согласен с ОП. Бывают случаи, когда намерение активируется по совершенно разным причинам.

Например, у вас есть такие слова, как "Почему?" "Как?" для некоторых конкретных намерений, и соответствующие им действия запускаются без разбора. Как предотвратить срабатывание таких базовых выражений в самых маловероятных сценариях?

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

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

И приведенное выше решение Тома имеет смысл. Я попробую это.

ОБНОВЛЕНИЕ: это было мое решение:

def get_latest_event(events)
  latest_actions = []
    for e in events:
        if e['event'] == 'action':
            latest_actions.append(e)

    return latest_actions[-2:][0]['name']

get_latest_event(tracker.events)
  • Я подумал, что лучше всего обернуть его функцией для переносимости.
  • Я создаю пустой список.
  • Пройдите все заданные события.
  • Если событие является action событием, я помещаю его в пустой список выше.
  • Затем я возвращаюсь с двумя последними объектами, выбираю имя первого.

Предполагается, что мы ищем последнее сработавшее действие.

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

Например, пользователь спрашивает why?

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

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

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

person Wale    schedule 12.06.2020