빌드 처리 (Dialogflow)

처리는 사용자 입력을 가져오기 위한 작업의 대화형 인터페이스와 입력을 처리하고 최종적으로 작업을 처리하는 로직을 정의합니다.

대화 정의

작업을 정의했으므로 이제 이러한 작업에 상응하는 대화를 빌드할 수 있습니다. 이렇게 하려면 문법이나 사용자가 인텐트를 트리거하기 위해 말해야 하는 내용, 그리고 트리거될 때 인텐트를 처리하기 위해 인텐트를 정의하는 Dialogflow 인텐트를 만들면 됩니다.

전체 대화의 문법을 정의하려는 만큼 인텐트를 만들 수 있습니다.

인텐트 만들기

Dialogflow의 왼쪽 탐색 메뉴에서 인텐트 메뉴 항목 옆에 있는 + 기호를 클릭합니다. 다음 정보를 입력할 수 있는 인텐트 편집기가 표시됩니다.

  • 인텐트 이름은 IDE에 표시된 인텐트의 이름입니다.
  • 컨텍스트를 사용하면 인텐트 트리거의 범위를 특정 사례로 지정할 수 있습니다. 자세한 내용은 컨텍스트에 대한 Dialogflow 문서를 참조하세요.
  • 이벤트는 사용자가 아무 말도 하지 않아도 인텐트를 트리거합니다. 이벤트 예시로는 Google 어시스턴트가 작업을 호출할 수 있는 GOOGLE_ASSISTANT_WELCOME 이벤트가 있습니다. 이 이벤트는 작업의 기본 작업에 사용됩니다. 내장 도우미 인텐트에 관한 자세한 내용은 이 문서를 참조하세요.
  • 학습 문구는 인텐트를 트리거하기 위해 사용자가 말해야 하는 내용 (문법)을 정의합니다. 사용자가 인텐트를 트리거하기 위해 말할 수 있는 몇 가지 문구 (5~10개)를 여기에 입력합니다. Dialogflow는 제공된 예시 문구의 자연스러운 변형을 자동으로 처리합니다.
  • 작업 및 매개변수는 이 인텐트에 처리가 사용 설정된 경우 처리에 전달할 데이터를 정의합니다. 여기에는 사용자 입력에서 파싱된 데이터와 처리에서 트리거된 인텐트를 감지하는 데 사용할 수 있는 이름이 포함됩니다. 나중에 이 이름으로 인텐트를 상응하는 처리 로직에 매핑합니다. 작업 정의에 대한 자세한 내용은 Dialogflow 문서의 작업 및 매개변수를 참조하세요.

  • 응답은 Dialogflow 응답 빌더로서, 처리를 호출하지 않고 Dialogflow 내에서 직접 이 인텐트에 대한 응답을 정의할 수 있습니다. 이 기능은 처리가 필요하지 않은 정적 응답에 유용합니다. 간단한 환영 또는 작별 메시지를 제공할 때 사용할 수 있습니다. 그러나 대부분의 인텐트에 관해 처리를 사용하여 사용자에게 응답할 수 있습니다.

  • Fulfillment는 인텐트가 트리거될 때 처리를 호출할지 여부를 지정합니다. 이 기능은 대부분 Dialogflow 에이전트의 인텐트에 사용 설정될 가능성이 높습니다. 인텐트에서 이 항목을 보려면 Fulfillment 메뉴에서 에이전트에 fulfillment를 사용 설정해야 합니다.

Dialogflow에서 응답 빌드

일부 인텐트의 경우 처리가 응답을 반환하도록 할 필요가 없을 수도 있습니다. 이러한 경우 Dialogflow의 응답 빌더를 사용하여 응답을 만들 수 있습니다.

응답 영역에서 사용자에게 반환할 텍스트 응답을 제공합니다. 기본 텍스트 응답은 여러 Dialogflow 통합에서 작동할 수 있는 간단한 TTS 텍스트 응답입니다. Google 어시스턴트의 응답은 응답 페이지에 설명되어 있습니다.

처리 응답 빌드

