[GPT API] 합격자소서를 데이터셋으로 구축한 GPT4o-mini Fine-tuning Model 테스트 결과

김재만·2024년 9월 4일
1

알쓸개잡

목록 보기
5/9
post-thumbnail

GPT Fine-tuning 알아보기.

이글은 GPT 공식문서를 바탕으로 제작되었습니다.

글을 읽으시기전 GPT API 를 이용하는 작업으로 GPT API 유료 서비스 결제가 필요함을 알려드립니다.(최소 5달러부터 시작) 그러나 사실 5달러만 결제하여도 제가 사용한 방법 기준으로 충분히 (최소 자소서 200개 이상) 많이 사용할 수 있어 초기에 5~10달러만 결제하시고 부족할 경우 충전해 사용하시는 것을 권장합니다. 또한 자동결제를 막으시면 자동 충전되지않아 의도치 않은 과금을 방지할 수 있기에 걱정없이 사용이 가능합니다.

데이터셋 구축하기

openAI 공식 홈페이지에 보면 50~100개의 데이터셋를 권장하지만 최소 10개의 데이터셋은 필요하다라고 되어있다. (하지만 절대적인 데이터셋 양보다 중요한건 질임을 강조)

이를 바탕으로 최소데이터인 12개의 내가 합격한 자소서를 dataset으로 GPT-4o-mini 데이터셋에 알맞게 chat형 데이터셋으로 자료를 구축하여 보았습니다.

아래는 실제 저의 합격자소서 기반 데이터셋의 일부를 발췌한 것입니다. 저는 아래처럼 .jsonl 형식으로 12개의 자소서를 구성하였습니다.

