파이썬 챗봇 만들기(1) - 구글 dialogflow와 네이버 라인 메신저 연결하기

Yesol Lee·2022년 4월 11일
0

파이썬

목록 보기
2/2

2022년 4월 4일(월) ~ 6일(수) 3일 간 대구디지털산업진흥원 DIP아카데미의 '오픈API를 활용한 파이썬 챗봇 제작 과정 (김진숙 강사님)' 강의를 듣고 정리한 내용입니다.

시리즈

  1. 파이썬 챗봇 만들기(1) - 구글 dialogflow와 파이썬 flask
  2. 파이썬 챗봇 만들기(2) - 챗봇에 오픈API와 DB 연결

챗봇(chatbot)이란?

정의

사람과의 문자/음성 대화를 통해 질문에 알맞은 답이나 각종 연관 정보를 제공하는 인공지능(AI) 기반의 커뮤니케이션 소프트웨어

챗봇의 유형 2가지

1. Rule Based Model

  • 정해진 입력에 따라 정해진 결과값을 제공
  • 미리 입력해놓은 정보들만 답변할 수 있다.

2. AI model

  • 다양한 입력값에 대해 맥락과 의도를 추출해낼 수 있다.
  • 사전에 입력되지 않은 내용에 대해서도 이해하고 대답할 수 있다.
  • 다양한 입력 해석하기 위해 자연어처리 AI 기술 필요

차이점

AI모델이 더 자유로운 대답이 가능하니 더 좋아보일 수 있지만, 챗봇의 운용 목적에 따라 rule based가 나을 때도 있다. 지식 위주의 FAQ 등 챗봇이 제공할 정보가 정해져있는 경우 굳이 구현하는데 자원이 많이 드는 AI로 구현할 필요가 없을 것이다.

개발환경 세팅

이번 수업에서는 챗봇 서비스를 만들기 위해 언어는 python, 개발툴은 jupyter notebook, 자연어처리 AI서비스로 구글의 dialogflow, 프론트엔드 역할로 네이버 라인의 messaging API를 사용했다.

설치 순서

  1. 파이썬 설치
  2. 주피터 노트북 설치
  3. 네이버 라인 계정 생성 -> Line Developers 사이트에서 라인 개발자 계정 생성
  4. 구글 dialogflow 로그인

구글 Dialogflow 사용하기

agent

agent가 하나의 챗봇 시스템이라고 생각하면 된다.

1. agent 생성


왼쪽 상단에서 create new agent 메뉴를 찾아 클릭한다.


'Agent name' 부분에 챗봇 서비스의 이름을 적고 바로 아래 'Default Language' 부분에서 챗봇이 사용할 언어를 설정한다. 기본은 영어로 되어있는데, 이 말은 이 챗봇이 영어로 된 질문을 받아 답변한다는 뜻이다. 나는 한국어 서비스를 만들었기 때문에 한국어로 바꾸어주었다. 그리고 오른쪽 상단 create 버튼으로 생성한다.

intent

intent는 '의도'라는 뜻인데, 하나의 intent는 보통 하나의 이야기 주제를 담고 있는데, 사용자가 입력한 문장이 어떤 의미인지 분류하기 위한 기준이 된다. 예를 들어 '오늘의 날씨를 묻는다'라는 주제의 intent가 있으면, 사용자는 '날씨', '오늘 날씨', '오늘 날씨 어때?' 등 다양한 형식으로 날씨에 대한 질문을 할 수 있다. 말의 형식은 달라도 결국 발화의 주제는 오늘의 날씨인 것이다. 챗봇은 다양한 형식의 입력값에서 질문의 핵심 의도를 파악해 사용자가 원하는 대답을 돌려주어야 한다.

create intent


agent를 처음 생성하면 welcome intentfallback intent 두 개가 기본으로 들어있다. (나는 이미 ask라는 intent를 직접 생성한 상태이다)

welcome intent는 간단한 인삿말에 대해 인사해주는 intent고 fallback intent는 사용자 질문의 의도를 파악하지 못했을 경우 '이해하지 못했다'라고 대답해주는 intent이다.

먼저 오른쪽 상단의 'create intent' 버튼을 눌러 새로운 intent를 생성한다. 이 intent는 사용자가 질문이 있음을 표현할 때에 대한 대답을 정의하고 있기 때문에 'ask'라는 이름을 붙였다. intent 이름을 작성한 후 가장 먼저 할 일은 'Training phrases'를 작성하는 일이다.

training phrases


'Training phrases'란 해당 의도를 가진 사용자가 입력할 것으로 예상되는 다양한 형식의 텍스트를 의미한다. 의도는 '질문을 시작한다'로 같아도, 사용자의 언어는 굉장히 다양할 수 있기 때문에 챗봇이 다양한 형식의 문장들을 제대로 분류하기 위해서는 최대한 많은 '예상 질문'을 넣어주는 것이 좋다.

구글의 dialogflow는 한국어 자연어처리 기술도 상당히 지원하고 있기 때문에 반드시 같은 문장이 아니더라도 의미를 파악할 수 있다.

response


스크롤을 아래로 내리면 사용자의 질문에 대한 대답을 작성할 수 있다. 이 intent에서는 다양한 버전의 대답이 랜덤으로 나올 수 있도록 response를 많이 적었지만, 특정 지식을 알려주는 챗봇의 경우 수많은 질문 문장에 대한 response는 하나로도 충분하다. 예를 들어 '오늘 날씨', '날씨', '오늘 날씨 좀 알려줘' 등에 대한 대답은 '현재 기온은 n도, 예상 최대 기온은 n도...' 등 날씨 정보를 담은 response 하나만 정의하면 되는 것이다.

