본문 바로가기
프로젝트+스터디

자연어 처리 챗봇 프로젝트 _ 챗쪽이

by 코낄2 2024. 3. 15.
자연어 처리를 배우면서 진행하게 된 챗봇 프로젝트

 

1. 주제 선정

주제를 선정하면서 내가 집중한 것은

gpt와 같은 성능이 좋은 챗봇이 많은 지금, "굳이 내가 만든 앱을 사용해보고 싶은 이유"를 만들기였다.

 

한달이 안되는 시간 안에 두명이서 데이터를 작성하고 모델 학습과 서버 구축을 완료해야 했다. 강사님께서 짧은 시간안에 챗봇의 높은 정확도를 기대하기는 어렵다고 조언을 해주셨기 때문에 성능보다는 흥미를 자극하는 주제를 생각해보았다.

 

그렇게 후보로 간추려진 세가지 주제

> 시간 여행자 컨셉으로 역사적 시기를 지정하면 해당 시대의 사람과 대화하는 챗봇
> 반려동물의 행동을 얘기하면 훈련이나 질병 관련 조언을 주는 챗봇
> 나와 배우자의 성격을 입력하면 그에 기반하는 아이성격을 생성해서 대화해볼 수 있는 챗봇

 

첫번째, 두번째 주제는 굳이 대화 형식이 아닌 버튼 형식이 더 편하거나, 다른 곳에서 훨씬 정확하고 좋은 정보들을 많이 얻을 수 있기에 흥미를 이끌면서 '대화'에 의미가 있는 세번째 주제로 진행을 하게되었다.


2. 나의 역할

나는 동일한 질문에 성격별 대답이 다르게 출력되도록 모델을 학습시키는 역할을 맡았다.

 

(사실상 내가 실패하면 성격 기반 AI 챗봇이 실패하는 것이기 때문에 책임감이 무거웠다ㅠㅠ!)

 

당시 훈련 과정은 자연어 처리에서 토큰화에 대한 개념을 이해하고 있을 때였고, 이 정도의 단계에서 챗봇은 어떤식으로 데이터를 정제하고, 훈련시켜야할지 이해가 잘 가지 않았다. 다행히 강사님께서 이전 기수가 어떤식으로 프로젝트를 진행했는지 코드를 공유해주셔서 해당 코드들을 하나씩 살펴보며 길을 잡아갔다. 또한 강사님께서 대규모 텍스트 데이터를 사용하여 사전 훈련된(비지도 학습) 모델들을 파인 튜닝하면 어느 정도의 대화 실력은 기반이 되어있다고 말씀을 해주셔서 대화의 수준이 어느 정도인지 감을 먼저 잡아보기로 했다.

 

트랜스포머 아키텍처를 사용하는 자연어 처리 모델에는 크게 GPT와 BERT 모델이 있다고 해서, GPT와 BERT 모델에 대해서 찾아보았다. 두 모델의 구조적인 가장 큰 차이점은 'Attention의 참조방향이 순방향이냐 양방향이냐'이다.

GPT와 BERT를 비교하여 텍스트 생성 작업에 대한 각 모델의 장단점을 분석해놓은 버트 대 지피티 논문을 참고한 결과 기계 번역 작업에서는 BERT가 양방향 문맥을 고려하기 때문에 훈련 데이터에 대한 이해가 더 정확하고, 결과적으로 번역 품질이 GPT보다 우수한 것으로 나타났다. 또한 요약 작업에서도 BERT가 원본 텍스트의 중요한 내용을 보다 정확하게 요약했다. 하지만 GPT는 단방향 디코더로 텍스트를 생성하므로 일련의 문맥을 고려하여 자연스러운 문장을 생성하는 데 강점을 가지고 있었다. 
결론적으로 양방향 인코더를 사용하는 BERT는 언어를 이해하고 문맥 정보를 추출하는 데 뛰어나기 때문에 감성 분석 및 텍스트 분류와 같은 작업에는 이상적이다. 반면에 단방향 디코더를 사용하는 GPT 모델은 대화형 상황에서 더 많은 유연성을 제공할 수 있기 때문에, 챗봇 및 언어 생성 작업에 가장 적합한 선택지는 GPT라고 생각했다.

 

gpt를 fine-tuning 하는 다른 코드들을 찾아보면서 그때까지 만들어둔 질문 600개에 대한 대답을 학습시켜본 결과 정확하진 않지만 어느 정도 학습시킨 주제에 대해서는 대답을 자연스럽게 생성하는 것을 확인 할 수 있었다.

그래서 이 다음에는 "성격별로 다른 대답을 생성하게 하려면 어떻게 해야할까" 하고 '라벨링'에 대해서 계속해서 고민했다.

Hello, It’s GPT-2 - How Can I Help You?
Towards the Use of Pretrained Language Models for Task-Oriented Dialogue Systems라는 논문에서 사전 훈련된 언어 모델을 기반으로 대화 시스템을 설계하고 구현하는 방법에 대한 힌트를 얻어서 라벨링을 완성할 수 있었다.

label 토큰과 라벨값, Q토큰과 질문내용, A토큰과 답변내용을 구분토큰으로 붙여주고 마지막엔 종료토큰을 붙여서 모델에 넣어주었다. 또한 모델이 예측해야하는 답변 부분만 남기고 마스크를 씌운 토큰을 만들어서, 모델이 예측한 결과를 답변 부분만 추출하여 비교해줌으로써 대답 부분을 학습 시킬 수 있었다.


3. 트러블 슈팅

가장 먼저 느꼈던 문제점은, 

짧은 시간안에 모든 대화에 대한 데이터를 모두 작성하기가 어렵다보니, 대답의 어휘력이 떨어진다고 느꼈다. 

그래서 대화의 유연성을 높혀보기 위해 AI허브에서 감정형 대화 말뭉치를 다운받아 한번 더 pre-train 시켜보았다

하지만!! 어휘력은 높아졌으나 대답의 정확도는 높아지지 않았다

결국 말뭉치 학습보다는 "파인튜닝 시키는 데이터의 양과 질이 훨씬 영향력이 높다"는 것을 알았고 데이터 양을 늘리고 정제하는데 집중하면서 대답의 정확성을 늘려갔다.


두번째는 학습 데이터를 전처리 시키는 과정에서 특수문자를 없애니, 데이터 학습이 더 잘됐다. 하지만 그럴 경우에는 출력되는 대답에서도 특수문자가 제외되기 때문에 성격별 말투가 흐려지는 문제가 있었다. 그래서 출력이 나온 후 들어갔던 라벨값에 따라 구분자나 특수기호를 다시 붙여주는 등 후처리를 하는 방법을 사용했다. 이를 통해 데이터 전처리때부터 후처리 구상이 함께 필요함을 느꼈다.

 

이 프로젝트에서 이상적인 데이터 작성 방법은 실제 사용자들이 할 법한 질문을 수집하는 것이다. 또한 챗봇의 대답 역시 실제로 사용자가 받아야 할 말투와 어휘에 기반하여 가능한 자세히 작성 해야한다. 데이터 수집과 처리가 이번 프로젝트에서 가장 중요한 단계였다고 생각한다. 그리고 진행하는 프로젝트에 따라 알맞는 모델을 찾아서 활용하는 것이 중요하다고 생각한다.

 

https://github.com/junyealim/chatbot

 

GitHub - junyealim/chatbot: 성격 기반 AI 챗봇_챗쪽이

성격 기반 AI 챗봇_챗쪽이. Contribute to junyealim/chatbot development by creating an account on GitHub.

github.com