{"messages": [{"role": "system", "content": "너는 현대오토에버 데이터기술 플랫폼 개발직무에 입사 지원하는 지원자로서 자기소개서를 작성해야하는 일을맡을것입니다."}, {"role": "user", "content": " 지원 직무와 관련하여 어떠한 역량을(지식/기술 등) 강점으로 가지고 있는지, 그 역량을 갖추기 위해 무슨 노력과 경험을 했는지 구체적으로 작성해주시기 바랍니다. (학내외 활동/프로젝트/교육 이수 과정 등 본인의 경험을 기반으로 작성해주시기 바랍니다.) (최소 500자 ~ 최대 1500자)\n\n###\n\n"}, {"role": "assistant", "content": "데이터 기술팀의 플랫폼 오픈소스 개발 및 유지보수 직무에서 제가 가진 강점은 다음 두 가지입니다.\n첫 째, 빅데이터 플랫폼 구축 사업 참여를 통한 빅데이터 분산 처리 시스템(Hadoop) 이해도 및 Linux, Python을 통한 데이터 수집 및 전처리 경험을 통해 빠른 업무 적응을 확신합니다.\n지오시스템리서치에서 빅데이터플랫폼 구축 사업 1년 차에 참여하여 크롤링 및 데이터 전처리 프로그램을 개발하였습니다. 해양 관련 뉴스, 논문, 도서, 최신 트렌트(트위터, 네이버등 오픈 API 활용)를 Python 스크립트를 활용하여 크롤링 후 데이터 Standardization 과정을 진행해 처리 테스트를 진행하였습니다. Python Watchdog 라이브러리를 활용해 옵저버 패턴의 자동화를 사내 Linux 서버에서 진행하여 24시간 기준 약 1만 건의 데이터를 수집할 수 있었습니다. 또한 이후 사업에서 필수적인 빅데이터 분산 처리 시스템중 하나인 Hadoop에 대해 사전 학습하고 구축 계획을 수립하였습니다.\n두 번째, 약 80여 명의 다국적 개발자분들과 함께 오픈소스 프로젝트에 참여하며 기른 탄탄한 개발적 소통 능력으로 오픈소스 내에서 활발한 소통으로 기여할 수 있음을 확신합니다.\nSamsung ONE(On-device Neural Engine) 오픈소스 컨트리뷰터 활동을 통해 오픈소스 프로젝트 관리 경험을 쌓았습니다. Python(pybind11), C(Cmake), Linux(Cross Build)를 활용하여 기존 C++로 작성된 runtime CAPI를 Python API로 바인딩하는 프로젝트를 기획하여 기존 CAPI를 활용하여 코드를 작성하였을 때보다 3배 감소한 코드라인 및 C++ 런타임 코드 빌드 과정 생략을 통한 초기 모델 테스트에서 5배 이상의 시간단축 성과를 달성한 경험이 있습니다. 이러한 성과를 달성하는 데 있어 수많은 Issue와 PR로 다른 개발자 분들과 소통을 진행하였습니다. 소통 과정에서 얻은 다양한 아이디어와 현재 발견한 버그 공유로 빠르게 원하는 성과를 달성할 수 있었습니다.\n이 두 가지 프로젝트 경험을 통해 저는 현대오토에버 데이터기술 플랫폼 오픈소스 개발 및 유지보수 팀에 빠르게 적응하고 성과를 낼 수 있을 것이라 확신합니다.\n"}]}
{"messages": [{"role": "system", "content": "너는 이카운트  ERP 기능 개발직무에 입사 지원하는 지원자로서 자기소개서를 작성해야하는 일을맡을것입니다."}, {"role": "user", "content": " 개발자로서 요구되는 역량을 갖추기 위한 본인의 노력 또는 경험 (500자 이상)\n\n###\n\n"}, {"role": "assistant", "content": "제가 가진 개발자로서의 핵심 역량은 문제 해결 능력과 소통입니다. SSAFY 라는 소프트웨어 교육프로그램을 통하여 웹 풀스택 교육, 알고리즘, 팀프로젝트를 수행하며 이 핵심 역량을 키울 수 있었습니다. 제가 가진 역량을 통해 이카운트 ERP 개발팀에서 기존 기능 고도화 업무 담당에 즉시 기여를 할 수 있을 것이라 확신합니다.\n이카운트 ERP 개발 업무에 기여할 수 있는 근거는 다음과 같습니다.\n첫 번째, 문제 해결 능력입니다. 소프트웨어 교육뿐만 아니라 국립해양조사원 파견직, 수자원공사의 인턴 근무를 통해 처음 해보는 데이터 전처리, 자동화, 시스템 엔지니어, 데이터 가시화까지 다양한 프로그래밍 언어를 단기간에 습득하고 업무에 적응해 문제를 해결한 경험이 있습니다. 또한 평소 알고리즘 문제 풀이를 즐겨하며 문제 해결 자체를 즐기는 성격으로 다양한 기능 개발과 여러 문제들이 발생하는 ERP 개발 업무 특성에 적합한 성격이라고 확신합니다.\n두 번째, 소통능력입니다. 소프트웨어 교육을 통해 다양한 팀프로젝트를 새로운 사람들과 시도한 경험이 있습니다. 웹, 앱, CI/CD, 오픈소스 등 다양한 분야의 팀프로젝트를 담당하며 소통에 필요한 배경 지식을 충분히 습득하였습니다. 이는 제가 ERP 개발에 투입되어 어떤 업무를 담당하게 되더라도 동료 개발자분들과의 소통을 원활하게 해줄 것이며, 다양한 사람들과의 팀프로젝트 경험은 여러 사람들의 성향을 이해하고 팀에 녹아드는데 큰 도움이 될 것이라 확신합니다. 또한 다수의 팀 프로젝트를 진행하며 Git, Jira, Slack, Notion 등의 협업 툴 사용 경험이 있어 협업 적응을 도울 것이라 확신합니다.\n이러한 능력을 바탕으로 이카운트 ERP 개발팀에 합류해 좋은 성과를 빠르게 도출해낼 수 있을 것이라 확신합니다.\n"}]}

초기에는 지금처럼 chat 형식의 dataset이 아닌 직관적인 prompt-completion 자료구조로 파인튜닝을 진행했었다고 합니다. 개인적으로는 prompt-completion 구조가 직관적이기에 좋아보이지만, 아무래도 챗봇을 겨냥한 변경점이 아닌가 싶습니다.
(해당 자료는 2024년 9월 기준 GPT4, GPT3.5 기준으론 chat 대화형 데이터셋만을 파인튜닝 자료로 사용할 수 있습니다. babbage, davinci 모델의 경우 prompt-completion 데이터 셋을 사용하지만 곧 deprecated 예정이라고하니 참고 부탁드립니다.)

