* FormValidationAction
사용자 입력값을 Form- slot값으로 수집할 때, 유효성 검사에 활용할 수 있는 Custom Action.
domain, rule, stroy에 Form 과 slot 이 정의되어 있을 때,
1. Form에 대한 validate 클래스 정의
from rasa_sdk.forms import FormValidationAction
class ValidateFoodOrderForm(FormValidationAction):
def name(self) -> str:
return "validate_food_order_form" # Form 이름과 연결
Form 이름과 Validation Action은 name() 메서드로 연결된다.
return "validate_<Form이름>"
2. 내부에 각 slot들에 대한 validate 메소드 정의
from rasa_sdk.forms import FormValidationAction
class ValidateFoodOrderForm(FormValidationAction):
def name(self) -> str:
return "validate_food_order_form" # Form 이름과 연결
def validate_food_type( # slot 이름과 연결
self,
slot_value: Any,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[str, Any],
) -> Dict[str, Any]:
"""Validate the food type."""
valid_foods = ["피자", "햄버거", "파스타", "초밥"]
if slot_value in valid_foods:
return {"food_type": slot_value}
else:
dispatcher.utter_message(text=f"{slot_value}은(는) 유효한 음식 종류가 아닙니다. 다시 입력해주세요.")
return {"food_type": None}
슬롯이름과 메서드 이름 일치시켜줘야 한다.
각 slot에 대해 사용자 입력값이 들어오면 validate_<slot이름> 메소드 호출.
기본적으로 slot 요청 순서는 정의된 순서를 따르지만, 여기에서 동적으로 변경 가능.
* FormValidationAction 호출 규칙
Form이 활성화된 상태에서는 사용자의 Intent 분석(처리)보다 슬롯채우기 (Slot Filling) 동작이 우선 수행된다.
ex) 사용자 입력값을 버튼으로 받는다면, 버튼이 payload가 intent와 entity를 명확히 포함하고 있어도
Rasa는 해당 Intent를 처리하지 않고 슬롯 값 채우기로 전환한다.
' / intent명 '이 들어오더라도, 현재 Form의 required_slots 중 아직 값이 없는 슬롯에 연결.
=> validate 가 정의되어 있다면 여기로 넘어온다.
* Form 활성화
return [ ActiveLoop("food_order_form")]
커스텀 액션에서 From을 활성화 시킬 때는 FollowupAction 대신 ActiveLoop 활용.
그런데 action에서 Form을 활성화 시킨 후 슬롯값을 채우고
rule이나 story를 통해 다음 action을 진행하는 부분 실패......
추가적인 커스텀 액션으로 진행해야 될듯.
** ActiveLoop 나 SlotSet 은 returnn 값으로 반환해줘야 한다 **
'업무 > 챗봇 (Rasa)' 카테고리의 다른 글
[Rasa] Payload (0) | 2024.11.25 |
---|---|
[Rasa] nlu_fallback 커스텀 액션 처리 (0) | 2024.10.12 |
[Rasa] domain (+ 업데이트 중) (0) | 2024.08.30 |
[Rasa] Form과 slot 이벤트에 따른 action진행 (0) | 2024.08.28 |
[Rasa] json_to_yml.py 파일 정리 (+ 업데이트 중) (0) | 2024.08.27 |