작성일 : 23.01.30

 

출발하기 앞서

제 전역이 임박했습니다. 사지방도 여건이 쉽지 않아서, 개발 공부는 커녕 영어공부 할 시간도 없었습니다. 군대는 뺑뺑이다가 옛말이 아님을 몸소 확인하고, 마지막 휴가를 나와서 기술동향을 대충 훑어보고 있는데, 이게 뭔가.. Chat GPT라는 괴물이 세상에 풀려있었습니다.

 

이제 껏 군대에서 꼬깃꼬깃 종이에 적어내렸던 조잡한 아키택처들이 너무 보잘것 없어지는 순간이었습니다.

방금 한번 데모페이지에서 테스트 해본 걸로도 어이가 없었습니다. 

한국어가 어색하다. 특히 영어권 국가에 없는 존댓말과 반말에 약했다.

여러가지 시도를 해가며 40분정도 체험해 본 결과를 정리해봤습니다.

 

체험내용

멀티턴에도 굉장히 높은 기억력과 이해력을 보였으며, 유기적인 맥락 조합능력이 매우 좋았습니다. 하지만, 아무래도 한국어에대한 적응력이 부족했으며, Chat GPT의 말투는 어딘가 번역된 어투인 감이 많았습니다. 예를 들면 '출력 : 안녕 ~ 어떻게 지내?'는 한국인이 잘 쓰지 않는 언어들로 누가봐도 Hello, How are you가 번역 된 말투같았습니다.

 

뭔가 Chat GPT에 대하여 잘 알아보고 쓰는 게시물이 아니라 그냥 구경하는 게시물임으로, 이번엔 단지 이 괴물같은 녀석을 체험한 체험기느낌으로 작성하려고 합니다. Feat. 뉴진스 민지....!

 

챕터가 오픈도메인 챗봇이니 페르소나를 입혀보려고 노력을 해봤는데 한국어로는 쉽지 않은 것 같네요, 아니면 제가 모르는 적절한 입출력 포멧이 있는걸지도 모르겠습니다.

 

장점

멀티턴, 높은 기억력, 이해력, 대화 맥락 조합능력

 

단점

한국어 못함, 번역된 듯한 말투, 영어식 회화

 

평가

그~~~래도 아직은 한국어에 한해서, 튜닝없이 써먹긴 어려워보입니다. 근데 이거... 재밌네요....

 

단점 + 고집 개썜

 

서론

이번 포스팅의 주제는 목표에 다가간다는 느낌보다는 재미에 가깝게 구성되었다.
재밌고 의미 있는 결과를 얻는 것이 목표임으로 자주 나오는 대화 주제를 이용하여 결과를 관찰했다.

본론
이전 포스팅에서 언급했듯이 학습에 필요한 데이터를 전처리 할때 사진, 동영상, 삭제된 게시글 등.. 을 토큰화 시켜서 입력해봤다.
실제로 생성된 결과에서도 <delete> 토큰이 있는걸 볼 수 있다.

  • 실제로 아마 "응 죽어도 못해~~" 썼다 지웠거나 뭐 그런 느낌쓰 일 거다.
  • 실제로 이운호 군은 "지금은 친구들이랑 노는 게 더 좋아..." 같은 느낌이었는데 실제로 그렇게 나왔다.
  • 운호 재밌겠다...(?) 왜 나왔는지 모르겠다. 아직 학습이 부족한 모습이 보인다.


