안경잡이개발자

728x90
반응형

  다이얼로그 플로우(Dialog Flow)에서 스몰 토크(Small Talk)는 다양한 일상적인 대화들을 포함하는 내장 에이전트(Prebuilt Agent)입니다. 따라서 이 스몰 토크를 이용하면 순식간에 대부분의 일상 대화를 에이전트에 담을 수 있습니다. 한 번 스몰 토크 에이전트를 만들어 보겠습니다.



  기본적으로 자신의 프로젝트의 언어를 새롭게 만들 스몰 토크 에이전트의 언어와 일치하도록 만듭니다. 이후에 'Small Talk'를 눌러서 스몰 토크 에이전트를 만들어주겠습니다.



  IMPORT 버튼을 누르면 바로 에이전트를 생성할 수 있습니다.




  스몰 토크 에이전트가 생성된 이후에는 다음과 같이 기본적인 인텐트(Intent)들이 형성되어 있는 것을 볼 수 있습니다.



  이제 여기에 추가적인 개인 인텐트 파일을 업로드 해서 완전한 형태의 챗봇(Chat Bot)을 하나 만들 수 있습니다.



  실제로 스몰 토크가 만들어 준 인텐트를 확인해보면 다음과 같이 안정적으로 기본 예문들이 들어와 있습니다.



  반면에 한국어(KO) 설정에서도 스몰 토크 에이전트를 이용할 수 있습니다. 한국어 프로젝트에서 Prebuilt Agents 탭에 들어가 보시면 다음과 같이 몇 개의 내장 기능들이 존재합니다. 영어에 비해서 상대적으로 적은 기능들이지만 스몰 토크는 포함이 되어 있네요.



  한글로 만든 스몰 토크 에이전트는 다음과 같이 기본적인 한글 질문들이 포함되어 있지만 한글 대답은 포함되어 있지 않으므로 본인이 직접 넣어주셔야 합니다.




728x90
반응형

728x90
반응형

  다이얼로그 플로우는 다양한 Intent를 JSON 형식의 파일에서 불러오는 기능을 제공합니다. 따라서 JSON 파일의 형식이 잘못되었거나, 다이얼로그 플로우에서 설정하고 있는 기본적인 형식을 지키지 못하면 오류 메시지가 출력됩니다.



  일단 위와 같이 장문의 오류가 발생하면 당황하지 말고 개발자 도구를 열어서 오류 메시지를 정확히 복사합니다.




  오류 메시지가 위와 같이 굉장히 많이 나왔네요.



  이를 위와 같이 텍스트 파일에 옮겨줍시다. 이제 오류가 발생하는 해당 파일들을 일일이 삭제할 수 있습니다.



  혹은 텍스트 파일에 담은 뒤에 파일 이름만 파이썬으로 추출할 수 있습니다. 다음과 같이 말이죠.



import os 


FIND_DIR="./error messages.txt"


def find_all(string,substring):

    length = len(substring)

    c=0

    indexes = []

    while c < len(string):

        if string[c:c+length] == substring:

            indexes.append(c)

        c=c+1

    return indexes


f = open(FIND_DIR, "r")

s = f.read()

all_errors = find_all(s, "intents/")

for i in range(0, len(all_errors)):

  index = all_errors[i]

  # get only 12 characters

  print(s[index+8:index + 20])

f.close()


위 스크립트를 실행하면 정확히 오류가 발생하는 파일의 이름 앞 부분을 구할 수 있습니다.



  이제 이러한 파일들을 삭제해야 하는데요. 만약 삭제해야 할 파일의 개수가 많다면, 다음과 같이 파이썬 스크립트를 이용해서 일괄 삭제할 수도 있습니다. 저는 다음과 같이 삭제하고자 하는 파일을 배열에 하나씩 담아서 하나씩 순회하면서 삭제되도록 만들었습니다.


import os 


DIR="./Dialog Flow Example Project/intents/"


# deleting some intents that have an error sententce.

targets=[

'145127b6428c',

'14015d374076',

'1401cc8a40b3',

'1451bc4266be',

'1451b39a0148',

'105137cdd164',

'1401fec0f8e8',

'1051e6b4632a',

'145138afb780',

'1451bc4266be',

'1451e8f0d5cb',

'1051b5472e66',

'1001bb2b5200',

'1451153fae0e',

'1451bc0aa2a9',

'1001956e5832',

'105112bdd48a',

'1451bcdef726',

'1451ef55eba6',

'1051b3439dd6',

'1051bb288765',

'1001d0245578',

'14011ae6df96',

'1101cab5bc06',

'145103636150',

'140141837fb0',

'1401c7dde1b5',

'140192c0fdf1',

'1451400f135b'

]


