ChatGPT와 생성형 AI를 활용한 콘텐츠 제작 가이드: GPT-4 미세 조정 하기

이번 블로그 포스팅에서는 OpenAI의 최신 GPT-4 모델을 사용하여 미세 조정된 AI 모델을 만드는 방법을 살펴보겠습니다. 이를 통해 더욱 효과적이고 구체적인 콘텐츠를 제작하는 방법을 배워보겠습니다.


미세 조정의 개념 이해하기


미세 조정(fine-tuning)은 기존의 기본 모델을 특정 용도에 맞게 조정하는 과정입니다. 예를 들어, 특정 회사의 고객 지원 챗봇을 만들기 위해 일반적인 GPT-4 모델을 해당 회사의 데이터로 미세 조정할 수 있습니다. 이렇게 하면 모델이 특정한 지침이나 문서 스타일에 맞춰 더욱 정확하고 유용한 답변을 제공합니다.

데이터 준비하기


미세 조정을 시작하려면 우선 사용할 데이터를 준비해야 합니다. 데이터 준비 단계에서는 모델을 훈련할 예제 데이터를 선정하고, 이를 JSON Lines (JSONL) 형식으로 변환합니다. JSONL 형식은 모델이 학습할 수 있는 구조화된 데이터를 제공합니다.

예를 들어, 다음과 같은 JSONL 형식의 데이터를 준비할 수 있습니다:

{"messages": [{"role": "system", "content": "FreeTutor는 무료로 지식을 제공하는 훌륭한 봇입니다."}, {"role": "user", "content": "한국의 수도는 어디인가요?"}, {"role": "assistant", "content": "글로벌 사람들이 다 알고 있는 그곳. 서울입니다."}]}

이러한 데이터를 통해 모델이 특정 상황에서 어떻게 반응해야 하는지 학습하게 됩니다​.

중요! : 데이터 업로드 파일 형식은 JSONL 확장자만 지원합니다.

OpenAI API를 통한 미세 조정


이제 준비한 데이터를 OpenAI API를 통해 업로드하고, 미세 조정 작업을 시작할 수 있습니다. 이 과정에서는 OpenAI API 키가 필요하며, API 호출을 통해 데이터를 업로드하고 모델을 훈련합니다.

데이터 업로드: 먼저 JSONL 파일을 OpenAI 서버에 업로드합니다.

ft_json.jsonl 파일 내용

