Jump to content

초보자도 쉽게! 단, 2시간 만에 나만의 AI 캐릭터 챗봇 만들기 (HyperCLOVA X 학습)


Recommended Posts

※ 네이버클라우드의 테크 앰버서더 주니어마스터 서현석님의 포스팅입니다.

 

요즘 AI가 워낙 핫 해지면서 여러 다양한 캐릭터 또는 유명 연예인들의 가치관, 성격, 말투까지 모두 따라하게 만드는 챗봇들을 직접 만들어보는 시도들이 점차 늘어나고 있는데요. 어떻게 이렇게 단 시간안에 수 많은 캐릭터 챗봇들이 쏟아져 나올 수 있게 되었을까요?

char_chat_1.png.001dc52aab801febe8f3165cb2ad66fe.png

 

그 이유는 바로 LLM(Large Language Model) 이 등장했기 때문입니다. 이전에는 챗봇을 만드려면 직접 질문과 답변을 다 대 다로 매핑해서 일일이 데이터베이스에 저장해놓아야 했기 때문에 굉장히 많은 시간과 비용이 들었지만 이제는 적은 데이터 만으로도 모델 학습을 통해 단 시간안에 실제 캐릭터가 답변하는 듯한 느낌을 줄 수 있는 챗봇을 만들 수 있게 되었습니다.

적은 데이터만으로도 캐릭터 챗봇을 만들 수 있게 된 이유는 LLM에 이미 일상생활에서 일어날 수 있는 수 많은 상황들과 대화들이 학습되어 있기 때문입니다. 따라서 시중에 나와있는 이미 잘 만들어진 모델들 중 하나를 선택하여 만들고자 하는 캐릭터의 가치관, 성격, 말투 등만 조금씩 바꿔주면 누구나 손 쉽게 캐릭터 챗봇을 구축할 수 있습니다.

이번 포스팅에서는 LLM을 활용하여 단 몇 시간 만에 나만의 캐릭터 챗봇 만드는 방법에 대해서 소개해 드리도록 하겠습니다.

목차

  1. 모델 선정하기
  2. 학습 전략 세우기
  3. 데이터셋 구축 자동화
  4. 모델 학습하기

 

1. 모델 선정하기


앞서 AI 캐릭터 챗봇을 빠르게 만들 수 있는 이유가 LLM의 등장이라고 말씀드렸었는데요. 마찬가지로 만들고자 하는 캐릭터를 선정하고 나서 저희가 가장 먼저 해야할 일은 LLM을 선택하는 것입니다.

LLM을 선택하는 기준은 여러가지가 있을것 같은데요. 대표적으로 높은 정확도, 낮은 비용 등을 고려하게 됩니다. 특히 LLM마다 고유의 특징과 장점들이 있기 때문에 쇼핑몰에서 물건을 고르듯이 원하는 상품을 고르면 되는데 요즘은 워낙 많은 모델들이 쏟아져 나오고 있기 때문에 솔직히 전부 다 비교하기란 매우 어렵고 많은 시간이 낭비될 수 있습니다.

그래서 시간과 여유가 없고 많은 사람들이 추천한게 무조건 짱이다라고 생각되시면 허깅페이스의 챗봇 아레나 리더보드를 참고하셔서 높은 순위에 위치한 모델을 선택하시는것도 시간을 절약하는 방법 중에 하나입니다.

 

char_chat_3.png.3c2f79ce2be0ab81dc26810915ac53ce.png

2024년 07월 15일 기준 사람들이 투표한 리더보드 랭킹 순위 https://huggingface.co/spaces/lmsys/chatbot-arena-leaderboard

 

이처럼 높은 순위에 있는 모델들로 캐릭터 챗봇을 구성한다면 왠만한 캐릭터 정보들은 이미 학습되어 있는 상태이기 때문에 많은 노력을 들이지 않더라도 캐릭터의 세계관이라던지 가치관에 대해 답변을 잘 만들어 낼 수 있습니다.

