📝 개요
이 글에서는 제품 설명 텍스트만을 입력받아
가격을 예측하는 Fine-tuned GPT-4o-mini 모델을 구축하는 과정을 다룹니다.
데이터 준비부터 모델 파인튜닝,
완성된 모델 테스트까지 전 과정을 코드와 함께 실습하며,
Weights & Biases를 이용한 학습 모니터링과 모델 성능 평가 방법도 소개합니다.
주요 목표:
- 제품 설명을 기반으로 가격을 추론하는 맞춤형 GPT 모델 만들기
- OpenAI Fine-tuning API 실습
- 학습 진행 상황을 Weights & Biases로 실시간 추적
- Fine-tuned 모델을 활용해 테스트 및 성능 평가하기
🚀 라이브러리 및 환경 설정
모델 파인튜닝과 데이터 처리에 필요한 주요 라이브러리들을 불러옵니다.
이제부터 본격적으로 작업을 시작할 준비를 합니다.
📦 필수 라이브러리 임포트
# 📂 시스템 관련 작업을 위한 라이브러리
import os # 파일 경로 설정, 환경 변수 관리 등 시스템 작업 지원
import re # 정규 표현식을 사용해 텍스트 데이터 전처리
import math # 수학 계산 (로그, 제곱근 등) 함수 제공
import json # JSON 포맷의 데이터 읽기/쓰기
# 🎲 데이터 무작위 처리 관련
import random # 랜덤 샘플링 및 셔플링 등 무작위 작업 지원
# 🔐 환경 변수 파일(.env) 로드
from dotenv import load_dotenv # .env 파일에 저장된 API 키 등 민감 정보 불러오기
# 🤝 Hugging Face Hub 로그인
from huggingface_hub import login # Hugging Face API 연동을 위한 인증 처리
# 📊 데이터 시각화
import matplotlib.pyplot as plt # 그래프 및 차트 그리기용 시각화 라이브러리
import numpy as np # 수치 계산 및 배열 연산을 위한 핵심 라이브러리
# 💾 객체 저장 및 로딩
import pickle # 파이썬 객체를 파일로 저장하거나 불러올 때 사용
# 🧮 데이터 빈도수 계산
from collections import Counter # 리스트, 문자열 등에서 요소별 등장 횟수 계산
# 🤖 OpenAI API 사용
from openai import OpenAI # OpenAI 모델 호출을 위한 라이브러리
# 🤖 Anthropic API 사용
from anthropic import Anthropic # Anthropic (Claude 등) 모델 호출을 위한 라이브러리
✨ 요약
- 파일 관리, 데이터 처리, API 연동, 시각화까지 프로젝트 전반에 필요한 도구들을 모두 불러온 단계입니다.
- 이후 데이터 준비, 모델 학습, 파인튜닝, 결과 분석을 차례로 진행할 준비가 완료되었습니다.
🌿 환경 변수 설정 (Environment Setup)
API 키를 안전하게 불러와 설정합니다.
.env 파일을 사용하여 코드에 민감한 정보를 직접 노출하지 않고 관리할 수 있습니다. 🔐
# 🌱 .env 파일 로드
load_dotenv(override=True)
# - 현재 디렉터리에 있는 .env 파일을 읽어 환경 변수로 등록
# - override=True 옵션으로 기존에 설정된 값도 덮어쓸 수 있도록 설정
# 🔑 OpenAI API 키 설정
os.environ['OPENAI_API_KEY'] = os.getenv('OPENAI_API_KEY', 'your-key-if-not-using-env')
# - 환경변수에서 OPENAI_API_KEY 값을 가져옴
# - 만약 없으면 'your-key-if-not-using-env'라는 기본 값을 사용
# 🔑 Anthropic API 키 설정
os.environ['ANTHROPIC_API_KEY'] = os.getenv('ANTHROPIC_API_KEY', 'your-key-if-not-using-env')
# - 환경변수에서 ANTHROPIC_API_KEY 값을 가져옴
# - 기본값을 설정해 예외 상황에서도 코드가 깨지지 않도록 함
# 🔑 Hugging Face API 토큰 설정
os.environ['HF_TOKEN'] = os.getenv('HF_TOKEN', 'your-key-if-not-using-env')
# - 환경변수에서 HF_TOKEN 값을 가져옴
# - 기본값을 설정하여 안전성 확보
✨ 요약
load_dotenv()
로.env
파일을 불러와 API 키를 자동 설정합니다.- os.environ을 통해 코드 실행 중에도 환경변수를 명시적으로 지정할 수 있습니다.
- 키가 없을 경우 대비하여 기본값(
'your-key-if-not-using-env'
)을 설정해 코드의 안정성을 높였습니다.
🔐 Hugging Face 로그인 (Login to Hugging Face)
Hugging Face Hub에 인증하고, 모델이나 데이터셋을 사용할 준비를 합니다.
(터미널에 직접 로그인하는 대신 코드로 자동 로그인합니다.)
# 🔑 Hugging Face 토큰 불러오기
hf_token = os.environ['HF_TOKEN']
# - 환경 변수(HF_TOKEN)에서 Hugging Face API 토큰을 가져옴
# 🤝 Hugging Face Hub 로그인
login(hf_token, add_to_git_credential=True)
# - 가져온 토큰을 이용해 Hugging Face에 로그인
# - add_to_git_credential=True 옵션을 주면 Git 자격 증명에도 추가하여 CLI에서도 인증 상태를 유지할 수 있음
🧪 테스트 유틸리티 패키지 임포트 (Import Testing Utilities)
테스트 코드를 별도 패키지로 분리하여, 깔끔하게 호출할 수 있도록 구성했습니다.
(이제 메인 코드에서는 간단하게 Tester.test()
를 호출하면 됩니다.)
# 🧩 아이템(Item) 클래스 임포트
from items import Item
# - 제품 데이터나 입력값을 객체 형태로 다루기 위한 Item 클래스
# 🧪 테스터(Tester) 클래스 임포트
from testing import Tester
# - 모델이나 함수의 성능을 테스트하는 기능을 담당
# - Tester.test(function_name, test_dataset) 형식으로 호출
✨ 요약
- Item: 입력 데이터 구조를 관리하는 클래스
- Tester: 함수 또는 모델의 예측 결과를 테스트하고 검증하는 도구
- 테스트 호출 방법:
Tester.test(함수이름, 테스트 데이터셋)
예시:
Tester.test(predict_price, sample_items)
참고:
- 테스트 패키지를 별도로 관리하면 코드가 훨씬 모듈화 되고, 유지보수가 쉬워집니다. 🔧
- 메인 로직과 테스트 로직을 깔끔하게 분리할 수 있어 프로젝트 구조가 더 프로페셔널해집니다.
🤖 OpenAI 인스턴스 생성 (Initialize OpenAI Client)
OpenAI API를 호출하기 위해 클라이언트 인스턴스를 생성합니다.
(이 인스턴스를 통해 모델에게 요청하고, 응답을 받을 수 있습니다.)
# 🤖 OpenAI 클라이언트 인스턴스 생성
openai = OpenAI()
# - 환경 변수에 등록된 OPENAI_API_KEY를 자동으로 사용하여 인증
# - 생성된 openai 인스턴스를 통해 채팅, 텍스트 생성, 파인튜닝 요청 등을 수행할 수 있음
✨ 요약
OpenAI()
를 호출하면 API 키 인증이 자동으로 이뤄집니다.- 이후에는 이
openai
인스턴스를 사용해 모델 호출이나 fine-tuning 작업을 간편하게 진행할 수 있습니다. - 추가 설정 없이 바로 사용 가능하며, 필요시 파라미터로
api_key
등을 직접 지정할 수도 있습니다.
📌 예시:
(나중에 사용하게 될 형태)
response = openai.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Hello!"}]
)
🖼️ 주피터 노트북용 그래프 설정 (Matplotlib Inline)
주피터 노트북(Jupyter Notebook)에서 그래프를 바로 출력할 수 있도록 설정합니다.
# 📈 주피터 노트북 내부에 그래프를 출력하도록 설정
%matplotlib inline
# - matplotlib으로 그린 모든 그래프가 새로운 창이 아니라
# 노트북 셀 바로 아래에 인라인으로 표시됨
# - 주피터 노트북 전용 매직 명령어(%)이기 때문에 Python 스크립트(.py) 파일에서는 사용하지 않음
✨ 요약
%matplotlib inline
은 주피터 노트북 전용 명령어입니다.- 그래프를 즉시 셀 아래에 표시해 주므로 시각화 결과를 바로 확인할 수 있습니다.
.py
파일에서는 필요하지 않고, 오직 노트북 환경에서만 사용합니다.
📌 추가 참고:
만약 다른 출력 방식이 필요하다면 아래처럼 설정할 수도 있습니다.
%matplotlib notebook
→ 인터랙티브 그래프 출력%matplotlib widget
→ 줌/팬 가능한 고급 위젯 기반 그래프 출력
💾 학습 및 검증 데이터 불러오기
시간을 절약하기 위해, 이전에 저장해 둔 학습용(train)과 테스트용(test) 데이터를 바로 불러옵니다.
(데이터를 다시 만들 필요 없이 바로 사용할 수 있습니다.)
💽 저장해둔 학습 데이터셋 불러오기
# 💽 저장해둔 학습 데이터셋 불러오기
with open('train.pkl', 'rb') as file:
train = pickle.load(file)
# - 'train.pkl' 파일을 읽기 모드(rb)로 열고
# - pickle 모듈을 사용해 train 객체로 복원
# - 학습에 사용할 데이터셋
# 💽 저장해둔 테스트 데이터셋 불러오기
with open('test.pkl', 'rb') as file:
test = pickle.load(file)
# - 'test.pkl' 파일을 읽어 test 객체로 복원
# - 모델 검증 및 평가에 사용할 데이터셋
✨ 요약
.pkl
파일은 Python 객체를 그대로 저장하는 파일 포맷입니다.- train.pkl → 모델 학습용 데이터
- test.pkl → 모델 테스트용 데이터
- 데이터를 다시 수집하거나 전처리할 필요 없이 바로 사용할 수 있어 작업 시간을 크게 절약할 수 있습니다.
📌 참고:
pickle.load(file)
은 파일 안에 저장된 Python 객체(리스트, 딕셔너리, 클래스 등)를 메모리로 복원합니다.- 주의: Pickle 파일은 신뢰할 수 없는 소스로부터 받은 경우 보안 위험이 있을 수 있습니다. (항상 안전한 파일만 로드하세요!)
🏋️ 파인튜닝용 데이터셋 구성 (Prepare Fine-tuning Dataset)
OpenAI에서는 보통 50~100개의 예시로 파인튜닝을 권장하지만,
이번에는 예시 하나하나가 작기 때문에 200개를 사용하고, 에포크는 1회만 돌립니다. 🎯
# 📚 파인튜닝 학습 데이터 준비
fine_tune_train = train[:200]
# - 전체 train 데이터 중 앞 200개를 파인튜닝 학습용으로 사용
# - 예시 하나당 데이터가 작기 때문에 평소보다 많은 수를 선택함
# 📚 파인튜닝 검증 데이터 준비
fine_tune_validation = train[200:250]
# - train 데이터 중 200~249번째까지 50개를 검증용(validation) 데이터로 사용
# - 학습 과정 중 모델의 성능을 평가하기 위해 별도로 분리
✨ 요약
- fine_tune_train: 학습에 사용할 200개의 데이터
- fine_tune_validation: 검증(validation)에 사용할 50개의 데이터
- 일반적인 가이드라인보다 많은 데이터를 사용하는 이유는 예시 하나가 작아서입니다.
- 1 epoch만 돌릴 예정이기 때문에 과적합(overfitting) 걱정도 크지 않습니다.
📌 참고:
- 파인튜닝에 사용할 데이터는 가능한 한 다양한 패턴을 포함하는 것이 중요합니다.
- 검증 데이터는 학습에 사용하지 않고, 모델이 일반화(generalization)를 잘했는지 평가하는 데 사용됩니다.
✏️ Fine-tuning용 프롬프트 구성
Frontier 모델을 위한 깔끔한 프롬프트를 준비합니다.
(직접 파인튜닝할 모델은 쉽게 문제를 만들어야 하지만, Frontier 모델은 별다른 단순화 없이 처리할 수 있습니다.)
🧹 프롬프트 최적화 및 메시지 포맷팅 (Prompt Optimization & Message Formatting)
# 🎯 Frontier 모델용 프롬프트 구성 함수
def messages_for(item):
# 🛠️ 시스템 역할 설정
system_message = "You estimate prices of items. Reply only with the price, no explanation"
# - 모델에게 가격만 간결하게 답변하도록 지시
# - 불필요한 설명 없이 숫자만 응답하도록 유도
# 🛠️ 사용자 프롬프트 생성
user_prompt = item.test_prompt().replace(" to the nearest dollar","").replace("\n\nPrice is $","")
# - 기존 프롬프트에서 "to the nearest dollar" 문구 제거
# - "Price is $" 안내문도 제거하여 더욱 깔끔한 입력 생성
# 📩 메시지 리스트 반환
return [
{"role": "system", "content": system_message}, # 시스템 지시
{"role": "user", "content": user_prompt}, # 사용자 질문
{"role": "assistant", "content": f"Price is ${item.price:.2f}"} # 정답 (소수점 둘째 자리까지)
]
✨ 요약
- system_message: 모델이 가격만 출력하도록 지시합니다.
- user_prompt: 불필요한 문구를 제거해 모델이 입력에만 집중하도록 최적화합니다.
- assistant 응답: 가격을
"Price is $xx.xx"
형태로 정확히 출력합니다.
📌 참고:
- Frontier 모델은 강력한 언어 이해 능력을 가졌기 때문에, 문제를 쉽게 만들어줄 필요가 없습니다.
- 대신 우리가 파인튜닝할 커스텀 모델은 복잡한 문장을 어려워할 수 있으므로, 별도로 단순화된 프롬프트를 사용할 예정입니다. 🧠
📩 첫 번째 학습 데이터로 메시지 생성 (Generate Messages for First Training Item)
train 데이터셋의 첫 번째 아이템을 가지고, 모델 입력용 메시지 리스트를 생성합니다.
# 📨 첫 번째 학습 데이터(train[0])를 기반으로 메시지 포맷팅
messages_for(train[0])
# - 'train' 리스트의 첫 번째 아이템을 선택
# - 이 아이템을 기반으로 시스템 메시지, 사용자 프롬프트, 정답 응답(assistant)을 구성
# - JSONL 포맷으로 저장하거나, 모델에 입력할 준비를 함
✨ 호출 결과 예시
(※ 실제 train[0]
내용에 따라 다를 수 있습니다)
[
{"role": "system", "content": "You estimate prices of items. Reply only with the price, no explanation"},
{"role": "user", "content": "This is a high-quality wireless mouse with ergonomic design and long battery life."},
{"role": "assistant", "content": "Price is $29.99"}
]
✨ 요약
train[0]
➔ 학습용 첫 번째 아이템messages_for(train[0])
➔ 해당 아이템을 대화 메시지 포맷(system, user, assistant)으로 변환- 이 포맷은 파인튜닝용 JSONL 파일에 들어가게 됩니다.
📌 추가 참고:
- 이렇게 변환된 메시지들은 OpenAI 파인튜닝 시 "messages" 필드에 그대로 들어가야 합니다.
- 이 구조를 맞추지 않으면 파인튜닝 요청 시 오류가 발생할 수 있습니다. ⚡
🔄 데이터셋을 JSONL 문자열로 변환 (Convert Dataset to JSONL Format)
학습 아이템 리스트를 OpenAI 파인튜닝용 JSONL 포맷으로 변환합니다.
(JSONL: JSON 객체를 한 줄씩 저장하는 형식)
# 🔄 아이템 리스트를 JSONL 문자열로 변환하는 함수
def make_jsonl(items):
result = ""
for item in items:
# 📨 각 아이템을 메시지 포맷으로 변환
messages = messages_for(item)
# 📦 메시지 리스트를 JSON 문자열로 변환
messages_str = json.dumps(messages)
# 🧩 "messages" 키에 메시지 리스트를 담아 한 줄 JSON 객체로 구성
result += '{"messages": ' + messages_str + '}\n'
# 📋 최종적으로 생성된 JSONL 문자열 반환
return result.strip()
✨ 요약
- make_jsonl(items) 함수는 여러
Item
객체들을 받아 JSONL 문자열로 변환합니다. - 변환 규칙:
- 각 줄(row)이 하나의 학습 데이터 예시를 나타냅니다.
- 각 예시는
"messages"
키 아래 시스템, 사용자, 어시스턴트 역할을 가진 대화 배열을 가집니다.
- 생성된 JSONL 문자열은 나중에 파일로 저장하여 OpenAI 파인튜닝 API에 업로드할 수 있습니다.
📌 JSONL 포맷 구조 예시
(파일로 저장되면 이런 식으로 한 줄에 하나의 JSON 객체가 들어갑니다)
{"messages": [{"role": "system", "content": "You estimate prices of items. Reply only with the price, no explanation"}, {"role": "user", "content": "This is a high-quality wireless mouse."}, {"role": "assistant", "content": "Price is $29.99"}]}
{"messages": [{"role": "system", "content": "You estimate prices of items. Reply only with the price, no explanation"}, {"role": "user", "content": "A lightweight camping tent for two people."}, {"role": "assistant", "content": "Price is $89.00"}]}
...
🖨️ JSONL 문자열 미리 보기 (Preview JSONL Output)
train 데이터셋 중 앞 3개 항목을 JSONL 포맷으로 변환하고, 그 결과를 출력합니다.
(파일로 저장하기 전에 데이터 구조가 잘 만들어졌는지 확인하는 과정입니다.)
# 🖨️ 학습 데이터 앞 3개를 JSONL 형식으로 변환 후 출력
print(make_jsonl(train[:3]))
# - train 리스트에서 처음 3개의 아이템만 선택
# - make_jsonl 함수를 사용해 JSONL 문자열로 변환
# - 변환 결과를 화면에 출력해 포맷이 정상적인지 확인
✨ 출력 예시
(※ 실제 데이터에 따라 다를 수 있습니다)
{"messages": [{"role": "system", "content": "You estimate prices of items. Reply only with the price, no explanation"}, {"role": "user", "content": "High-quality wireless mouse with ergonomic design."}, {"role": "assistant", "content": "Price is $29.99"}]}
{"messages": [{"role": "system", "content": "You estimate prices of items. Reply only with the price, no explanation"}, {"role": "user", "content": "Durable stainless steel water bottle with insulation."}, {"role": "assistant", "content": "Price is $19.50"}]}
{"messages": [{"role": "system", "content": "You estimate prices of items. Reply only with the price, no explanation"}, {"role": "user", "content": "Set of professional-grade paint brushes."}, {"role": "assistant", "content": "Price is $15.00"}]}
✨ 요약
train[:3]
➔ 학습 데이터 중 3개 샘플만 추출make_jsonl(train[:3])
➔ 이 3개를 JSONL 형식으로 변환print()
➔ 변환된 결과를 눈으로 확인- 데이터가 JSON 포맷 + 1줄 1 객체 형식으로 잘 정리됐는지 사전 점검할 수 있습니다.
📌 참고
- JSONL 포맷은 "한 줄 = 하나의 학습 예시"입니다.
- 만약 출력 중 괄호나 큰따옴표가 어긋나 있으면, OpenAI 업로드 시 에러가 발생합니다! 그래서 이렇게 출력 미리 보기를 꼭 해주는 게 좋습니다. 🔍
💾 아이템 리스트를 JSONL 파일로 저장하기 (Save Items as JSONL File)
아이템 리스트를 JSONL 포맷으로 변환한 후, 지정한 파일에 저장합니다.
(파인튜닝을 위해 파일로 준비하는 단계입니다.)
# 📄 아이템 리스트를 JSONL 포맷으로 변환하고 파일에 저장하는 함수
def write_jsonl(items, filename):
# ✍️ 파일을 쓰기 모드("w")로 열기
with open(filename, "w") as f:
# 🔄 아이템 리스트를 JSONL 문자열로 변환
jsonl = make_jsonl(items)
# 💾 파일에 변환된 JSONL 문자열을 기록
f.write(jsonl)
✨ 설명
items
: 저장할 데이터 리스트 (예: fine_tune_train, fine_tune_validation 등)filename
: 생성할 파일 이름 (예:"fine_tune_train.jsonl"
)make_jsonl(items)
: 아이템 리스트를 한 줄마다 하나의 JSON 객체를 갖는 JSONL 문자열로 변환합니다.- 변환된 문자열을 지정한 파일에 기록하여, 이후 OpenAI API에 업로드할 수 있도록 준비합니다.
💾 파인튜닝 학습 데이터를 JSONL 파일로 저장 (Save Fine-tuning Training Data as JSONL)
파인튜닝에 사용할 학습 데이터(fine_tune_train)를 JSONL 파일로 저장합니다.
# 💾 fine_tune_train 데이터를 JSONL 파일로 저장
write_jsonl(fine_tune_train, "fine_tune_train.jsonl")
# 📝 작동 과정:
# - fine_tune_train 리스트를 JSONL 포맷 문자열로 변환
# - "fine_tune_train.jsonl" 파일을 새로 만들거나 덮어쓴 뒤
# - 변환된 JSONL 문자열을 파일에 기록
✨ 설명
fine_tune_train
: 앞서 200개로 구성한 파인튜닝용 학습 데이터입니다.write_jsonl(...)
함수: 아이템 리스트를 JSONL 문자열로 변환한 뒤 파일에 저장하는 역할을 합니다.- 결과로 생성된
fine_tune_train.jsonl
파일은 OpenAI 파인튜닝 API에 업로드할 준비가 된 상태입니다.
💾 파인튜닝 검증 데이터를 JSONL 파일로 저장 (Save Fine-tuning Validation Data as JSONL)
파인튜닝 과정 중 모델 평가에 사용할 검증 데이터(fine_tune_validation)를 JSONL 파일로 저장합니다.
# 💾 fine_tune_validation 데이터를 JSONL 파일로 저장
write_jsonl(fine_tune_validation, "fine_tune_validation.jsonl")
# 📝 작동 과정:
# - fine_tune_validation 리스트를 JSONL 포맷 문자열로 변환
# - "fine_tune_validation.jsonl" 파일을 새로 만들거나 덮어쓴 뒤
# - 변환된 JSONL 문자열을 파일에 기록
✨ 설명
fine_tune_validation
: 앞서 50개로 구성한 검증(validation)용 데이터입니다.write_jsonl(...)
함수: 검증용 데이터도 학습 데이터와 동일한 포맷(JSONL)으로 저장합니다.- 생성된
fine_tune_validation.jsonl
파일은 파인튜닝할 때 validation_file 옵션으로 사용됩니다.
☁️ 학습 데이터 파일을 OpenAI에 업로드 (Upload Training File to OpenAI)
로컬에 저장한 fine_tune_train.jsonl 파일을 OpenAI 서버에 업로드합니다.
(업로드된 파일은 이후 파인튜닝 요청 시 사용됩니다.)
# 📤 fine_tune_train.jsonl 파일을 열어 OpenAI 서버에 업로드
with open("fine_tune_train.jsonl", "rb") as f:
train_file = openai.files.create(file=f, purpose="fine-tune")
# 📝 작동 과정:
# - "fine_tune_train.jsonl" 파일을 바이너리 읽기 모드("rb")로 엽니다.
# - openai.files.create() 함수를 사용해 파일을 OpenAI에 업로드합니다.
# - purpose="fine-tune" 설정을 통해 이 파일이 파인튜닝용 데이터임을 명시합니다.
# - 업로드가 완료되면 파일 정보를 담은 객체(train_file)를 반환받습니다.
✨ 설명
with open(..., "rb")
: 파일을 바이너리 모드로 읽어야 API 업로드가 가능합니다.openai.files.create(...)
: 파일을 OpenAI 서버에 업로드하는 함수입니다.purpose="fine-tune"
: 이 파일을 "모델 파인튜닝용"으로 사용할 것임을 지정합니다.- 반환된
train_file
객체에는 파일 ID, 파일명, 상태 등이 담겨 있습니다. (추후 파인튜닝 요청 시 필요)
📂 업로드된 학습 파일 객체 (Uploaded Training File Object)
fine_tune_train.jsonl 파일을 OpenAI에 업로드한 결과로 생성된 파일 객체입니다.
# 📂 업로드된 학습 파일 정보
train_file
# - openai.files.create() 호출 결과로 생성된 객체
# - 업로드된 파일의 메타데이터(파일 ID, 파일명, 상태 등)를 포함
✨ 설명
train_file
은 OpenAI 서버에 업로드된 파일을 나타내는 객체입니다.- 이 객체 안에는 여러 가지 중요한 정보가 들어 있습니다:
- id: 업로드된 파일의 고유 ID (파인튜닝 시작할 때 필요)
- filename: 업로드한 파일 이름 (예: "fine_tune_train.jsonl")
- purpose: 파일 목적 ("fine-tune"으로 설정됨)
- status: 업로드 성공 여부 ("processed"가 정상 상태)
📋 예시: train_file 객체 내용
(실제로 출력하면 이런 형태가 나옵니다)
{
"id": "file-abc123xyz456",
"object": "file",
"bytes": 23456,
"created_at": 1710000000,
"filename": "fine_tune_train.jsonl",
"purpose": "fine-tune",
"status": "processed"
}
🔔 주의
train_file.id
값을 잘 보관해두어야 합니다.- 이후 파인튜닝을 시작할 때 file ID를 지정해야 합니다!
☁️ 검증 데이터 파일을 OpenAI에 업로드 (Upload Validation File to OpenAI)
fine_tune_validation.jsonl 파일을 OpenAI 서버에 업로드하여, 파인튜닝 시 검증 데이터로 사용할 준비를 합니다.
# 📤 fine_tune_validation.jsonl 파일을 열어 OpenAI 서버에 업로드
with open("fine_tune_validation.jsonl", "rb") as f:
validation_file = openai.files.create(file=f, purpose="fine-tune")
# 📝 작동 과정:
# - "fine_tune_validation.jsonl" 파일을 바이너리 읽기 모드("rb")로 엽니다.
# - openai.files.create()를 호출하여 파일을 OpenAI에 업로드합니다.
# - purpose="fine-tune"을 지정해 이 파일이 검증용 데이터임을 명시합니다.
# - 업로드가 완료되면 파일 정보를 담은 객체(validation_file)를 반환받습니다.
✨ 설명
fine_tune_validation.jsonl
: 파인튜닝 중 모델 성능을 평가할 때 사용할 검증 데이터 파일입니다.openai.files.create(...)
:- 파일을 OpenAI 서버에 업로드합니다.
purpose="fine-tune"
로 설정하면 validation_file로 지정할 수 있습니다.
- 반환된
validation_file
객체는 파일 ID, 파일명, 상태 등의 정보를 포함합니다.
📂 업로드된 검증 파일 객체 (Uploaded Validation File Object)
fine_tune_validation.jsonl 파일을 OpenAI에 업로드한 결과로 생성된 파일 객체입니다.
# 📂 업로드된 검증 파일 정보
validation_file
# - openai.files.create() 호출 결과로 생성된 객체
# - 업로드된 검증 데이터 파일의 메타데이터를 포함
✨ 설명
validation_file
은 OpenAI 서버에 업로드된 검증용 데이터 파일을 나타내는 객체입니다.- 이 객체에는 다음과 같은 중요한 정보가 들어 있습니다:
- id: 업로드된 파일의 고유 ID (파인튜닝 시 validation_file 옵션에 필요)
- filename: 업로드한 파일 이름 (예:
"fine_tune_validation.jsonl
") - purpose:
"fine-tune"
(파인튜닝용으로 업로드된 파일) - status:
"processed"
(정상 업로드 완료 상태)
📋 예시: validation_file 객체 출력 결과
(실제로 출력하면 이런 형태가 나옵니다)
{
"id": "file-xyz789abc123",
"object": "file",
"bytes": 5678,
"created_at": 1710001111,
"filename": "fine_tune_validation.jsonl",
"purpose": "fine-tune",
"status": "processed"
}
🔔 주의
validation_file.id
값을 반드시 기억해둬야 합니다.- 파인튜닝 시작할 때 validation_file 옵션에 반드시 이 ID를 넘겨야 합니다.
'🧠 LLM 엔지니어링' 카테고리의 다른 글
Fine-tuned GPT-4o-mini를 이용한 제품 가격 예측 모델 구축 가이드 03 (2) | 2025.05.06 |
---|---|
Fine-tuned GPT-4o-mini를 이용한 제품 가격 예측 모델 구축 가이드 02 (0) | 2025.05.05 |
제품 설명 기반 가격 예측 실험: Frontier 모델 테스트 (1) | 2025.05.03 |
자연어 처리 기반 가격 예측 모델 개발💸 (BOW vs Word2Vec vs RF) 02 (0) | 2025.05.02 |
자연어 처리 기반 가격 예측 모델 개발💸 (BOW vs Word2Vec vs RF) 01 (1) | 2025.05.01 |