Dialogflow는 GCP가 제공하는 챗봇 API입니다. 한국어도 지원합니다!!!
2016년에 Api.ai 라고 하는 시장에서 가장 유명한 챗봇 플랫폼을 Google 이 인수하였고 그것을 그대로 사용한 것이 아니라 챗봇 플랫폼의 가장 중요한 부분인 자연어 처리(NLP)나 Intent 매칭과 같은 대화식 인터페이스의 핵심 엔진인 머신러닝 엔진을 Google 의 머신러닝 엔진으로 변경해서 좀 더 강화한 형태로 만든 챗봇 플랫폼이 바로 Dialogflow 입니다.
- 출처
좋은 학습 자료들은 다음과 같습니다.
Getting started
https://dialogflow.com/docs/getting-started
Step by step guide to DialogFlow (API.AI)
https://miningbusinessdata.com/step-by-step-guide-to-api-ai/
A Guide to Building an Intelligent Chatbot for Slack using Dialogflow API
https://www.analyticsvidhya.com/blog/2018/03/how-to-build-an-intelligent-chatbot-for-slack-using-dialogflow-api/
[DialogFlow] 다이얼로그 플로우로 주문 챗봇 만들기
http://codevkr.tistory.com/74
[GCP]Dialogflow 를 이용한 간단 챗봇 만들기
우선 Dialogflow 홈페이지로 이동합시다.
Agent를 생성하면 GCP Project가 자동으로 하나 생성됩니다. 해당 프로젝트로 이동하여 서비스 계정 아이디를 확인하고 key를 생성해줍시다.
AWS와 다르게 GCP는 프로젝트 별로 관리가 되며, 서비스 계정은 AWS의 AMI와 같은 기능을 합니다.
여기서 키를 생성해줍시다.
해당 json을 다운로드 받아 저장된 경로를 아래 path-to-keys에 복붙해서 운영 체제의 환경 변수에 등록해주시면 되겠습니다. 이런 방법 대신에 프로젝트에 해당 json 키 파일을 넣어서 필요할 때마다 빼다 쓰는 방법도 있습니다. 개인적으론 후자의 방법이 더 합리적인 것 같습니다만, 편하신 방법으로 하시면 됩니다.
set GOOGLE_APPLICATION_CREDENTIALS=/path-to-keys/keys-file.json
export GOOGLE_APPLICATION_CREDENTIALS=/path-to-keys/keys-file.json
GCP와 사용자 계정 세팅을 끝내셨다면 npm의 dialogflow, dialogflow-fulfillment 패키지를 이용해서 코드를 작성하시면 됩니다. 굳이 javascript 기반의 npm일 필요는 없지만 제가 제일 친숙한 환경이라서 ㅎ... 또, 챗봇과 같이 데이터가 많이 오가는 경우에는 가벼운 node를 사용하는 것이 좋다는 의견이 많습니다. 챗봇에 node를 쓰는 것은 합리적인 선택입니다.
www.npmjs.com/package/dialogflow
dialogflow를 이용하는 방법 자체는 간단합니다. 그냥 API니까, 요청을 보내고, 응답을 받으면 됩니다.
받은 응답은 프론트 단에서 적절히 처리해주기만 하면 됩니다.
const express = require("express");
const router = express.Router();
const structjson = require("./structjson.js");
const dialogflow = require("dialogflow");
const uuid = require("uuid");
const config = require("../config/keys");
const projectId = config.googleProjectID;
const sessionId = config.dialogFlowSessionID;
const languageCode = config.dialogFlowSessionLanguageCode;
// Create a new session
const sessionClient = new dialogflow.SessionsClient();
const sessionPath = sessionClient.sessionPath(projectId, sessionId);
// We will make two routes
// Text Query Route
router.post("/textQuery", async (req, res) => {
//We need to send some information that comes from the client to Dialogflow API
// The text query request.
const request = {
session: sessionPath,
queryInput: {
text: {
// The query to send to the dialogflow agent
text: req.body.text,
// The language used by the client (en-US)
languageCode: languageCode,
},
},
};
// Send request and log result
const responses = await sessionClient.detectIntent(request);
console.log("Detected intent");
// 만약 특정하게 지정한 문구가 입력되면 해당 intent에 따라 처리한 결과를 반환합니다.
const result = responses[0].queryResult;
console.log(`Query: ${result.queryText}`);
console.log(`Response: ${result.fulfillmentText}`);
res.send(result);
});
이렇게 오고가는 단어를 일시적으로 redux에 저장하셔도 되고, DB에 저장하셔서 오고가는 채팅을 저장해둘 수도 있습니다. 이 같은 경우에는 가벼운 mongoDB가 적절해보이지만, 코드는 생략하겠습니다. 쉬워서..ㅎ.
추가적으로, dialog를 설정함에 있어 요청을 보내면 답장을 하는 기본값 외에도, 특정 문구에 특정한 반응을 하는 등 Event 등 intents를 지정할 수 있습니다. 적절히 읽고, 구성하시면 됩니다. 이 부분은 특정한 request를 날리는 코드가 필요한 부분이 아니라 dialogflow 측에서 처리하는 부분이기 때문에 따로 코드를 설명할 필요는 없을 것 같습니다.
'GCP > ☁️ GCP' 카테고리의 다른 글
Google Compute Engine (3): GCE 기본적 운영 (일정, OS patch/policy, NEG ...) (0) | 2021.09.14 |
---|---|
Google Compute Engine (2) : GCE Network 기초 (VPC, Subnet) (0) | 2021.09.12 |
Google Compute Engine (1) : GCE 생성 및 접근 (0) | 2021.09.12 |
GCP의 Region/Zone, 리소스 계층 구조 (0) | 2021.09.10 |
Cloud Storage 와 @google-cloud/storage 패키지를 이용한 업로드 (0) | 2020.07.29 |