for ROOT, DIRS, FILES in os.walk(DIR): 

  for F in FILES: 

    filename = "{}/{}".format(ROOT, F) 


    for i in range(0, len(targets)):

      if targets[i] in filename: 

        print("Deleting file \"{}\"".format(filename)) 

        os.remove(filename) 



  다만 위와 같이 하면 수동으로 파일명을 입력해야 하므로, 오류 메시지로부터 자동으로 파일 이름을 읽어서 오류가 발생하는 파일만 삭제하도록 스크립트를 합칠 수 있습니다.


import os 


FIND_DIR="./error messages.txt"

ERROR_DIR="./Dialog Flow Example Project/intents/"


def find_all(string,substring):

    length = len(substring)

    c=0

    indexes = []

    while c < len(string):

        if string[c:c+length] == substring:

            indexes.append(c)

        c=c+1

    return indexes


f = open(FIND_DIR, "r")

s = f.read()

all_errors = find_all(s, "intents/")


for ROOT, DIRS, FILES in os.walk(ERROR_DIR): 

  for F in FILES: 

    filename = "{}/{}".format(ROOT, F) 


    for i in range(0, len(all_errors)):

      index = all_errors[i]

      if s[index+8:index + 20] in filename: 

        print("Deleting file \"{}\"".format(filename)) 

        os.remove(filename)



  결과적으로 특정 인텐트의 JSON 파일에 오류가 나오는 경우 오류 메시지를 error message.txt에 기록만 해주고, 이 스크립트를 실행하면 알아서 오류 메시지에 적힌 오류 인텐트 파일들을 찾아서 그 파일들만 intents 폴더에서 지워주게 됩니다.



  결과적으로 위와 같이 더이상 문법과 관련한 오류는 나오지 않는 것을 알 수 있습니다.

728x90
반응형

728x90
반응형

다이얼로그 플로우(Diaolg Flow)와 플라스크(Flask)를 카카오톡 플러스친구에 연동하기


  지난 시간에는 다이얼로그 플로우(Dialog Flow)와 플라스크(Flask) 웹 서버와 연동하는 방법에 대해 알아보는 시간을 가졌습니다. 이번 시간에는 플라스크 웹 서버와 카카오톡 플러스 친구를 연동하는 방법을 알아보도록 하겠습니다.


※ 카카오톡 플러스친구 만들기 ※


  ▶ 플러스친구 관리자 센터: https://center-pf.kakao.com/


  당연히 카카오톡 플러스친구부터 만들어야 합니다. 위 사이트에 접속한 뒤에 로그인을 하시고 '플러스친구 만들기'를 누르시면 됩니다.



  기본적으로 플러스친구 관리자로 가입을 하셔야 자신의 플러스친구를 제대로 관리할 수 있습니다.




  이후에 저는 다음과 같이 'my_flask_test'라는 이름으로 플러스친구를 개설보았습니다.



  위와 같이 간단하게 이름만 설정하고 바로 생성할 수 있습니다.



  이후에 기본적으로 플러스친구는 비공개 설정이 되어 있으므로 '공개 설정하러 가기'를 눌러 공개 설정을 해주셔야 합니다.



  이후에 위와 같이 '홈 공개'와 '검색 허용'ON으로 설정해주시면 됩니다.



  이제 '스마트채팅' 탭에서 'API형'으로 설정해주시면 됩니다. API 형으로 설정하면 자유자재로 우리가 원하는 형태로 카카오톡 플러스 친구를 개발할 수 있습니다. 대신 우리의 전용 웹 API를 직접 개발해야 하지만 그만큼 활용도가 매우 높아집니다. 즉, 지난 시간에 만들었던 것과 같이 플라스크(Flask) 웹 서버 등을 직접 만들 수 있는 사람이 사용할 수 있는 선택지입니다.


