본문 바로가기

업무/챗봇 (Rasa)

[Rasa] 커스텀 액션 이벤트 (FollowupAction, Restarted)

 

[ Rasa SDK ]

events

from rasa_sdk.events import (
    Restarted, SlotSet, SessionStarted, ActionExecuted, EventType,
    FollowupAction, ActiveLoop, Form, UserUtteranceReverted, ConversationPaused , AllSlotsReset
)

 


 

* FollowupAction

한 액션의 실행 후 즉시 다른 액션을 실행하도록 제어.

 

from rasa_sdk import Action
from rasa_sdk.events import FollowupAction
from rasa_sdk.interfaces import Tracker
from rasa_sdk.executor import CollectingDispatcher

class ActionProvideInfo(Action):
    def name(self):
        return "action_provide_info"

    def run(self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: dict):
        # 사용자에게 정보 제공
        dispatcher.utter_message(text="여기 필요한 정보를 제공합니다.")

        # 정보 제공 후 추가 정보 요청을 위해 다른 액션 실행
        return [FollowupAction("action_request_additional_info")]

class ActionRequestAdditionalInfo(Action):
    def name(self):
        return "action_request_additional_info"

    def run(self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: dict):
        # 사용자에게 추가 정보를 요청
        dispatcher.utter_message(text="추가로 필요한 정보를 알려주세요.")

        # 이 액션을 처리한 후 자동으로 사용자의 입력을 기다리도록 설정
        return []

=> action_provide_info 액션 실행 이후 곧바로 action_request_additional_info 액션을 실행.

 

** FollowupAction 으로 지정한 액션이 rule & story 에 지정된 액션보다 우선적으로 실행 (액션이 충돌하는 경우)

- story: 사용자 정보 요청과 추가 정보 요청
  steps:
  - intent: request_info
  - action: action_provide_info
  - action: action_after_info  
  # 이 액션은 FollowupAction에 의해 우선적으로 실행된 action_request_additional_info 후에 실행

stroy에 위와 같이 지정되어 있다면,

action_provide_info   =>  action_after_info    순서로 실행.

FollowupAction 으로 액션 순서를 제어한다면,

action_provide_info   =>  action_request_additional_info (FollowupAction)  =>  action_after_info   순서로 실행.

 

조건에 따라 대화 흐름을 제어해야 할 때 유용 ***

 


 

* Restarted

대화 상태를 초기화하고 모든 슬롯 값을 비워준다. (대화 세션을 재시작.)

 

from rasa_sdk import Action
from rasa_sdk.events import Restarted, FollowupAction
from rasa_sdk.interfaces import Tracker
from rasa_sdk.executor import CollectingDispatcher

class ActionRestartConversation(Action):
    def name(self):
        return "action_restart"

    def run(self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: dict):
        # 대화 재시작 메시지 전송
        dispatcher.utter_message(text="대화를 재시작합니다.")

        # 대화를 재시작하고, 사용자 입력을 기다리는 액션으로 다시 전환
        return [Restarted(), FollowupAction("action_listen")]

 

=> action_restart 액션이 실행되면, 

return값으로    Restarted()  => 대화 세션 초기화. (모든 슬롯값 초기화)

                        FollowupAction("action_listen")  => 사용자 입력 대기상태로 전환.