{"messages": [{"role": "system", "content": "FreeTutor는 무료로 지식을 제공하는 훌륭한 봇입니다."}, {"role": "user", "content": " f-cademy는 무엇인가요?"}, {"role": "assistant", "content": "f-cademy는 온라인 교육 플랫폼으로, 다양한 주제에 대한 강의를 제공하는 사이트입니다."}]}
{"messages": [{"role": "system", "content": "FreeTutor는 무료로 지식을 제공하는 훌륭한 봇입니다."}, {"role": "user", "content": "f-cademy에서는 어떤 과목을 배울 수 있나요?"}, {"role": "assistant", "content": "f-cademy.에서는 프로그래밍, 디자인, 마케팅, 비즈니스 등 다양한 과목을 배울 수 있습니다."}]}
{"messages": [{"role": "system", "content": "FreeTutor는 무료로 지식을 제공하는 훌륭한 봇입니다."}, {"role": "user", "content": "f-cademy을 사용하기 위해 비용이 드나요?"}, {"role": "assistant", "content": "f-cademy는 전부 무료 입니다."}]}
{"messages": [{"role": "system", "content": "FreeTutor는 무료로 지식을 제공하는 훌륭한 봇입니다."}, {"role": "user", "content": "f-cademy의 강의는 어떻게 구성되어 있나요?"}, {"role": "assistant", "content": "f-cademy의 강의는 블로그 강의, 퀴즈, 데몬으로 구성되어 있습니다."}]}
{"messages": [{"role": "system", "content": "FreeTutor는 무료로 지식을 제공하는 훌륭한 봇입니다."}, {"role": "user", "content": "f-cademy의 강사들은 어떤 자격을 가지고 있나요?"}, {"role": "assistant", "content": "FreeTutor는 각 분야에서 실무 경험과 전문 지식을 가진 전문가입니다."}]}
{"messages": [{"role": "system", "content": "FreeTutor는 무료로 지식을 제공하는 훌륭한 봇입니다."}, {"role": "user", "content": "f-cademy은 어떤 연령대의 학습자를 대상으로 하나요?"}, {"role": "assistant", "content": "f-cademy는 주로 성인 학습자를 대상으로 하지만, 모든 연령대가 이용할 수 있습니다."}]}
{"messages": [{"role": "system", "content": "FreeTutor는 무료로 지식을 제공하는 훌륭한 봇입니다."}, {"role": "user", "content": "f-cademy에 등록하려면 어떻게 해야 하나요?"}, {"role": "assistant", "content": "가입 필요 없이 모든 자료에 엑세스 가능합니다."}]}
{"messages": [{"role": "system", "content": "FreeTutor는 무료로 지식을 제공하는 훌륭한 봇입니다."}, {"role": "user", "content": "f-cademy의 강의는 자율적으로 수강할 수 있나요?"}, {"role": "assistant", "content": "예, f-cademy의 강의는 자율 학습을 지원하며, 수강생이 원하는 시간에 학습할 수 있습니다."}]}
{"messages": [{"role": "system", "content": "FreeTutor는 무료로 지식을 제공하는 훌륭한 봇입니다."}, {"role": "user", "content": "f-cademy에서 수료증을 받을 수 있나요?"}, {"role": "assistant", "content": "자유 지식 공유 하는 공간으로 수료증은 발급하지 않습니다."}]}
{"messages": [{"role": "system", "content": "FreeTutor는 무료로 지식을 제공하는 훌륭한 봇입니다."}, {"role": "user", "content": "f-cademy은 어떤 추가 학습 자원을 제공하나요?"}, {"role": "assistant", "content": "f-cademy은 강의 자료, 프로젝트 파일, 추가 읽기 자료 등 다양한 학습 자원을 제공합니다."}]}

Note. 훈련에 필요한 데이터셋 파일 안에는 10개 이상의 예가 필수입니다. (10개 이하 시 Failed 발생)

파이썬 코드

import openai

openai.api_key = 'your_api_key'

file_path = 'ft_json.jsonl'

response = openai.files.create(
  file=open(file_path, "rb"),
  purpose="fine-tune"
)

training_file_id = response.id
print(training_file_id)

Note. file_path 변수에 절대 경로로 입력 하면 다른 경로에 있는 파일 지정 가능합니다.
(ex : file_path = /temp/remote1/ft_json.jsonl’)

획득한 파일 ID

file-CBldL3v1ToGMBDRNmV7g1mhq

명령어를 통해 데이터 파일을 업로드하고, 파일 ID를 확인합니다.

미세 조정 작업 생성

다음으로, 업로드한 데이터를 바탕으로 미세 조정 작업을 생성합니다.

... 위 코드 이어서
(만약 파일 ID만 가지고 있고 코드를 새로 작성하는 경우 import 및 api key설정을 다시 하세요)

response = openai.fine_tuning.jobs.create(
  training_file=training_file_id,
  model="gpt-3.5-turbo"
)

fine_tune_id = response.id
fine_tune_model = response.model
fine_tune_organization_id = response.organization_id
fine_tune_training_file = response.training_file

print(f"Fine-tune ID: {fine_tune_id}")
print(f"Fine-tune Model: {fine_tune_model}")
print(f"Fine-tune Organization ID: {fine_tune_organization_id}")
print(f"Fine-tune Training_File: {fine_tune_training_file}")

Note-1. 공식 홈페이지에서 Model = [gpt-4o-minigpt-3.5-turbobabbage-002davinci-002] 사용이 가능하다고 합니다. 하지만 필자가 작성하는 기준에서는 gpt-4o-mini는 지원하지 않아, gpt-3.5-turbo 로 작성했습니다. 참고하세요.

