У меня есть намерение под названием intent_yes
, которое используется в нескольких различных разговорных потоках. Когда пользователь говорит «Да» или «Да» и т. Д., Он вызывает действие моего веб-перехватчика / Rasa. Мне нужно знать, на что они сказали "да". Как мы можем получить предыдущее имя намерения из действия веб-перехватчика Rasa?
Получить предыдущее имя намерения из действия Раса?
Ответы (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"]
Думаю, я согласен с ОП. Бывают случаи, когда намерение активируется по совершенно разным причинам.
Например, у вас есть такие слова, как "Почему?" "Как?" для некоторых конкретных намерений, и соответствующие им действия запускаются без разбора. Как предотвратить срабатывание таких базовых выражений в самых маловероятных сценариях?
Конечно, неэффективно писать рассказы для каждого мыслимого разговора на тему «Почему» и «Как».
Вот почему мне нужно решение, которое проверяет состояние разговора и определяет, было ли инициировано конкретное намерение перед запуском.
И приведенное выше решение Тома имеет смысл. Я попробую это.
ОБНОВЛЕНИЕ: это было мое решение:
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
.
Если меня интересует крайний случай, я обращаюсь с ним по-другому. Если нет, я отвечу в общем.
Это хакерство? Может быть. Но до тех пор, пока я не найду способ запретить себе писать истории обо всех возможных способах, которыми пользователь может спросить «почему?», Этого будет достаточно. Я открыт для лучших предложений.