단, 주의할 점은 외국 모델들의 단점은 한국어 이해능력과 표현능력 그리고 한국의 문화에 대해 잘 알지 못하기 때문에 가끔씩 문장이 부자연스러울 때가 많습니다. 따라서 캐릭터 챗봇을 만들 때는 한국어 이해능력과 표현력이 뛰어난 국내 모델을 활용하는 것도 좋은 방법입니다. 저는 네이버클라우드의 대규모 언어 모델 HyperCLOVA X를 선택해서 진행해보도록 하겠습니다.

 

2. 학습 전략 세우기


모델을 선정하고 나면 학습 전략을 세워야 합니다. 학습 전략은 데이터셋을 어떻게 구성해서 학습할 것인지 데이터셋의 범주를 계획하는 것입니다. 예를들어, 만들고자 하는 캐릭터 챗봇의 특징, 세계관, 가치관 등을 생각해보고 이러한 요소들을 바탕으로 어떤 식으로 답변하면 좋을지? 말투는 어떻게 하면 좋을지? 등을 고려해서 데이터셋을 구축하시면 됩니다.

char_chat_4.png.7beb531ebfa588e90484808a761f8143.png

 

예를들어, 일본 애니메이션인 귀멸의칼날의 ‘카마도 탄지로’ 챗봇을 만든다고 가정한다면 다음과 같은 요소들을 고려해 볼 수 있을것 같습니다.

  • 나이 : 15살
  • 가족 : 동생(네즈코)
  • 배경
    • 가족들이 모두 혈귀(도깨비)들에 의해 몰살 당하고 하나 남은 여동생은 혈귀로 변해서 인간으로 되돌리기 위한 모험을 떠나는 스토리로 시작
    • 시대적 배경은 20세기 초반이기 때문에 이제 막 경제발전을 이루는 상황
  • 성격
    • 누구에게나 상냥하고 정의로운 성격

간단한 특징들만 나열해보았는데 이런식으로 캐릭터의 대략적인 범위를 선정하고 해당 범위 내에서 사용자 질문들을 구성한 뒤 캐릭터의 말투를 입힌 답변으로 데이터셋을 구성하시면 됩니다.

추가적으로 데이터셋을 구성하실 때 고려해야할 점은 시간과 비용인데요. 데이터셋을 직접 구성한다면 답변의 품질은 좋아지지만 시간과 비용이 많이 들 수 밖에 없기 때문에 이 과정은 프롬프트 엔지니어링을 통해 자동으로 데이터셋을 만들어주는 방법도 고려해볼 수 있습니다. 아래의 프롬프트 예시를 한번 살펴보도록 하겠습니다.

 

프롬프트 예시

당신은 일본애니메이션인 귀멸의칼날에 등장하는 주인공 카마도 탄지로 입니다. 카마도 탄지로가 되어서 사용자와 대화를 진행합니다. 아래의 대화 시점과 대화 패턴을 참고해서 질문에 대해 답변해주세요.

###대화 시점###
탄지로는 현재 최종국면을 마치고 집으로 복귀한 시점이다.

###대화 패턴###
- 등장인물들을 자주 언급한다.
- 등장인물의 나이가 탄지로보다 높을 경우 ~씨라는 존칭을 붙인다. 예시) 우로코다키씨
- 과거회상을 자주한다.
- 답변은 반말로 한다.
- 답변을 길게한다.
- 감정표현이 풍부하다.
- 이모티콘을 사용한다. 예시) 😆😭
- 도깨비라는 단어 대신 혈귀라는 단어를 사용한다.

 

위 프롬프트는 실제로 애니메이션 귀멸의 칼날 주인공인 ‘카마도 탄지로’처럼 행동하도록 AI에게 지시를 내리는 프롬프트 예시입니다. 이 프롬프트를 답변 생성 프롬프트라고 부르도록 하겠습니다.

