RASA - 사용자 지정 제출 작업
이번 글에서는 폼 데이터를 Airtable API로 보내는 방법에 대해 알아보겠습니다.
아직 계정이 없다면 Airtable에서 계정을 만드십시오. 무료 계정이면 충분합니다.
Account overview 페이지에서 API 키를 생성합니다. 이 키를 옆에 두십시오.
그런 다음 https://airtable.com/universe/exp3exFotfMOfr8dw/rasa-dev-tutorial을 방문하십시오. 베이스 복사를 클릭합니다. 그러면 Table 1이라는 하나의 테이블이 있는 Rasa dev tutorial이라는 새 작업 공간이 생성됩니다.
오른쪽 상단에서 도움말을 클릭한 다음 API 설명서를 클릭합니다. 이렇게 하면 작업공간에 대해 자동 생성된 API 문서가 열립니다.
app
로 시작하는 기본 ID를 복사합니다. 곧 필요할 것입니다.프로젝트 루트에서 새
.env
파일을 만듭니다.AIRTABLE_API_KEY=key*****
BASE_ID=app*****
TABLE_NAME=Table%201
TABLE_NAME
는 Rasa 개발 자습서 작업 공간에 있는 테이블의 이름입니다. 공백이 포함되어 있기 때문에 공백은 URL에 대해 %20
로 인코딩됩니다.자신의
AIRTABLE_API_KEY
와 BASE_ID
를 넣으십시오.이러한 값은 비밀로 유지되어야 합니다.
.env
파일을 .gitignore
에 추가하여 실수로 버전 제어 시스템에 커밋하지 않도록 합니다..gitignore
에 다음을 추가합니다.# keep secret keys out of VCS
.env
다음 코드를 사용하여
actions/actions.py
에 해당 변수를 로드합니다.# actions/actions.py
load_dotenv()
airtable_api_key = os.getenv("AIRTABLE_API_KEY")
base_id = os.getenv("BASE_ID")
table_name = os.getenv("TABLE_NAME")
Python 가상 환경이 활성화되어 있는지 확인하십시오(
source venv/bin/activate
).두 개의 새 패키지를 설치합니다. 곧 사용할 것입니다.
pip install python-dotenv requests
requirements.txt
파일에 추가합니다.rasa==2.3.1
python-dotenv==0.15.0
requests==2.25.1
actions/actions.py
에서 다음 가져오기가 필요합니다.# actions/actions.py
from typing import Text, List, Optional, Dict, Any
from rasa_sdk.forms import FormValidationAction
from rasa_sdk.executor import CollectingDispatcher
from rasa_sdk import Tracker, Action
from dotenv import load_dotenv
import os
import requests
import json
import uuid
actions/actions.py
에서 새 방법을 만듭니다.# actions/actions.py
def create_newsletter_record(email, frequency, notifications, can_ask_age, age):
request_url = f"https://api.airtable.com/v0/{base_id}/{table_name}"
headers = {
"Content-Type": "application/json",
"Accept": "application/json",
"Authorization": f"Bearer {airtable_api_key}",
}
data = {
"fields": {
"Id": str(uuid.uuid4()),
"Email": email,
"Frequency": frequency,
"Notifications?": notifications,
"Can ask age?": can_ask_age,
"Age": age,
}
}
try:
response = requests.post(
request_url, headers=headers, data=json.dumps(data)
)
response.raise_for_status()
except requests.exceptions.HTTPError as err:
raise SystemExit(err)
print(f"Response status code: {response.status_code}")
return response
이 메소드는 URL, HTTP 헤더 및 본문을 생성하고 Airtable API 엔드포인트에 POST 요청을 보냅니다.
본문에는 양식 루프 중에 사용자로부터 얻은 데이터가 포함되어 있습니다.
uuid.uuid4()
는 레코드의 고유 식별자를 생성하는 데 사용됩니다.또한
actions/actions.py
에서 새 클래스를 만듭니다.이 클래스는 사용자 지정 작업입니다.
Action
클래스를 확장합니다. - action: submit_newsletter_form
메서드가 반환하는 것이 submit_newsletter_form이기 때문에 규칙 및 스토리에서 name
로 이 작업을 호출할 수 있습니다.# actions/actions.py
class SubmitNewsletterForm(Action):
def name(self) -> Text:
return "submit_newsletter_form"
async def run(
self, dispatcher, tracker: Tracker, domain: Dict[Text, Any],
) -> List[Dict[Text, Any]]:
email = tracker.get_slot("email")
frequency = tracker.get_slot("frequency")
notifications = tracker.get_slot("notifications")
can_ask_age = tracker.get_slot("can_ask_age")
age = tracker.get_slot("age")
response = create_newsletter_record(email, frequency, notifications, can_ask_age, age)
dispatcher.utter_message("Thanks, your answers have been recorded!")
return []
run
메서드는 작업이 호출될 때 호출됩니다.먼저 슬롯 값을 얻습니다.
그런 다음 이전 방법
create_newsletter_record
을 사용하여 Airtable API로 보냅니다.마지막으로
dispatcher
를 사용하여 사용자 지정 메시지를 발화합니다.반환 값은 따라야 하는 이벤트 목록입니다. 이 경우에는 없습니다.
이 작업을
domain.yml
에 추가하는 것을 잊지 마십시오.# domain.yml
# ... previous content ...
actions:
# ... previous actions ...
- submit_newsletter_form
data/stories.yml
및 data/rules.yml
에서 utter_subscribed 작업 후에 이 작업을 호출합니다.# data/stories.yml
# ... previous content ...
stories:
# ... previous stories ...
- story: interactive_story_1
steps:
- intent: subscribe
- action: newsletter_form
- active_loop: newsletter_form
- slot_was_set:
- requested_slot: email
- intent: chitchat
- action: utter_ask_continue
- intent: affirm
- action: newsletter_form
- slot_was_set:
- requested_slot: email
- slot_was_set:
- requested_slot: frequency
- intent: chitchat
- action: utter_ask_continue
- intent: affirm
- action: newsletter_form
- slot_was_set:
- requested_slot: frequency
- active_loop: null
- action: utter_subscribed
- action: submit_newsletter_form
# data/rules.yml
# ... previous content ...
rules:
# ... previous rules ...
- rule: submit form
condition:
- active_loop: newsletter_form
steps:
- action: newsletter_form
- active_loop: null
- action: utter_subscribed
- action: submit_newsletter_form
tests에도 조치를 추가하십시오.
모델 재교육:
rasa train
.작업 서버를 시작합니다:
rasa run actions
.새 터미널 창에서 rasa 셸을 시작합니다:
rasa shell
.제출 작업은 테이블에 새 레코드를 만들었습니다.
documentation에서 작업에 대해 자세히 알아볼 수 있습니다.
다음 장에서는 메시징 채널을 살펴보겠습니다.
Please note that I needed to make some changes to the
notifications
slot. Those changes can be seen on GitHub.
이 튜토리얼의 저장소:
펫7555 / rasa-dev-튜토리얼
이 튜토리얼의 끝에서 다음을 실행하여 리포지토리의 상태를 체크아웃할 수 있습니다.
git clone --branch 18-custom-submit-action [email protected]:petr7555/rasa-dev-tutorial.git
Reference
이 문제에 관하여(RASA - 사용자 지정 제출 작업), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/petr7555/rasa-custom-submit-action-46fe텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)