처리 코드는 작업의 웹훅 처리 로직에서 호스팅됩니다. 예를 들어 Silly Name Maker 샘플에서 이 로직은 Firebase용 Cloud 함수의 index.js에 있습니다.

처리를 사용하는 인텐트가 트리거되면 Dialogflow에서 인텐트에 대한 정보가 포함된 요청을 수신합니다. 그런 다음 인텐트를 처리하고 응답을 반환하여 요청에 응답합니다. 이 요청 및 응답은 Dialogflow 웹훅으로 정의됩니다.

Node.js 클라이언트 라이브러리를 사용하여 요청을 처리하고 응답을 반환하는 것이 좋습니다. 다음은 클라이언트 라이브러리를 사용하는 일반적인 프로세스입니다.

  1. Dialogflow 객체를 초기화합니다. 이 객체는 요청 리슨과 파싱을 자동으로 처리하므로 처리에서 요청을 처리할 수 있습니다.
  2. 요청을 처리하는 함수를 만듭니다. 이러한 함수는 사용자 입력 및 인텐트의 기타 구성요소를 처리하고 Dialogflow로 반환할 응답을 빌드합니다.

Dialogflow 객체 초기화

다음 코드는 Dialogflow를 인스턴스화하고 Google Cloud Functions의 상용구 Node.js 설정을 수행합니다.

Node.js
'use strict';

const {dialogflow} = require('actions-on-google');
const functions = require('firebase-functions');

const app = dialogflow({debug: true});

app.intent('Default Welcome Intent', (conv) => {
  // Do things
});
exports.yourAction = functions.https.onRequest(app);
자바
public class DfFulfillment extends DialogflowApp {
  private static final Logger LOGGER = LoggerFactory.getLogger(DfFulfillment.class);

  @ForIntent("Default Welcome Intent")
  public ActionResponse welcome(ActionRequest request) {
    // Do things
    // ...
  }

요청을 처리하는 함수 만들기

사용자가 인텐트를 트리거하는 문구를 말하면, 처리의 함수로 처리할 수 있는 Dialogflow의 요청이 수신됩니다. 이 함수에서는 일반적으로 다음 작업을 실행합니다.