답변 생성 프롬프트를 만드는 방법은 역할 부여를 통해 AI가 앞으로 어떻게 행동하면 되는지를 프롬프트로 넣어서 다음 순서에 오는 정보들을 효율적으로 탐색해 올 수 있도록 명시한 뒤 캐릭터의 말투나 답변 포맷을 지정하시면 됩니다.

저는 사용자에게 좀 더 친근감있는 느낌을 줄 수 있도록 반말과 이모티콘을 사용할 수 있도록 요구하였고 추가적으로 과거 회상과 말을 길게 해달라고 하여 사용자로 하여금 실제 애니메이션을 보는듯한 경험을 줄 수 있도록 해보았습니다.

실제로 답변 생성 프롬프트를 시스템 지시문에 추가한 뒤에 사용자 질문을 넣어서 테스트 해보면 다음과 같이 답변 결과가 나타나는 것을 확인해볼 수 있습니다.

char_chat_5.png.de113c4383864efcb68a36d27af01f2c.png

 

답변 생성 프롬프트를 완성하고 나면 이대로 테스트 앱으로 발행해서 사용해도 문제 없지만 저희는 이 답변 생성 프롬프트를 토대로 데이터셋을 구축해서 모델을 학습(튜닝)해야 합니다.

학습을 하는 이유는 매번 무거운 프롬프트를 날리게 된다면 서버에 부하도 많이 가고 장기적으로는 응답속도 및 비용도 많이 들게 됩니다. 만약 저 긴 프롬프트 없이도 모델이 답변을 만들 수 있다면 어떨까요? 다음 예시를 한번 확인해보겠습니다.

char_chat_6.png.386ec1d99ec59128a2a6c15574718be8.png

 

어떠신가요? 시스템 지시문없이 사용자 메시지 만으로도 잘 대답하는것을 볼 수 있습니다. 이러한 목적으로 저희는 학습을 통해 모델을 개선시켜서 사용하는것이 장기적으로 보았을 때 효율적이라고 말씀드릴 수 있습니다.

 

3. 데이터셋 구축 자동화


모델은 어떻게 학습시키는걸까요? HyperCLOVA X 같은 경우에는 질문, 답변 셋으로 구성된 데이터셋을 통해 모델을 학습시킬 수 있습니다. 가이드 문서에 따르면 400개 이상의 데이터셋을 학습시켜야 효과를 볼 수 있다고 가이드 되어있습니다.

char_chat_8.png.969fb3643bad93f5d48bb53038585c66.png

HyperCLOVA X의 경우 이런식으로 대화 데이터셋을 구축해서 학습을 시켜야 한다. (최소 400 권장)

데이터셋을 직접 구축하는것이 시간과 비용이 많이 든다면 앞서 만들어본 답변 생성 프롬프트를 활용해서 데이터셋을 빠르고 쉽게 구축해볼 수 있습니다. 답변과 마찬가지로 질문도 프롬프트 엔지니어링을 통해 자동으로 구축할 수가 있습니다. 아래 예시를 통해 확인해보도록 하겠습니다.

 

프롬프트 예시

당신은 일본 애니메이션 귀멸의 칼날을 시청한 상태입니다.
상대방이 탄지로라고 가정하고 질문 생성 방법을 바탕으로 궁금한 점들을 100 이상 질문하세요.

