Actions SDK를 사용하여 Google 어시스턴트용 작업 빌드하기(레벨 2)

Google 어시스턴트 개발자 플랫폼을 사용하면 스마트 스피커, 스마트폰, 자동차, TV, 헤드폰 등 10억 대 이상의 기기에서 가상 개인 비서인 Google 어시스턴트의 기능을 확장하는 소프트웨어를 만들 수 있습니다. 사용자는 식료품 구매, 차량 예약과 같은 작업을 완료하기 위해 어시스턴트와 대화합니다. 개발자는 어시스턴트 개발자 플랫폼을 사용하여 사용자와 타사 처리 서비스 간의 즐겁고 효과적인 대화 환경을 쉽게 만들고 관리할 수 있습니다.

이 Codelab에서는 Google 어시스턴트 개발을 위한 중간 수준의 개념을 다루며 레벨 1 Codelab에서 만든 작업을 기반으로 합니다. 이 Codelab을 시작하기 전에 레벨 1 Codelab을 완료하는 것이 좋습니다.

이 Codelab에서 빌드하는 작업은 사용자가 선택한 도우미를 기반으로 신비로운 땅, 그리핀버그를 누비는 사용자의 여정에 어떠한 운명이 깃들어 있는지 말해 줍니다.

빌드할 항목

이 Codelab에서는 다음과 같은 기능을 갖춘 고급 대화 작업을 빌드합니다.

  • 사용자로부터 데이터를 수집하고 값에 따라 대화 메시지를 변경합니다.
  • 대화를 진행시키기 위해 후속 질문을 사용해 대답합니다.
  • 사용자가 운세를 받은 후 작업과 다시 상호작용할 수 있도록 게임 루프를 만듭니다.

빌드를 시작하기 전에 "Hey Google, 운명의 예언자에게 말 걸어 줘"이라고 말하면 Google 어시스턴트 지원 기기에서 실시간 작업과 상호작용할 수 있습니다. 재사용자를 위한 이 작업의 기본 경로는 다음의 상호작용으로 구성됩니다.

dd6f5c61296b8b50.png

eba043f546aa8c51.png

학습할 내용

  • 슬롯을 사용하여 사용자로부터 데이터를 수집하는 방법
  • 조건을 사용하여 장면에 로직을 추가하는 방법
  • 게임 루프를 추가하는 방법
  • 지원 경로를 추가하는 방법

필요한 항목

이 Codelab의 전제 조건은 다음과 같습니다.

  • 원하는 IDE/텍스트 편집기
  • NodeJS, npm, git이 설치된 셸 명령어를 실행하는 터미널입니다.
  • 웹브라우저(예: Chrome)
  • Codelab 레벨 1 작업 프로젝트를 완료합니다.

이 Codelab의 처리 코드를 이해하려면 자바스크립트(ES6)를 능숙하게 다루는 것이 좋지만, 필수사항은 아닙니다.

선택사항: 샘플 코드 가져오기

선택사항으로 이 GitHub 저장소에서 완전한 레벨 1 프로젝트 코드를 받거나 GitHub 저장소에서 완전한 레벨 2 프로젝트 코드를 받을 수 있습니다.

첫번째 Codelab에서는 하나의 장면인 Start를 사용하여 단순 대화 작업을 생성합니다.

이번 Codelab에서는 작업의 대화를 확장합니다. 다음 섹션에서는 다음 작업을 할 수 있는 작업을 구성합니다.

  • 사용자가 운세를 듣고 싶어 하는 경우 새로운 Fortune 장면으로 전환합니다.
  • 사용자에게 자신의 여정에 동행할 도우미를 선택하라고 요청합니다.
  • 사용자의 선택에 따라 맞춤 운세를 제공합니다.

Fortune 장면으로 전환하기 및 만들기

이 섹션에서는 다음과 같은 작업을 하게 됩니다.

  • 사용자에게 응답하고 대화를 종료하는 Start 장면에서 기존 메시지를 삭제합니다.
  • Start 장면에서 Fortune 장면으로의 전환 정의하기
  • Fortune 장면 만들기

Start 장면을 수정하고 Fortune 장면으로 전환하려면 다음 단계를 따르세요.

  1. 텍스트 편집기의 레벨 1 Codelab에서 작업 프로젝트를 엽니다.
  2. custom/scenes/Start.yaml 파일을 엽니다.
  3. 코드가 아래 스니펫과 일치하도록 yes 인텐트의 handler를 업데이트합니다.

Start.yaml

