본문 바로가기

업무/챗봇 (Rasa)

[Rasa] 챗봇_ 기본구성 및 Action, Tracker, CollectingDispatcher

 

Rasa NLU  : 인테트 분류 / 엔티티 추출 
Rasa Core : Action (챗봇응답 & 챗봇동작 명시)
 
 
도메인(yml) : 챗봇 구성 요소들 정의. 아래 정보들을 포함.
 
 - 인텐트(intents) : 발화 의도.
 - 엔티티(entities) : 발화 속 핵심 키워드.
 - 폼(forms) : 사용자 입력값 수집을 위한 양식.
 - 슬롯(slots) : 키워드가 채워질 공간.          ----- forms
 - 템플릿(response) : 인텐트에 대한 기본 응답. (사용자가 받는 응답값)
 - 액션(actions) : 사용자 발화에 따른 행동.(어떤 응답을 내보낼지)      ------ custom action
 - 세션설(session configuration) : 세션 종료 시간 설정.

=> utils의 json_to_yml.py : db값을 기반으로 damain의 위의 속성들을 만들어주는 로직 포함. 

 

rules (yml) : 조건에 따른 액션. (조건에 따라 실행할 고정된 규칙.)

stroy (yml) : 대화 흐름 시나리오. (대화의 맥락을 학습해서 적절한 액션을 선택하기 위해 필요.)

* rule이 있어도 story가 없으면 응답을 못함!! 

 

action (py) : Rasa SDK 의 Action 객체를 상속받은 클래스들을 정의. (액션에 대한 로직을 작성하는 곳.)

'action_example' 액션에 대해 아래의 클래스 로직이 실행. 

class ActionExample(Action):
    def name(self) -> str:
        return "action_example"

    def run(self, dispatcher: CollectingDispatcher,
            tracker: Tracker,
            domain: dict) -> list:
        
        # 로그 메시지
        logger.debug(f"Action 'action_example' triggered by user '{tracker.sender_id}' with intent '{tracker.latest_message['intent']['name']}'")
        logger.debug(f"Latest message: {tracker.latest_message}")
        logger.debug(f"Slots: {tracker.slots}")
        
        dispatcher.utter_message(text="Hello, this is an example action.")
        return []

 

 - ActionExample 클래스 :  Action 클래스를 상속.

 - def name(self) 메서드 : 액션의 이름 반환. ( -> str : 메서드가 문자열을 반환한다는 타입힌트) 

 - def run(self, ....) 메서드 : 커스텀 액션의 작업을 정의. ( return 응답 or 다음액션호출 )

   > self  ( 파이썬에서 클래스의 인스턴스를 참조하기 위한 필수 매개변수 ) 

   > dispatcher: CollectingDispatcher ( dispatcher 매개변수는 CollectingDispatcher 클래스의 인스턴스라는 타입 힌트)  

   > tracker: Tracker ( tracker 매개변수는 Tracker 클래스의 인스턴스라는 타입 힌트)  

   > domain : dict  ( domain의 매개변수는 dictionary 라는 타입 힌트 ) 

   >  ' -> list ' ( 메서드가 리스트를 반환한다는 타입 힌트 ) 

 


 

[ Rasa SDK ]

from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher

 

* CollectingDispatcher : 사용자에게 전송할 메시지 수집. 주로 커스텀 액션(action)을 정의할 때 사용하는 클래스. 

  dispatcher.utter_message()  메서드 : 사용자에게 텍스트, 이미지, 버튼 등을 전송.

(Text)

dispatcher.utter_message(text="안녕하세요! 어떻게 도와드릴까요?")

=> 텍스트로 응답.

 

(Button)

buttons = [
	{"title": "예", "payload": "/affirm"}, 
	{"title": "아니오", "payload": "/deny"}
    ]
dispatcher.utter_message(text="이 정보가 도움이 되었나요?", buttons=buttons)

=> 텍스트 & 버튼(예/아니오)으로 응답.

 

(Image)

dispatcher.utter_message(image="https://example.com/image.png")

=> 이미지로 응답. 

 

(Template) 

dispatcher.utter_message(template="utter_greet")

// dispatcher.utter_message(template="domain의 response에 정의해둔 템플릿 이름")

=> domain.yml 에 정의해둔 템플릿으로 응답. (domain의 response에 정의해둔 템플릿) 

 


 

 

* Tracker : 대화 상태 추적할 수 있는 클래스. (사용자의 값, 응답값, 슬롯값, 현재 대화 단계 등 모든 정보.)

 

 tracker.get_slot  (slot의 현재값)   

user_name = tracker.get_slot('user_name')

=> 'user_name' 슬롯 이름에 해당하는 슬롯 값 반환.

 

tracker.get_latest_entity_values  (최근 엔티티값)

location = tracker.get_latest_entity_values('location')

// get_latest_entity_values(entity_type: str, entity_role: Optional[str] = None, entity_group: Optional[str] = None)

=> 가장 최근 인식된 'location' 타입의 엔티티 값 반환.

def get_latest_entity_values(entity_type: str, entity_role: Optional[str] = None, entity_group: Optional[str] = None) -> Generator[Text, None, None]:

=> 엔티티 역할, 엔티티 그룹 지정가능.

 

tracker.get_intent_of_latest_message  (최근 인텐트값)

intent = tracker.get_intent_of_latest_message()

=> 가장 최근 메시지의 인텐트 값 반환.

 

tracker.latest_message  (이전 메시지 추적)

latest_message = tracker.latest_message

=> 사용자의 마지막 메시지정보.

 

tracker.events  (대화 기록)

for event in tracker.events:
    print(event)

=> 대화의 모든 이벤트 리스트를 반환.

 

tracker.current_state  (트래커 현재 상태) 

state = tracker.current_state()

=> 슬롯, 인텐트, 엔티티, 최신메시지 등을 포함.

 

tracker.active_form  (대화 현재 상태)

active_form = tracker.active_form

=> 현재 활성화된 폼 반환.

 

tracker.latest_action  (마지막 액션)

latest_action = tracker.latest_action_name

=> 마지막으로 실행된 액션 이름 반환.

( name  : 마지막 실행된 액션 이름, confidence : 해당 액션이 선택된 확률 값, policy : 액션이 선택된 정책의 이름, policy confidence : 정책이 해당 액션을 선택한 확률 값.) 

 


 

* FormAction : 커스텀 폼 액션을 정의할 수 있는 클래스. (폼 활성화)

* FormValidationAction : 사용자 입력(슬롯값)을 검증하고 처리할 수 있는 클래스. 

  slots_mapped_in_domain 메서드 : ' FormAction' 클래스의 메서드로 domain에 정의된 슬롯값을 매핑해서 가져옴.

 

domain.yml 파일에 form과 required_slots(필수항목) 정의 

forms:
  my_form:	# form이름
    required_slots:
      name:
        - type: from_text

=> 사용자가 반드시 입력해야 하는 값 : name, age, email

form이 활성화 되면 required_slots로 지정한 값들이 모두 채워질 때까지 활성 상태 유지. 

 => 이후  FormValidationAction 클래스를 상속받아 슬롯값 검증 로직 구현.

 

** type 은 생략가능 (생략시 text )  ** 사용자 입력값으로 슬롯을 채우는 경우 위처럼 지정해주는게 좋다. 

더보기

 

(타입 생략)

forms:
  my_form:	# form이름
    required_slots:
      name: {}

 

forms:
  my_form:	# form이름
    required_slots:
    - name
    - email