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
'업무 > 챗봇 (Rasa)' 카테고리의 다른 글
[Rasa] rasa built-in actions (0) | 2024.07.23 |
---|---|
[Rasa] 커스텀 액션 이벤트 (FollowupAction, Restarted) (0) | 2024.07.12 |
[Rasa] 챗봇_ slot 이벤트에 따른 action진행 (SlotSet) (2) | 2024.07.10 |
[Rasa] rule & stroy (0) | 2024.07.08 |
[Rasa] 설정파일 정리 (endpoints.yml , credentials.yml) (0) | 2024.07.05 |