Tech Log

대화 속에 드러나는 감정을 분석해드립니다!

chedda.choi 2022. 9. 28. 11:07

시작하며

안녕하세요, 카카오엔터프라이즈에서 오픈 도메인 대화 모델을 기획하고 있는 프링과 쌔미입니다. 오늘은 저희가 다른 곳과는 차별화된 감정 분석 모델을 개발한 이야기를 소개하려고 하는데요. 도대체 어떤 모델이기에 이렇게 자신 있게 ‘차별화'되었다고 하는지 지금부터 시작해 볼게요.😉

 

챗봇이 눈치껏👀 대화할 수 있도록!

저희는 대화 모델을 기반으로 한 다양한 서비스를 기획하고 있어요. 그중에는 업무용 메신저인 카카오워크에 내재되어있는 AI 어시스턴트 '캐스퍼'도 있고요, 카카오톡에서 일상 대화를 나눌 수 있는 '외개인아가'라는 오픈 도메인 챗봇도 있답니다. 대화 인터렉션을 기반으로 여러 다양한 서비스를 기획하다 보니 저희는 챗봇이 사용자와 조금 더 눈치껏 대화를 나누면서 사용자의 요청을 수행해주는 것이 좋겠다는 생각이 들었어요. 예를 들어, 사용자가 답답한 상황에 처해서 하소연을 하고 있다면 걱정도 해주고 위로도 해줬으면 좋겠고, 또 한편으로 사용자가 매우 화가 난 상황이라면 화를 돋우지 않고 '워~워~' 시키면서 사용자를 잘 도와줄 수 있는 그런 봇이었으면 좋겠다고 말이죠.

 

[그림 1] 카카오워크 AI 어시스턴트 캐스퍼와 대화하기

 

이렇게 하기 위해서는 봇이 사용자와의 대화에서 맥락을 보면서 사용자의 감정을 판단할 수 있어야겠구나 싶더라고요. 물론 이미 감정을 추출해주는 NLP(자연어 처리) 모델은 여러 곳에서 연구를 하고, API로도 제공하고 있지만, 대화 데이터를 기반으로 동작하는 모델은 거의 없는 것 같았어요. 뉴스 기사 댓글이나, 쇼핑 리뷰, 도서, 블로그 등 문어체 문장에서 드러나는 감정을 판단해주는 모델은 많아도 대화 데이터 속에서 콘텍스트에 따라 묻어나는 감정을 판단하는 모델은 거의 보지 못했거든요. 저희가 기획하는 서비스가 대화를 기반으로 하는 만큼 학습시키는 데이터 자체도 대화 코퍼스를 사용해야 한다고 판단했고, 이와 더불어 명시적인 감정 용언이 없는 발화라도 행간을 읽고 감정을 추출할 수 있는 모델이어야 한다고 생각했습니다. 그래서 모델 구축 단계에서부터 다른 곳과는 다르게 단일 발화를 기반으로 학습시키는 것이 아닌, A-B 두 화자가 나누는 일련의 대화 데이터를 기반으로 학습하는 것에서부터 시작하여 모델을 연구하게 되었습니다.

 

요약하면 저희는 사용자의 요청을 좀 더 효과적으로 수행해주기 위해서는 사용자의 감정을 파악하는 것이 중요하다고 생각했고, 이를 위해 감정 모델을 기획하게 되었습니다. 이 감정 모델이 정말 잘 작동하게 되면 대화 자체가 더 의미 있고 풍부해질 뿐만 아니라 사용자와 봇 간의 대화가 좀 더 오랜 기간 지속될 수 있을 것이라고 예상했어요.

 

[단독] 감정 모델, 이렇게 만들었습니다