※ 구름 IDE에서 플라스크 웹 서버 구현하기 ※


  구름 IDE 서비스: https://ide.goorm.io/


  구름 IDE 서비스는 제가 현재 알고 있는 클라우드 서비스 중에서 가장 쉽고 빠르게 테스트 목적의 웹 서버를 구축할 수 있는 서비스입니다. 실제로 사용해 보시면 순식간에 일정 시간 동안 사용할 수 있는 공인 IP 주소와 웹 서비스를 구축할 수 있습니다. (무료 버전에서는 시간 제한이 있습니다.)


  바로 구름 IDE 서비스에 접속하신 이후에 회원가입 및 로그인을 하시고 'Flask 프로젝트'로 새로운 컨테이너를 생성해주시면 됩니다.



  만든 이후에는 index.py 파일이 기본적으로 생성이 되어 있습니다. 'python index.py 5000' 명령어로 서버를 구동시킬 수 있습니다. 기본적으로 플라스크는 5000번 포트로 동작시킵니다.



  그러면 다음과 같이 서버가 동작이 되고 있다는 메시지가 출력됩니다.



  이후에 구름 IDE는 '포트포워딩' 설정을 해주셔야 외부에서 공인 IP로 접속할 수 있습니다.



  저는 위와 같이 내부 포트 5000번을 열어주어서 13.124.201.44:57706으로 접속할 수 있게 되었습니다.



  실제로 위와 같이 접속해보니 환영 메시지가 출려된 것을 확인할 수 있었습니다.


※ 카카오톡 플러스친구와 연동하기 ※


  카카오톡 플러스친구를 웹 서버와 바로 연동하기 위해서는 두 가지 중요한 API 키워드만 알고 있으면 됩니다. 구체적인 내용은 다음과 같이 API 명세서에서 확인할 수 있습니다.




  요약하면 두 가지 키워드는 'keyboard'와 'message'입니다. keyboard는 이용자가 최초로 채팅방에 들어올 때 명령어의 목록을 보여줄 때 사용하는 기능입니다. message는 실질적으로 사용자가 입력한 명령어를 웹 서버가 처리하도록 해주는 기능입니다. 따라서 기존의 소스코드에 다음의 두 가지 처리 로직을 추가해주시면 됩니다.


@app.route("/keyboard")

def keyboard():


    res = {

        'type': 'buttons',

        'buttons': ['대화하기']

    }


    return jsonify(res)


@app.route('/message', methods=['POST'])

def message():


    req = request.get_json()

    content = req['content']

    user_key = req['user_key']


    if content == u"대화하기":

        res = {

            'message': {

                'text': "영어로 대화를 시작하시면 됩니다."

            }

        }

    else:

        res = {

            'message': {

                'text': get_answer(content, user_key)

            }

        }

    

    return jsonify(res)


  이후에 다시 서버를 동작시킨 뒤에 기존에 포트포워딩으로 열어 놓은 공인 IP 주소로 테스트를 해봅시다.



  위와 같이 keyboard 경로로 들어가면 '대화하기'라고 카카오톡 챗봇에 나올 메시지가 출력되는 것을 알 수 있습니다. 이제 이러한 웹 서버에 카카오톡의 크롤러가 자동으로 연동할 수 있게 된 것입니다.



  앱 URL에 우리의 웹 서버 URL을 입력하여 'API 테스트'를 해보시면 위와 같이 OK 메시지가 출력됩니다.



  이제 위와 같이 전화번호로 인증을 한 뒤에 저장하시면 됩니다.



  이제 '시작하기'를 눌러서 구동시키면 됩니다. 구동 이후에는 다음과 같이 스마트 폰에서 검색이 되는 것을 확인할 수 있습니다.



  이제 다음과 같이 카카오톡 챗봇과 자유롭게 대화를 할 수 있는 것을 알 수 있습니다.


 


※ 전체 플라스크 소스코드 ※


# -*- encoding: utf-8 -*-

import requests

import json


from flask import Flask, request, jsonify


def get_answer(text, user_key):

    

    data_send = { 

        'query': text,

        'sessionId': user_key,

        'lang': 'ko',

    }

    

    data_header = {

        'Authorization': 'Bearer CLIENT ACCESS TOKEN',

        'Content-Type': 'application/json; charset=utf-8'

    }

    

    dialogflow_url = 'https://api.dialogflow.com/v1/query?v=20150910'

    

    res = requests.post(dialogflow_url, data=json.dumps(data_send), headers=data_header)


    if res.status_code != requests.codes.ok:

        return '오류가 발생했습니다.'

    

    data_receive = res.json()

    answer = data_receive['result']['fulfillment']['speech'] 

    

    return answer


app = Flask(__name__)

app.config['JSON_AS_ASCII'] = False


@app.route('/', methods=['POST', 'GET'])

def webhook():


    content = request.args.get('content')

    userid = request.args.get('userid')


    return get_answer(content, userid)


@app.route("/keyboard")

def keyboard():

    res = {

        'type': 'buttons',

        'buttons': ['대화하기']

    }

    return jsonify(res)


