AI/AI 도구

GPT-3.5 파인 튜닝 후기

RevFactory 2023. 8. 23. 20:18

OpenAI GPT-3.5 파인 튜닝이 가능해져서 테스트를 진행해 보았습니다.

>> OpenAI, 오늘부터 GPT-3.5 파인 튜닝 가능

 

1. 춘식이가 누구야?

messages = [
  {"role": "system", "content": "Kakao Friends Assistant Bot"},
  {"role": "user", "content": "춘식이가 누구야?"}
]
 
답변
춘식이는 카카오 프렌즈 캐릭터 중 하나로, 파랑색 토끼 모습을 하고 있습니다. 춘식이는 친구들과 함께 놀고 먹는 것을 좋아하며, 언제나 밝고 활발한 성격을 가지고 있습니다.
 
ChatGPT 에는 춘식이 정보가 없으므로 춘식이에 대한 질문에 토끼 모습을 하고 있다며, 환각(Hallucination)이 발생하는 것을 확인 할 수 있습니다. 이를 해결하기 위해서 기존에 우리는 춘식이에 대한 정보를 질문과 함께 컨텍스트로 추가 제공하여 답변을 얻을 수 있었죠. 나무위키의 설명 일부를 Context 로 제공했습니다.

하지만 이제 춘식이에 대한 데이터를 추가 학습하여 파인튜닝을 한다면 우리는 추가 컨텍스트 없이도 춘식이에 대한 정보를 제공 받을 수 있습니다.
 

2. 파인튜닝 데이터 만들기

저는 춘식이에 대한 나무위키 글을 이용하여 파인튜닝을 위한 데이터셋을 만들어 보았습니다.
의도를 살려 좀 더 고도화 할 수 있겠지만 이해를 돕기위해 간단하게 진행한 점 참고해주세요.
아래와 같이 파인 튜닝 할 데이터와 함께 파인 튜닝 포멧을 샘플로 제공하여 ChatGPT 가 데이터셋을 자동으로 생성하도록 했습니다. 데이터를 기반으로 질문과 답변을 자동으로 생성한 것을 볼 수 있습니다.
 

 
데이터 샘플
 
{
   "messages":[
      {
         "role":"system",
         "content":"Kakao Friends Assistant Bot."
      },
      {
         "role":"user",
         "content":"Who is Chunshik in Kakao Friends?"
      },
      {
         "role":"assistant",
         "content":"Chunshik is Ryan's pet cat. But, instead of just a pet, Chunshik is treated like a member of the Kakao Friends and can speak and behave like a human."
      }
   ]
}
 
실제 데이터는 아래 URL 에서 확인할 수 있습니다.

 

참고로, 이와 같이 ChatGPT 모델을 이용하여 학습 데이터를 생성하여 사용하는 것은 이용 약관 상 제한되어 있습니다.

 

2. 서비스 요구사항
(c) 제한
(iii) 서비스의 결과물을 사용하여 OpenAI와 경쟁하는 모델을 개발하는 경우

 

보다 자세한 데이터 포멧은 OpenAI 의 "데이터 세트 준비" 문서 를 참고해주세요
 

3. 데이터 파일 OpenAI에 등록하기

데이터 파일을 등록하면, 아래와 같이 파일 ID를 응답으로 받게 됩니다.
데이터는 포멧에 맞게 JSON으로 작성되어 있어야 하며, 최소 10개 이상의 데이터로 JSONL 로 제공되어야 합니다.
빈 라인 없이 모든 라인은 유효한 JSON 데이터여야 합니다.
 
# 생성된 데이터셋 파일을 openai 에 등록합니다.
openai.File.create(
  file=open("mydata.jsonl", "rb"),
  purpose='fine-tune'
)

 

응답
{
  "object": "file",
  "id": "file-xxxxxxxxxxxxxx",
  "purpose": "fine-tune",
  "filename": "file",
  "bytes": 3636,
  "created_at": 1692770127,
  "status": "uploaded",
  "status_details": null
}
 

4. 파인튜닝 JOB 생성하기

파일 ID 로 파인 튜닝 작업을 요청합니다. 그러면 아래와 같이 작업 ID를 응답으로 받게 됩니다.
 
# 파일을 등록하여 받은 파일 ID로 파인 튜닝 Job 을 생성합니다.
openai.FineTuningJob.create(training_file="file-xxxxxxxxxxxxxx", model="gpt-3.5-turbo")

 

응답
{
  "object": "fine_tuning.job",
  "id": "ftjob-xxxxxxxxxxxxxx",
  "model": "gpt-3.5-turbo-0613",
  "created_at": 1692770140,
  "finished_at": null,
  "fine_tuned_model": null,
  "organization_id": "org-xxxxxxxxxxxxxx",
  "result_files": [],
  "status": "created",
  "validation_file": null,
  "training_file": "file-xxxxxxxxxxxxxx",
  "hyperparameters": {
    "n_epochs": 9
  },
  "trained_tokens": null
}
 
 