intentEvents:
- intent: "yes"
  transitionToScene: Fortune
- handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: I understand, stranger. Best of luck on your quest! Farewell.
  intent: "no"
  transitionToScene: actions.scene.END_CONVERSATION
  1. 파일을 저장합니다.

Fortune이라는 새 장면을 만들려면 다음 단계를 따르세요.

  1. 터미널에서 Codelab 레벨 1 작업 프로젝트로 이동합니다.
  2. scenes 디렉터리에 Fortune.yaml이라는 새 파일을 만듭니다.
touch custom/scenes/Fortune.yaml

이 파일은 다음 섹션에서 수정하게 됩니다.

Fortune 장면의 대화 로직 정의하기

이 Codelab에서는 사용자에게 ‘여러분의 여정에 도움을 줄 도우미를 하나 선택하세요. 드래곤, 번역사, 나침반 중에서 무엇을 선택하시겠어요?’라는 질문을 던지도록 Fortune 장면을 구성합니다. 슬롯 채우기라는 기능을 사용하여 사용자에게 필요한 정보를 수집한 후 다음으로 진행할 수 있습니다.

작업에서는 드래곤, 번역사, 나침반이라는 세 가지 도우미에 관한 운세를 제공합니다. 사용자의 입력에서 이 세 가지 옵션을 파악할 수 있도록 작업을 구성하려면 반드시 새로운 유형을 만들어야 합니다.

장면의 슬롯 채우기 스테이지에서 유형을 사용하여 사용자로부터 원하는 정보를 정의할 수 있습니다. NLU 엔진이 사용자 입력에서 슬롯 일치를 감지하면 슬롯을 입력된 매개변수로 추출하므로 이 장면에서 슬롯을 사용해 로직을 실행할 수 있습니다.

available_options 유형 만들기

이 섹션에서는 사용자가 메시지에 대한 응답으로 선택할 수 있는 세 가지 옵션(드래곤, 번역사, 나침반)을 지정하는 새로운 유형, available_options를 만듭니다. 또한 사용자가 유사한 내용을 말하는 경우에 대비하여 이러한 옵션의 동의어 몇 가지도 정의합니다. 이후 섹션에서 available_options 유형을 슬롯에 추가하여 사용자가 선택한 항목을 확보하고 싶다고 명시하게 됩니다.

available_options 유형을 만들려면 다음 단계를 따르세요.

  1. types이라는 새 디렉터리를 만듭니다.
mkdir custom/types
  1. types 디렉터리에 available_options.yaml이라는 새 파일을 만듭니다.
touch custom/types/available_options.yaml
  1. 텍스트 편집기에서 custom/types/available_options.yaml을 엽니다.

유형은 정보의 키-값 쌍으로 구성되며, 여기에서 는 유형 이름이고 은 해당 키의 동의어입니다. 키를 정의하면 값이 자동으로 추가됩니다. Actions SDK를 사용하면 키를 entities로, 값을 synonyms로 표시합니다.

사용자가 선택할 수 있는 세 가지 옵션을 추가하려면 다음 단계를 따르세요.

  1. available_options.yaml 파일에 다음 entitiessynonyms를 추가합니다.

available_options.yaml

synonym:
  entities:
    dragon:
      synonyms:
      - dragon
      - hydra
      - lizard
    translator:
      synonyms:
      - translator
      - communicator
      - machine
      - decoder
      - translate
    compass:
      synonyms:
      - compass
      - direction
      - guide
      - navigator
  matchType: EXACT_MATCH
  1. 파일을 저장합니다.

이제 작업에서 available_options가 드래곤, 번역사, 나침반임을 이해하며 이에 해당하는 몇 가지 동의어도 인식할 수 있습니다.

슬롯 채우기 구성하기

이제 Fortune 장면에 슬롯 채우기를 구성해야 합니다. 슬롯 채우기 로직을 구성하려면 다음 단계를 따르세요.

  1. 텍스트 편집기에서 custom/scenes/Fortune.yaml을 엽니다.
  2. Fortune.yaml 파일에 다음 slots 데이터를 추가합니다.

Fortune.yaml

slots:
- commitBehavior:
    writeSessionParam: chosenOptions
  name: chosenOptions
  promptSettings:
    initialPrompt:
      staticPrompt:
        candidates:
        - promptResponse:
            firstSimple:
              variants:
              - speech: What do you choose to help you on your quest, a dragon, a translator, or a compass?
            suggestions:
            - title: Dragon
            - title: Translator
            - title: Compass
  required: true
  type:
    name: available_options
  1. 파일을 저장합니다.