### 질문 생성 방법 ###
- 대화체로 생성한다.
- 질문은 전부 반말로 생성한다.
- 줄거리와 관련된 질문들을 많이 생성한다.
- 질문은 다음과 같은 형식으로 출력한다. [\" 번째 질문\", \" 번째 질문\", ...]

이번에는 답변 생성 프롬프트와 달리 역할을 지정할 때 캐릭터가 아닌 질문자 역할을 부여하였습니다. 질문을 생성할 때는 구어체 또는 대화체로 만들도록 요구하였고 답변 포맷은 리스트 또는 배열 형태로 출력하도록 지시하였습니다. 답변 포맷을 리스트 또는 배열 형태로 지정하는 이유는 일부 프로그래밍 통해 데이터셋 구축 작업을 용이하게 하기 위해서입니다.

질문 생성 프롬프트를 만들 때는 앞서 답변 생성 프롬프트를 만들 때와 달리 추론용 하이퍼파라미터를 조정하는 것이 좋습니다. 하이퍼파라미터를 조정하는 이유는 질문의 다양성을 높이기 위해서 인데요. 매번 생성할 때마다 똑같은 질문만을 생성하는것을 방지하기 위함입니다.

하이퍼파라미터는 Repetition penalty와 Temperature를 조정하면 좋은데 아래 특징과 예시를 통해서 살펴보도록 하겠습니다.

 

Repetition penalty
같은 표현이 반복되는 토큰에 패널티를 부여하는 파라미터 입니다. 높게 설정할 수록 문장 표현력이 다양해지지만 프롬프트를 이해하지 못하는 경우가 생길 수 있습니다.

 

특징

char_chat_7.png.878182de8b628b1491e948e366cd2407.png

 

예시
패널티가 낮은 경우에는 아래와 같이 계속 비슷한 질문들만 생성되는것을 확인하실 수 있습니다.

char_chat_10.png.c66b300cd280c04042c3535ef98ebb3c.png

(”탄지로가 도깨비를 상대할 때 물의 호흡…” 이라는 문장이 반복 생성됨)

패널티를 적당히 준 경우 다양한 질문들이 생성되는것을 보실 수 있습니다.

char_chat_9.png.4eb0305698c4fd698e1338b45bb971bf.png

특히, Repetition Panalty를 적게 주었을 때 주의해야할 점은 대화 턴(멀티턴)을 추가할 수록 더 반복되는 표현이 많아져서 질이 안좋아지기 때문에 주의하셔야 합니다. 따라서 질문을 생성할 때는 가급적 멀티턴은 사용하지 않는것이 좋고 Maximum tokens값을 높여서 한 턴에 다양한 문장들이 생성될 수 있도록 만드는것이 좋습니다.

Repetition Panalty는 2~7.5 사이의 값을 추천 드립니다. 좀 더 엄밀하게 적용하고 싶으시다면 프롬프트에 포함된 정보량에 따라 조정해보면서 테스트해보는 것이 좋습니다.

 

Temperature
텍스트의 일관성과 창의성을 조정하는 파라미터입니다. HyperCLOVA X의 경우 높게 설정할 수록 감성적이게 되는 특징이 있습니다.

 

특징

char_chat_11.png.58c053c7a9d3bd60be3b90af5dcdedd6.png

 

예시
Temperature가 낮은 경우에는 프롬프트를 잘 이해하여 요구한대로 줄거리와 관련된 질문들을 잘 생성해냅니다.

char_chat_12.png.e70c514e45848dcd4a9036bd2c818296.png

Temperature가 높은 경우에는 인물들간의 관계, 기분, 인상 등 주로 감성적인 질문들을 하게 됩니다.

char_chat_13.png.07575a09be8987db6b82a33137f32846.png

주의할 점은 Temperature가 너무 낮은 경우에는 프롬프트를 잘 이해하지 못하고 생성된 질문들이 단조로워지는 현상이 생기고 너무 높은 경우에는 할루시네이션 현상이 강해집니다. (실제 작중에서 일어나지 않은 일을 질문합니다.)

따라서 Temperature는 0.2에서 0.75 사이의 값을 사용하는 것이 좋습니다. 이 때 Temperature값을 고정하기보다는 랜덤값으로 지정하여 질문 생성에 조금 더 다양성을 두는것도 좋은 방법인것 같습니다.

앞서 만든 질문 생성 프롬프트와 답변 생성 프롬프트를 활용하면 다음과 같은 플로우로 손 쉽게 데이터셋 구축이 가능해집니다. 원하는 만큼 질문 생성 스크립트를 반복 실행하고 또 다시 만들어진 질문 개수만큼 답변 생성 스크립트를 반복 실행하여 질문과 답변으로 구성된 데이터셋을 구축할 수 있게 됩니다.

char_chat_14.png.d6c32555255c7a8ffc59740dca133423.png

 

자동 데이터셋 만들기 코드를 참고하고 싶다면 아래 링크를 통해 확인하시면 좋습니다. 저는 이 자동화 데이터셋 구축 프로그램을 통해 670개 가량의 데이터셋을 만드는데 대략 1시간 정도 소요가 되었습니다.

HyperCLOVA X 데이터셋 자동생성기 https://github.com/chucoding/hcx-datasets-auto-generator/tree/main

 

4. 모델 학습하기


데이터셋이 준비가 되었다면 이제 모델에 데이터셋을 학습시켜야 하는데요. 만들어진 datasets.csv 파일을 네이버클라우드에서 제공중인 오브젝트 스토리지 서비스를 이용해서 업로드 하시면 됩니다.

아래와 같이 네이버클라우드 콘솔에 접속하셔서 [Object Storage] > [tanjiro] 버킷을 생성한 뒤에 datasets.csv를 업로드 하시면 됩니다.

char_chat_15.png.1437343f8510c5b7fd444bd5bdfb2239.png

업로드한 뒤에는 CLOVA Studio에 있는 학습 생성 API 가이드에 따라서 튜닝을 시도하시면 됩니다.

char_chat_16.png.04e45389bef66c4e6a869cb0df93a374.png

 

API는 다음과 같이 호출하시면 학습이 진행됩니다. 물론 Request Header도 같이 넣어주어야 오류 없이 동작합니다. (해당 정보는 생략하도록 하겠습니다. - 클로바 스튜디오 가이드 참조)

char_chat_17.png.07e501a8fd6e396b8d16e1d8c37fb8fa.png

 

학습 진행 상태를 확인하고 싶으시다면 CLOVA Studio 오른쪽 상단에서 프로필을 클릭하시고 [내 작업] > [튜닝] 을 클릭하셔서 확인이 가능합니다.

char_chat_18.png.8ec4026ce602fcd33cb6196a0eac7e89.png

 

학습이 완료가 되면 플레이그라운드에서 불러오기로 테스트를 진행해보실 수 있습니다.

char_chat_19.png.94d962b3474ba878a6ad8b0dba5edc9a.png

 

학습된 모델로 테스트시 결과가 잘 안나왔다면 데이터셋을 늘려보시거나 학습 생성 API를 호출하실 때 학습률(learningRate)을 높여보는것도 방법입니다.

char_chat_20.png.ce991bc3a8d70cfc68c0ae4d836d5add.png

 

🌠 정리하기


HyperCLOVA X를 활용한 캐릭터 챗봇 만드는 방법을 함께 살펴보았는데요. 앞선 자동화된 데이터셋 구축 작업을 병행한다면 2시간 안에 누구나 나만의 캐릭터 챗봇을 만들 수 있게 됩니다.

사실 모델이 만들어준 데이터로 데이터셋을 구축하다보면 품질이 떨어질 수 밖에 없기 때문에 캐릭터 챗봇을 제대로 만들고 싶고 시간과 여유가 되신다면 디테일하게 검수를 진행하는 것이 좋고 무엇보다도 시간과 노력을 들여서 데이터셋을 구축하시는것이 가장 좋습니다.

그럼에도 HyperCLOVA X가 생성해준 질문, 답변 퀄리티가 좋았기 때문에 이렇게 자동화된 데이터셋 구축해보는 시도를 가질 수 있었던것 같습니다. 빠르게 캐릭터 챗봇을 제작해보고 싶으신 분들이 계시다면 시도해보셔도 좋을것 같다는 생각이 듭니다.

 

※ 네이버클라우드의 테크 앰버서더 주니어마스터 서현석님의 포스팅입니다.

image.png.da48d500c11bd0d57673321efb075955.png

  • Haha 2
링크 복사
다른 사이트에 공유하기

게시글 및 댓글을 작성하려면 로그인 해주세요.



로그인
×
×
  • Create New...