entity

entity란 입력 문장 속에서 원하는 정보를 추출하여 적절하게 대화를 이끌어 나갈 수 있도록 설정하는 단어 집합이다. 예를 들어 피자를 주문하는 챗봇을 만든다고 하면, 피자 메뉴 종류를 하나의 entity로 설정할 수 있다.
이렇게 챗봇에서 쓰이는 주요 단어를 entity에 저장해놓으면, '하와이안'만 입력해도 음식인지 '하와이 사람'을 뜻하는 말인지 헷갈리지 않고 바로 '하와이안 피자'로 해석할 수 있다.

이러한 entity는 사용자가 직접 정의할 수도 있지만 시스템에서 기본으로 제공하는 것도 있다. 예를 들어 날짜, 수량, 색상, 시간 등 자주 쓰이는 속성의 경우 직접 정의하지 않고 시스템 entity를 쓰는 것이 더 편리하다.

네이버 라인메신저와 연결 (integration)

구글 dialogflow는 네이버 라인 메신저와 연결을 지원하고 있다. 원래 카카오톡도 있었는데 카톡이 챗봇을 유료화하면서 빠졌다고 한다. dialogflow에서 설정하기 전 먼저 라인에서 챗봇 채널을 하나 생성해야 한다.

라인 챗봇 채널 생성하기


먼저 Line Developer 사이트에 들어가서 messaging API 서비스로 들어간다. 거기서 start now 버튼을 클릭하면 아래 창이 뜬다.

  • provider: (필수) 이 챗봇의 제작자를 설정한다. 없으면 'create provider'로 생성한다.
  • company or owner's country or region: (필수) 챗봇을 서비스할 지역을 선택한다. 원래 선택값이었는데 이제 필수 입력값이라고 한다. south korea를 선택한다.
  • channel icon: 선택입력값으로 메신저 프로필 사진을 설정할 수 있다. 한번 설정하면 일주일 뒤에 바꿀 수 있다.
  • channel name: (필수) 챗봇의 이름을 설정한다
  • channel description (필수): 서비스 설명을 작성한다
  • category/subcategory (필수)
  • email은 자동으로 입력됨. 나머지는 선택
  • 아래 약관 동의한 후 'create'버튼으로 생성한다.

라인 챗봇을 dialogflow와 연결하기


다시 dialogflow의 integration으로 돌아가서 라인을 클릭하면 아래와 같은 화면이 뜬다.


비어있는 3개 칸은 라인 챗봇 채널 정보에서 가져오고, 이미 채워져있는 webhook URL은 복사해서 라인 챗봇 채널에 입력할 것이다.

1. 구글 dialogflow 설정하기


라인 채널 생성 후 들어가보면 위와 같은 화면이 나온다. 그 중 dialogflow로 복사할 값은 아래와 같다.

  • basic settings - channel ID
  • basic settings - channel secret
  • Messaging API - channel access token에서 'issue'버튼 클릭하면 토큰이 발급된다. 그걸 복사해서 붙여넣는다.

그 후 fullfillment탭으로 이동하여 webhook을 사용한다고 설정해야 한다.

2. 라인 채널 설정하기

dialogflow에 라인의 정보들을 입력해주었으니, 라인 채널에도 dialogflow의 정보들을 연결해 주어야 한다.
다시 dialogflow의 integration - Line을 클릭해 가장 마지막 webhoopk URL 항목의 값을 복사한다.

비어있는 3개 칸은 라인 챗봇 채널 정보에서 가져오고, 이미 채워져있는 webhook URL은 복사해서 라인 챗봇 채널에 입력할 것이다.

라인 채널의 messaging API 탭으로 이동해 webhook settings를 찾는다.

webhook을 사용하겠다고 하고, edit를 누르면 webhook url 입력창이 나온다. dialogflow에서 복사한 값을 넣고 verify를 완료하면 연결이 된 것이다.

messaging API 탭에서 한 가지 더 설정할 것이 있는데, 바로 라인의 자동 응답기능을 끄는 것이다. 우리는 이미 dialogflow에서 intent에 대한 응답을 지정해두었기 때문에 이 기능이 필요가 없다.

두 번째 항목인 auto-reply messages 항목에 Edit를 눌러 들어가면 새 창에 아래와 같은 화면이 뜨는데, 상세설정-자동답변을 '사용 안함'으로 바꿔주면 된다.

라인에서 챗봇에 질문해보기

이제 연결이 다 끝났으면 라인 채널의 messaging API탭에서 채널에 연결하는 QR코드를 이용해 챗봇에 연결해본다. 연결이 잘 되었다면 dialogflow의 try now 창에서 보이던 텍스트들이 메신저에 잘 뜨는 것을 확인할 수 있다.

사실 intent를 구성하는 부분이 많이 생략되었는데 사용법이 이해하기 어렵지는 않아서 라인과 연결하는 부분을 좀더 자세히 기록해놓으려고 했다. 작성하다 보니 너무 길어져서 flask 서버 구축 내용은 다음 글로 넘겨야 할 것 같다.

profile
문서화를 좋아하는 개발자

0개의 댓글