이제 available_options 유형이 슬롯에 추가되었습니다. 이 유형은 작업에 다음으로 진행하기 전에 사용자로부터 수집해야 하는 정보(도우미 선택)를 알립니다. 또한 슬롯 내의 메시지도 구성했는데, 이 메시지는 사용자가 장면의 슬롯 채우기 스테이지에 도달하는 시점의 메시지 대기열에 추가되었습니다.

슬롯의 이름을 chosenOptions로 지정하면 writeSessionsParam 필드가 동일한 이름($session.params.chosenOptions)으로 업데이트됩니다. 메시지와 클라이언트 라이브러리 처리에서 해당 이름으로 이 매개변수에 액세스할 수 있습니다.

조건 추가하기

이제 사용자가 선택할 수 있는 슬롯이 추가되었으므로 조건을 추가하여 사용자가 대화를 계속하기 전에 슬롯 데이터를 가져왔는지 확인할 수 있습니다.

이 섹션에서는 슬롯 채우기가 완료되었는지 확인할 수 있는 scene.slots.status == "FINAL" 조건을 추가합니다. 모든 슬롯이 채워지면 조건이 메시지 대기열에 메시지(You picked $session.params.chosenOptions.)를 추가합니다.

scene.slots.status == "FINAL" 조건을 구성하려면 다음 단계를 따르세요.

  1. 텍스트 편집기에서 custom/scenes/Fortune.yaml을 엽니다.
  2. Fortune.yaml 파일 상단에 conditionalEvents 데이터를 추가합니다.

Fortune.yaml

conditionalEvents:
- condition: scene.slots.status == "FINAL"
  handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: You picked $session.params.chosenOptions.
  1. 파일을 저장합니다.

시뮬레이터에서 작업 테스트하기

이제 사용자가 슬롯을 채울 때 선택해야 하는 옵션을 정의했습니다. 사용자로부터 이 정보를 획득하면 작업에서 사용자가 선택한 특정 옵션을 참조하는 메시지를 제공해야 합니다.

작업을 테스트하려면 다음 단계를 따르세요.

  1. 터미널에서 다음 명령어를 실행합니다.
gactions deploy preview

다음과 같은 출력이 표시됩니다.

✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
  1. 제공된 URL을 복사하여 브라우저에 붙여넣습니다.
  2. 입력 필드에서 Talk to my test app을 클릭하거나 입력하고 Enter 키를 누릅니다.
  3. 입력 필드에 Yes를 입력하고 Enter 키를 누릅니다. 또는 추천 칩을 클릭해도 됩니다.

a899d45c542668f6.png

  1. dragon을 클릭하거나, 입력하거나, 말합니다. ‘드래곤을 선택하셨습니다.’라는 메시지가 표시됩니다.

다음 섹션에서는 사용자가 선택할 수 있는 도우미별로 메시지를 맞춤설정합니다.

조건을 사용하여 메시지 맞춤설정하기

이 섹션에서는 사용자가 선택할 수 있는 각 옵션에 조건을 추가하고 각 조건에 대한 맞춤 메시지를 추가합니다.

dragon 운세 맞춤설정하기

조건을 업데이트하고 사용자가 '드래곤'을 선택한 경우의 메시지를 맞춤설정하려면 다음 단계를 따르세요.

  1. 텍스트 편집기에서 custom/scenes/Fortune.yaml을 엽니다.
  2. Fortune.yaml 파일에서 conditionalEvents 데이터를 다음 스니펫으로 바꿉니다.

Fortune.yaml

conditionalEvents:
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "dragon"
  handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: The people of Gryffinberg will be awestruck by the beauty and
                power of the ancient dragon. Much to your dismay, the townspeople
                fall into dispute over who will receive the honor of riding the dragon
                first. You return home from your quest without everlasting glory or
                a dragon.
  1. 파일을 저장합니다.

이제 사용자가 '드래곤'이라고 말하거나 이와 비슷한 소리가 나는 단어를 말했을 때 작업에서 사용자의 선택에 따라 운세를 제공합니다. 이어서 나머지 두 개의 선택지를 추가합니다.

translatorcompass 운세 맞춤설정하기

조건을 추가하고 사용자가 '번역사' 또는 '나침반'을 말한 경우의 메시지를 맞춤설정하려면 다음 단계를 따르세요.

  1. custom/scenes/Fortune.yaml 파일에서 dragon 조건 아래에 다른 두 조건을 추가합니다.

Fortune.yaml

- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "translator"
  handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: With the help of the translator, the rival factions in Gryffinberg
                are finally able to communicate with each other and resolve their
                disputes. You will complete your quest to restore peace in the town.
                The translator will be used on many other journeys across the
                earth. After its work is done, it retires honorably to a premier location
                in the Gryffinberg History Museum.
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "compass"
  handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: The compass will help you find the mystical and ancient Library
                of Gryffinberg. Among its infinite stacks of dusty books, you find
                one entitled "Wisdom of the Ages". By the time you've read the 50,000-page
                tome, the townspeople have forgotten their problems. You will write
                a second edition of "Wisdom of the Ages", but have limited commercial
                success.
  1. 파일을 저장합니다.

시뮬레이터에서 작업 테스트하기

이 시점에서 작업은 사용자가 선택하는 옵션에 맞게 맞춤 운세를 제공해야 합니다.

작업을 테스트하려면 다음 단계를 따르세요.

  1. 터미널에서 다음 명령어를 실행합니다.
gactions deploy preview

다음과 같은 출력이 표시됩니다.

✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
  1. 제공된 URL을 복사하여 브라우저에 붙여넣습니다.
  2. 입력 필드에 Talk to my test app를 입력하고 Enter 키를 누릅니다.
  3. Input 필드에 Yes를 입력하고 Enter 키를 누릅니다. 또는 추천 칩을 클릭합니다.
  4. Translator을 클릭하거나, 입력하거나, 말합니다.

29e17f950bd0dd71.png

'번역사' 옵션에 적합한 운세가 제공되어야 합니다.

이 섹션에서는 사용자가 선택한 후에도 다른 옵션을 선택하고 다른 운세를 들을 수 있도록 작업을 구성합니다. 이 변경사항은 게임이 끝날 때 표시되는 '다시 플레이하시겠습니까?' 메시지와 비슷합니다. 이 루프를 빌드하려면 이전에 만든 yesno 인텐트를 다시 사용하고 Again이라는 새로운 장면에 추가하면 됩니다.

Again 장면 만들기

이 섹션에서는 새로운 Again 장면을 만들고 사용자에게 다른 옵션을 선택할 것인지 묻는 메시지를 추가합니다.

Again 장면을 만들고 구성하려면 다음 단계를 따르세요.

  1. scenes 디렉터리에 Again.yaml이라는 새 파일을 만듭니다.
touch custom/scenes/Again.yaml
  1. 텍스트 편집기에서 custom/scenes/Again.yaml을 엽니다.
  2. Again.yaml에 다음 onEnter 데이터를 추가합니다.

Again.yaml

onEnter:
  staticPrompt:
    candidates:
    - promptResponse:
        firstSimple:
          variants:
          - speech: That is what I see for you. Would you like to choose a different option and explore another future?
        suggestions:
        - title: "Yes"
        - title: "No"
  1. 파일을 저장합니다.

Fortune에서 Again 장면으로의 전환 추가하기

사용자가 운세를 받은 다음 대화가 새로운 Again 장면으로 전환되어야 합니다.

Fortune 장면에서 Again 장면으로의 전환을 추가하려면 다음 단계를 따르세요.

  1. 텍스트 편집기에서 custom/scenes/Fortune.yaml을 엽니다.
  2. 다음 스니펫에 표시된 대로 각 조건에 transitionToScene: Again을 추가합니다.

Fortune.yaml

conditionalEvents:
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "dragon"
  handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: The people of Gryffinberg will be awestruck by the beauty and
                power of the ancient dragon. Much to your dismay, the townspeople
                fall into dispute over who will receive the honor of riding the dragon
                first. You return home from your quest without everlasting glory or
                a dragon.
  transitionToScene: Again
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "translator"
  handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: With the help of the translator, the rival factions in Gryffinberg
                are finally able to communicate with each other and resolve their
                disputes. You will complete your quest to restore peace in the town.
                The translator will be used on many other journeys across the
                earth. After its work is done, it retires honorably to a premier location
                in the Gryffinberg History Museum.
  transitionToScene: Again
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "compass"
  handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: The compass will help you find the mystical and ancient Library
                of Gryffinberg. Among its infinite stacks of dusty books, you find
                one entitled "Wisdom of the Ages". By the time you've read the 50,000-page
                tome, the townspeople have forgotten their problems. You will write
                a second edition of "Wisdom of the Ages", but have limited commercial
                success.
  transitionToScene: Again
  1. 파일을 저장합니다.

시뮬레이터에서 작업 테스트하기