우선 감정 모델을 기획하기 위해서는 저희가 어떤 감정을 의미 있게 추출해낼 것인지 감정의 유형을 정리하는 작업이 필요했어요. 감정을 분류하는 기준은 연구자마다, 회사마다, 서비스마다 조금씩 다르게 나타나는데요. 저희는 감정을 크게 4개의 유형으로 나눈 뒤, 내부 서비스 필요에 따라 세부 감정을 추가로 정의하기로 했어요. 저희가 꼽은 네 가지의 감정은 Positive(긍정), Negative(부정), Ambiguous(미묘함) 그리고 Neutral(감정없음) 유형이었습니다. 특히 네 가지 감정 유형 중에서 Negative(부정) 감정을 잘 추출해내는 것이 중요하다고 판단했는데요. 그 이유는 사람들이 기쁘고 즐거울 때보다 화가 나고 슬프거나 짜증이 날 때 봇한테 더 예민하게 반응하는 경향이 있기 때문이었어요. 그렇지 않아도 짜증이 난 상태인데 봇이 눈치 있게 대답하지 못해 버리면 정말 더 짜증이 날 수 있잖아요?🙄 그래서 Negative 감정 유형은 저희가 세부 유형으로 더 잘게 나눠둔 상태랍니다. 물론 이 네 가지의 감정 유형은 상호 배타적이진 않아요. 왜냐하면 감정이 무 자르듯 딱딱 나뉘는 것이 아니기 때문에 미묘하게 겹치는 부분이 생기기도 하거든요. 그래서 저희는 대화 데이터에 감정 유형을 레이블링할 때에도 여러 작업자의 다중 태깅을 통해서 데이터를 모았습니다.

 

앞서 짧게 소개드렸다시피, 모델 학습에 사용할 데이터는 일련의 대화로 이루어진 (멀티턴) 세션 데이터를 기반으로 했습니다. 여러 가지 상황을 특정하고, 그 상황 속에서 이뤄진 A-B 화자의 대화 데이터에 감정 유형 값을 레이블링해서 저희가 기 정의한 감정 유형을 모델이 잘 학습할 수 있도록 준비했어요. 사실 사람들이 항상 감정적으로 대화를 하는 것이 아니기 때문에 애초에 감정이 많이 묻어나는 대화 세션을 솎아내는 작업도 필요했어요. 적어도 감정선이 있는 대화 유형에서 나온 이러한 반응이 이러한 감정을 나타낸다는 것을 학습시킬 필요가 있었기 때문이었죠. 그래도 뭐 'Neutral(감정없음)'으로 태깅되는 문장들이 수두룩해서 많은 양을 작업해야 하긴 했지만요.

 

저희가 모델 구축을 위해 데이터를 디자인할 때 가장 유의했던 점은 동일한 문장일지라도 대화 문맥(상황)에 따라 다른 감정값을 추출할 수 있도록 하는 것이었는데요. 이것이 저희 감정 모델의 가장 큰 차별점이라고 할 수 있어요. 실제로 뚜렷한 감정 용언이 문장에서 드러나는 경우, 예를 들면 ‘나 정말 행복해’ 같은 문장은 Positive(긍정)의 감정으로 쉽게 학습시킬 수 있습니다. 다른 곳의 감정 모델을 봐도 이렇게 감정 용언이 드러나는 경우는 높은 확률로 감정을 잘 추출해내거든요. 하지만 문제는 감정 용언이 드러나지는 않아도 발화 속에 감정이 담겨있는 경우라고 생각했어요. 이러한 종류의 문장들은 대화 문맥(상황)에 따라서 다른 감정을 드러낼 수 있기 때문에 더 까다롭고, 이 때문에 해당 문제를 잘 풀기 위해서는 더 많은 학습 데이터가 필요했답니다.

 

[그림 2] 대화 문맥(상황)에 따라 다른 감정값을 추출하는 감정 모델

 