@app.route('/message', methods=['POST'])

def message():

    

    req = request.get_json()

    content = req['content']

    user_key = req['user_key']


    if content == u"대화하기":

        res = {

            'message': {

                'text': "영어로 대화를 시작하시면 됩니다."

            }

        }

    else:

        res = {

            'message': {

                'text': get_answer(content, user_key)

            }

        }

    

    return jsonify(res)

    

if __name__ == '__main__':

    app.run(host='0.0.0.0')

728x90
반응형

728x90
반응형

  다이얼로그 플로우(Dialog Flow)로 챗봇(Chat Bot)을 개발한 뒤에 이를 실제 상용 서비스에서 활용하기 위해서는 웹 서버와 함께 사용하는 것이 가장 효과적입니다. 웹 서버 중에서는 가장 가벼우면서도 빠르게 구현할 수 있는 플라스크(Flask)를 이용하면 효율적입니다. 따라서 아래 과정을 차근차근 따라하면서 자신만의 플라스크 웹 서버에서 다이얼로그 플로우를 사용할 수 있도록 하세요.


※ 다이얼로그 플로우 API V1 테스트하기 ※


  먼저 자신이 사용하고자 하는 에이전트(Agent) 프로젝트의 클라이언트 액세스 토큰(Client Access Token)을 확인합니다.



  이후에 API를 어떻게 사용할 수 있는지 확인해 봅시다.


  Dialog Flow API V1 문서: https://dialogflow.com/docs/reference/agent/query


  기본적으로 다이얼로그 플로우는 매우 간단하게 초기 버전의 API를 사용할 수 있습니다. 가장 중요한 부분만 추출하면 다음과 같습니다.



  먼저 POST 방식 전송 예제는 위와 같습니다. 헤더에 CLIENT ACCESS TOKEN을 넣은 뒤에 아래쪽에 'query'로 실질적인 질의문을 넣는 것을 알 수 있습니다. 이제 이를 파이썬을 이용해 동일하게 동작하는 클라이언트를 작성하면 됩니다. 전체 Flask 웹 서버의 소스코드는 다음과 같습니다.



  위 사진은 결과 예제 사진입니다. 보시면 JSON 형태로 'result' -> 'fulflilment' -> 'speech'에 결과 값이 담겨 오는 것을 알 수 있습니다. 따라서 요청 데이터를 보낸 이후에 결과 값에서 이를 파싱하도록 소스코드를 작성하면 됩니다.


※ Flask 웹 서버의 소스코드


# -*- encoding: utf-8 -*-

import requests

import json


from flask import Flask, request, jsonify


def get_answer(text, user_key):

    

    data_send = { 

        'query': text,

        'sessionId': user_key,

        'lang': 'ko',

    }

    

    data_header = {

        'Authorization': 'Bearer CLIENT ACCESS TOKEN',

        'Content-Type': 'application/json; charset=utf-8'

    }

    

    dialogflow_url = 'https://api.dialogflow.com/v1/query?v=20150910'

    

    res = requests.post(dialogflow_url, data=json.dumps(data_send), headers=data_header)


    if res.status_code != requests.codes.ok:

        return '오류가 발생했습니다.'

    

    data_receive = res.json()

    answer = data_receive['result']['fulfillment']['speech'] 

    

    return answer


app = Flask(__name__)

app.config['JSON_AS_ASCII'] = False


@app.route('/', methods=['POST', 'GET'])

def webhook():


    content = request.args.get('content')

    userid = request.args.get('userid')


    return get_answer(content, userid)


if __name__ == '__main__':

    app.run(host='0.0.0.0')    


  위와 같이 API 문서의 내용을 그대로 따라 작성한 것을 알 수 있습니다. 대신에 자신의 웹 서버에서는 'content'와 'userid'라는 두 파라미터로 값을 받습니다. 이후에 해당 소스코드를 실행하고 자신의 로컬 환경에서 테스트를 진행하면 됩니다.


728x90
반응형

728x90
반응형

다이얼로그 플로우(Dialog Flow)에 엑셀 파일(csv) 등의 데이터를 한 번에 넣는 방법