이 시점에서 작업은 운세를 받은 사용자에게 다음과 같은 메시지를 제공해야 합니다. ‘제게 보인 당신의 운명을 들려드렸습니다. 다른 옵션을 선택하고 다른 미래를 살펴보시겠어요?’

작업을 테스트하려면 다음 단계를 따르세요.

  1. 터미널에서 다음 명령어를 실행합니다.
gactions deploy preview

다음과 같은 출력이 표시됩니다.

✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
  1. 제공된 URL을 복사하여 브라우저에 붙여넣습니다.
  2. 입력 필드에 Talk to my test app를 입력하고 Enter 키를 누릅니다.
  3. 입력 필드에 Yes를 입력하고 Enter 키를 누릅니다. 또는 추천 칩을 클릭합니다.
  4. dragon을 클릭하거나, 입력하거나, 말합니다.

b299e9fed9aedb69.png

드래곤 옵션에 해당하는 운세와 Again 메시지가 표시되어야 합니다.

인텐트 추가 및 Again 장면 전환하기

이 섹션에서는 작업이 사용자가 새로운 옵션을 선택하고 싶은지 이해할 수 있도록 Again 장면에 yesno 인텐트를 추가합니다. 또한 yesno 인텐트에 적절한 전환도 추가합니다. yes 인텐트가 Fortune 장면으로 전환되고 no 인텐트는 시스템 장면 End conversation으로 전환됩니다.

Again 장면에 인텐트와 전환을 추가하려면 다음 단계를 따르세요.

  1. 텍스트 편집기에서 custom/scenes/Again.yaml을 엽니다.
  2. Again.yaml 파일 상단에서 OnEnter 위에 intentEvents 데이터를 추가합니다.

Again.yaml

intentEvents:
- intent: "yes"
  transitionToScene: Fortune
- handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: It pleases me that you are satisfied with your choice. Best
                of luck on your quest. Farewell.
  intent: "no"
  transitionToScene: actions.scene.END_CONVERSATION
  1. 파일을 저장합니다.

시뮬레이터에서 작업 테스트하기

이제 작업에서 사용자가 새로운 옵션을 선택하고자 하는지, 아니면 대화를 종료하고자 하는지 결정해야 합니다.

yes 인텐트를 테스트하려면 다음 안내를 따르세요.

  1. 터미널에서 다음 명령어를 실행합니다.
gactions deploy preview

다음과 같은 출력이 표시됩니다.

✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
  1. 제공된 URL을 복사하여 브라우저에 붙여넣습니다.
  2. 입력 필드에 Talk to my test app를 입력하고 Enter 키를 누릅니다.
  3. 입력 필드에 Yes를 입력하고 Enter 키를 누릅니다. 또는 추천 칩을 클릭합니다.
  4. 옵션 중 하나를 클릭하거나, 입력하거나, 말합니다.
  5. 입력 필드에 Yes를 입력하고 Enter 키를 누릅니다.

5d0690332efe2e29.png

‘여러분의 여정에 도움을 줄 도우미를 하나 선택하세요. 드래곤, 번역사, 나침반 중에서 무엇을 선택하시겠어요?’라는 메시지가 표시됩니다.

no 인텐트를 테스트하려면 다음 안내를 따르세요.

  1. 옵션 중 하나를 클릭하거나, 입력하거나, 말합니다.
  2. 입력 필드에 No를 입력하고 Enter 키를 누릅니다.

다음과 같은 End conversation 메시지가 표시됩니다. ‘만족스러운 선택을 하셨다니 저도 기쁩니다. 당신의 여행에 행운이 깃들기 바랍니다. 그럼 안녕히.’

이제 작업에서 대부분의 사용자가 선택할 기본 경로를 빌드했습니다. 하지만 사용자가 Fortune 장면의 ‘여러분의 여정에 도움을 줄 도우미를 하나 선택하세요. 드래곤, 번역사, 나침반 중에서 무엇을 선택하시겠어요?’라는 메시지에서 제공된 옵션 중 하나가 아닌 다른 항목을 선택할 수 있습니다.

이 섹션에서는 사용자가 '마법', '돈', '말' 또는 '휴대전화'를 말했을 때 이를 이해하고 사용자가 이러한 옵션 중 하나를 선택하면 원래 제공되는 세 가지 선택지 중 하나를 선택하라고 다시 메시지를 표시하도록 작업을 구성합니다. 이 로직을 구성하려면 다른 선택지를 포함하는 새로운 type과 사용자가 이러한 옵션 중 하나를 말했을 때 일치하는 새로운 인텐트 other_option을 만들어야 합니다. 또한 인텐트 매개변수를 식별하고 추출할 수 있도록 other_option 인텐트 내의 학습 문구에 주석을 추가해야 합니다.