위 예시의 두 대화에서 마지막 문장인 '왜 그러냐고'의 경우, 문장 형태는 동일하게 사용되었지만 1번 대화와 2번 대화에서 각기 다른 감정값이 추출된 것을 확인할 수 있어요. 1번 대화에서는 A, B 모두 짜증을 내고 있는 상황이 감안되었기 때문에 "왜 그러냐고”라는 문장이 '싫음’으로 태깅된 반면, 2번 대화에서는 A의 폭탄발언 상황에 대한 B의 반응을 분석했기 때문에 '놀람’으로 결과를 얻을 수 있었는데요. 만약 단일 문장 위주로 해당 발화들을 분석했다면 이렇게 다른 감정값을 추출해 내기는 어려웠을 것이라고 생각합니다.

 

감정 분석 모델 적용하기!

저희는 이렇게 만들어진 감정 분석 모델로 다양하게 테스트를 진행해봤어요. 예상했던 대로, 앞의 여러 턴의 대화 맥락을 파악하고 감정을 분석하기 때문에 마지막 발화가 동일한 "응!!"이라고 하더라도 다른 감정으로 분석되는 것을 확인할 수 있었습니다. 뿌듯!😀

[그림 3] 동일한 발화에서 다른 감정의 형태를 나타내는 모습.

👉🏻 독자 분들도 카카오엔터프라이즈 테크그라운드에서 감정분석을 테스트해 볼 수 있어요! 

 

감정 분석 모델을 개발하고, 최근 대화했던 전체 대화 로그를 분석해보았습니다. 'Neutral(감정없음)'이 59.7%로 대부분을 차지하고 있었고 Positive(긍정), Negative(부정), Ambiguous(미묘함) 순이었어요. 역시나 'Neutral(감정없음)'이 제일 높게 나왔네요. 친구와 하는 대화가 아니라 봇과 하는 대화는 대화 턴 수도 길지 않기 때문에 더욱 감정이 담기지 않은 대화를 할 확률이 높은 것 같아요.🤗

 

[그림 4] 감성 분석 모델의 최근 대화 로그 분석 결과

 

이렇게 잘 만들어진 감정 모델을 저희가 서비스하고 있는 챗봇 '외개인아가’에 적용해보기로 했어요. 외개인아가의 답변에 감정이 담겨 있다면, 그 감정에 맞게 이모지를 붙여주기로 했습니다. 세분화된 감정에 맞게 디테일하게 이모지를 선정하고, 한 개의 감정 클래스에 여러 개의 적합한 이모지 중 랜덤으로 한 개의 이모지가 붙도록 했어요.😊😄

 

늘 차갑다는 말을 들었던🙄 불쌍한 우리 외개인아가는 어떻게 변했을까요? 이모지 하나 더 붙었을 뿐인데 좀 더 감정 표현을 잘하는 밝은 성격의 외개인아가가 되었습니다. 이제는 차갑다는 말이나 못됐다는 말은 좀 덜 듣겠죠?😢

 

[그림 5] 왼쪽: 감정분석 모델 붙이기 전, 오른쪽: 감정분석 모델 붙인 후

 

외개인아가가 이렇게 감정을 표현함으로써 정말 사용자와의 대화의 질이 높아졌는지 궁금했어요. 감정 분석 모델 붙이기 전과 후의 대화 턴 수의 차이를 분석해봤는데요. 아래 차트와 같이 전체적으로 미약하게 감정 분석 모델이 붙은 이후에 대화 비율이 올라간 걸 볼 수 있어요. 2~5턴의 짧은 대화에서는 외개인아가의 이모지 감정 표현이 대화에 더 많은 영향을 주더라고요. 아마 대화를 길게 하면 외개인아가와 친밀감이 깊어지고, 텍스트만으로도 충분히 감정 교류가 가능하지만, 짧은 대화에서는 이모지가 좀 더 감정을 느끼해주고 대화에 흥미를 느끼게 하는 것이 아닐지 생각해보았습니다.

[그림 6] 감정모델 배포 전후로의 대화 지속 비율 그래프

여하튼 감정 모델 붙이기 대성공!😛

 

앞으로의 계획