나동빈


  구글의 다이얼로그 플로우를 이용할 때 우리는 기본적으로 자신이 직접 하나씩 입력(Input) 및 출력(Output)을 넣어서 챗봇(Chat Bot)을 개발해야 합니다. 


  하지만 챗봇을 위해 사전에 많은 양의 데이터를 준비하여 한 번에 넣어야 할 때가 있습니다. 예를 들어 저는 매우 많은 양의 영어 대화(English Conversation) 정보를 한 번에 다이얼로그 플로우에 삽입을 해야 하는 경우가 있었습니다.



  저는 이렇게 엑셀 형태로 챗봇에 들어갈 데이터가 약 3,000 개가 넘는 상황이었습니다.


  다이얼로그 플로우는 대용량 csv 파일을 한 번에 삽입할 수 있는 기능을 제공하고 있지 않습니다. 대신에 JSON 형태의 문서를 삽입할 수 있습니다. 그러므로 csv 파일을 다이얼로그 플로우에 맞는 전용 JSON 형식으로 바꾸어서 업로드(Upload) 해야 합니다. 이번 강에서는 다이얼로그 플로우 전용 JSON 형식으로 바꾸는 방법에 대해서 소개하고자 합니다.



  일단 하나의 에이전트(Agent)를 만들어 봅시다.



  그리고 일단 위와 같이 기본적으로 존재하는 두 개의 인텐트(Intent)를 지워줍니다.



  이제 위와 같이 'Test Intent'라는 이름으로 하나의 인텐트를 만든 뒤에 2개의 입력(Input)을 넣어보겠습니다.



  또한 하나의 출력(Output)을 가지도록 해보겠습니다.



  이후에 저장(Save)을 하고 해당 챗봇 프로젝트를 내보내기(EXPORT AS ZIP) 해봅시다.



  이후에 압축을 풀어 보면 위와 같이 폴더가 구성되어 있는 것을 확인할 수 있습니다. 여기에서 인텐트(Intent) 파일 정보는 intents에 담깁니다.



  위와 같이 intents 폴더에 들어가 보면 두 개의 JSON 파일이 존재하는 것을 알 수 있습니다. 먼저 'Test Intent.json'을 열어봅시다.



  우리가 바꾸어야 할 부분은 두 가지 입니다. 바로 이름(name)과 메시지(message)입니다. 이 부분을 바꾸어서 다시 Import 시키면, 그에 맞는 인텐트가 다이얼로그 플로우에 적용 될 것입니다. 다음으로는 'Test Intent_usersays_ko.json'를 열어 봅시다. 이 파일에는 사용자의 입력(Input) 데이터가 들어가 있습니다.



  위와 같이 입력 값의 개수에 맞게 텍스트(Text) 부분만 바꾸어주면 된 다는 것을 쉽게 이해할 수 있습니다.


  여기에서부터는 자신이 처한 환경에 따라서 구현 방법이 서로 다릅니다. 쉽지 않을 수 있다는 점을 감안하세요! 저는 파이썬(Python)을 이용해서 작업해보았습니다.


import openpyxl


# 한 건의 대화에 대한 정보를 담는 객체입니다.

class Conversation:

    

    # 질문(Question), 응답(Answer) 두 변수로 구성됩니다.

    def __init__(self, contentName, contentType, question, answer):

        self.contentName = contentName

        self.contentType = contentType

        self.question = question

        self.answer = answer


    def __str__(self):

        return "질문: " + self.question + "\n답변: " + self.answer + "\n"


# 영어 대화 데이터가 담긴 엑셀 파일을 엽니다.

wb = openpyxl.load_workbook('Conversation Data.xlsx')

 

# 활성 시트를 얻습니다.

ws = wb.active


conversations = []


# 시트 내에 존재하는 모든 영어 대화 데이터를 객체로 담습니다.

for r in ws.rows:

    c = Conversation(r[0].value, r[1].value, r[2].value, r[3].value)

    conversations.append(c)

    

wb.close()


for c in conversations:

    print(str(c))

    

# 모든 대화 내용을 출력합니다.

for c in conversations:

    print(str(c))

    

print('총 ', len(conversations), '개의 대화가 존재합니다.')



  저는 일단 위와 같이 파이썬을 이용해 엑셀에서 전체 데이터를 뽑아내 리스트(List)에 담았습니다.


# -*- coding: utf-8 -*-


# 파일로 출력하기

i = 1

# 출력, 입력 값 JSON 파일을 생성합니다.

prev = str(conversations[0].contentName) + str(conversations[0].contentType)

f = open(prev + '.json', 'w', encoding='UTF-8')

f.write('{ "id": "10d3155d-4468-4118-8f5d-15009af446d0", "name": "' + prev + '", "auto": true, "contexts": [], "responses": [ { "resetContexts": false, "affectedContexts": [], "parameters": [], "messages": [ { "type": 0, "lang": "ko", "speech": "' + conversations[0].answer + '" } ], "defaultResponsePlatforms": {}, "speech": [] } ], "priority": 500000, "webhookUsed": false, "webhookForSlotFilling": false, "fallbackIntent": false, "events": [] }')