간단하게 데이터셋 구성에 대해 설명드리자면, role에는 3가지 역할(system, user, assistant)이 주어지며 각 역할마다 내용(content)를 구성하여야합니다. (system 은 부가적인 작업으로 반드시 필요하진않음) user(나,질문자)-assistant(gpt,답변자)

  • system : 대화를 진행하기전 시스템에게 역할 부여하여 답변의 퀄리티를 높입니다.
  • user : gpt에게 질문이나 대화를 위한 주제를 작성합니다.
  • assistant : 정답이 되는 답변을 작성합니다.

이렇게 데이터셋 구성이 완성되었습니다.

GPT4o-mini 파인튜닝

제가 선정한 모델은 GPT4o-mini 모델입니다. 해당모델은 GPT4o 기반의 라이트한 모델이라고 생각하시면 될 것 같습니다. 이 모델을 선정한 이유는 성능대비 가격이 가장 우수한 모델이었습니다.

가격정책

openai 공식 웹페이지에서 가격 정책을 살펴보면 다음과 같은 문구를 확인 할 수 있다. GPT4o 와 GPT4o-mini 모델에 대해서 each quailfying org의 경우 하루 1M의 무료 Training 토큰을 제공한다.

여기서 조금 난해한 부분이 저 each quailfying org 입니다. 적격한 조직의 경우에만 제공을 한다는 것인데, 무슨 심사를 받아야 하는 것인지 신청을 해야하는 것인지, 모두 제공해주는 것인지 이해하기 어려웠습니다.

몇몇 뉴스 기사에서 모든 사용자들에게라고 되어 있는 기사를 보며 저도 궁금해서 자료를 좀 찾아보았고, 결과적으로 제가 직접 돌려보며 모든 사용자들에게 제공되는 혜택이라는 것을 알게 되었습니다. 2024-09-23일까지 진행되는 무료 이벤트입니다. 추후에는 비용이 발생할 수 있습니다.

위 토큰 발생 집계 현황을 보면 Fine-Tuning Training 토큰이 잡혀있는 것을 볼 수 있습니다. 이를 보고 처음엔 비용이 발생한 것이 아닌가 생각했습니다만 아래 Usage Cost 사용 금액에는 표시되지 않았습니다.

위 사진을 보시고 'Fine-Tuning Model 로 비용이 잡혀있는 것은 무엇이냐?, 파인 튜닝 사용요금인지, 파인 튜닝 트레이닝 비용인지 모르지 않냐?' 궁금해 하실 수 있을 것 같습니다.

그래서 한번 계산해보았습니다.

데이터셋이 얼마나 많은 토큰을 발생시키는지 해당 토큰이 어느 정도의 비용을 가져올지 계산해 보겠습니다. (물론 5, 10달러만 결제하였고 자동 충전등록을 하지 않는다면 5,10달러 사용 이후엔 API 요청이 자동 차단됩니다.)

import json
import tiktoken

# tiktoken 인코딩 설정 (예: GPT-3.5를 위한 인코딩 사용)
encoding = tiktoken.get_encoding("cl100k_base")
print(encoding)

# # JSONL 파일 경로
file_path = './data/data_conversational.jsonl'
tokenCnt = 0

# # JSONL 파일을 열고 각 줄을 읽어서 처리
with open(file_path, 'r', encoding='utf-8') as file:
    for line_number, line in enumerate(file, start=1):
        try:
            # 각 줄을 JSON 객체로 변환
            data = json.loads(line.strip())
            
            # prompt 값 가져오기
            messages = data.get('messages', '')
            
            # 인코딩하여 길이 계산
            messages_length = 0
            for i in range(3):
                messages_length += len(encoding.encode(messages[i]['content']))
              
            tokenCnt += messages_length

            # 결과 출력
            print(f"Line {line_number}: Prompt 길이 = {messages_length} 토큰")
        
        except json.JSONDecodeError as e:
            print(f"Error decoding JSON on line {line_number}: {e}")
            
print(tokenCnt)  # 전체 토큰 길이