앞으로의 계획은 당연히 감정 모델을 더더더 고도화시키는 것입니다. 아직은 더 많은 데이터가 필요해요. 대화 데이터에 감정 레이블을 해준 데이터가 필요한데요. 감정값을 레이블링 하는 작업이 이만저만 힘든 게 아닙니다.🥲 어떤 한 사건을 보고 사람들이 느끼는 감정이 다 다르듯, 대화에서도 사람들의 감정은 몹시 다르기 때문에 적어도 3명 이상이 동일한 데이터를 보고 작업해야 하는 것 같아요. 아래 대화에서 마지막 “응, 좋아.”의 경우, 어떤 사람은 놀러 가기 때문에 기분이 좋아 Positive(긍정)를 생각하기도 하지만, 어떤 사람은 감정 없는 발화로 생각하기도 하거든요. 이런 논란의 여지가 있어서 여러 명의 평가 결과를 합쳐서 감정을 학습시키는 것이 좋습니다.

화자 발화 감정
A 우리 언제 한번 놀러 갈까? Neutral(감정없음)
B 한번 그렇게 해 볼까? Neutral(감정없음)
A 그럴까? Neutral(감정없음)
B 응, 좋아. Neutral(감정없음)?
Positive(긍정)?

위와 같은 데이터를 많이 만들어서 감정 모델을 고도화하는 것도 해야 하고요. Ambiguous(미묘함) 감정이 긍정적인 상황인지 부정적인 상황인지를 파악할 수 있는 모델 고도화도 필요합니다. 놀라거나 창피한 감정의 경우, Positive(긍정)인지 Negative(부정) 감정인지 알 수 없기 때문에 Ambiguous(미묘함)로 감정을 분석하고 있는데요. 앞의 맥락을 파악해서 생일 축하를 받고 놀라는 것과 같은 긍정적인 상황과, 친구가 다쳤다는 소식과 같은 부정적인 놀라운 상황을 구분할 수 있다면 더 풍부한 감정 분석이 가능하겠죠? (할 일이 너무 많네요😅 할 일은 항상 끝이 없….🫠)

 

더불어 저희는 감정 모델을 더욱 대화 모델에 더욱 적극적으로 활용하는 방안도 고민 중입니다. 현재는 캐릭터의 표정을 변경한다던가 대화의 마지막에 이모지를 붙이는 등의 감정을 표현하는 것으로만 활용되고 있는데요. 앞으로는 더 대화에 적극적으로 감정을 활용할 수 있는 눈치 있는 챗봇을 만들고 싶어요. 사용자의 현재 감정을 파악하여, 지금 대화의 분위기를 파악하여 적절한 봇의 답변을 생성할 수 있는 방향에 대해서 고민 중입니다.🥲

 

마치며

카카오엔터프라이즈는 텍스트 대화 데이터 기반의 감정 분석 모델뿐만 아니라 음성 데이터 기반의 감정 분석 모델도 보유하고 있는데요. 음성을 통한 감정 분석 모델과 대화 맥락을 통한 감정 분석 모델을 융합하여 시너지 효과를 내는 방법도 고민 중입니다. 현재 카카오엔터프라이즈에서 제공하고 있는 다양한 음성 서비스, 콜봇 등에서 활용한다면 더욱 사람같은 봇과 대화할 수 있게 되겠죠?

 

저희가 열심히 만든 감정분석 API는 카카오 엔터프라이즈 클라우드에서 사용할 수 있어요. 댓글이나 단일 문단의 감정 분석 외에 앞의 대화 맥락을 기반으로 마지막 대화의 감정을 분석하는 모델은 특별한 거 아시죠?😉 카카오 i 클라우드에서 만나보세요!

 

그럼 저희는 다시 대화 모델 연구에 박차를 가해서 다음 번에 더 특별한 NLP(자연어 처리) 모델을 소개하러 오겠습니다. 많이 기대해주세요. 고맙습니당!

 

Pring (솜털)

대충 철저히 고민 중.. 

Sammy (쌔미)

츤츤한 에반젤리스트 쌔미요정. NLP 엔지니어링 디자인을 담당하고 있습니다.