ETC/Dialogflow

Dialogflow 사용[1]

Raconer 2023. 4. 15. 17:38
728x90

1. 개요

Google Dialogflow를 사용하면 정적인 답변을 쉽게 만들어 낼 수 있지만 대부분 사용자들은 동적인 답변을 받기 위해 사용한다.

ex) 동적 답변

  • 정보 : 날씨, 시간표 등
  • Action : 음식 주문, 강의 예약, 문자 전송
  • ETC.

이에 대해 많은 정보가 인터넷에 있지만 Inline editor를 사용하면서 가장 깔끔하다고 생각하는 코드를 정리해 보려고 합니다.

YouTube에서 참고한 내용이며 출처를 찾으려고 했지만, 같은 영상을 찾지 못하였습니다. 추후에 출처를 찾으면 작성해 놓겠습니다.

Fulfillment 란?

TODO : 홈페이지 서비스 종료로 인한 추후 재 작성


2. 코드 및 설명

기준 sidebar

  1. 사용하려는 Intents의 Fulfillment를 Enable로 변경한다.

  2. Intents → 원하는 Intent → 하단 "Enable webhook call for this intent"를 On 한다.

  3. Fulfillment에 Inline Editor Enabled

  4. Inline Editor 작성

  5. Inline Editor는 Node.js를 기반으로 사용한다.

index.js

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

app.intent(Fallback, (conv, params) => {
  conv.add("Hellow FallBack");
});

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

설명

  1. require('firebase-functions')

  2. Dialogflow는 firebase를 통해 실행되는 Node.js를 사용한다.

  3. const Fallback = 'Default Fallback Intent';

  4. 쉽게 말하면 Mapping을 위한 선언이다.

  5. 선언하는 데이터는 Intent의 Title이다.

  6. const app = dialogflow();

  7. dialogflow를 사용하기 위해 선언

  8. app.intent(Fallback, (conv, params) => ...)

  9. 선언했던 Fallback을 Mapping하여 배포하면 Intents에 입력한 Response 내용이 출력되지 않고 Inline editor에 작성된 코드가 return된다.

  10. return 내용은 conv.add()를 통해 반환된다.


3. 응용

Inline editor에서 외부 API 요청하기

Dialogflow에서 정적인 요청에서 API를 요청하여 데이터를 요청하거나 Action을 실행할 때 사용한다.

1. Dependency 추가

package.json"sync-request"를 추가한다.

sync-request를 사용하는 이유는, request만 사용할 경우 API 실행이 완료되기 전에 다음 코드로 넘어가 데이터 수신이 실패할 수 있기 때문입니다. 동기화를 보장하기 위해 sync-request를 사용합니다.

index.js (API 요청 포함)

const request = require('sync-request');
const functions = require('firebase-functions');
const { dialogflow } = require('actions-on-google');
const Fallback = 'Default Fallback Intent';
const app = dialogflow();

function request_function(path, params) {
  const url = 'url';
  const res = request('POST', url, {
    headers: {
      'Content-Type': 'application/json',
    },
    json: params,
  });
  return JSON.parse(res.getBody('utf8'));
}

app.intent(Fallback, (conv, params) => {
  const result = request_function('/example', params);
  conv.add("API 응답 내용: " + JSON.stringify(result));
});

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

설명

  • 내가 사용할 때는 Action보다는 데이터를 가져오기 위해 사용했기 때문에 request_function의 return 값을 JSON 타입으로 받았습니다.
  • 각 요청은 URL, Header, Body(JSON)를 지정하여 사용하며, 반환값은 JSON 타입으로 처리합니다.
728x90

'ETC > Dialogflow' 카테고리의 다른 글

Dialogflow 사용[2]  (0) 2023.04.15
Dialogflow 란?[3]  (0) 2023.04.15
Dialogflow 란?[2]  (0) 2023.04.15
Dialogflow 란?[1]  (0) 2023.04.15