어시스턴트의 자연어 처리 엔진이 사용자 입력에서 슬롯 일치를 감지하면 이 값을 입력된 매개변수로 추출하므로 이 장면에서 슬롯을 사용해 로직을 실행할 수 있습니다. 이 Codelab에서는 사용자가 선택한 도우미를 추출하고 메시지에서 사용자가 선택한 도우미를 참조할 수 있도록 작업을 구성합니다.

unavailable_options 유형 만들기

이제 작업이 사용자 입력에서 데이터를 식별할 수 있도록 다양한 옵션을 포함하고 있는 unavailable_options 유형을 만들 수 있습니다.

unavailable_options 유형을 만들려면 다음 단계를 따르세요.

  1. types 디렉터리에 unavailable_options.yaml이라는 새 파일을 만듭니다.
touch custom/types/unavailable_options.yaml
  1. 텍스트 편집기에서 custom/types/unavailable_options.yaml을 엽니다.
  2. unavailable_options.yaml 파일에 다음 synonyms 데이터를 추가합니다.

unavailable_options.yaml

synonym:
  entities:
    money:
      synonyms:
      - money
      - cash
      - gold
    horse:
      synonyms:
      - horse
      - stallion
      - steed
    magic:
      synonyms:
      - magic
      - enchanted
      - spells
    phone:
      synonyms:
      - phone
      - cell
      - apps
  matchType: EXACT_MATCH
  1. 파일을 저장합니다.

other_option 인텐트 만들기

다음으로 other_option이라는 인텐트를 만들고 unavailable_options 유형의 옵션을 포함하는 학습 문구를 추가합니다. 이 인텐트는 사용자가 unavailable_options 유형에 포함된 항목을 선택할 때 일치됩니다.

other_option 인텐트를 만들고 구성하려면 다음 단계를 따르세요.

  1. intents 디렉터리에 other_option.yaml이라는 새 파일을 만듭니다.
touch custom/intents/other_option.yaml
  1. 텍스트 편집기에서 custom/intents/other_option.yaml을 엽니다.
  2. 다음 parameters 데이터와 trainingPhrases 데이터를 other_option.yaml 파일에 추가합니다.

other_option.yaml

parameters:
- name: chosenUnavailableOption
  type:
    name: unavailable_options
trainingPhrases:
- I want to use ($chosenUnavailableOption 'spells' auto=true)
- I really really want to use a ($chosenUnavailableOption 'phone' auto=true)
- ($chosenUnavailableOption 'magic' auto=true)!
- ($chosenUnavailableOption 'cash' auto=true)
- I want to ride a ($chosenUnavailableOption 'horse' auto=true)

여기에서 이전 섹션에서 지정한 사용할 수 없는 옵션으로 학습 문구를 수동으로 주석 처리합니다. 인텐트 매개변수인 chosenUnavailableOption을 사용하면 옵션 이름을 추출하고 메시지에서 이 옵션을 사용할 수 있습니다. 이 작업은 다음 섹션에서 해 보겠습니다.

  1. 파일을 저장합니다.

Fortune 테마에 other_option 인텐트 추가하기

이제 other_option 인텐트로 사용자가 원래 옵션 중 하나가 아닌 옵션을 지정했을 때 이를 처리할 수 있습니다. 이 섹션에서는 Fortune 장면에 other_option 인텐트를 추가합니다. 인텐트 매개변수를 사용하여 사용자의 입력에 따라 메시지를 맞춤설정하세요.

Fortune 장면에 other_option 인텐트를 추가하려면 다음 단계를 따르세요.

  1. 텍스트 편집기에서 custom/scenes/Fortune.yaml을 엽니다.
  2. 다음 intentEvents 데이터를 conditionalEvents 데이터와 slots 데이터 사이에 추가합니다.

Fortune.yaml

intentEvents:
- handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech:  I have seen the future and a $intent.params.chosenUnavailableOption.original will not aid you on your journey.
  intent: other_option
  1. 파일을 저장합니다.

$intent.params.chosenUnavailableOption 표현식은 인텐트 매개변수 객체를 참조하며 $intent.params.chosenUnavailableOption.original은 해당 객체의 값을 참조합니다. original 속성은 사용자가 지정하는 원시 입력을 나타냅니다.