  1. 사용자 입력을 처리하는 데 필요한 로직을 실행합니다.
  2. 트리거된 인텐트에 응답하도록 응답을 빌드합니다. 사용자가 적절한 응답을 구성하는 데 사용하는 노출 영역을 고려해야 합니다. 다양한 노출 영역의 응답을 처리하는 방법에 관한 자세한 내용은 노출 영역 기능을 참고하세요.
  3. 응답과 함께 ask() 함수를 호출합니다.

다음 코드는 호출 인텐트 (input.welcome)와 대화상자 인텐트 (input.number)를 처리하는 두 개의 TTS 응답을 빌드하는 방법을 보여줍니다. 이 응답은 사용자를 작업에 환영하고 사용자가 Dialogflow 인텐트에 대해 말한 숫자를 이름과 함께 에코합니다.

Node.js
const app = dialogflow();
app.intent('Default Welcome Intent', (conv) => {
conv.ask('Welcome to number echo! Say a number.');
});
app.intent('Input Number', (conv, {num}) => {
// extract the num parameter as a local string variable
conv.close(`You said ${num}`);
});
자바
@ForIntent("Default Welcome Intent")
public ActionResponse defaultWelcome(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  rb.add("Welcome to number echo! Say a number.");
  return rb.build();
}

@ForIntent("Input Number")
public ActionResponse inputNumber(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  Integer number = (Integer) request.getParameter("num");
  rb.add("You said " + number.toString());
  return rb.endConversation().build();
}

위 코드와 함께 제공되는 맞춤 인텐트 입력 번호@sys.number 항목을 사용하여 사용자 발화에서 숫자를 추출합니다. 그런 다음 인텐트는 사용자의 숫자가 포함된 num 매개변수를 처리의 함수로 전송합니다.

각 인텐트의 개별 핸들러 대신 대체 함수를 추가할 수 있습니다. 대체 함수 내에서 이를 트리거한 인텐트를 확인하고 그에 따라 적절한 작업을 실행합니다.

Node.js
const WELCOME_INTENT = 'Default Welcome Intent';
const NUMBER_INTENT = 'Input Number';
const NUMBER_PARAMETER = 'num';
// you can add a fallback function instead of a function for individual intents
app.fallback((conv) => {
 // intent contains the name of the intent
 // you defined in the Intents area of Dialogflow
 const intent = conv.intent;
 switch (intent) {
   case WELCOME_INTENT:
     conv.ask('Welcome! Say a number.');
     break;
   case NUMBER_INTENT:
     const num = conv.parameters[NUMBER_PARAMETER];
     conv.close(`You said ${num}`);
     break;
 }
});
자바
// you can add a fallback function instead of a function for individual intents
@ForIntent("Default Fallback Intent")
public ActionResponse fallback(ActionRequest request) {
  final String WELCOME_INTENT = "Default Welcome Intent";
  final String NUMBER_INTENT = "Input Number";
  final String NUMBER_ARGUMENT = "num";
  // intent contains the name of the intent
  // you defined in the Intents area of Dialogflow
  ResponseBuilder rb = getResponseBuilder(request);
  String intent = request.getIntent();
  switch (intent) {
    case WELCOME_INTENT:
      rb.add("Welcome! Say a number.");
      break;
    case NUMBER_INTENT:
      Integer num = (Integer) request.getParameter(NUMBER_ARGUMENT);
      rb.add("You said " + num).endConversation();
      break;
  }
  return rb.build();
}

일치하지 않는 메시지 다시 표시

Dialogflow가 인텐트의 학습 문구에 정의된 입력 문법과 일치시킬 수 없는 경우 대체 인텐트를 트리거합니다. 대체 인텐트는 일반적으로 작업에 필요한 입력을 제공하도록 사용자에게 다시 메시지를 표시합니다. 대체 인텐트의 응답 영역에 재프롬프트 문구를 지정하여 제공하거나 웹훅을 사용하여 응답을 제공할 수 있습니다.

사용자의 응답이 작업의 학습 문구와 일치하지 않으면 Google 어시스턴트는 입력을 처리하려고 시도합니다. 이 동작은 사용자가 대화 중에 작업을 쉽게 변경할 수 있게 해줍니다. 예를 들어 사용자가 "이번 주에 상영하는 영화는?"이라고 묻고 대화 중간에 "내일 날씨 어때?"와 같이 맥락을 변경하면 이 예에서는 '내일 날씨 어때?'가 첫 프롬프트에서 트리거된 대화에 유효한 응답이 아니므로 어시스턴트는 자동으로 일치를 처리하고 사용자를 적절한 대화로 이동하려고 합니다.

어시스턴트가 사용자의 입력과 일치하는 적절한 작업을 찾지 못하면 사용자는 작업의 컨텍스트로 돌아갑니다.

어시스턴트가 유효한 일치하지 않는 시나리오에 응답하기 위해 작업을 중단할 수 있으므로 사용자 쿼리를 처리하는 방법으로 대체 인텐트를 사용하지 마세요. 사용자에게 유효한 입력을 다시 요청하는 경우에만 대체 인텐트를 사용해야 합니다.

대체 인텐트를 만들려면 다음 안내를 따르세요.

  1. Dialogflow의 탐색 메뉴에서 인텐트를 클릭합니다.
  2. 인텐트 만들기 옆에 있는 ⋮ 아이콘을 클릭하고 대체 인텐트 만들기를 선택합니다. 또는 기본 대체 인텐트를 클릭하여 수정합니다.
  3. 사용자에게 답장할 문구를 다시 표시합니다. 이러한 문구는 대화할 수 있어야 하며 사용자의 현재 상황에 최대한 유용해야 합니다.

    처리 없이 실행: 인텐트의 응답 영역에 문구를 지정합니다. Dialogflow는 보다 구체적인 인텐트가 트리거될 때까지 사용자에게 대답할 문구를 이 목록에서 무작위로 선택합니다.

