Google DialogFlow를 활용한 챗봇 구축

November 20, 2023

목차


개요

DialogFlow는 Google에서 제공하는 자연어 처리(Natural Language Processing) 플랫폼입니다. 개발자들은 텍스트나 음성 인터페이스를 통해 사용자와의 대화에서 사용자의 의도를 이해하고 적절한 응답을 생성하는 서비스를 구축하는데 이를 사용할 수 있습니다. 이는 고객 서비스, 음성 인식 시스템, 메시징 앱 등 다양한 분야에서 활용될 수 있습니다.


DialogFlow 시작

dialogflow-initial-1

  1. DialogFlow에 접속합니다.

dialogflow-initial-2

  1. 화면의 좌상단에서 Create new agent를 클릭합니다.

dialogflow-initial-3

  1. Agent Title, Default Language, Default Time Zone을 설정하고 Create 버튼을 누르면 DialogFlow를 시작할 수 있습니다.
  2. Mega Agent는 여러 개의 하위 에이전트를 엮어 단일 에이전트로 만들 때 활용하는 기능입니다. 본 문서에서는 다루지 않습니다.

DialogFlow 구축

Entities

dialogflow-entities-1

Entities는 사용자의 발화에서 정보를 추출하는데 사용하는 도구입니다. 예를 들어, “내일 오전 9시에 알람을 설정해줘”라는 사용자의 발화에서 “내일 오전 9시”라는 시간 정보를, “알람을 설정”이라는 발화 의도 정보를 추출할 때 Entity를 설정하여 이를 추출할 수 있습니다.

Entity는 DialogFlow가 미리 정의한, 일반적으로 사용되는 정보를 정리한 시스템 Entity와 사용자가 직접 설정할 수 있는 커스텀 Entity가 있습니다. 본 문서에서는 커스텀 Entity를 어떻게 설정하고 다룰 수 있는지를 설명하겠습니다.

dialogflow-entities-2

Create Entity 버튼을 눌러 Entity 생성 화면으로 진입합니다.

dialogflow-entities-3

Entity 생성 화면입니다.

  • Entity name : 만약 이 Entity로 시간 정보를 추출하고자 하신다면 예시로 @time과 같은 네이밍을 정할 수 있습니다.

dialogflow-entities-4

  • Define synonyms : 동의어를 설정합니다. 예를 들어, “오후 1시”와 “13시”의 의미는 같지만 기호가 다르므로 DialogFlow는 이 두 단어를 다른 의미의 단어로 받아들이게 됩니다. 이 둘을 동의어로 설정하면 DialogFlow가 기호가 다른 두 단어를 같은 의미의 단어로 받아들일 수 있습니다. 단, DialogFlow “오후 1시”와 “오후1시”라는 두 단어를 다르게 받아들입니다. 따라서 위와 같이 띄어쓰기를 염두하여 동의어 처리를 해줄 필요가 있습니다.

dialogflow-entities-5

  • Regexp Entity : 정규표현식을 사용하여 사용자의 발화에서 특정 패턴을 인식하는데 사용되는 Entity입니다. 위와 같이 전화번호 정보를 추출하는 Entity를 작성할 때 다음과 같이 “(숫자3개)-(숫자3개)-(숫자4개)“의 패턴이 보인다면, DialogFlow는 그러한 문자열을 전화번호 정보로 추출할 수 있습니다.
  • Allow automatic expansion : 이 설정이 활성화되면 개발자가 명시적으로 정의하지 않은 값도 해당 Entity로 인식할 수 있으나, 의도치 않은 결과가 학습될 수 있어 주의해야 합니다. 예를 들어, @color Entity에 “Red”, “Blue”, “Green”의 값은 명시되어 있으나 “Yellow”는 명시되지 않아 추출될 수 없을 때, 이 설정이 활성화되어 있다면 “Yellow”를 명시하지 않아도 “Yellow”를 @color Entity로 추출할 수 있습니다. 단, “Mountain”이라는 문자열도 @color Entity에 추가될 수 있습니다.
  • Fuzzy Matching : 이 설정이 활성화되면 명시한 값과 완벽하게 일치하지는 않지만, 어느 정도 유사한 값을 추출할 수 있습니다. 다만 이 역시 의도치 않은 결과가 학습될 수 있어 주의해야 합니다. 예를 들어, @color Entity에 “빨강”, “노랑”, “초록”이 명시되어 있고 이 설정이 활성화되어 있다면, “빨간색”이라는 문자열을 @color Entity로 추출할 수 있습니다. 다만, ‘빨간국물’이라는 문자열도 @color Entity에 추가될 수 있습니다.

Intents

dialogflow-intents-1

Intents는 사용자의 발화에서 의도를 나타내는 단어 또는 구문의 집합입니다. 사용자의 발화에서 어느 의도를 정의하는 것은 단어 또는 구문의 조합, 단어의 의미, 단어의 순서 등으로 정의될 수 있습니다.

Intents는 크게 사용자가 정의한 커스텀 Intent, 특정 Intent를 추출하지 못했을 때 후처리용 메세지의 모음인 Fallback Intent가 있습니다.

dialogflow-intents-2

Create Intents 버튼을 눌러 Intent 생성 화면으로 진입합니다.

dialogflow-intents-3

Intents 생성 화면입니다.

  • Contexts : 다른 Intent와 연결 지어 해당 Intent가 추출될 수 있는 발화의 시점을 잡습니다. 다시 말해, 발화의 맥락을 고려하여 해당 Intent의 추출 여부를 활성화할 수 있습니다.
  • Events : Contexts와 비슷하나, 해당 Intent의 추출 여부를 문어적 상황과는 별개로 잡습니다.
  • Training Phrases & Action and Parameters : 해당 Intent를 추출하기 위해 특정 문자열을 삽입하여, 해당 문자열의 각 단어를 Entity로 연결하고, 그 Entity의 필수 여부 및 순서 등을 조정하여 Intent의 추출 여부를 활성화할 수 있습니다.
  • Responses : 해당 Intent가 추출되었을 때, 봇이 던질 답변을 정의합니다.

작동 확인

dialogflow-conclusion

저는 현재 Welcome이라는 Intent를 작성하였습니다. 해당 Welcome Intent는 @greetings라는 Entity가 오면 의도를 추출하고, 의도 추출 시 “안녕하세요, 넥스트이노베이션입니다.”라는 문자열을 return 하도록 설계되었습니다. “안녕”과 “안녕하세요”는 @greeting Entity에서 동의어 처리가 되어 정상 동작함을 확인할 수 있으나 “어서오세요”는 Welcome Intent가 추출되지 못하여 Fallback Intent의 문구가 던져지는 모습을 확인할 수 있습니다.

DialogFlow를 더욱 잘 사용하기 위해서는, DialogFlow로 구축하려는 챗봇을 어느 상황에서 활용할 것인지 명확히 하고, 시나리오를 구축하여 시나리오 상에서 예측할 수 있는 Entities와 Intents를 추출, 챗봇이 해당 Entities와 Intents를 잘 추출할 수 있도록 많은 데이터로 학습시키는 것이 좋습니다.


Written by @Keedong Kim

넥스트이노베이션의 기술, 문화, 뉴스, 행사 등 최신 소식 및 넥스트이노베이션이 겪은 다양한 경험을 공유합니다.