문제 피드백

  • "왜 지금 안 된다" 아마도 "왜" 쓰고 조금 뒤에 "지금은 안 된다"의 느낌일 것이다 전처리에서 붙여줬기 때문에 말이 붙은 것 같다.
    • 이런 부분은 엔터 부분도 토큰처럼 넣어줘야 하나 생각했고, 토큰처럼 넣었다가 괜히 모델이 복잡해지지 않을까 생각했다. 일단킵
  • 형식 학습이 안 되는 부분이 있었다. EOS토큰임 </s>가 나오지 않고 <pad> 토큰만 반복되다 끝난다던지.
    • 와 그거 재밌겠는데 <pad> <pad> <pad> <pad> <pad>... 이런 식이다.
  • 기존의 kogpt를 학습하는데 쓰인 데이터와 다른 형식일 확률? 매우 높다, 심지어 카톡 채팅은 맞춤법이나 말투도 일반적이지 않으니 특성 학습하기도 쉽지 않다. 급하게 2 epoch 학습한 게 너무 적었던 것 같다.
  • 5 epoch까지 한번 돌려봐야겠다.


실행

  • 사진, 삭제 등의 토큰을 학습 데이터셋에서 제거했다.
  • 토큰 반복에 대한 처리를 추가했다.
  • 5 epoch까지 증가시켰다.
  • checkpoint에서 다시 이어서 학습시키는 로직을 추가했다.

두 번째, 세 번째 학습에서는 아무래도 달라진 입력 형식에 대한 학습이 필요했다. 그렇기에 잠깐 loss가 뜨는 현상이 생겼다.
이경우에 gradient exploding을 방지하기 위해 gradient clipping을 했다. 이후 다시 loss의 감소세를 보였다.


결과
이제 형식적인 틀은 어느 정도 학습을 잘 진행하는 것 같다.
뒷부분이 반복되는 문제는 거의 없어졌다. 그리고 문맥에서 완전히 벗어나는 말도 거의 하지 않는다.

또한 소름 돋게 해당 발화자의 말버릇이나 느낌을 잘 구현해 냈다. (자주 쓰는 욕이라던지, 언급하는 내용이라던지)

아 진짜 재밌는거 많이 나왔는데 이런것밖에 못올려서 아쉽..
ㅇㅇ

 


아 진짜 웃기고 잘된 게 많은데 너무 개인적인 이야기들이 많이 나와 못 올려서 아쉽다.
하지만 진짜 웃긴 것들 많이 나왔다. 생각보다 정말 소름 돋게 잘 나왔다. ㅋㅋㅋㅋㄱㅋㅋㅋㅋㅋㅋㅋㅋ

피드백

작성 중
- 인물 바뀜 문제
학습데이터에 있어서 누구 하나의 대화 비율이 높으면 가끔 대화스타일이 비슷해지려는 경향이 있는것 같다.

학습시킨 인물의 수가 너무 적기 때문에 데이터 불균형에 민감한 것 같다
워낙 개연성없이 대화하는(각자 할말만 함.. ㅋㅋㅋ)  채팅방의 로그를 사용한 탓도 있어보인다. 

하지만 각 인물들의 대화 스타일과 말버릇은 확실하게 남겼다.

- 질의자와 발화자 별의 갭의 문제
위 모델과 같은 경우에는 A가 질문했을때와 B가 질문했을때의 C의 대답의 갭의차이가 많이 난다는 문제가 있습니다 이는 발화 태깅을 인물로 하지않고 전에 언급했다 싶이 성격으로 바꾸면 해결될 것 이라고 생각한다. 위의 케이스같은 경우에는 A나 B각각에게 일관적으로 보이는 C의 성격을 각각 태그를 만들 면어떨까 생각해 볼 수 있을 것 같다.


이후 계획
지금까지는 find tuning 한 transformer 학습이 어떻게, 얼마나 잘 진행이 되는지를 테스트해보기 위함이었다. 그렇기에 비교적 작은 양의 데이터를 이용하여 학습을 시켰었다. 이후 모델에서도 위와 비슷한 방법으로 모델과 데이터 구성을 바꿔 성능을 확인해 볼 생각이다.

서론

오픈 도메인 챗봇 개발이라는 목표를 달성하기 위해 많은 용량의 대화 데이터를 확보해야 하지만,

한국어로 된 오픈 도메인 챗봇을 상당히 얻기 어려울 뿐더러,

