Dialogflow 기반 RBM 에이전트 만들기 (고급)

이 Codelab에서는 Dialogflow를 사용하여 RBM 에이전트를 구동하는 대화형 인터페이스를 만드는 방법을 알아봅니다.

이 Codelab에서 빌드할 내용은 무엇인가요?

  • RBM 상담사의 대화를 지원하는 Dialogflow 에이전트
  • 사용자에게 자전거 매장에 대한 정보를 제공하고 자전거 수리 또는 정비 일정을 예약하는 가상의 자전거 매장용 대화형 인터페이스

내용

  • Dialogflow의 세 가지 주요 구성 (인텐트, 항목, 컨텍스트)을 사용하여 대화형 인터페이스를 만드는 방법
  • Dialogflow의 fulfillment 및 인라인 편집기를 사용하여 자체 서비스 및 API에 대화 인터페이스를 연결하는 방법 (Firebase용 Cloud Functions 제공)
  • 사용자를 위한 풍부한 RBM 환경을 만들기 위해 Dialogflow에서 RBM 응답 유형을 만드는 방법

필요한 사항

  • Google 계정

첫 번째 에이전트 만들기 및 쿼리하기

길이: 10:00

첫 번째 Dialogflow 에이전트 만들기

Dialogflow 에이전트를 만들려면 다음 안내를 따르세요.

  1. 새 탭을 열고 Dialogflow에 로그인합니다.
  2. 왼쪽 탐색 메뉴에서 에이전트 만들기를 클릭합니다.

  3. 에이전트 이름으로 'CodelabRBMBikeShop'을 입력하고 기본 시간대를 시간대로 설정합니다. 그런 다음 만들기를 클릭합니다.

Dialogflow 콘솔

이제 Dialogflow 콘솔이 표시됩니다. 작은 화면에서 작업 중이며 왼쪽 탐색이 숨겨진 경우 왼쪽 상단의 탐색 버튼을 클릭합니다. 설정 버튼을 누르면 현재 에이전트의 설정으로 이동합니다.

페이지 중간에 에이전트의 인텐트 목록이 표시됩니다. 기본적으로 Dialogflow 에이전트는 인텐트 두 개로 시작합니다. 에이전트가 사용자의 말을 이해하지 못하면 기본 대체 인텐트가 대응하는 결과로 산출됩니다. 기본 시작 인텐트는 사용자에게 인사할 때 사용됩니다. 이러한 인텐트를 변경하여 환경을 맞춤설정할 수 있습니다.

오른쪽에는 Dialogflow 시뮬레이터가 있습니다. 이를 통해 메시지를 말하거나 입력하여 에이전트를 사용해 볼 수 있습니다.

에이전트 쿼리

Dialogflow 에이전트는 NLU (자연어 이해) 모듈로 가장 잘 설명됩니다. 앱, 제품 또는 서비스에 포함되어 자연스러운 사용자 요청을 실행 가능한 데이터로 변환할 수 있습니다.

에이전트를 사용해 볼 차례입니다. 오른쪽의 시뮬레이터에서 지금 사용해 보기라는 텍스트 필드를 클릭하고 '안녕하세요'를 입력한 후 Enter 키를 누릅니다.

Dialogflow는 쿼리를 식별하고 기본 시작 인텐트와 일치하며 일반적인 인사말로 응답합니다. Dialogflow가 몇 가지 샘플 인사말로 기본 시작 인텐트를 자동으로 학습하기 때문입니다.

RBM 에이전트 만들기

비즈니스 커뮤니케이션 개발자 콘솔에 로그인한 후 에이전트 만들기를 클릭합니다.

이름 필드에 '이름의 자전거 판매점'(예: 센 자전거 자전거 상담사)을 입력하고 지역을 선택하고 에이전트 만들기를 클릭합니다.

Dialogflow에 RBM 에이전트 연결

RBM 에이전트가 생성된 후 에이전트를 클릭하여 에이전트의 개요 페이지를 확인합니다. 왼쪽 탐색 메뉴에서 통합 링크를 클릭합니다.

기본적으로 RBM 에이전트는 Google Cloud Pub/Sub를 사용하여 사용자 메시지를 처리합니다. 앞에서 만든 Dialogflow 에이전트에 RBM 에이전트를 연결하려면 Dialogflow 통합을 클릭합니다.

대화상자에서 기존 모델 연결을 클릭합니다. 안내에 따라 RBM 에이전트에 Dialogflow 에이전트를 호출할 수 있는 권한을 부여한 후 다음을 클릭합니다.

마지막으로 Dialogflow 프로젝트 ID를 제공해야 합니다. 비즈니스 커뮤니케이션 개발자 콘솔이 아닌 다른 브라우저 탭에서 Dialogflow로 이동하여 앞서 만든 CodelabRBMBikeShop 에이전트를 엽니다. 왼쪽 탐색 메뉴에서 프로젝트 이름 근처에 있는 톱니바퀴 아이콘을 클릭합니다.