f.close()

f = open(prev + '_usersays_ko.json', 'w', encoding='UTF-8')

f.write("[")

f.write('{ "id": "3330d5a3-f38e-48fd-a3e6-000000000001", "data": [ { "text": "' + conversations[0].question + '", "userDefined": false } ], "isTemplate": false, "count": 0 },')


while True:

    if i >= len(conversations):

        f.write("]")

        f.close()

        break;

    c = conversations[i]

    if prev == str(c.contentName) + str(c.contentType):

        f.write('{ "id": "3330d5a3-f38e-48fd-a3e6-000000000001", "data": [ { "text": "' + c.question + '", "userDefined": false } ], "isTemplate": false, "count": 0 },')

    else:

        f.write("]")

        f.close()

        # 출력, 입력 값 JSON 파일을 생성합니다.

        prev = str(c.contentName) + str(c.contentType)

        f = open(prev + '.json', 'w', encoding='UTF-8')

        f.write('{ "id": "10d3155d-4468-4118-8f5d-15009af446d0", "name": "' + prev + '", "auto": true, "contexts": [], "responses": [ { "resetContexts": false, "affectedContexts": [], "parameters": [], "messages": [ { "type": 0, "lang": "ko", "speech": "' + c.answer + '" } ], "defaultResponsePlatforms": {}, "speech": [] } ], "priority": 500000, "webhookUsed": false, "webhookForSlotFilling": false, "fallbackIntent": false, "events": [] }')

        f.close()

        f = open(prev + '_usersays_ko.json', 'w', encoding='UTF-8')

        f.write("[")

        f.write('{ "id": "3330d5a3-f38e-48fd-a3e6-000000000001", "data": [ { "text": "' + c.question + '", "userDefined": false } ], "isTemplate": false, "count": 0 },')

    i = i + 1


  저는 이후에 이렇게 막가파식으로 JSON 데이터를 생성하는 소스코드를 만들어 보았으며, 여러분은 자신의 입맛대로 소스코드를 작성하시면 됩니다. 제 소스코드는 결과적으로 다음과 같이 모든 영어 대화 내용을 다이얼로그 플로우에 삽입할 수 있는 JSON 파일을 만들어 냅니다.



  재미있는 점은 Intent 파일의 '아이디(id)' 값은 서로 동일하게 해도 다이얼로그 플로우에 적용 될 때 알아서 ID 값이 정상적으로 처리되기 때문에 정말 텍스트(Text) 값만 서로 다르게 해서 적용하면 문제 없이 등록됩니다.



  이제 우리가 처음에 다운로드 받았던 프로젝트 폴더의 intents 폴더 내에 모든 JSON 파일을 넣어주고 다시 압축해줍시다.



  이제 새롭게 만들어 진 챗봇 프로젝트 파일을 다시 삽입해줍시다.




  복구(RESTORE) 버튼을 눌러 프로젝트를 복구하면 다음과 같이 모든 인텐트가 들어가는 것을 알 수 있습니다.



  이로써 대용량 엑셀 파일로부터 다이얼로그 플로우에 인텐트를 삽입하는 방법을 알아보았습니다.


728x90
반응형

728x90
반응형

다이얼로그 플로우(Dialog Flow) 엔티티(Entity)로 단어 분류하여 응답하기

나동빈


지난 시간까지 간단히 사용자가 챗봇과 연속적으로 대화를 나눌 수 있도록 연계형 챗봇을 구현하는 시간을 가져보았습니다. 다만 현재까지 다룬 내용으로는 챗봇은 항상 동일한 문장만을 말하게 된다는 단점이 있습니다.


이번 시간에는 엔티티(Entity)단어를 분류하여 처리하는 방법을 알아보고자 합니다.



지난 시간에 이어서 '강의 신청' 인텐트에 새로운 연계형 인텐트를 추가해주겠습니다.



Custom 모드로 생성하여 자유롭게 인텐트를 처리해봅시다.



저는 위와 같이 사용자가 실질적으로 듣고자 하는 강의 이름을 입력해서 신청을 시도한다고 가정하여 입력 데이터를 구성했습니다.



이제 엔티티를 생성해봅시다. 'HTML' 부분을 드래그하면 원하는 엔티티 그룹을 설정할 수 있습니다. 새롭게 엔티티를 생성해봅시다.