5. 파인튜닝 JOB 진행 상황 확인

파인튜닝 작업 요청 후 추가 학습을 위한 시간이 필요합니다.
저의 경우 10개 데이터를 파인 튜닝하는데 11분 정도 소요되었습니다.
status 가 running 으로 표시되다가 완료가 되면 아래와 같이 successed 로 표시되며, 파인 튜닝된 모델을 알려줍니다.
 
# 전체 작업 확인하기 (최대 10개)
openai.FineTuningJob.list(limit=10)

# 개별 작업 진행상황 확인하기
openai.FineTuningJob.retrieve("ftjob-xxxxxxxxxxxxxx")

 

응답
{
  "object": "fine_tuning.job",
  "id": "ftjob-xxxxxxxxxxxxxx",
  "model": "gpt-3.5-turbo-0613",
  "created_at": 1692770140,
  "finished_at": 1692770762,
  "fine_tuned_model": "ft:gpt-3.5-turbo-0613:xxxxxxxxxxxxxx::xxxxxxxxxxxxxx",
  "organization_id": "org-xxxxxxxxxxxxxx",
  "result_files": [
    "file-xxxxxxxxxxxxxx"
  ],
  "status": "succeeded",
  "validation_file": null,
  "training_file": "file-xxxxxxxxxxxxxx",
  "hyperparameters": {
    "n_epochs": 9
  },
  "trained_tokens": 6651
}
 
 

6. 파인튜닝 된 모델로 질문하기

파인 튜닝된 모델을 이용하여 질문을 해볼 수 있습니다.
# 파인 튜닝 된 모델로 질문 하기
response = openai.ChatCompletion.create(
    model = "ft:gpt-3.5-turbo-0613:xxxxxxxxxxxxxx::xxxxxxxxxxxxxx",
    messages = [
        {"role": "system", "content": "Kakao Friends Assistant Bot."},
        {"role": "user", "content": "Who is Chunshik in Kakao Friends?"}
    ]
)

 

응답
Chunshik is a character in Kakao Friends that was raised by Ryan after being rescued from a cardboard box, and is now treated as a pet.

(번역) 춘식은 라이언이 골판지 상자에서 구조한 후 키운 카카오프렌즈의 캐릭터로, 지금은 반려동물로 대접받고 있습니다.
 
* 파인튜닝된 모델은 해당 계정의 Playground 에서도 테스트 확인하실 수 있습니다.
 

7. 파인튜닝 된 모델 삭제하기

새롭게 파인튜닝 하거나 하여 기존 모델이 필요 없어지면 아래와 같이 삭제가 가능합니다.
단, 삭제는 모델이 생성된 조직의 owner만 가능하다고 합니다.
 
openai.Model.delete("ft-xxxxxxxxxxxxxx")

 

참고를 위한 전체 코드는 아래 Repository 에서 확인 하실 수 있습니다.
 

결론

다만 몇 번 더 테스트해 보았을 때, 아직 환각 현상이 존재했습니다.
학습한 데이터의 질문을 똑같이 던지더라도 우리가 원하는 답변을 보장하지는 못합니다.

OpenAI의 가이드에 따르면, 일반적으로 50개에서 100개의 예제로 파인튜닝을 하면 효과를 볼 수 있지만 사용 사례에 따라 적절한 개수는 달라집니다. 잘 만들어진 50개의 데이터로 시작하여 파인튜닝을 진행해보고, 모델에 개선 징후가 나타나는지 확인하는 것을 권장하고 있습니다. 만약 개선의 조짐이 있다면 더 많은 데이터를 제공할 경우 모델이 계속 개선 될 수 있다는 좋은 신호이며, 개선의 조짐이 없을 경우에는 데이터셋을 더 확장하기 전에 진행 중인 작업을 재고하거나 데이터를 재구성 하는 것이 좋다고 합니다.

 
성공적인 파인튜닝을 위해서는 
1. 고품질의 데이터를 확보하는 것이 중요합니다.
2. 그리고 적절한 양의 데이터가 필요합니다. 너무 적거나, 너무 많으면 새로운 데이터나 테스트 데이터에 대한 성능이 떨어지는 오버피팅(overfitting)이 일어납니다.
3. 데이터의 다양상을 높이기 위해 데이터 증강을 통해 학습 데이터 양을 늘리는 것을 고려해볼 수 있습니다. 예를 들어 문장의 순서를 바꾸거나 유의어를 사용하는 방법들이 있습니다.