이 버튼을 클릭하면 모델의 설정으로 이동합니다. Google 프로젝트에서 프로젝트 ID를 찾아 복사합니다.

비즈니스 커뮤니케이션 개발자 콘솔이 열려 있는 탭으로 돌아가 프로젝트 ID를 대화상자에 붙여넣고 통합 시작을 클릭합니다.

이 작업은 완료하는 데 2분 정도 걸립니다. 완료되면 Dialogflow 통합 옵션이 강조표시되고 사용 가능한 에이전트 보기 링크가 표시됩니다.

에이전트와 주고받는 모든 메시지가 이제 CodelabRBMBikeShop Dialogflow 에이전트에서 처리됩니다.

테스트 기기 초대 및 메시지 보내기

Dialogflow를 사용하기 전에 테스트 기기를 설정해 보겠습니다. 아직 RBM 메시지를 수신할 수 있는 기기가 없다면 이 가이드에 따라 기기를 준비하세요.

비즈니스 커뮤니케이션 개발자 콘솔의 왼쪽 탐색 메뉴에서 기기를 클릭합니다. 양식에서 E.164 형식 (예: +12223334444)으로 기기의 전체 전화번호를 입력하고 추가를 클릭합니다.

기기에서 테스트 초대를 받습니다. 테스터로 지정을 탭합니다.

브라우저의 기기 목록에서 기기를 찾아 기기에 테스트 메시지를 보냅니다. 기기에서 RBM 에이전트로부터 메시지를 받았다면 이 Codelab을 계속 진행할 수 있습니다.

시작 인텐트 만들기

일반적으로 Dialogflow 기반 RBM 에이전트에서는 대화를 시작하기 위해 사용자의 전화번호와 대화를 시작하는 Dialogflow 인텐트 (대개 에이전트의 시작 인텐트)를 지정합니다. 이 Codelab에서는 이 단계를 건너뛰고 대신 이전 단계에서 만든 대화형 스레드를 비즈니스 커뮤니케이션 개발자 콘솔의 테스트 기기와 함께 사용합니다. 그러나 이 API 기능에 대한 자세한 내용은 이 가이드를 참조하세요.

먼저 Dialogflow가 RBM 에이전트와 함께 사용할 수 있도록 기본 시작 인텐트에 RBM 응답을 추가합니다. 먼저 Dialogflow가 열려 있는 브라우저 탭으로 이동합니다. 기본 시작 인텐트를 클릭하고 응답 섹션까지 아래로 스크롤한 후 응답 유형 목록에서 +를 클릭하고 RCS 비즈니스 메시지 (RBM)를 선택합니다.

응답 추가를 클릭한 후 단순 응답을 선택합니다. Simple Response 텍스트 입력란에 '안녕하세요? 호가스의 자전거 판매점에 오신 것을 환영합니다. 무엇을 도와드릴까요? (내 이름으로 호가스 대체) 후 저장을 클릭합니다.

대화 시작

시작 인텐트를 구성했으므로 테스트 기기로 돌아가서 'Hi&quot' 메시지를 전송하세요. 이 메시지는 기본 시작 인텐트를 트리거하며, 아래와 비슷한 이미지가 표시됩니다.

시작 인텐트 업데이트

이제 Dialogflow가 간단한 메시지를 전송하도록 했으므로 메시지를 좀 더 유용하게 업데이트해 보겠습니다. 사용자에게 인사할 뿐만 아니라 사용자의 행동을 안내하고자 합니다.

현재 생성 중인 에이전트는 2가지 주요 기능(예: 영업시간 확인 및 예약 일정)을 지원해야 합니다. 간단한 응답 환영 메시지를 이러한 상호작용을 실행하는 추천 답장을 제공하는 카드로 바꾸겠습니다.

기본 시작 인텐트응답 섹션에서 RCS 비즈니스 메시지 (RBM) 탭을 선택합니다. 휴지통 아이콘을 클릭하여 기존 단순 응답을 삭제합니다. 그런 다음 응답 추가를 클릭하고 독립형 리치 카드를 선택합니다.

독립형 리치 카드 양식에 다음을 입력합니다.

  • 카드 제목: 안녕하세요. Hogarth의 자전거 판매점에 오신 것을 환영합니다.
  • 카드 설명: 무엇을 도와드릴까요? 아래 옵션 중에서 선택합니다.
  • 카드 방향 선택: 세로 모드
  • 이미지/동영상 URL: https://storage.googleapis.com/df-rbm-codelab/bike-shop.jpg
  • 미디어 높이 선택: 보통

추천 추가를 클릭하고 다음을 입력합니다.

  • 제안 텍스트: 영업시간이 어떻게 되나요?
  • 제안 포스트백: reply_hours

제안 추가를 클릭하고 다음을 입력하여 다른 제안을 추가합니다.

  • 제안 텍스트: 예약
  • 제안 포스트백: reply_appointment