위는 제가 작성한 토큰 계산 코드입니다. 데이터셋(jsonl)의 각 데이터(json) 하나하나의 토큰 길이를 산정하였고 최종적으로 모두 더해진 토큰 값과 예상 비용을 계산해 출력하였습니다.

초기 검증 모델 : 데이터셋 12개 (이전에 내가 작성한 자소서 중 합격한 기업의 자소서만을 추출) -> 12개 데이터셋으로만 학습하여도 벌써 $ 0.03 가 되어버립니다..

추후 검증 모델 : 데이터셋 65개 -> 0.16 달러 (약 200원)

물론 비싼 값이 드는 것은 아니지만, 데이터셋의 크기가 커진다면 충분히 부담이 될 수 있을 것 같습니다. 무료로 제공해줄때 학습을 진행해둔다면 좋을 것 같습니다.

더 자세하고 정확한 가격측정을 원하시면 여기에서 확인하시면 더 자세한 가격측정 코드 구축을 위한 튜토리얼 코드를 확인할 수 있습니다..

또는 더 간단히 확인하고 싶으시다면 여기에서 직접 데이터를 넣어보고 토큰을 확인해볼 수 있습니다.

파인튜닝 진행

데이터셋을 알맞게 구축하셨으면 파인튜닝 진행은 비교적 간단합니다.

from openai import OpenAI
import dotenv

dotenv_path = dotenv.find_dotenv()
APIKEY = dotenv.get_key(dotenv_path, "GPT_SECRET_KEY")  # .env 파일을 만들어 API 키관리
client = OpenAI(api_key=APIKEY)

# 1. 데이터셋 업로드
res = client.files.create(
  file=open("data/data_conversational.jsonl", "rb"),
  purpose="fine-tune"
)  # 내 데이터셋 을 openai 내 계정에 업로드

resId = res.id
print(f"trained file id : {resId}")

# 2. 파인튜닝 진행
response = client.fine_tuning.jobs.create(
  training_file=resId,  # 업로드된 나의 데이터셋을 아이디로 찾아 파인튜닝진행
  model="gpt-4o-mini-2024-07-18", 
  hyperparameters={
    "n_epochs":5,
    "batch_size": 1
  }
)

만약 데이터셋을 내 계정에 업로드해두었다면, 해당 아이디만을 통해 파인튜닝만 진행하시면됩니다.

최종적으로 response를 통하여 파인튜닝된 아이디를 얻을 수 있고 openai API 홈페이지 내에서 나의 dashboard - Fine tuning 탭을 통해 확인할수도 있습니다.

epochs & batch_size 선정

파인 튜닝을 진행할 때 주의해야 할 점은 다들 아시겠지만, epochs와 batch_size 입니다. 기본적으로 epochs 는 제 데이터셋과 같이 소량의 데이터의 경우 over-fitting(과적합)되는 것을 막기위해 1~3회 가 적당하다고 생각하지만, 여러 epochs와 batch_size를 진행해본 결과 epochs를 늘리는 것이 더 좋은 판단이라고 생각하였습니다.

아래는 제가 12개의 데이터셋을 통해 epochs, batch_size 를 변경해가며 테스트한 결과입니다.

epochs :2 , batch_size: 1

epochs :5 , batch_size: 1

epochs :5 , batch_size: 12

이를 통해 epochs :5 , batch_size: 1의 케이스가 가장 좋은 모델이라고 판단하였고, 65개의 데이터셋을 해당 케이스로 파인튜닝을 진행해 보았습니다.

epochs :5 , batch_size: 1, data_set_length : 65

최종 결과

