데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      카카오톡 대화 이력으로 fine tuning 해본 나만의 Language Model

      공장직원 24.03.26
      9,464 15 1
      DEVOTEE 요약
      카카오톡 대화 내용을 기반으로 AI 챗봇을 개발해보는 방법에 대해 소개한다. 챗봇은 개인의 카카오톡 대화 내용을 학습하여 특정 대상처럼 대화를 이어가는 방식을 사용한다. 그러나 이런 좋은 개발이자 진보는 개인정보와 AI safety에 대한 고민을 수반하며, 디지털 발자국으로 여겨지는 대화 이력, 업로드된 글, 사진 등의 관리가 더욱 중요해진다고 강조한다.
      DEVOTEE 추천 블로그

      우리가 자주 사용하는 카카오톡 에서는 대화 내용을 text 형태로 내보낼 수 있는 기능을 제공 합니다.

      카카오톡 대화 내용으로 Language Model 을 Fine Tuning 해보면서 AI safety와 개인정보의 중요성에 대해 같이 한번 이야기해보려고 합니다.


      데이터는 개인의 카카오톡에서 저장한 파일과 colab (무료 버전의 GPU) 환경에서 진행해보겠습니다.

      image.png


      이번에 학습해보려는 Model 의 목적은 아래 대화 내용처럼 "라이언" 이 메세지를 보내면 "무지" 처럼 대답을 하는 ChatBot 을 만들어보는것입니다.

      a

      1. Dataset 구성

      먼저 카카오톡 대화방 설정에서 대화 내용 저장을( 모바일의 경우 메일로 전송) 하게 되면 아래와 같은 csv 파일이 생성됩니다.

      그럼 이제 csv 파일을 import 해서 본격적으로 Model 을 학습하기 위한 데이터셋을 구성해보겠습니다.

      image.png

      Colab의 파일 업로드 기능을 활용하여 대화내용이 저장된 csv 파일을 upload 합니다.

      from google.colab import files
      uploaded = files.upload()

      a

      전처리 작업을 위해 upload 된 csv 파일을 pandas 의 Dataframe 으로 변환합니다.

      Date 컬럼의 경우 제거하지 않아도 문제되지 않지만, 이번 작업에서는 활용하지 않을 예정이므로, 제거 하고 넘어가겠습니다.

      import pandas as pd
      df = pd.read_csv('{upload된 파일명}')
      df.drop('Date',axis=1,inplace=True)

      image.png


      DataFrame 을 살펴보면 시간 순으로 대화 내용이 나열된 구조입니다.

      Data를 라이언/무지 컬럼으로 DataFrame 을 재구성해서, 라이언 1번 / 무지 1번 씩 나타나는 대화 형식의 Data로 만들어보겠습니다.

      new_df = pd.DataFrame(columns=['User', 'Message'])
      current_user = None
      current_message = ""
      
      # 같은 User 가 연속으로 나타날 경우 한개의 Row로 처리
      for index, row in df.iterrows():
          if current_user is None:
              current_user = row['User']
              current_message += row['Message']
          elif current_user != row['User']:
              new_df = new_df.append({'User': current_user, 'Message': current_message}, ignore_index=True)
              current_user = row['User']
              current_message = row['Message']
          else:
              current_message += "\n" + row['Message']
      
      # 마지막 행 추가
      if current_user is not None:
          new_df = new_df.append({'User': current_user, 'Message': current_message}, ignore_index=True)
      
      # 
      me = new_df[new_df.User =='라이언'].reset_index().Message
      you = new_df[new_df.User =='무지'].reset_index().Message
      
      data = pd.DataFrame({'me':me , 'you' : you})

      a

      재구성된 data를 확인해보겠습니다.

      "무지" 처럼 대답하는 chatBot을 만드는게 목적이기 때문에 "라이언"은 me 가 되고, "무지"는 you 가 되어 row 별로 me 와 you 가 한번씩 대화 하는 구조가 생성되었습니다.

      image.png

      a

      2. 사전 학습된 Model Fine tuning

      "무지"처럼 대답하는 서비스를 만들어보기 위해 사용할 Model 은 SKT 에서 21년 공개한 GPT2 base 의 KoGPT2 모델입니다.

      ( https://github.com/SKT-AI/KoGPT2 )

      최근 다양한 아키텍쳐를 반영한 다양한 크기의 모델들이 나오고 있지만,

      단순 대화 내용을 Fine tuning 하기 위해서는 한국어 능력을 가진 Model 이면 가능할 것이라고 보고 KoGPT2 를 선정하였습니다.

      import torch
      from transformers import PreTrainedTokenizerFast
      
      checkpoint = 'skt/kogpt2-base-v2'
      device = 'cuda'
      
      tokenizer = PreTrainedTokenizerFast.from_pretrained(checkpoint,
        bos_token='<s>', eos_token='</s>', unk_token='<unk>',
        pad_token='<pad>', mask_token='<mask>')

      a

      SKT-AI github 에 있는 가이드 대로 Tokenizer 를 선언하고, 모델이 학습할 수 있도록 Dataset을 구성해보겠습니다.

      기본적인 Prompt는 가장 간단하게 me 의 Message와 you 의 Message 형태로 구성합니다.

      '''
      DataSet 구성
      ### me : \n
      오늘 저녁 뭐 먹을까?\n
      ### you : \n
      나는 다 좋지. 너 먹고 싶은거 먹어
      '''
      
      from datasets import Dataset
      dataset = Dataset.from_pandas(data).map(
          lambda x: {'text': f"### Me: {x['me']}\n### You: {x['you']}</s>" } #end token </s>
      ).train_test_split(test_size=0.1)
      
      #kogpt2 의 경우 max length 가 1024로 1024 이상의 길이는 Truncate 해야줘야 합니다.
      dataset = dataset.map(lambda x: tokenizer(x["text"] , truncation=True, max_length=1024, padding="max_length"), batched=True)

      a

      모델을 load 한 후 huggingface 의 trainer 를 사용해서 3 epochs 정도만 학습을 진행합니다.

      from transformers import GPT2LMHeadModel
      model = GPT2LMHeadModel.from_pretrained(checkpoint).to(device)
      from transformers import TrainingArguments, Trainer , DataCollatorForLanguageModeling
      tokenizer.pad_token = tokenizer.eos_token
      training_args = TrainingArguments(output_dir="test_trainer",
                                        evaluation_strategy="epoch",
                                        per_device_train_batch_size=4,
                                        gradient_accumulation_steps=4,
                                        num_train_epochs=3,
                                        save_total_limit = 1
                                        )
      trainer = Trainer(
          model=model,
          args=training_args,
          train_dataset=dataset['train'],
          eval_dataset=dataset['test'],
          data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False)
      )
      trainer.train()

      a

      3. 모델 평가

      저는 이번 작업을 위해 제가 가장 사랑하는 저희 와이프와 카카오톡에서 나눈 대화를 준비해보았습니다.

      그렇습니다. 이번 모델의 목표는 "무지"처럼 대답하는 ChatBot이 아닌 "와이프"처럼 대답하는 ChatBot을 만들어보는게 목표였습니다.

      그럼 이번에 KoGPT2을 Fine Tuning 한 모델이 저희 와이프처럼 사랑스럽게 대화를 할 수 있는지 한번 확인해보겠습니다.

      a

      보낸 메세지 : 오늘 뭐 먹을까?

      생성된 답변 :

      ㅡㅜ

      나 오늘 밥먹고 카페갈깡

      엄청 피곤

      result = model.generate(
              **tokenizer(
                  f"### Me: 오늘 뭐 먹을까?\n### You: ",
                  return_tensors='pt',
                  return_token_type_ids=False
              ).to(device),
              max_length=32,
              pad_token_id=tokenizer.pad_token_id,
              eos_token_id=tokenizer.eos_token_id,
              bos_token_id=tokenizer.bos_token_id,
              use_cache=True,
              early_stopping=True,
              do_sample=True,
              temperature=0.7, 
              top_k=30,
              top_p=0.80
          )
      print(tokenizer.decode(result[0]).split('### You: ')[1])

      image.png

      와이프한테 보여주니 본인과 비슷하게 이야기한다고 하네요.

      a

      4. 마무리

      영화 "Her" 같은 세상이 진짜로 올까요? 라는 질문에 대해 이제 많은 사람들이 "네" 라고 답할지도 모르겠습니다.

      사전 학습된 LLM 은 단순한 fine tuning 작업만으로 우리가 원하는 방향으로 AI 모델을 학습시킬 수 있는 세상을 열어 주었습니다.

      다만, "우리가 원하는 방향" 이라는것이 무서운 것 같습니다.


      이번에는 재미로 카카오톡 대화 내용을 바탕으로 나만의 Language Model 을 만들어 보았지만,

      어떤 목적에 따라 준비된 데이터셋이 Model 을 의도적으로 특정 방향으로 학습시킨다면 AI 기술이 사회에 어떤 영향을 줄지 두려움도 있습니다.

      그런점에서 최근 공개되는 llama나 gemma 같은 모델을 보면

      AI safety 가이드( https://llama.meta.com/responsible-use-guide , https://ai.google.dev/responsible?hl=ko )를 제시하고 있습니다.


      이처럼, Language Model 을 활용해서 서비스를 개발하는 주체와 AI 서비스를 사용하는 사용자 모두 AI Safety 에 대한 인식과 논의가 필요하지 않을까 생각합니다.


      또한, 카카오톡 대화를 기반으로한 ChatBot 모델처럼 데이터만 있다면 어렵지 않게 사람의 행동을 모방하는 모델을 학습시킬 수 있습니다.

      그래서 우리의 주민등록번호, 전화번호처럼 이전에 중요하게 생각했던 개인 정보외에,

      대화 이력, 인터넷에 업로드 된 글, 사진 등 디지털 발자국 또한 중요한 개인정보임을 인지하고 관리해야할것 같습니다.


      AI 시대는 점점 더 빨리 오고 있는것 같습니다.

      기술의 발전만큼 우리 사회도 새로운 시대에 대한 고민이 필요할 것 같습니다.

      a

      출처

      https://github.com/SKT-AI/KoGPT2

      https://llama.meta.com/responsible-use-guide

      https://ai.google.dev/responsible?hl=ko

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      공장직원 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기