핵심을 언급하지 않는 적당한 대답을 매핑하여 출력되도록 하지도 않을 것이다. (그렇게 하기도 힘들다)

 

본론

그래서 카카오톡 로그를 좀 이용해보면 어떨까 생각했다.

마침 최근에 카카오톡 로그 분석같은 것도 했어서 더 괜찮을 것 이라고 생각이 들었다.

 

데이터 수집과 가공에 대한 이야기를 쓰려 했지만 왜 이런 데이터를 수집해봤냐를 기록하기 위해서 생각해봤던 아이디어도 같이 적어보려고 한다.

우선 이전에 리뷰했던 아래 논문에 의하면

 

[논문 리뷰] Hello, It’s GPT-2 - How Can I Help You? Towards the Use of Pretrained Language Modelsfor Task-Oriented Dialogu

날렵한 곰의 간단 논문 리뷰 시리즈 입니다. * 논문 읽는 연습을 하는 단계에서 쓴 글입니다. * 참고할만한 한글리뷰가 없이 작성해서 조금 미숙 할수 있습니다. * 자연스러운 번역을 위해 다듬은

luna-b.tistory.com

 

아래와 같은 구성으로 transformer의 입력에서 대화의 상태를 값으로써 입력할 수 있다.

그것은 대화에서 나왔던 흐름 상태와 외부에서 참고할 데이터의 상태 2가지로 이용하는 모습을 보였다.

Hello, It’s GPT-2 - How Can I Help You? 논문 모델 구성

그렇다면 이를 이용하면 아래와 같은 입력도 가능 할 것 이라는것이다.

더 나아가서는 성격 state앞에 이전 대화 기록을 붙이면 멀티턴 까지도 기대할 수 있지만.

우선 이정도로 잡고 가봤다.

이런 구조도 가능할 것 같다.

나는 이러한 형식에 맞는 데이터를 수집하기 위해서 

대화 데이터셋 이면서, 성격을 알 수 있는 인물 데이터를 모으려고 해봤다.

 

데이터 수집 접근 방법에 대하여 소개해보겠다.

특정 소설 1개의 대본정보를 크롤링한 뒤 인물에 대하여 직접 성격 라벨링을 진행합니다.

아래와 같이 라벨링을 진행한뒤 대화 데이터와 함깨 성격 데이터를 이용하는 것 입니다.

데이터 수집

이렇게 하면 성격을 섞어서 여러개의 성격을 만들어낼 수 있지 않나 생각 했습니다.

물론 학습량과 데이터가 좀 많아야 겠지만요

 

첫번째로 접근한 방법은 소설 데이터셋이다.

네이버소설을 크롤링 해서 사용해 보려고 했지만, 크롤링에서 인물을 특정할 수 있는 키가 애매하기도하고 서사와 대본이 섞여있어서 애매한 부분도 있었다. 그리고 소설을 크롤링.... 찜찜하기그지없다.

 

두번째로 접근한 방법은 드라마 대본이다.

장점은 일정한 형식으로 서사와 대본이 정확히 분리되어있다. 또한 무료로 풀려있는 대본도 있었다. 드라마"W"

단점은 거의 한글 파일로 되어있다. (물론 변환기를 사용하면 되긴 하지만..)

 

세번째로 접근한 방법이 카카오톡 데이터셋이다.

이때는 데이터 사용 전략을 바꿔야 했는데, 여러가지 가공하기 어려운 이유가 있다.

메신저 특성상 말이 섞이는 경우가 많다.

가: 야 배고프지 않냐?

나: 와 화학 방금끝남 왤케오래하누

나: 어? 아 배고프지

가: 아 너 화학도 듣냐?

가: 버거킹이나 가자

위 대화를 보면 바로 알 수 있다.

이런경우 적절하게 처리하기도 약간 어렵고,

 

소설이나 작품을 위해 만들어진 인물이 아닌 실제 사람을 어떤 성격이다 라고 규정짓는 것도 힘들고,