자체적으로 아래와 같이 3가지 테스트케이스를 만들어 비교했습니다. 모두 질문은 동일합니다.
프롬프팅 엔지니어링의 경우 : 사전에 제 이력서, 포트폴리오를 제공하여 자소서 출력에 도움을 주었습니다.
(temperature, top_p, penalty 값은 모두 동일)

  1. 프롬프팅 엔지니어링 X / 파인튜닝 모델 사용 X

    OO회사 infra engineer 직무
    Q. 지원직무와 관련하여 자신의 경쟁력을 나타낼 수 있는 경험이나 이력 등을 기술하십시오. (학교수업/프로젝트/경진대회/대외활동 등)
    OO회사의 Infra Engineer(미들웨어, OS) 직무에 지원하게 된 이유는, 인프라 엔지니어로서의 기술적 역량과 경험을 바탕으로 귀사의 발전에 기여하고 싶기 때문입니다. 제게 주어진 다양한 기회를 통해 쌓아온 프로젝트 경험과 학교 수업에서의 성취는 저를 이 직무에 적합한 인재로 만들어주었습니다.
    대학에서 운영체제(OS)와 네트워크 시스템을 집중적으로 학습하며 시스템 구조와 프로세스 관리에 대한 깊은 이해를 쌓을 수 있었습니다. 특히, Linux 기반 서버 운영과 미들웨어 설정, 트러블슈팅 과정에서 체계적인 문제 해결 능력을 배양할 수 있었습니다. 이러한 학습 경험은 제가 대규모 시스템을 안정적으로 관리하고 최적화하는 데 필요한 역량을 갖추도록 도와주었습니다.
    또한, 팀 프로젝트로 수행한 클라우드 인프라 구축 경험은 저의 기술적 강점을 한층 더 강화시켰습니다. 클라우드 환경에서의 미들웨어 구성과 서버 간의 부하 분산 작업, 그리고 운영체제 상에서의 자동화 스크립팅을 통해 시스템의 안정성을 크게 개선한 경험이 있습니다. 이러한 성과는 팀 내에서 중요한 역할을 담당하게 했으며, 문제 발생 시 신속하게 대응하는 능력도 키울 수 있었습니다.
    OO회사의 인프라 엔지니어로서, 저는 귀사의 미들웨어와 운영체제 관리에 기여하고, 지속적인 시스템 안정성을 제공하기 위해 노력할 것입니다. 특히, 새로운 기술 트렌드와 미들웨어 운영 기술을 적용해 시스템의 성능을 극대화하는데 기여할 자신이 있습니다.​

  2. 프롬프팅 엔지니어링 O / 파인튜닝 모델 사용 X

    OO회사 infra engineer 직무
    Q. 지원직무와 관련하여 자신의 경쟁력을 나타낼 수 있는 경험이나 이력 등을 기술하십시오. (학교수업/프로젝트/경진대회/대외활동 등)
    안녕하세요, OO회사의 infra engineer 직무에 지원하는 [이름]입니다. 저는 SSAFY에서 Python Web Full Stack 과정을 수료하며 다양한 프로젝트 경험을 쌓았고, 특히 인프라 운영과 관련된 경험을 통해 이 직무에 적합한 경쟁력을 갖추게 되었습니다.
    국립해양 조사원에서 시스템 엔지니어로 근무하며 Linux(CentOS 7) 서버를 관리하고 운영한 경험이 있습니다. 이 과정에서 데이터 백업, 서버 이전, 충돌 해결 등의 업무를 수행하며 서버 성능을 5% 이상 개선하였습니다. 이러한 경험은 OO회사의 보험사 인프라 운영에 필요한 미들웨어 및 OS 관리 능력을 배양하는 데 큰 도움이 되었습니다.
    또한, Samsung ONE CAPI Pybinding 프로젝트에서는 C++와 Python을 활용하여 크로스 컴파일을 진행하며 플랫폼 라이브러리를 자동으로 인식하도록 로직을 구현했습니다. 이 과정에서 발생한 Python 인식 문제를 해결하기 위해 CMake를 활용한 경험은 OS 운영 및 클라우드 시스템 운영에 필요한 문제 해결 능력을 키우는 데 기여했습니다.
    저는 Booking 프로젝트를 통해 안드로이드 앱 개발 경험도 쌓았습니다. 위치 기반 서비스 구현 및 사용자 경험 증대를 위한 로딩 페이지 추가 작업을 통해 사용자 친화적인 시스템을 설계하는 능력을 배양했습니다. 이러한 경험은 OO회사의 클라우드 시스템 운영 및 서버 운영에 필요한 기술적 역량을 더욱 강화하는 데 기여할 것입니다.
    마지막으로, SSAFY에서 최우수 교육생으로 선정된 경험은 저의 학습 능력과 팀워크를 증명합니다. 다양한 프로젝트와 경진대회에서의 성과는 저의 열정과 전문성을 보여줍니다. OO회사에서 인프라 엔지니어로서의 경력을 쌓으며, 회사의 발전에 기여하고 싶습니다. 감사합니다.

  3. 프롬프팅 엔지니어링 O / 파인튜닝 모델 사용 O

    OO회사 infra engineer 직무
    Q. 지원직무와 관련하여 자신의 경쟁력을 나타낼 수 있는 경험이나 이력 등을 기술하십시오. (학교수업/프로젝트/경진대회/대외활동 등)
    A. 제가 가진 인프라 엔지니어로서의 역량은 국립해양 조사원의 시스템 엔지니어로 파견업무를 수행하며 길렀습니다. Linux 서버를 관리/운영하며 데이터 백업, 서버 이전, 충돌 해결 업무를 수행했습니다. 서버의 성능을 수치적으로 분석하여 5%+ 성능 개선을 이뤄낸 경험을 통해 성능 개선에 대한 니즈를 느끼고, 이를 수치적으로 분석할 수 있는 능력을 갖추었습니다. 또한, Python의 numpy, pandas, pickle 등의 라이브러리를 이용하여 데이터를 가공하고, matplotlib을 이용해 데이터를 가시화하는 사이클을 만들어 매일 10시 해양 예보 업무에 차질이 없도록 운영하며, 데이터 엔지니어로서의 역량도 함께 길렀습니다. 이 경험을 통해 인프라 엔지니어로서의 기본적인 업무 수행 능력을 갖추었다고 생각합니다.
    이후 Samsung ONE 오픈 소스 프로젝트에 참여하며 C++로 작성된 코드를 Python으로 바인딩하는 작업을 진행했습니다. 이 과정에서 C++의 포인터와 더블 포인터에 직관적으로 매칭되는 Python 개념이 없어, Python의 Class와 __init__ 초기화 함수 및 super().__init__을 사용하여 문제를 해결하는 등 C++과 Python 두 가지 언어에 대한 깊은 이해를 바탕으로 다양한 문제를 해결해 나갔습니다. 또한, cross compile 과정에서 발생하는 python 인식 문제를 CMake를 통해 해결하는 등 CMake에 대한 이해도 함께 길렀습니다. 이 경험을 통해 다양한 언어와 툴을 다룰 수 있는 능력을 갖추었다고 생각합니다.
    위 경험을 바탕으로 인프라 운영에 필요한 기본적인 지식과 다양한 언어에 대한 이해를 통해, 빠르게 업무에 적응하고 수행할 수 있을 것이라 생각합니다.