Note-2. training_file=training_file_id 코드는 앞서 코드에서 training_file_id 변수를 생성하고 응답에서 ID를 추출해서 저장해놓아 사용가능합니다. 만약 직접 String으로 입력하고자 하면 아래 처럼 입력하세요

training_file_id = 'ID'
예시) training_file_id = 'file-H71hClp8GEjr2C2yaBUOe8Fg'

위와 같이 작업이 완료되면 Fine-tune 된 새로운 모델 ID를 받게 됩니다

Fine-tune ID: ftjob-4jpGKQ5IcNZCmxkM9xdykflx
Fine-tune Model: gpt-3.5-turbo-0125
Fine-tune Organization ID: org-9kM6Imd7BTDximy9trXtZboa
Fine-tune Training_File: file-CBldL3v1ToGMBDRNmV7g1mhq

여기서 가장 중요한건 fine_tune_id 입니다.

미세 조정 모델 상태 확인

response = openai.fine_tuning.jobs.list()

for i in response.data:
  print(f"ID : {i.id}")
  print(f"Org ID : {i.organization_id}")
  print(f"Model : {i.model}")
  print(f"Training File : {i.training_file}")
  print(f"Status : {i.status}")
  print(f"Message : {i.error.message}")
  print("-------------------------------------")
ID : ftjob-4jpGKQ5IcNZCmxkM9xdykflx
Org ID : org-9kM6Imd7BTDximy9trXtZboa
Model : gpt-3.5-turbo-0125
Training File : file-CBldL3v1ToGMBDRNmV7g1mhq
Status : running
Message : None

-------------------------------------

ID : ftjob-sJr57ey3yJ7WzWbS19blM81t
Org ID : org-9kM6Imd7BTDximy9trXtZboa
Model : gpt-3.5-turbo-0125
Training File : file-IBvrwCsJS8t3znjO8I6We8P8
Status : failed
Message : The job failed due to an invalid training file. Expected file to have JSONL format, where every line is a valid JSON dictionary. Line 8 is not a dictionary.

위와 같이 두개의 미세 조정 모델이 있지만, 위의 모델은 running 상태인 것을 확인할 수 있고, 아래의 모델은 구동 실패를 확인할 수 있습니다. 에러 메세지를 참조하여, 해당 이슈를 한 후, 새로 학습을 진행하시면 됩니다.

미세 조정 모델 활용하기

이제 미세 조정된 모델을 활용하여 다양한 애플리케이션에 적용할 수 있습니다. 예를 들어, 고객 지원 챗봇이나 콘텐츠 생성 도구에 이 모델을 통합할 수 있습니다.

미세 조정된 모델이 올바르게 작동하는지 테스트합니다.

Note. 위 상태 미세 조정 상태 확인 시 Status 값이 “succeeded” 되어야 fine_tuned_model 이 생성되며, 이 모델 값을 이용하여 호출이 가능합니다.

response = openai.fine_tuning.jobs.retrieve(fine_tune_id)
fine_tuned_model = response.fine_tuned_model

response = openai.chat.completions.create(
  model = fine_tuned_model,
  messages=[
    {"role": "user", "content": "f-cademy는 무엇인가요?"}
  ]
)

print(response.choices[0].message.content)
'f-cademy는 온라인 교육 플랫폼으로, 다양한 주제에 대한 강의를 제공하는 사이트입니다.'

결과를 확인하고, 미세 조정된 모델이 적절한 응답을 제공하는지 확인합니다​.

미세 조정은 기존 AI 모델을 특정 용도에 맞게 최적화하는 강력한 방법입니다. OpenAI의 최신 GPT-4 모델을 사용하여 미세 조정된 AI 모델을 제작하면, 더욱 정확하고 유용한 콘텐츠를 생성할 수 있습니다. 이번 가이드를 통해 미세 조정의 기본 개념과 실질적인 적용 방법을 이해하고, 이를 바탕으로 다양한 AI 응용 프로그램을 개발해 보세요.

#ChatGPT #GenAI #생성형 AI #fine-tuning #OpenAI API

다른 강의 자료