사용자가 Fortune 장면에서 unavailable_options 유형에 나열된 옵션을 말하면 other_option 인텐트가 일치되고 메시지 대기열에 메시지가 추가됩니다. 지정된 전환이 없으므로 장면 실행 루프는 조건 스테이지를 재평가하여 계속됩니다. 그런 다음 chosenOptions 슬롯이 메시지 대기열에 메시지를 추가하며, 메시지 대기열이 사용자에게 전달됩니다.

시뮬레이터에서 작업 테스트하기

이제 사용자가 unavailable_options 유형에 명시된 옵션 중 하나를 선택하면 작업에서 적절히 응답하고 사용자가 선택한 도우미를 지정할 수 있어야 합니다. 그런 다음 작업에서 사용자에게 드래곤, 번역사, 나침반 등 원래 선택지 중 하나를 선택하라는 메시지를 표시해야 합니다.

시뮬레이터에서 작업을 테스트하려면 다음 단계를 따르세요.

  1. 터미널에서 다음 명령어를 실행합니다.
gactions deploy preview

다음과 같은 출력이 표시됩니다.

✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
  1. 제공된 URL을 복사하여 브라우저에 붙여넣습니다.
  2. 입력 필드에 Talk to my test app를 입력하고 Enter 키를 누릅니다.
  3. 입력 필드에 Yes를 입력하고 Enter 키를 누릅니다. 또는 추천 칩을 클릭합니다.
  4. 입력 필드에 magic를 입력하고 Enter 키를 누릅니다.

3a42c33eca435f32.png

사용자가 '마법'을 선택하면 그 앞에 붙은 정관사 'a' 때문에 메시지가 올바르지 않게 표시되지 않습니다. 다음 섹션에서 이 문제를 해결합니다.

unavailable_options 핸들러 추가하기

unavailable_options 유형에서 선택할 수 있는 항목 앞에 'a' 정관사를 붙이려면 사용자가 선택한 옵션 앞에 'a'가 필요한지 확인할 수 있도록 처리 로직의 이벤트 핸들러를 구성하세요. 먼저 Fortune 장면에서 핸들러를 호출하도록 작업을 구성해야 합니다.

Fortune 장면에 unavailable_options 핸들러를 추가하려면 다음 단계를 따르세요.

  1. 텍스트 편집기에서 custom/scenes/Fortune.yaml을 엽니다.
  2. Fortune.yaml 파일을 다음 intentEvents 데이터로 업데이트합니다.

Fortune.yaml

intentEvents:
- handler:
    webhookHandler: unavailable_options
  intent: other_option
  1. 파일을 저장합니다.

처리 업데이트 및 배포하기

이제 작업에서 unavailable_options 이벤트 핸들러를 호출하도록 구성했으므로 처리의 핸들러를 업데이트하고 배포할 수 있습니다.

처리를 업데이트하려면 다음 단계를 따르세요.

  1. 텍스트 편집기에서 webhooks/ActionsOnGoogleFulfillment/index.js을 엽니다.
  2. greeting 핸들러 아래의 index.js에 다음 코드를 추가합니다.

index.js

app.handle('unavailable_options', conv => {
  const option = conv.intent.params.chosenUnavailableOption.original;
  const optionKey = conv.intent.params.chosenUnavailableOption.resolved;
  let message = 'I have seen the future and ';
  if(optionsNeedA.has(optionKey)){
    message = message + 'a ';
  }
  message = message + `${option} will not aid you on your journey. `;
  conv.add(message);
});
  1. const app = conversation({debug:true}); 아래에 다음 코드를 추가합니다.

index.js

const optionsNeedA = new Set();
optionsNeedA.add('horse').add('phone');
  1. 파일을 저장합니다.

코드 이해하기

unavailable_options 핸들러는 다음을 진행합니다.

  • conv 객체에서 option 데이터를 가져와서 사용자의 원시 입력인 original 속성에 option을 할당합니다.
  • unavailable_options 유형의 키인 resolved 속성에 optionKey를 할당합니다.
  • optionKey가 'a'가 필요한 옵션 중 하나인지 확인합니다. 'a'가 필요한 경우 'a'가 추가된 메시지를 작성합니다.
  • conv.add(message)를 통해 메시지를 추가합니다.

핸들러 업데이트하기

작업이 unavailable_options를 사용하도록 허용하려면 webhooks/ActionsOnGoogleFulfillment.yamlunavailable_options 핸들러를 추가합니다.

  1. unavailable_options 핸들러 이름을 ActionsOnGoogleFulfillment.yaml에 추가합니다.