저장을 클릭합니다.

직접 사용해 보세요.

모델이 '에이전트 학습 완료'라고 표시되면 기기로 돌아가서 '안녕하세요'를 에이전트로 보냅니다. 이제 방금 디자인한 독립형 리치 카드가 표시됩니다.

영업시간을 알려 주세요를 탭하세요. 기본 대체 인텐트가 트리거됩니다. 이는 Dialogflow 에이전트가 이 추천에 대해 구성한 포스트백 데이터("reply_hours")를 처리하는 방법을 모르기 때문입니다.

이 문제를 해결해 보겠습니다.

Hours 인텐트 만들기

Dialogflow는 인텐트를 사용하여 사용자의 의도를 분류합니다. 인텐트에는 학습 문구가 있는데, 이는 사용자가 에이전트에게 할 수 있는 말의 예시입니다. 예를 들어 자전거 매장의 영업 시간을 알고자 하는 사용자가 '어떻게 해야 하지?'라고 하는 식으로요.

이러한 모든 쿼리는 고유하지만 목적은 같습니다. 즉, 자전거 매장이 문을 여는 시점에 대한 정보를 얻는 것입니다.

이 쿼리를 다루려면 다음과 같이 '시간' 인텐트를 만듭니다.

  1. 왼쪽 탐색 메뉴에서 인텐트 옆에 있는 +를 클릭합니다.
  2. 인텐트 이름에 "Hours"를 입력합니다.
  3. 학습 문구에서 사용자 표현 추가를 클릭하고 다음을 입력한 후 한 항목의 입력이 끝날 때마다 Enter 키를 누릅니다.

    • When do you open?
    • What are your hours?
    • How late can I come in?
    • reply_hours.

    이 마지막 학습 문구는 이전 섹션에서 구성한 포스트백 데이터를 이 인텐트로 매핑하는 데 사용됩니다.

  4. 응답에서 +를 클릭하고 RCS 비즈니스 메시지 (RBM)를 선택합니다.

  5. 응답 추가를 클릭하고 단순 응답을 선택합니다.

  6. 간단한 응답의 텍스트 입력란에 평일 오전 9시부터 오후 5시 30분까지 'open'을 입력합니다.

  7. 저장을 클릭합니다.

직접 사용해 보세요.

이제 상담사에게 시간을 물어보세요. 기기의 RBM 에이전트 대화에서 "when are youSTS\"를 입력하고 상담사에게 메시지를 전송합니다.