저는 강의 엔티티라는 의미로 이름을 Lecture라고 지었습니다.



이후에 다시 인텐트 화면으로 돌아오면 드래그 했을 때 새롭게 '@Lecture' 엔티티가 보입니다.



Lecture 엔티티로 설정해주면 위와 같은 화면으로 변경됩니다.



강의 종류로는 HTML뿐만 아니라 JSP 등이 있으므로 JSP도 추가해주었습니다.



이제 다시 인텐트 화면에서 모든 강의에 대해서 Lecture 엔티티로 설정해주면 알아서 강의 이름으로 분류가 진행됩니다.



이후에 응답(Response)에서 사용자가 입력한 데이터를 활용하기 위해서 '$Lecture'라는 키워드를 이용하여 응답을 구성합니다.



테스트를 진행하면 사용자가 입력한 강의 이름을 챗봇이 그대로 사용하는 것을 알 수 있습니다.



이제 최종적으로 강의 수강 여부를 물을 수 있도록 하나의 연계형 인텐트를 더 추가해주겠습니다.



새롭게 추가된 인텐트에 들어가 봅시다.



저는 위와 같이 동의의 의미를 담는 여러 개의 문장들을 입력 데이터로 넣어주었습니다.



또한 문맥(Context)를 보시면 CourseReservation-custom-2-followup에서 입력 값이 넘어온다고 쓰인 것을 알 수 있습니다.



응답(Response) 문장으로는 위와 같이 넘어온 데이터 중에서 Lecture 단어를 사용하겠다고 적어주시면 됩니다.



결과적으로 위와 같이 강의 신청 확인까지 챗봇을 통해 안정적으로 이루어지게 된 것을 알 수 있습니다.


728x90
반응형

728x90
반응형

다이얼로그 플로우(Dialog Flow) Follow-up Intent를 이용한 연계형 챗봇 만들기

나동빈


지난 시간에는 다이얼로그 플로우(Dialog Flow)에서 직접 Intent를 생성해 단순한 형태의 질의응답 챗봇을 만들어 보았습니다. 이번 시간에는 Follow-up Intent를 이용해 맥락 속에서 연속적인 질의 응답을 수행하는 연계형 챗봇을 만들어 보도록 하겠습니다.


실제로 강의를 예약하는 등 사용자로부터 다양한 정보를 연속적으로 받아야 할 때는 이러한 연계적인(Follow-up) 구성이 이루어져야 합니다.



지난 시간에 만든 강의 예약(Course Reservation) 인텐트에서 'Add follow-up intent' 링크를 클릭합니다.



이후에 커스텀(Custom) 모드로 생성해줍니다.



새롭게 부가적인 인텐트가 생성된 것을 알 수 있습니다. 그 안에 들어갈 수 있도록 합니다.



그러면 맥락(Context) 영역에서 입력(Input) 값을 통해 이전 인텐트와 연결된 것을 확인할 수 있습니다.



이제 위와 같이 사용자가 강의 이름은 아직 정하지 못한 상황일 때를 가정하고 입력 데이터를 넣어주었습니다.



이제 간단하게 서버 측의 응답(Response) 데이터도 넣어준 뒤에 저장(Save) 해줍니다.



이제 작성된 챗봇 프로그램의 동작을 확인하기 위해 통합(Integration) 탭에 들어가 봅시다.



웹 환경에서 확인할 수 있도록 웹 데모(Web Demo)를 활성화 해줄 수 있습니다.



이후에 구글에서 고유한 챗봇 URL을 제공해줍니다. 이를 복사하여 브라우저에서 접속하면 테스트를 수행할 수 있습니다.



위와 같이 '강의 신청를 하고 싶은 상태'에서 '하지만 강의 이름은 결정하지 못한 상태'로 자연스럽게 질의응답이 연계되는 것을 확인할 수 있습니다. 이것은 2단계까지 연계를 수행한 것이며 더욱 깊고 복잡하게 이어질 수 있도록 챗봇을 설계할 수도 있다는 점도 기억해주세요.


728x90
반응형

728x90
반응형

다이얼로그 플로우(Dialog Flow) Intent를 생성해 단순 질의응답 챗봇 만들기

나동빈


지난 시간에는 다이얼로그 플로우(Dialog Flow) 계정을 생성하고 간단히 테스트 해보는 시간을 가져보았습니다. 이번 시간에는 본격적으로 챗봇을 만드는 방법을 익히기 위해 직접 Intent를 생성해서 단순 질의응답 챗봇을 만들어보도록 할 것입니다.