ActionsOnGoogleFulfillment.yaml

handlers:
- name: greeting
- name: unavailable_options
inlineCloudFunction:
  executeFunction: ActionsOnGoogleFulfillment
  1. 파일을 저장합니다.

시뮬레이터에서 작업 테스트하기

이제 작업이 unavailable_options 유형에서 사용자가 선택한 항목 앞에 정관사 'a'가 필요한지에 따라 메시지를 조정해야 합니다.

작업을 테스트하려면 다음 단계를 따르세요.

  1. 터미널에서 다음 명령어를 실행합니다.
gactions deploy preview

다음과 같은 출력이 표시됩니다.

✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
  1. 제공된 URL을 복사하여 브라우저에 붙여넣습니다.
  2. 입력 필드에서 Talk to my test app을 클릭하거나 입력하고 Enter 키를 누릅니다.
  3. 입력 필드에 Yes를 입력하고 Enter 키를 누릅니다. 또는 추천 칩을 클릭합니다.
  4. 입력 필드에 magic를 입력하고 Enter 키를 누릅니다. 그런 다음 입력 필드에 horse를 입력하고 Enter 키를 누릅니다.

54ee24c5c3c56e.png

'말'이 선택되면 작업이 'a'를 추가해야 하지만 '마법'이 선택되면 'a'가 들어가지 않은 메시지를 구성해야 합니다.

Actions SDK는 Actions 콘솔에 통합되어 있는 웹 기반 IDE인 Actions Builder와 상호 운용이 가능합니다. gactions push 명령어로 콘솔에서 작업의 초안으로 로컬 파일 시스템을 푸시할 수 있습니다. Actions 콘솔은 작업의 구성을 시각적으로 표시합니다. 매핑된 작업을 시각적으로 표시하면 개발 중에 유용하며 테스트에 사용되는 작업의 버전에는 영향을 주지 않습니다.

작업 프로젝트를 푸시하고 Actions 콘솔에서 확인하려면 다음 단계를 따르세요.

  1. 터미널에서 다음 명령어를 실행하여 프로젝트를 Actions 콘솔로 푸시합니다.
gactions push

다음과 같은 출력이 표시됩니다.

✔ Done. Files were pushed to Actions Console, and you can now view your project with this URL: https://console.actions.google.com/project/{project-id}/overview. If you want to test your changes, run "gactions deploy preview", or navigate to the Test section in the Console.
  1. 제공된 URL을 복사하여 브라우저에 붙여넣습니다.
  2. Actions 콘솔의 상단 탐색 메뉴에서 Develop을 클릭합니다.
  3. Scenes 옆에 있는 드롭다운 화살표를 클릭하고 Start를 클릭합니다. 다음 스크린샷과 같이 작업의 Start 테마를 시각적으로 표현할 수 있습니다.

cae526c647f8d40f.png

축하합니다.

이제 Actions SDK를 사용하여 Google 어시스턴트용 작업을 빌드하는 데 필요한 중간 난이도의 기술을 배웠습니다.

학습한 내용

  • Node.js 처리 라이브러리를 사용하여 대화 작업을 개발하는 방법
  • 슬롯을 사용하여 사용자로부터 데이터를 수집하는 방법
  • 조건을 사용하여 장면에 로직을 추가하는 방법
  • 게임 루프를 추가하는 방법
  • 지원 경로를 추가하는 방법

추가 학습 자료

Google 어시스턴트용 작업을 빌드하는 방법을 학습하기 위한 다음의 리소스를 살펴보세요.

Twitter에서 @ActionsOnGoogle을 팔로우하여 최신 소식을 확인하고 #AoGDevs로 트윗을 보내 내가 빌드한 결과물을 공유하세요.

프로젝트 정리하기[권장]

요금이 청구되지 않도록 하려면 사용하지 않을 프로젝트를 삭제하는 것이 좋습니다. 이 Codelab에서 만든 프로젝트를 삭제하려면 다음 단계를 따르세요.

  1. 클라우드 프로젝트 및 리소스를 삭제하려면 프로젝트 종료(삭제) 섹션에 나열된 단계를 완료하세요.
  1. 선택사항: Actions 콘솔에서 프로젝트를 즉시 삭제하려면 Deleting a project 섹션에 나열된 단계를 완료하세요. 이 단계를 완료하지 않으면 프로젝트가 약 30일 후에 자동으로 삭제됩니다.

의견 설문조사

종료하기 전에 간단한 설문조사에 참여해 주세요.