ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HyperCLOVA X로 나만의 캐릭터 챗봇 만들기: LLM 활용부터 데이터셋 자동화까지
    AI/HyperCLOVAX 2024. 7. 17. 23:30

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

     

    (좌) Character.ai (우) 네이버웹툰 캐릭터챗

     

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

     

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

     

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

     


     

    목차

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

     


     

    1. 모델 선정하기

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

     

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

     

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

     

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

     

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

     

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

     


     

    2. 학습 전략 세우기

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

     

    캐릭터 챗봇의 답변 생성에 필요한 데이터 + 캐릭터 답변 포맷(말투) = 캐릭터 챗봇 답변

     

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

     

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

     

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

     

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

     

    프롬프트 예시

    당신은 일본애니메이션인 귀멸의칼날에 등장하는 주인공 카마도 탄지로 입니다. 카마도 탄지로가 되어서 사용자와 대화를 진행합니다. 아래의 대화 시점과 대화 패턴을 참고해서 질문에 대해 답변해주세요.
    
    ###대화 시점###
    탄지로는 현재 최종국면을 마치고 집으로 복귀한 시점이다.
    
    ###대화 패턴###
    - 등장인물들을 자주 언급한다.
    - 등장인물의 나이가 탄지로보다 높을 경우 ~씨라는 존칭을 붙인다. 예시) 우로코다키씨
    - 과거회상을 자주한다.
    - 답변은 반말로 한다.
    - 답변을 길게한다.
    - 감정표현이 풍부하다.
    - 이모티콘을 사용한다. 예시) 😆😭
    - 도깨비라는 단어 대신 혈귀라는 단어를 사용한다.

     

     

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

     

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

     

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

     

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

     

    답변 생성 프롬프트를 적용한 뒤 "네즈코는 요즘 잘 지내?"라는 질문으로 답변 생성 결과 확인

     

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

     

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

     

    학습된 모델을 사용하는 경우 추가적인 프롬프트 작업 없이도 답변을 잘 생성해낼 수 있다.

     

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

     


     

    3. 데이터셋 구축 자동화

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

     

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

     

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

     

    프롬프트 예시

    당신은 일본 애니메이션 귀멸의 칼날을 시청한 상태입니다.
    상대방이 탄지로라고 가정하고 질문 생성 방법을 바탕으로 궁금한 점들을 100개 이상 질문하세요.
    
    ### 질문 생성 방법 ###
    - 대화체로 생성한다.
    - 질문은 전부 반말로 생성한다.
    - 줄거리와 관련된 질문들을 많이 생성한다.
    - 질문은 다음과 같은 형식으로 출력한다. [\"첫 번째 질문\", \"두 번째 질문\", ...]

     

     

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

     

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

     

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

     

    Repetition penalty

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

     

    특징

    Repetition penalty 구간별 특징

     

    예시

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

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

     

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

    패널티를 적당히 준 경우 다양한 질문들이 생성됨

     

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

     

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

     

    Temperature

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

     

    특징

    Temperature 구간별 특징

     

    예시

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

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

     

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

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

     

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

     

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

     

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

     

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

     

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

     

     

    GitHub - chucoding/hcx-datasets-auto-generator: 하이퍼클로바X 튜닝용 데이터셋 자동생성기

    하이퍼클로바X 튜닝용 데이터셋 자동생성기. Contribute to chucoding/hcx-datasets-auto-generator development by creating an account on GitHub.

    github.com

     


     

    4. 모델 학습하기

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

     

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

     

    네이버클라우드 오브젝트 스토리지에 캐릭터 챗봇 학습용 데이터셋을 저장

     

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

     

    CLOVA Studio 학습 생성 API 스펙

     

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

     

    학습생성 API를 토대로 Request Body를 구성

     

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

     

    API 호출 후 학습 진행 상태는 프로필 내 작업에서 확인 가능하다.

     

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

     

    CLOVA Studio 플레이그라운드 오른쪽 상단에 불러오기를 통해 학습된 모델을 불러와서 테스트를 진행할 수 있다.

     

    학습된 모델로 테스트 시 결과가 잘 안 나왔다면 데이터셋을 늘려보시거나 학습 생성 API를 호출하실 때 학습률(learningRate)을 높여보는 것도 방법입니다. (기본값이 1.0E-4인데 1.0E-3 정도까지는 괜찮은 것 같습니다)

     

    학습된 모델(캐릭터 챗봇)에게 대화 요청결과

     

    🌠 정리하기

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

     

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

     

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

    댓글

Designed by Tistory.