커스텀 GPT 만들기 #1 FineTuning

문정현·2024년 8월 24일
0

챗봇 개발기

목록 보기
1/7

RAG방식을 선택하기 까지의 기록

처음엔 데이터를 크롤링해서 학습시키라는 지시가 있었음

GPT를 학습시키는 방법을 공부하다 보니 GPT FineTuning 이란 개념이 있음

FneTuning :
ChatGPT Fine-tuning은 특정 작업이나 도메인에 특화된 추가 학습 데이터를 사용하여 사전 학습된 언어 모델의 매개 변수를 업데이트하는 프로세스

ChatGPT가 만들어둔 AI 모델을 활용해 특정 도메인이나 주제에 대한 질문에 답을 할 수 있도록 해당 데이터를 미세조정(FineTuning) 즉 추가 학습 시키는 것

파인튜닝을 위한 단계는 다음과 같다

  1. 훈련 데이터 준비 및 업로드

  2. 새로운 미세 조정 모델 학습

  3. 결과를 평가하고 필요한 경우 1단계로 회귀

  4. 미세 조정된 모델을 사용

  5. 데이터 준비 및 업로드

1단계의 훈련 데이터 준비의 경우 추후 포스트할 크롤링에서 다루도록 함 사실 1단계가 제일 힘들었다

  1. 파인 튜닝

파인튜닝을 위한 데이터셋은 수집한 데이터의 JSON 파일을 GPT가 읽을 수 있는 프롬프트 형식으로 변환한다

OPENAI의 GPT를 위한 프롬포트 형식은 다음과 같다

{"role": "system", "content": "greeting"},
{"role": "user", "content": "hi"},
{"role": "assistant", "content": "hi user!"}

각 role 별 차이점은 링크를 참고한다

  • system : 시스템(System)역할은 ChatGPT에게 어떻게 행동을 할지 지정하는 기능
  • assistant : 보조자(Assistant)역할은 이전 대화를 저장하고 연속성을 유지하기 위해 사용
  • user: 사용자(User)의 역할은 chatGPT에 일반적으로 질문하는 질문 내용
def convert_to_chat_format(input_file):
    with open(input_file, 'r', encoding='utf-8') as f:
        data = json.load(f)

    chat_format_data = []

    for entry in data:... 
        
	      # 수집 데이터마다 형식이 다르므로 상세 코드는 생략한다
		    main_title = entry.get('main_title', '')
	        messages = [
              {"role": "system", "content": "You're Direa's friendly chatbot"},
              {"role": "user", "content": f"{main_title}에 대해 알려줘"},
              {"role": "assistant", "content": message_content}
          ]
          chat_format_data.append({"messages": messages})

    return chat_format_data

나의 경우 JSON파일로 데이터를 수집했고 이 데이터를 순회하며 user 질문지에 문서 제목을 Message에 문서 내용을 text로 담았다

변환된 JSONL파일

{"messages": [{"role": "system", "content": "Category: [온라인] 업무 가이드"}, {"role": "user", "content": "HTTP 관련 내용을 알려줘."}, {"role": "assistant", "content": "HTTP는..."}]}
{"messages": [{"role": "system", "content": "Category: [온라인] 업무 가이드"}, {"role": "user", "content": "TCP 관련 내용을 알려줘."}, {"role": "assistant", "content": "TCP.."}]}
{"messages": [{"role": "system", "content": "Category: [온라인] 업무 가이드"}, {"role": "user", "content": "Sync to Sync 관련 내용을 알려줘."}, {"role": "assistant", "content": "Sync.."}]}
{"messages": [{"role": "system", "content": "Category: [온라인] 업무 가이드"}, {"role": "user", "content": "Sync 채널 설정 관련 내용을 알려줘."}, {"role": "assistant", "content": "Sync 채널.."}]}
{"messages": [{"role": "system", "content": "Category: [온라인] 업무 가이드"}, {"role": "user", "content": "Async to Async 관련 내용을 알려줘."}, {"role": "assistant", "content": "Async.."}]}
{"messages": [{"role": "system", "content": "Category: [온라인] 업무 가이드"}, {"role": "user", "content": "Async 채널설정 관련 내용을 알려줘."}, {"role": "assistant", "content": "Async 채널.."}]}

주의할 점은 학습 시키고자 하는 내용의 크기(epoc)가 10 미만이면 fine_tuning과정에서 에러 발생

변환된 데이터는 로컬 스토리지에 저장해서 다시 재호출을 통해 OpenAI client에 전달하여 파인튜닝을 진행한다

학습 시키는 방법 또한 공식문서를 참고하여 진행한다.

  1. JSONL파일을 업로드 한다.
from openai import OpenAI
client = OpenAI()

client.files.create(
  file=open("mydata.jsonl", "rb"),
  purpose="fine-tune"
)
  1. 업로드한 파일을 통해 JOB생성하여 시작
from openai import OpenAI
client = OpenAI()

client.fine_tuning.jobs.create(
  training_file="file-abc123", 
  model="gpt-3.5-turbo"
)

+추가적인 옵션도 존재한다.

from openai import OpenAI
client = OpenAI()

# List 10 fine-tuning jobs
client.fine_tuning.jobs.list(limit=10)

# Retrieve the state of a fine-tune
client.fine_tuning.jobs.retrieve("ftjob-abc123")

# Cancel a job
client.fine_tuning.jobs.cancel("ftjob-abc123")

# List up to 10 events from a fine-tuning job
client.fine_tuning.jobs.list_events(fine_tuning_job_id="ftjob-abc123", limit=10)

# Delete a fine-tuned model (must be an owner of the org the model was created in)
client.models.delete("ft:gpt-3.5-turbo:acemeco:suffix:abc123")

FineTuning의 진행도는 openai 플랫폼에서

dashboard의 fine-tuning탭에서 확인가능하다

저 status가 돌아가며 꽤나 오랜 시간이 소요된다.

참고 자료
[GPT]GPT-3.5 Turbo Fine Tuning 시켜보기
OpenAI Platform

profile
주니어 개발자를 꿈꾸며

0개의 댓글