이번 포스팅에는 Dialogflow가 자연어 처리를 하는 방식을 이해해보며 자연어 처리의 성능을 올려보도록 하겠습니다. Dialogflow는 내부적으로 들어온 발화를 분석하여 각각의 Intent마다 score를 매겨서 가장 일치하는 Intent에 매핑하는 로직을 가지고 있습니다. 하지만 Dialogflow 공식 document에는 자연어 학습을 시키는 방법에 대해서만 설명이 되어있고 10개 이상의 다양한 형태의 발화를 학습시키라는 가이드라인을 제시해줄 뿐 구체적으로 어떤 방식으로 자연어 학습을 진행하는지와 학습 처리 방식에 대해서는 설명하고 있지 않습니다. 따라서 이번 포스팅에서는 몇 가지 예시의 intent를 학습시킨 후 각각의 상황에 맞게 발화를 입력하여 어떤 intent에 높은 score를 주는지 분석해보도록 하겠습니다.
문장의 형태를 보고 구분
이전의 자연어 처리는 의미만을 중심으로 학습하고 통계를 도출해냈었습니다. 하지만 이러한 방식의 학습 형태는 대부분의 발화에 빠르게 매칭하고 응답할 수 있었지만, 언어의 변형이 다양한 한국어에서 몇몇 문장에 대해서 예상치 못한 결과를 반환하는 버그가 있었습니다. 예를 들어 "오늘 뭐먹었어?" 라는 문장과 "뭐 먹었어? 오늘?"이라는 문장은 같은 같은 의미를 가지지만 문장의 어순이 바뀜으로써 NLP 엔진이 보기에는 전혀 다른 발화가 되어버립니다. 그래서 나온 것이 바로 Explainable Chabot(설명 가능한 챗봇)으로 자연어 처리가 잘 되지 않았을 경우 '설명이 가능해야 한다'는 패러다임입니다. 그래서 최근 학습의 방향이 단순이 의미적으로 접근하는 자연어 처리가 아니라 문장의 형태를 보고 판별하는 것입니다. Dialogflow 역시 이러한 현재의 패러다임이 적용되었습니다. 아래의 예시를 보도록 하겠습니다.
Dialogflow에 새로운 agent를 만들고 다음과 같은 3개의 intent를 만들어봅니다.
Intent | Training |
윤재 | 윤재 누구야? |
정민 | 허정민 누구야? |
다예 | 다예 누구야? |
Training된 어구를 보면 윤재와 다예는 이름만으로 질문하는 문장을 학습했습니다. 그리고 '정민'이라는 Intent만 "성 + 이름 누구야?"라는 형태로 학습되었습니다. 이러한 agent에서 만약 "신윤재 누구야?"라는 발화가 들어오면 어떻게 될까요?
의미적으로 본다면 "윤재 누구야?"라는 문장이 학습된 '윤재' Intent에 발화가 매칭 되어야 정상입니다. 하지만 결과는 예상을 벗어납니다.
"신윤재 누구야?"라는 발화에 대하여 0.51점의 score(1점 만점)로 '정민'이라는 Intent에 매칭 됩니다. 즉 단어의 의미가 아니라 문장의 형태에 더욱 많은 score를 부여하고 학습한다는 것을 알 수 있습니다.
그런데 만약 '신윤재'라는 Entity가 존재한다면 어떤 결과가 나올까요?
만약 발화 속에 Entity가 존재한다면 dialogflow는 1.0(최고 점수)으로 윤재라는 Intent에 발화를 매칭 하는 것을 알 수 있습니다. 즉 문장의 형태로 score를 부여하되 Entity가 있을 경우 신뢰성이 올라간다 (높은 score를 부여한다.)라는 결론을 도출 할 수 있습니다.
그렇다면 어떤 식으로 학습을 해야 할까요? 일단 예상할 수 있는 다양한 Entity를 학습하는 것이 좋습니다. 그리고 이후에 intent에 문장을 학습할 때에 다양한 문장의 형태로 학습하는 것이 중요합니다. 다시 말해 "윤재 누구야?"와 "누구야? 윤재"와 같은 다양한 문장의 형태로 학습하여 dialogflow의 학습 패턴에 일치하였을 때 더욱 높은 자연어 처리 성능을 기대할 수 있게 됩니다.
복합 명사
이번에는 복합 명사가 발화로 들어왔을 때를 시뮬레이션 해보도록 하겠습니다. 복합 명사란 두 개 이상의 명사가 합쳐져 새로운 의미의 명사가 되는 것을 말합니다. 그렇다면 질문을 던져보도록 하겠습니다. 만약 '카드 내역'이라는 단어가 있을 때 '카드', '내역'과 같이 각각의 명사를 entity로 입력하는 것이 정확도가 높을까요? 아니면 '카드 내역'이라는 하나의 복합명사로 entity를 입력하는 것이 정확도가 높을까요?
바로 한번 확인해보도록 하겠습니다. 두개의 intent를 만들고 하나는 복합 명사로 entity를 설정하고, 하나는 일반 명사로 entity를 입력했습니다. 그리고 "카드 내역 보여줘"라는 발화를 입력 하였을 때 어떤 intent로 발화가 매칭 되는지 확인해보았습니다. 발화 문장으로만 보면 두개의 intent 모두 정확한 entity와 문장을 발화로 입력하였기 때문에 수치만으로는 두 개의 문장 모두 1.0으로 결과가 도출되어야 합니다. 이러한 결과의 상황에서 어떠한 intent에 매칭 되는지 확인해보도록 하겠습니다. 아래는 이미지는 해당 시뮬레이션에 대한 결과입니다.
결과 이미지를 보면 googleParameter의 결과에 두개의 entity가 인식되었으며 일반 명사 intent에 1.0 score로 매칭 된 것을 확인할 수 있습니다. 즉 복합명사를 학습할 때에 단일 명사 entity로 학습시키는 것이 더 다양한 예시에 확장성 있게 대처할 수 있고, 같은 score로 통계 결과가 도출되었을 경우 더욱 높은 선호도로 복합 명사의 intent를 반환하는 것을 알 수 있습니다.
Entity만 입력되었을 경우
마지막으로 같은 Entity가 다양한 Intent안에 속해 있을 때 Entity만을 발화로 입력했을 때 dialogflow의 Intent 매칭 정책을 알아보도록 하겠습니다. 사전에 '카드'라는 Entity를 설정하고 각각의 Intent에 '카드'라는 명사가 들어가도록 생성해보도록 하겠습니다.
그리고 dialogflow에 '카드'라고 발화를 입력해보고 결과를 확인해보도록 하겠습니다. 그 결과는 아래와 같습니다.
해당 시뮬레이션은 첫번째 했었던 문장의 형태와 Entiy의 중요성에 대해 다시 한번 점검하는 시뮬레이션이었습니다. 제일 처음 했던 시뮬레이션에서 Entity의 중요성에 대해서 이야기했었습니다. 그럼 Entity만 잘 설정하면 되는 거 아냐?라고 생각할 수 있지만, 해당 시뮬레이션의 결과를 보면 googleParameter에 '카드'라는 Entity를 정상적으로 인식했음에도 불구하고 0.3점이라는 낮은 score를 부여한 것을 알 수 있습니다. 제가 여러 번 시뮬레이션해본 결과 보통 0.7점 이상의 score의 경우 정확한 intent 매칭이 이루어졌지만 그 이하의 경우 잘못된 매칭이 이루어질 확률이 높았습니다. 즉 0.3점의 score는 거의 믿을 수 없는 정도의 Intent 매칭 점수를 뜻합니다. 이러한 시뮬레이션의 결과로 dialogflow는 phrases와 Entity를 이용해 자연어를 처리하지만 둘 중 어느 한쪽만으로 절대적인 자연어 처리 성능을 내는 것이 아니라 문장의 형태와 Entiy는 상호 보충하며 score를 결정한다는 것을 알 수 있습니다.
위의 시뮬레이션은 같은 Entity를 가진 Intent가 여러 개 일때 Entity만을 발화로 입력했을 때에 dialogflow의 판단을 확인해보는 시뮬레이션이었습니다. 그런데 시뮬레이션이 아니라 실제로 챗봇을 사용하는 사용자가 단순히 '카드'라는 일반 명사만을 입력했을 때 위의 3가지 intent 중 원하는 intent에 매칭 하길 원한다면 어떻게 해야 할까요?
dialogflow에서는 이러한 경우 Intent에 중요도 차등을 줄 수 있는 기능이 있습니다. 이와 같은 기능을 이용하여 다양한 사용자 패턴에서 정확도 높은 자연어 처리 성능을 이끌어 낼 수 있습니다.
'AI > Dialogflow' 카테고리의 다른 글
[Dialogflow] Dialogflow를 사용하여 챗봇 만들기 (0) | 2019.10.18 |
---|---|
[Dialogflow] Google NLP엔진 Dialogflow (0) | 2019.10.11 |