에이전트가 이제 쿼리에 올바르게 응답합니다. 쿼리가 학습 문구와 약간 다르더라도 ("열려 있는 시간은 언제인가요?\'라는 질문) Dialogflow는 여전히 쿼리를 올바른 인텐트에 일치시켰습니다. 리치 카드에서 영업시간은 어떻게 되나요?를 탭해도 됩니다.

Dialogflow는 학습 문구를 머신러닝 모델의 예시로 사용하여 사용자의 쿼리를 올바른 인텐트에 대응시킵니다. 머신러닝 모델이 쿼리를 에이전트의 모든 인텐트에 대조하고 모든 인텐트에 점수를 부여하며 가장 점수가 높은 인텐트가 대응됩니다. 가장 점수가 높은 인텐트에 매우 낮은 점수가 매겨지면 대체 인텐트가 대응됩니다.

fulfillment 추가

이 에이전트도 작동하지만 우리가 만든 에이전트는 약간 부자연스럽습니다. 사용자가 '영업 중인가요?'와 같은 질문을 하면 상담사는 평일 오전 9시부터 오후 5시 30분까지 영업합니다. 매장이 영업 중인지 직접 알려줘도 훨씬 더 자연스럽고 도움이 됩니다.

이를 위해 에이전트는 매장이 현재 영업 중인지 확인하고 두 경우 모두 다른 응답을 생성해야 합니다. Dialogflow에서는 이러한 유형의 복잡한 로직을 fulfillment 웹훅에 구현해야 합니다.

fulfillment 웹훅은 Dialogflow에서 현재 대화 상태에 대한 정보와 함께 호출하는 HTTP 서버입니다. fulfillment 코드는 필요한 작업을 수행한 다음 Dialogflow가 사용자에게 반환하는 응답을 생성합니다.

이제 에이전트가 더 효과적으로 응답하도록 하는 fulfillment 웹훅을 배포하는 프로세스를 살펴보겠습니다.

설정: fulfillment 배포 및 사용 설정

Dialogflow에는 Firebase용 Cloud Functions가 기본 제공되어 fulfillment를 처리할 자바스크립트 코드를 작성하고 배포할 수 있습니다.

Dialogflow의 왼쪽 탐색 메뉴에서 Fulfillment를 클릭하여 fulfillment 페이지를 엽니다. 인라인 편집기 옆에 있는 전환 버튼을 클릭하여 Firebase용 Cloud Functions 편집기를 사용 설정합니다.

편집기에는 fulfillment의 기본 코드가 포함된 'index.js'와 필수 종속 항목을 자세히 설명하는 'package.json'이 모두 포함되어 있습니다.

이제 fulfillment를 지원하는 샘플 코드를 가져오겠습니다.

이 파일의 텍스트를 복사하여 "index.js&quot에 붙여넣고 현재 콘텐츠를 모두 바꿉니다.

https://storage.googleapis.com/df-rbm-codelab/index.js

이제 페이지 하단으로 스크롤하여 배포를 클릭합니다. 1분 정도 후에 코드가 Firebase용 Cloud Functions에 배포됩니다.

함수가 배포되면 페이지 하단에 다음과 같이 배포 날짜와 시간이 표시됩니다.

fulfillment 코드를 확인합니다. hoursHandler 함수는 currentlyOpen를 호출하여 매장이 현재 영업 중인지 확인하고 조건에 따라 다른 RBM 응답을 추가합니다.

function hoursHandler(agent) {
    let responseText = 'We\'re currently closed, but we open every weekday at 9am!';
    if (currentlyOpen()) {
      responseText = 'We\'re open now!! We close at 5pm today.';
    }

    let payload = {
    "fulfillmentMessages": [
        {
          "platform": "GOOGLE_RBM",
          "rbmText": {
              "text": responseText
          }
        }
      ]
    };

    return response.status(200).json(payload);
}

intentMap.set('Hours', hoursHandler); 줄은 'Hours' 인텐트가 대응될 때 hoursHandler 함수가 실행되어야 한다고 fulfillment 라이브러리에 알립니다. 하지만 'Hours' 인텐트에 fulfillment를 사용 설정하도록 Dialogflow에 알려야 합니다.

왼쪽 탐색 메뉴에서 인텐트를 클릭하고 'Hours' 인텐트를 엽니다. 하단의 Fulfillment 섹션을 열고 이 인텐트에 웹훅 호출 사용 설정을 선택합니다.

인텐트를 저장한 후 시도해 볼 수 있습니다. 오른쪽의 시뮬레이터에 'Open youquoquo;;를 입력합니다. 진단 정보를 클릭하고 API 응답을 검사하면 fulfillment 응답이 표시됩니다. Firebase용 Cloud Functions 서버에서 사용되는 시간대는 UTC이므로 응답이 현재 현지 시간에 맞지 않을 수 있습니다.

fulfillment에 오류가 있는 경우 Dialogflow는 인텐트 페이지의 응답 섹션에 정의된 응답을 사용하여 에이전트가 적절하게 복구할 수 있도록 합니다.

다음으로, 항목을 사용하여 사용자 검색어의 관련 부분을 추출합니다. 이를 통해 사용자는 자전거 수리를 예약하거나 자전거를 수리할 수 있습니다.

항목으로 데이터 추출

길이: 12:00

이 섹션에서는 사용자의 자전거에서 서비스를 제공하거나 수리를 요청할 수 있도록 사용자의 쿼리에서 데이터를 추출하는 방법을 알아봅니다.

인텐트에 매개변수 추가

매개변수는 에이전트가 적절한 응답을 제공할 수 있도록 Dialogflow가 추출하는 사용자 쿼리 내 관련 단어 또는 구문입니다. 매개변수를 사용하여 새 인텐트를 만들고 매개변수에 값을 포함하는 방법을 알아봅니다.

  1. 왼쪽 탐색 메뉴에서 인텐트 옆에 있는 +를 클릭하여 새 인텐트를 만듭니다.
  2. 인텐트 이름 페이지 상단에 "Make Appointment"를 입력합니다.
  3. 다음을 학습 문구로 추가합니다.
    • reply_appointment
    • I'd like to schedule an appointment for next Thursday
    • I have a mountain bike that needs servicing I'd like to get my bike fixed
    • My bike is broken
    • Can I schedule service for 4pm tomorrow?
    • Can you fix my road bike?
    • Can I set up an appointment for noon on Friday?

Dialogflow가 학습 문구의 알려진 매개변수를 자동으로 감지하여 생성합니다.

학습 문구 아래에서 Dialogflow는 수집하는 정보로 매개변수 테이블을 자동으로 작성합니다.

  • 매개변수는 선택사항입니다 (필수 아님).
  • 이름을 datetime으로 지정
  • 시스템 항목 유형 @sys.date@sys.time에 해당합니다.**
  • $date$time의 값을 갖습니다.
  • 은(는) 목록이 아닙니다.

매개변수 데이터 사용

응답에 매개변수 값을 사용할 수 있습니다. 이 경우 응답에 $date$time를 사용할 수 있으며 에이전트에 지정된 쿼리에 지정된 날짜 및 시간으로 대체됩니다.

응답에서 RCS 비즈니스 메시지 탭을 추가하고 단순 응답에 다음을 추가한 후 저장을 클릭합니다.

Great! I've set up your appointment for $date at $time.  See you then!

직접 사용해 보세요.

이제 에이전트의 오른쪽 패널에 있는 시뮬레이터에서 "내일 오후 2시를 예약할 수 있나요?\"라고 쿼리합니다.

시뮬레이터 출력 하단에서 Dialogflow가 '내일' 및 '오후 2시' 매개변수를 쿼리에서 올바르게 추출하여 날짜 및 시간으로 올바르게 파싱한 것을 확인할 수 있습니다. 이제 테스트 기기에서 이와 동일한 작업을 시도하고 응답에 파싱된 날짜 및 시간이 어떻게 포함되어 있는지 확인합니다.

매개변수를 필수로 지정

자전거 매장의 경우 일정을 예약하기 전에 날짜와 시간의 값을 알아야 합니다. 기본적으로 모든 Dialogflow 매개변수는 선택사항입니다. 이를 필수로 만들려면 필요한 각 매개변수 옆에 있는 체크박스를 선택해야 합니다. 'Appointment 만들기' 인텐트에서 각 매개변수 옆의 체크박스를 선택합니다.

이제 각 매개변수가 필요하므로 각 매개변수에 대한 메시지를 만들어야 합니다. 사용자가 처음 의도를 표시했을 때 제공되지 않은 매개변수의 값 (이 경우 예약용)을 사용자에게 입력하라는 메시지가 표시됩니다. 프롬프트 정의를 클릭하여 매개변수에 대한 메시지를 만들고 각 매개변수에 다음 메시지를 입력합니다.

매개변수 프롬프트
date What day do you want to come in?
시간 몇 시로 정할까요?

프롬프트를 입력한 후 저장을 클릭합니다.

직접 사용해 보세요.

기기에서 예약 추천을 탭하거나 '자전거를 고정하고 싶습니다.'라고 입력합니다. '어떤 날에 오시겠어요?'라는 응답을 받게 됩니다. 날짜(“quot;tomorrow")를 표시하면 해당 날짜의 시간을 묻는 응답을 받게 됩니다. '응답'으로 응답하면 약속이 설정된 것을 확인할 수 있습니다.

초기 요청에 일부 정보가 포함된 쿼리(예: 내일 예약을 설정하려고 함)가 올바른 매개변수(날짜)를 채우고 날짜 프롬프트를 건너뛰며("날짜를 알려주세요.)

Dialogflow 항목과 매개변수를 사용하여 코드 없이 최소한의 설정만으로 완전히 고유한 대화를 만들었습니다. 다음으로 fulfillment를 사용하여 사용자에게 '약속을 언제로 예약할지'와 같은 메시지에 대한 답변을 안내하는 방법을 다룹니다.

설정: fulfillment 사용 설정

왼쪽 탐색 메뉴에서 인텐트를 클릭하고 'Make Appointment' 인텐트를 엽니다. Fulfillment를 열고 이 인텐트에 웹훅 호출 사용 설정슬롯 채우기에 웹훅 호출 사용 설정을 선택하여 둘 다 켜진 후 저장을 클릭합니다.

두 가지 모두 사용 설정된 경우 Dialogflow는 이 인텐트가 트리거될 때 fulfillment를 사용하여 필요한 매개변수 및 인텐트의 RBM 응답(필요한 경우)에 대한 응답을 생성합니다.

처리 구현하기

Dialogflow의 왼쪽 탐색 메뉴에서 Fulfillment를 클릭하여 fulfillment 페이지를 엽니다. 선까지 아래로 스크롤합니다.

intentMap.set('Hours', hoursHandler);

그리고 다음 줄에 다음을 추가합니다.

intentMap.set('Make Appointment', makeAppointment);

이는 'Make Appointment' 인텐트가 일치할 때 makeAppointment 함수가 실행되어야 한다고 fulfillment 라이브러리에 알립니다.

그런 다음 아래의 코드를 복사하여 currentlyOpen 함수 아래에 붙여넣습니다. 두 가지 함수 getSuggestedTimesgetSuggestedDates는 유용한 칩 목록을 만들어 사용자 응답을 촉진합니다.

function getSuggestedTimes() {
  return [
        {
          "reply": {
            "text": "9 am",
            "postbackData": "9:00am"
            }
        },
        {
          "reply": {
            "text": "10 am",
            "postbackData": "10:00am"
          }
        },
        {
          "reply": {
            "text": "1 pm",
            "postbackData": "1:00pm"
          }
        },
        {
          "reply": {
            "text": "2 pm",
            "postbackData": "2:00pm"
          }
        }
      ];
}

function getSuggestedDates() {
  return [
        {
          "reply": {
            "text": "Tomorrow",
            "postbackData": "Tomorrow"
          }
        },
        {
          "reply": {
            "text": "A week from now",
            "postbackData": "A week from now"
          }
        },
        {
          "reply": {
            "text": "Two weeks from now",
            "postbackData": "Two weeks from now"
          }
        }
      ];
}

그런 다음 hoursHandler 아래에 아래 코드를 복사하여 붙여넣고 배포를 클릭합니다.

function makeAppointment(agent) {
    // extract required parameters
    const appointmentDate = agent.parameters.date;
    const appointmentTime = agent.parameters.time;

    const gotAppointmentDate = appointmentDate.length > 0;
    const gotAppointmentTime = appointmentTime.length > 0;

    let responseText = '';
    let suggestions = [];

    if(gotAppointmentDate && gotAppointmentTime) {
      // We have all required parameters, return success message
      responseText = 'Great! I\'ve set up your appointment for ' +
          appointmentDate + ' at ' + appointmentTime + '.  See you then!';
    }
    else if(gotAppointmentDate) {
      responseText = 'What time works for you?';
      suggestions = getSuggestedTimes();
    }
    else if(gotAppointmentTime) {
      responseText = 'What day do you want to come in?';
      suggestions = getSuggestedDates();
    }
    else {
      responseText = 'What day do you want to come in?';
      suggestions = getSuggestedDates();
    }

    let payload = {
      "fulfillmentMessages": [
      {
        "platform": "GOOGLE_RBM",
        "rbmText": {
          "text": responseText,
          "rbmSuggestion": suggestions
        }
      }
    ]
    };

    return response.status(200).json(payload);
  }

잠시 시간을 내어 코드를 검사합니다. 필수 매개변수가 값을 확인 중이고, 설정되지 않은 경우 사용자에게 적절한 메시지와 추천 집합을 표시합니다.

직접 사용해 보세요.

기기에서 예약 추천을 탭하거나 '자전거를 고정하고 싶습니다.'라고 입력합니다. '내일', '지금부터 1주일 후', '지금부터 2주 후'와 같은 몇 가지 유용한 제안과 함께 날짜 ("내일)를 표시하면 한동안 응답을 받을 수 있습니다. 메시지에 응답하면 약속이 설정된 것을 확인할 수 있습니다.

컨텍스트로 상태 관리

길이: 7:00

대화 상태에 컨텍스트 추가

사용자가 예약을 성공적으로 설정한 후 사용자로부터 추가 정보를 수집해야 할 수 있습니다. 자전거 매장이 수리 또는 튜닝이라는 두 가지 유형의 약속을 제공한다고 가정해 보겠습니다. 사용자에게 필요한 사항이 무엇인지 알고 싶어 합니다.

시작하기 위해 "Make Appointment' 인텐트의 응답을 업데이트하여 사용자에게 필요한 약속 유형을 묻습니다. makeAppointment 처리 함수의 성공 응답을 아래 텍스트로 바꾼 다음 배포를 클릭합니다.

responseText = 'Great! I\'ve set up your appointment for ' +
    appointmentDate + ' at ' + appointmentTime + '.  Do you need a repair for just a tune-up?';

이 질문에 대한 답변을 수집하려면 또 다른 인텐트를 만들어야 합니다. 하지만 이 새 인텐트는 이 질문에 이미 답변한 후에만 일치해야 합니다. 이를 시행하려면 후속 조치 인텐트로 정의하면 됩니다.

후속 조치 인텐트는 '상위' 인텐트(이 경우에는 'Appointment' 인텐트)가 대응된 후에만 매칭될 수 있는 인텐트입니다. 왼쪽 탐색 메뉴에서 인텐트를 클릭합니다. 메뉴가 숨겨져 있으면 왼쪽 상단의 메뉴 ☰ 버튼을 클릭합니다. 그런 다음 'Make Appointment' 인텐트 위로 마우스를 가져가서 인텐트 이름 오른쪽에 표시되는 후속 조치 인텐트 추가를 클릭합니다.

그런 다음 드롭다운 메뉴에서 맞춤을 클릭합니다.

Dialogflow는 자동으로 후속 조치 인텐트 이름을 "Make Appointment - custom'로 지정했으며 화살표는 인텐트 간의 관계를 나타냅니다.

후속 조치 인텐트는 상위 인텐트가 일치된 후에만 일치될 수 있습니다. 이 인텐트는 'Make Appointment' 인텐트 이후에만 일치하므로 사용자에게 방금 '수리가 필요한지 아니면 미세 조정이 필요합니다'라는 질문을 받았다고 가정할 수 있습니다.

이 질문에 대한 답을 캡처하려면 먼저 몇 가지 항목을 정의해야 합니다.

첫 번째 항목 만들기

Dialogflow를 사용하면 Dialogflow 시스템 항목과 유사하게 작동하는 개발자 항목을 정의할 수 있습니다. 먼저 항목 유형을 만들어 보겠습니다. 사용자가 Google에서 예약하려는 약속 유형을 선택할 수 있기를 바라므로 항목 유형을 AppointmentType라고 하겠습니다. AppointmentType 항목 유형에 두 개의 예약 유형인 servicefix에 관한 항목 두 개를 추가합니다.

항목 유형을 만들려면 다음 안내를 따르세요.

  1. 왼쪽 탐색 메뉴에서 항목 옆에 있는 +를 클릭합니다.
  2. 항목 유형 이름에 "AppointmentType"를 입력합니다.
  3. 텍스트 입력란을 클릭하고 다음 항목을 추가합니다.
    • 서비스
    • 수정
  4. 항목을 입력할 때 Tab 키를 누르면 커서가 동의어 필드로 이동합니다. 각 항목에 다음 동의어를 추가합니다. 전체 문자열을 복사하여 붙여넣는 대신 각 단어를 개별적으로 추가해야 합니다.
항목 동의어
서비스
  • 서비스
  • 정비
  • 유지 보수
  • 튜닝
  • 조정
수정
  • 수정
  • repair
  • 수정
  • 깨짐
  • 타이어 타이어
  • 고정
  1. 저장을 클릭합니다.

각 항목 유형에는 다음이 있어야 합니다.

  • 카테고리를 정의하는 이름 ("AppointmentType")
  • 한 개 이상의 항목 ("service", "fix")
  • 동의어 하나 이상 ("유지보수', & 미세 조정)

Dialogflow는 복수형 및 대소문자와 같은 단순한 부분을 처리하지만 가능한 모든 동의어를 추가해야 합니다. 항목을 많이 추가할수록 에이전트가 항목을 더 잘 결정할 수 있습니다.

새 항목 추가

약속을 위한 항목 유형을 정의했으므로 이제 'Make Appointment - custom' 인텐트의 학습 문구에서 사용할 수 있습니다.

  1. 왼쪽 탐색 메뉴에서 인텐트를 클릭한 후 'Make Appointment' 인텐트 옆에 있는 화살표를 클릭하여 후속 조치 인텐트를 표시합니다. 'Make Appointment - custom' 인텐트를 클릭합니다.
  2. 다음 항목을 학습 문구로 추가합니다.

    • 제 자전거 서비스를 제공해 주시겠어요?
    • 수리가 필요합니다.

  3. 입력한 학습 문구에 자동으로 약속 항목 유형이 주석으로 표시됩니다. 그러면 표에 AppointmentType 매개변수가 추가됩니다. 이 매개변수는 학습 문구 섹션 아래에 있습니다. 체크박스를 클릭하여 이 매개변수를 REQUIRED로 표시합니다.

  4. 메시지 정의를 클릭하고 '자전거 서비스 또는 수리 가능'이라고 입력합니다. 어떤 작업을 하시겠어요?

  5. 응답에서 응답을 '알겠습니다. $AppointmentType."로 예약한 다음 저장을 클릭합니다.

직접 사용해 보세요.

기기에서 예약 추천을 탭하거나 '자전거를 고정하고 싶습니다.'라고 입력합니다. '내일', '지금부터 1주일 후', '지금부터 2주 후'와 같은 몇 가지 유용한 제안과 함께 날짜 (&OOT)를 표시하면 해당 날짜의 시간에 대한 응답이 전송됩니다.

시간을 선택하면 서비스 또는 튜닝용인지 묻는 새 응답이 표시됩니다.

그런 다음 '수리가 필요합니다'라고 입력합니다. Dialogflow가 올바른 AppointmentType을 항목으로 추출했음을 나타내는 '알겠습니다.'라는 응답을 확인할 수 있습니다.

현재 이 인텐트에 대한 응답 ("수정 일정을 잡겠습니다.')은 상당히 도움이 되지 않습니다. 응답이 예약된 날짜와 시간을 응답이 확인해 주는 것이 좋습니다. 이를 위해 날짜와 시간이 필요하지만 날짜 및 시간 매개변수는 'Make Appointment' 인텐트에만 있고 'Appointment 만들기 - 커스텀' 인텐트에는 없습니다.

인텐트 및 컨텍스트

'Make Appointment' 인텐트에서 수집된 매개변수로 응답하려면 후속 인텐트가 어떻게 작동하는지 알아야 합니다. 후속 조치 인텐트는 컨텍스트를 사용하여 상위 인텐트가 트리거되었는지 여부를 추적합니다. 'Make Appointment' 인텐트를 검사하면 출력 컨텍스트로 "MakeAppointment-followup"가 표시되며 숫자 2가 앞에 붙습니다.

'Make Appointment' 인텐트가 대응되면 Dialogflow는 컨텍스트에 'MakeAppointment-followup'을 두 번 연관시킵니다. 따라서 사용자가 질문에 응답하면 ("수리 또는 튠업이 필요한가요?) 컨텍스트 'MakeAppointment-followup'이 활성화됩니다. 입력 컨텍스트가 동일한 인텐트는 Dialogflow가 인텐트를 일치시킬 때 적극 권장됩니다.

왼쪽 탐색 메뉴에서 인텐트를 클릭한 후 '커스텀' 인텐트 - 커스텀 인텐트를 클릭합니다.

인텐트에 'Make Appointment'의 출력 컨텍스트와 동일한 입력 컨텍스트 ("MakeAppointment-후속")가 있는 것을 확인할 수 있습니다. 따라서 'Make Appointment'와 'customAppointment'는 'Make Appointment' 인텐트가 대응된 후에만 매칭됩니다.

컨텍스트 및 매개변수

컨텍스트는 매개변수 값을 저장합니다. 즉, "Make Appointment - custom"와 같은 다른 인텐트에서 정의된 인텐트의 매개변수 값에 액세스할 수 있습니다.

'makeAppointment - custom' 인텐트에 다음 응답을 추가하고 Save를 클릭합니다. "알겠습니다. #MakeAppointment-followup.time에서 $AppointmentType, #MakeAppointment- Followup.date를 예약해 보겠습니다. 그때 뵙겠습니다."

이제 에이전트에게 다시 질문하고 적절한 응답을 받을 수 있습니다. 먼저 내일 오전 11시에 자전거를 정비할 수 있도록 약속을 정한 다음 '수리 필요'로 질문에 답변할 수 있습니다.

예약을 확인하는 응답에 컨텍스트에서 날짜 및 시간 매개변수 값이 검색된 것을 볼 수 있습니다.

응답 형식 개선

길이: 5:00

fulfillment를 사용하여 날짜 및 시간 형식 지정

성공 메시지가 표시되는 날짜와 시간은 사용자 친화적이지 않은 것이죠. 이 문제를 해결하려면 fulfillment를 다시 사용하여 자바스크립트를 사용하여 날짜 및 시간 매개변수의 형식을 사용자가 쉽게 읽을 수 있는 형식으로 지정해야 합니다.

왼쪽 탐색 메뉴에서 인텐트를 클릭하고 'Make Appointment - custom' 인텐트를 클릭하여 'Make Appointment - custom' 인텐트로 이동합니다. 페이지 하단으로 스크롤하고 이 인텐트에 웹훅 호출 사용 설정을 켠 다음 저장을 클릭합니다.

왼쪽 탐색 메뉴에서 fulfillment 링크를 클릭하여 fulfillment로 이동합니다. 아래 코드를 복사하여 makeAppointment 함수 아래에 붙여넣습니다.

function makeAppointmentFollowUp(agent) {
    let context = agent.getContext('makeappointment-followup');

    // extract required parameters
    const appointmentDate = new Date(context.parameters.date);
    const appointmentTime = new Date(context.parameters.time);
    const appointmentType = agent.parameters.AppointmentType;

    // format date and time to be human-readable
    const dateAsString = appointmentDate.toLocaleDateString('en-US',
        { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });
    const timeAsString = appointmentTime.toLocaleString('en-US',
        { hour: 'numeric', minute: 'numeric', hour12: true });

    // compose response for user
    let responseText = 'Okay, we'll schedule a ' + appointmentType + ', ' + dateAsString +
        ', at ' + timeAsString + '.  We'll see you then.';

    let payload = {
      "fulfillmentMessages": [
      {
        "platform": "GOOGLE_RBM",
        "rbmText": {
          "text": responseText
        }
      }
    ]
    };

    return response.status(200).json(payload);
  }

이 함수 아래에서 intentMap.set('Make appointment', makeAppointment); 줄을 찾아 intentMap.set('Make appointment - custom', makeAppointmentFollowUp);를 추가하여 후속 조치 인텐트가 호출될 때 앞서 붙여넣은 함수를 호출합니다.

makeAppointmentFollowUp 코드를 살펴보고 수신 컨텍스트와 이 인텐트에서 매개변수가 어떻게 추출되고 있는지 확인하세요. 이제 responseText가 생성되기 전에 코드에서 사람이 읽을 수 있는 날짜 및 시간 형식을 지정합니다.

직접 사용해 보세요.

기기에서 예약 추천을 탭하거나 '자전거를 고정하고 싶습니다.'라고 입력합니다. '내일', '지금부터 1주일 후', '지금부터 2주 후'와 같은 몇 가지 유용한 제안과 함께 날짜 (&OOT)를 표시하면 해당 날짜의 시간에 대한 응답이 전송됩니다.

시간을 선택하면 서비스 또는 튜닝용인지 묻는 새 응답이 표시됩니다.

그런 다음 '수리가 필요합니다'라고 입력합니다. 약속 유형, 날짜 및 시간이 예약되었음을 확인할 수 있는 응답이 읽기 가능한 형식으로 표시되어야 합니다.

모두 마쳤습니다!

길이: 1:00

훌륭합니다.

지금까지 Dialogflow에 기반한 RBM 에이전트 빌드의 모든 단계를 살펴보았습니다.

흥미진진한 새 플랫폼을 개발해 보세요.