상대에 따라 다른 페르소나를 보이기에 위처럼 라벨링 하기는 쉽지 않다.

바꾼구조

그렇기에 위와 같이 구성하는게 더 낫지 않을까 생각했다.

물론 학습 정확도와 활용도는 좀 떨어지지 않을까 생각 하지만 이게 제일 쉽고 편한 방법인 것 같다.

 

카카오톡 데이터 전처리

나는 맥북을 이용하는데, 데이터를 csv파일로 받아볼 수 있기 때문에 조금더 쉽게 데이터를 처리할 수 있었다.

윈도우는 txt로 주고 형식도 처리하기 어렵다.

 

이모티콘, 사진, 동영상, 삭제된 메세지입니다., 너무긴 메세지, 태그, url

다음 토큰도 염두에 두어야한다.

 

데이터셋을 가공

데이터셋을 가공하는데는 다음 방법으로 해봤다.

긴 텀의 대화는 이어지지 않는 대화라고 가정하는 것이다.

아, 배고프다 ->>>>>>>>>> 오랜시간뒤 ->>>> 야 뭐하냐, 밥먹는중임

아, 배고프다는 버려지고

A: 야 뭐하냐

B: 밥먹는중임

이 데이터셋으로 들어가게 되는것이다.

 

결론

암튼 여기까지는 가설이고

사실 이렇게 만들고 모델을 만들어 테스트를 해봤지만

학습량이 부족한지 데이터가 부족한지 여러가지 문제로 인해

신기하다.. 대박이다.. 싶은 성능은 안나온다.

다음글은 시도와 분석에 대하여 쓰지않을까 싶다.

 

해당 포스팅에서는 가볍게 챗봇을 만들기 위한 기초 지식 공부와 간단한 채팅 모델에 API서버를 연동한 웹사이트를 보이려고 한다.

조금더 진척이 되고 올리려고 했으나, 입대까지 얼마 남지 않아 급한마음에 그냥 올리게 되었다.

 

챗봇 개발을 위한 기본 지식 공부

 

1. Transformer의 기반이 되는 Attention

seq2seq + attention을 논문과 함께 간단하게 구현해 봤다.

attention의 개념 정도는 확실히 잡고 가는 게 맞다고 생각했다.

 

[Pytorch] 차근차근 구현하는 seq2seq + attention mechanism

날렵한 곰의 차근차근 구현하는 시리즈 입니다. * 구현 연습을 하는 단계에서 쓴 글입니다. 대충 무슨내용인지는 아는데 구현은 직접하고 싶고 할라니까 아리까리하고 할 때 보면 좋다! 이론 Refe

luna-b.tistory.com

 

2. GPT계열의 기반이 되는 Transformer

attention is all you need.. 따로 리뷰를 하고 싶었지만 시간이 너무 부족했다.

이전에 구현을 해본 기억이 있긴 한데 다시 봐도 어려웠던 것 같다.

나중에 따로 리뷰를 작성하고 싶다.

 

3. KoGPT2-chatbot 코드와 구조를 분석했다.

처음에 KoGPT2로 이것저것 구현해 보고 있던 도중 발견한 프로젝트이다.

해당 프로젝트의 구현체를 보며 코드와 구조를 분석했다.

https://github.com/haven-jeon/KoGPT2-chatbot

 

GitHub - haven-jeon/KoGPT2-chatbot: Simple Chit-Chat based on KoGPT2

Simple Chit-Chat based on KoGPT2 . Contribute to haven-jeon/KoGPT2-chatbot development by creating an account on GitHub.

github.com

 

4. (3)의 개발자가 참고했다고 언급한 논문을 리뷰했다.

목표지향적 대화를 위해 GPT2에 상태값을 input 필드에 텍스트를 입력하는 적은 비용의 방법으로 학습하여 타 방법들에 대하여 뒤지지 않는 성능에 낸 것에 대하여 설명하는 논문이었다.

 

