안경잡이개발자

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
반응형