🧠 LLM 엔지니어링

Fine-tuned GPT-4o-mini를 이용한 제품 가격 예측 모델 구축 가이드 01

개발자 린다씨 2025. 5. 4. 14:36
반응형

📝 개요

이 글에서는 제품 설명 텍스트만을 입력받아
가격을 예측하는 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_fileOpenAI 서버에 업로드된 파일을 나타내는 객체입니다.
  • 이 객체 안에는 여러 가지 중요한 정보가 들어 있습니다:
    • 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_fileOpenAI 서버에 업로드된 검증용 데이터 파일을 나타내는 객체입니다.
  • 이 객체에는 다음과 같은 중요한 정보가 들어 있습니다:
    • 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를 넘겨야 합니다.
반응형