[논문 리뷰] Hello, It’s GPT-2 - How Can I Help You? Towards the Use of Pretrained Language Modelsfor Task-Oriented Dialogu

날렵한 곰의 간단 논문 리뷰 시리즈 입니다. * 논문 읽는 연습을 하는 단계에서 쓴 글입니다. * 참고할만한 한글리뷰가 없이 작성해서 조금 미숙 할수 있습니다. * 자연스러운 번역을 위해 다듬은

luna-b.tistory.com

우선 뭔가 했다 라고 말할 수 있는 유의미한 공부는 이 정도인 것 같다.

 

 

테스트3

3번 의 코드에 약간의 코드수정과 학습데이터 추가로 챗봇을 만들어 테스트 해봤다. 멀티턴 state를 사용하지 않기 때문에 대화가 이어지지는 않지만, 첫 포스팅이니 만큼 모델을 돌려본 것에 의의를 두었다. 

 

이녀석,, 공손하게 기분나쁜 말투다.

ㅋㅋㅋㅋ....

 

서버 설정

웹서버와 간편하게 연결해보기 위하여 호스팅을 했다.

시간을 들여 로컬 서버를 구축하는 수고로움을 덜기 위해 코드를 colab에 올리고 ngrok를 이용하여 호스팅 했다.

 

프론트

일단 때깔이라도 좋아야 좀 의욕이 생길 것 같아서 적당히 이쁘게 프론트를 만들어봤다.

적당히 애니메이션만 조금 넣어서 귀엽게 만들었다.

대충 입대 1달전 한풀이

 

번외

벌써 재밌을 것 같다.

감성 와장창....

 

+ 2022.06.04 추가함

 

2016년 

친구를 대신하여 대화상대가 되어 줄 수 있는 대화 봇을 만들 수 없을까 생각하며, 데이터베이스, 음성 생성 엔진 기반 대화봇을 만들었었다.

 

2019년

진짜 사람처럼 SNS를 관리하고 이용하는 인공지능을 만들어 보고자 생각했었다.

실제로 페이스북 같은 인스타그램 계정을 운영하면서 캐릭터 컨셉에 맞는 게시물을 올리고 채팅을 칠 수 있다면 분명 재밌을 것 이라고 생각했다.

 

2020년

AI분야로는 많이 부족한 나에겐 일단 AI를 SNS에 올릴 수 있는 플랫폼 코드를 구현하며 SNS관련 API를 숙달했다.

 

2021년

20년도 초 부터 운영해 오던 인공지능 동아리에서 조금이나마 AI에 대한 지식을 쌓았고, 무작정 챗봇 개발에 돌입했다.

그렇게 공부도중 9월 대한민국 육군 특공대에 입대를 하게 되었다.

 

2022년

조금씩 짬내서 이렇게 글도 쓰고 프린트한 논문들도 가끔씩 읽고 있다. (정말가끔)

 

2023년

전역예정이다.

 

 

 

오픈 도메인 챗봇 만들기 정리해보자!

우선 필자는 많은 개발자들이 그렇듯 독학을 통해서 공부와 포스팅을 하고있고,

스스로도 전문성은 많이 떨어질 것 이라고 인지하고 있다.

그렇기에 [한국어 오픈도메인 챗봇] 시리즈는 재미로만 보면 좋을 것 같다.

 

 

뭘 만드려고 하나

필자의 최종적인 목표는 AI 캐릭터를 만들어 내는 것이다.

이 프로젝트는 그중 대화 부분에 해당되는 부분을 공부하고 구현해 보려고 한다.

 

 

나는 오픈도메인 챗봇을 만들기를 희망한다.

챗봇은 크게 이렇게 2개로 나뉘는 것 같다.

1. task oriented chatbot 

2. open domain chatbot

 

이 두개를 간단히 설명하자면,