새롭게 에이전트(Agent)를 생성하면 마치 하나의 프로젝트가 생성된 것처럼 기본적으로 'Default Welcome Intent'가 생성된다고 했습니다. 다만 우리가 직접 챗봇 모듈을 개발하기 위해서는 인텐트(Intent)를 새롭게 만들어주어야 합니다.



저는 강의 예약(Course Reservation) 이라는 이름으로 인텐트를 생성한 뒤에 학습 문구(Training Phrases)를 하나 추가해주겠습니다.


학습 문구는 실질적으로 사용자가 입력할 문장의 예시입니다. 많은 데이터를 넣어주면 자동으로 다이얼로그 플로우가 문장을 학습하여 우리가 정확히 입력한 값이 아니라고 하더라도 사용자의 의도를 파악해줍니다.




저는 위와 같이 강의 예약을 자동으로 해주는 챗봇이라는 컨셉으로 '강의 등록' 의도(Intent)를 밝히는 문장을 여러 개 넣어보았습니다.



이제 사용자의 입력에 대한 응답 예시 데이터를 넣어주어야 합니다.



저는 위와 같이 3개의 응답(Response) 문장을 넣어주고 저장(Save)했습니다.



이제 테스트를 해보면 챗봇이 알아서 사용자의 의도를 파악하여 단순한 형태의 질의응답 챗봇이 만들어진 것을 알 수 있습니다.


728x90
반응형

728x90
반응형

다이얼로그 플로우(Dialog Flow) 개요 및 챗봇 개발 시작하기

나동빈


챗봇(Chatter Robot)이란 사람의 일상적인 언어를 이용해 사람처럼 대화를 하는 서비스입니다.


대표적인 예시: 카카오톡 챗봇, 페이스북 메신저 챗봇


다이얼로그 플로우(Dialog Flow)는 구글에서 개발한 챗봇 개발 플랫폼입니다. 우리가 인공지능(AI) 코어를 직접 개발하지 않아도 구글이 자체적으로 제공하는 자연어 처리(NLP) 기술을 이용하여 다양한 서비스에 챗봇을 적용할 수 있습니다.


결과적으로 다이얼로그 플로우만 잘 이용하면 사실상 코딩을 전혀 할 줄 몰라도 챗봇을 만들 수 있다는 큰 장점이 있습니다.


다이얼로그 플로우: https://dialogflow.com/



공식 웹 사이트에 접속하면 위와 같이 메인 화면이 등장하는 것을 알 수 있습니다. 'GO TO CONSOLE' 링크를 타고 이동하면 챗봇 개발을 바로 진행할 수 있는 콘솔 화면이 등장합니다.



기본적으로 서비스는 로그인 이후에 이용할 수 있으며 구글 계정으로 로그인하시는 것을 추천합니다.



다이얼로그 플로우를 처음 이용하는 분은 초기에 위와 같이 계정 설정을 진행해주셔야 합니다.



이후에 'Create Agent' 버튼을 눌러서 에이전트(Agent)를 생성할 수 있습니다. 에이전트는 '하나의 인공지능 프로젝트'의 개념으로 보시면 됩니다.


- 기본 언어(Default Language): 챗봇에서 사용할 기본 언어

- 기본 시간(Default Time Zone): 챗봇의 기본 시간대



저는 위와 같이 프로젝트 이름은 'FirstAgent'라고 지었으며 기본 언어는 한국어(Korean)로 설정했습니다.



프로젝트가 생성되면 바로 위와 같은 프로젝트 메인 화면이 등장합니다. 오른쪽에는 실시간으로 현재 우리 챗봇 프로젝트를 테스트할 수 있는 화면이 제공되어 있습니다. 또한 기본적으로 제공되는 인텐트인 'Default Welcome Intent'를 확인할 수 있습니다.



'Default Welcome Intent'는 말 그대로 환영 메시지를 보여주는 기본 인텐트입니다. 보시면 학습 구문(Training Phrases)으로 이미 기본적인 한글 인사이 들어가 있는 것을 알 수 있습니다.



위와 같이 챗봇을 테스트하는 영역에서 '안녕?'이라고 입력해 보면 챗봇 또한 자동으로 인삿말을 인식하여 '안녕!'이라는 환영 메시지를 출력하는 것을 알 수 있습니다. 결과가 정확하게 나왔으므로 아래 쪽에서 'OK'를 눌러 정상적인 결과임을 확인하도록 합니다.

728x90
반응형