    처리로 이 작업을 수행하려면 다음 안내를 따르세요.

    1. 인텐트의 Fulfillment 섹션에서 이 인텐트에 웹훅 호출 사용 설정을 전환합니다.
    2. 처리 로직에서 요청 처리를 위한 함수 만들기 섹션에 설명된 대로 다른 인텐트와 마찬가지로 대체 인텐트를 처리합니다.

    예를 들어 다음 함수는 Node.js 클라이언트 라이브러리conv.data 객체 (상태 유지에 사용할 수 있는 임의 데이터 페이로드)를 사용하여 대체 인텐트가 트리거되는 횟수를 추적하는 카운터를 저장합니다. 두 번 이상 트리거되면 작업이 종료됩니다. 코드에는 표시되지 않지만 대체가 아닌 인텐트가 트리거되면 다른 인텐트가 이 카운터를 0으로 재설정하도록 해야 합니다. 이를 구현하는 방법에 관한 자세한 내용은 Number Genie 샘플을 참고하세요.

    Node.js
    app.intent('Default Fallback Intent', (conv) => {
     conv.data.fallbackCount++;
     // Provide two prompts before ending game
     if (conv.data.fallbackCount === 1) {
       conv.contexts.set(DONE_YES_NO_CONTEXT, 5);
       conv.ask('Are you done playing Number Genie?');
     } else {
       conv.close(`Since I'm still having trouble, so I'll stop here. ` +
         `Let's play again soon.`);
     }
    });
    자바
    @ForIntent("Default Fallback Intent")
    public ActionResponse defaultFallback(ActionRequest request) {
      final String DONE_YES_NO_CONTEXT = "done_yes_no_context";
      ResponseBuilder rb = getResponseBuilder(request);
    
      int fallbackCount =
          request.getConversationData().get("fallbackCount") == null
              ? 0
              : (Integer) request.getConversationData().get("fallbackCount");
      fallbackCount++;
      request.getConversationData().put("fallbackCount", fallbackCount);
    
      if (fallbackCount == 1) {
        rb.add(new ActionContext(DONE_YES_NO_CONTEXT, 5));
        rb.add("Are you done playing Number Genie?");
      } else {
        rb.add("Since I'm still having trouble, so I'll stop here. Let's play again soon")
            .endConversation();
      }
      return rb.build();
    }

컨텍스트 사용

Dialogflow가 특정 상황에서만 대체 인텐트를 트리거하도록 하려면 컨텍스트를 사용합니다. 이는 서로 다른 불일치 시나리오에 서로 다른 대체 인텐트를 두려는 경우에 유용합니다.

  • 대체 인텐트에 컨텍스트를 설정하지 않으면 일치하는 다른 인텐트가 없을 때 Dialogflow가 트리거하는 전역 대체 인텐트로 간주됩니다. 하나를 사용하려면 이 중 하나만 정의해야 합니다.
  • 대체 인텐트에 입력 컨텍스트를 설정하는 경우 Dialogflow는 다음 조건을 충족할 때 이 대체 인텐트를 트리거합니다.

    • 사용자의 현재 컨텍스트는 인텐트에 정의된 컨텍스트의 상위 집합입니다.
    • 일치하는 다른 인텐트가 없습니다.

    이렇게 하면 서로 다른 입력 컨텍스트와 함께 여러 대체 인텐트를 사용하여 특정 시나리오에 맞추어 일치하지 않는 메시지를 다시 표시할 수 있습니다.

  • 대체 인텐트에 출력 컨텍스트를 설정하는 경우 대체 인텐트가 트리거되고 처리된 후에도 사용자를 동일한 컨텍스트에 유지할 수 있습니다.

자세한 내용은 Dialogflow 컨텍스트를 참조하세요.

입력 없는 메시지 다시 표시

사용자가 지속적인 상호작용이 필요한 Google Home과 같은 음성 기기에서 추가 입력을 제공하지 않는 경우 처리하는 방법에 관한 자세한 내용은 다시 메시지 표시 페이지를 참고하세요.