1번은 목적 지향 대화 챗봇으로, 보험추천 챗봇 같은 문제 해결에 중심을 두고 있는 챗봇을 말하고,

2번은 오픈된 대화주제 챗봇으로, 세상에 존재하는 모든 것을 대화 소재로 하는 대화가 가능한 챗봇을 말한다.

 

나는 여기서 2번의 open domain chatbot을 만들어보기를 희망하고 있다.

위에 설명한 것 과 같이 많은 범위를 포괄 해야함으로 넓은 범위의 지식을 알고 여러가지 상황에 flow대로 대처하는 것이아닌 유연하게 대처가 가능한 챗봇을 만들 수 있어야 한다.

 

 

어떤 기술이 필요할까?

섬세한 챗봇을 만들기 위해서는 너무나 많은 기술을이 필요하고, 특히 언어에 대한 분야는 아직까지도 상당히 난이도가 높다고 평가 되는 것 같다.

 

 

어려운 점.

챗봇 만들기를 준비하면서 개인적으로 어려웠던 점을 떠올려봤다.

 

첫번째로는 채팅 데이터를 얻는것이 가장 어려운 점이라고 생각했다.

한국어 채팅데이터와, 원하는 형태로 라벨링된 대화 데이터를 얻을 수 있는곳은 거의 없었고, 영어 데이터 조차도 찾기 힘들 정도였다. 

- 이러한 부분은 역할놀이나 컨셉 랜덤체팅을 지원하는 작은 놀이 웹사이트를 만들어 데이터를 수집해 보면 어떨까 생각도 해봤었다. (라벨링 된 데이터를 얻기 좋다)

- 소설이나 연극 대본 데이터를 잘 처리해서 라벨링된 pair 데이터로 이용할 순 없을까 생각도 해봤다.

 

두번째로는 학습 리소스와 시간인 것 같다.

현존하는 생성모델들은 거대한 파라미터 수와 방대한 양의 학습데이터를 사용하여 학습하는 경우가 많다. 우리는 이러한 부분을 퓨샷 러닝, 제로샷 러닝, 파인튜닝  등의 기법으로 추가 학습을 최소한으로 하여 모델을 이용 할 수 있긴 하지만, 필자는 훌륭한 학습환경을 마련하기도 힘들고, 긴 학습 시간을 넉넉히 기다리는 것도 쉽지 않다.

 

세번째로는 난이도가 높다.

개인적인 생각이긴 하다만, AI입문자가 하기에는 높은 난이도의 영역이라고 생각 된다. 현재 연구가 활발하게 진행되고 있다지만 여전히 많은 한계들이 발목을 잡고 있는 상황인 것으로 알고있다. (2021.06) 또한 고성능의 최신 논문이 나왔다 할지라도 리뷰나 구현체 없이 따라해볼 능력까지는 나에게는 아직 조금 어려운 것 같다.

 

목표.

나의 목표는 감정 묘사와 페르소나 적용이 가능한 챗봇을 만드는 것이지만,

질질 끌기보다는 최대한 가성비 넘치는 방법을 찾아 공부하고 개발하여 빠르게 결과를 보고 피드백 할 수 있는 방법으로 진행 해 보고 싶다.

 

로드맵

  1. 챗봇
    1. 메모리 장착
    2. 페르소나 장착
    3. 일관성 장착
    4. 이벤트 장착
  2. 플랫폿
    1. 플랫폼 연결
    2. 이벤트 장착

 

※ 쓰고나니 하나같이 현 최신 챗봇 연구분야에서도 어려워하는 목표들이다.

 

최근 읽은 논문들에 의하면 상당히 가성비 넘치는 방법이 많아 보인다. 완벽하진 않지만, 종종 몇번의 소름돋는 짜릿함을 선사하는 대화를 해주는 AI를 만들 순 없을까?

 

최대한 어렵지 않은 기술들을 잘 엮어서 만들어 보고 싶다.

+ Recent posts