RASA - 사용자 지정 제출 작업

18938 단어 chatbotairasanlp
궁극적으로 우리는 사용자의 응답을 화면에 출력하는 것 이상을 하고 싶습니다.

이번 글에서는 폼 데이터를 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_KEYBASE_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.ymldata/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

좋은 웹페이지 즐겨찾기