확실히 openai에서도 프롬프팅 엔지니어링 기술을 길러 더 잘 질문하고 여러 문제를 쪼개서 프롬프팅화 시키는 것이 더 효과적일 수 있고, 시간을 절약하는 방법일 수 있음을 말했듯

위에서 작성된 자기소개서의 경우 확실히 프롬프팅 엔지니어링을 거친 경우에 빠르게 80점의 결과물을 도출하는 것 같습니다.

하지만 파인튜닝을 거친 결과로는 두 가지 강점을 보였습니다.

  • 두괄식으로 작성을 진행함.
  • 여러개의 주제를 꺼내기보다 한 두개 주제를 깊이 설명하여 몰입감과 사실감을 제공함.

파인튜닝한 모델의 경우 temperature, top_p, 패널티 값이 모두 동일했음에도 불구하고 무작위성이 꽤 줄어들었다는 점이 재밌었습니다.

프롬프팅 엔지니어링과 관련되어 내용이 궁금하신 분은 openai prompt-engineering guide 를 참고부탁드립니다.


출처 : https://velog.io/@dongyoungkim/OpenAI-GPT-fine-tuning-1.-data-준비하기
출처 : https://littlefoxdiary.tistory.com/118
출처 : https://platform.openai.com/docs/guides/fine-tuning/preparing-your-dataset
출처 : https://cookbook.openai.com/examples/chat_finetuning_data_prep
출처 : https://platform.openai.com/docs/guides/prompt-engineering

profile
기록으로 남기고 공유를 위한 벨로그입니다.

0개의 댓글