📝 개요
이 글에서는 제품 설명 텍스트만을 입력받아
가격을 예측하는 Fine-tuned GPT-4o-mini 모델을 구축하는 과정을 다룹니다.
데이터 준비부터 모델 파인튜닝,
완성된 모델 테스트까지 전 과정을 코드와 함께 실습하며,
Weights & Biases를 이용한 학습 모니터링과 모델 성능 평가 방법도 소개합니다.
주요 목표:
- 제품 설명을 기반으로 가격을 추론하는 맞춤형 GPT 모델 만들기
- OpenAI Fine-tuning API 실습
- 학습 진행 상황을 Weights & Biases로 실시간 추적
- Fine-tuned 모델을 활용해 테스트 및 성능 평가하기
💵 문자열에서 가격 숫자만 추출하는 유틸리티 함수 (Utility Function to Extract Price)
모델이 응답한 문자열에서 가격 숫자만 뽑아내는 간단한 도구 함수입니다.
# 💵 문자열에서 가격(숫자)만 추출하는 함수
def get_price(s):
# 🧹 문자열에서 '$' 기호와 ',' 쉼표 제거
s = s.replace('$','').replace(',','')
# 🔍 정규식을 사용해 숫자 패턴 검색
match = re.search(r"[-+]?\d*\.\d+|\d+", s)
# 🎯 숫자가 발견되면 float 타입으로 변환해 반환
# 🎯 없으면 기본값 0 반환
return float(match.group()) if match else 0
✨ 설명
- 모델이 응답할 때 보통
"Price is $29.99"
처럼 문장 안에 숫자가 포함되어 있습니다. get_price()
함수는 이 문장에서 숫자 부분만 깨끗하게 추출해줍니다.$
,,
같은 기호를 제거하고,
정규식(Regex)을 이용해 실수(29.99) 또는 정수(30) 형태의 숫자를 찾아 반환합니다.- 만약 숫자를 찾지 못하면 기본값
0
을 반환합니다.
🔔 참고
- 이 함수는 모델이 일관된 포맷으로 가격을 답하지 않아도 유연하게 숫자만 추출할 수 있습니다.
- 학습 평가나, 모델 예측값과 실제값 비교(MAE, RMSE 등 계산)할 때 필수로 사용됩니다.
🧪 문자열에서 가격 추출 테스트 (Test Price Extraction from String)
문장 속에 포함된 가격 숫자($99.99)를 get_price()
함수로 추출해봅니다.
# 🧪 예시 문장에서 가격만 추출
get_price("The price is roughly $99.99 because blah blah")
# 📝 작동 과정:
# - 문자열 내 '$'와 ','를 제거합니다.
# - 정규식을 이용해 가장 먼저 등장하는 숫자 패턴(여기서는 99.99)을 검색합니다.
# - 숫자를 float(부동소수점) 타입으로 변환해 반환합니다.
✨ 결과
99.99
입력 문장에 다른 텍스트가 포함되어 있어도, "$99.99" 부분만 정확히 추출해서 99.99라는 숫자로 반환합니다.
🔔 참고
- 만약 문장에 여러 숫자가 있다면,
get_price()
는 가장 먼저 등장하는 숫자를 추출합니다. - 가격 외의 숫자가 먼저 나오는 경우를 조심해야 합니다. (필요하면 함수 개선 가능)
🧪 Fine-tuned 모델 테스트 및 예측
🤖 파인튜닝된 GPT-4o-mini 모델을 이용한 가격 예측 함수 (Function for gpt-4o-mini Fine-tuned Model)
Fine-tuned 모델에 입력 아이템을 보내 가격을 예측하고, 숫자 값으로 반환하는 함수입니다.
# 🤖 Fine-tuned GPT-4o-mini 모델을 이용해 가격 예측하는 함수
def gpt_fine_tuned(item):
# 📤 Fine-tuned 모델에 메시지를 보내 응답 받기
response = openai.chat.completions.create(
model=fine_tuned_model_name, # 사용할 fine-tuned 모델 이름
messages=messages_for(item), # 입력 item을 기반으로 만든 메시지 포맷 전달
seed=42, # 결과 재현성을 위한 랜덤 시드 고정
max_tokens=7 # 응답 최대 길이 제한 (가격 숫자만 기대)
)
# 📥 응답 텍스트 추출
reply = response.choices[0].message.content
# 💵 응답에서 가격 숫자만 추출
return get_price(reply)
✨ 설명
openai.chat.completions.create()
를 호출해 Fine-tuned 모델에 메시지를 보냅니다.- 모델은
"Price is $29.99"
처럼 응답할 것으로 예상합니다. - 응답 텍스트에서 get_price() 함수를 사용해 숫자만 추출해 결과로 반환합니다.
- seed를 고정해 항상 같은 입력에 같은 출력을 기대할 수 있도록 설정했습니다.
- max_tokens=7은 가격 응답이 짧을 것으로 예상하고 응답 길이를 제한하여 효율성을 높입니다.
📋 전체 흐름
단계 | 설명 |
---|---|
1 | 입력 아이템(item)으로부터 프롬프트 생성 |
2 | Fine-tuned 모델에게 프롬프트 전송 |
3 | 모델 응답(reply) 받기 |
4 | 응답에서 가격 숫자 추출 후 반환 |
🔔 참고
- 이 함수는 하나의 item에 대해 모델 예측 가격을 수치(float) 로 반환합니다.
- 여러 아이템에 대해 반복 호출하면, Fine-tuned 모델의 예측 성능을 평가할 수 있습니다.
seed
와max_tokens
설정은 원하는 대로 조정할 수 있습니다.
🧪 실제 가격 vs 예측 가격 비교 (Compare True Price vs Predicted Price)
테스트 데이터셋의 첫 번째 아이템에 대해 실제 가격과 모델 예측 가격을 각각 출력합니다.
# 🏷️ 테스트 데이터셋 첫 번째 아이템의 실제 가격 출력
print(test[0].price)
# 🤖 Fine-tuned 모델이 예측한 가격 출력
print(gpt_fine_tuned(test[0]))
✨ 설명
test[0].price
:- 테스트 데이터셋에서 0번째 아이템의 정답(실제 가격) 을 출력합니다.
gpt_fine_tuned(test[0])
:- Fine-tuned GPT-4o-mini 모델을 이용해 입력 item에 대한 예측 가격을 출력합니다.
📋 예시 출력
(예를 들어 test[0]
가 "무선 마우스"였다고 가정하면)
29.99 # 실제 정답 가격
30.12 # Fine-tuned 모델이 예측한 가격
🔔 참고
- 이 비교를 통해 Fine-tuned 모델이 실제 가격에 얼마나 가깝게 예측했는지를 바로 확인할 수 있습니다.
- 여러 데이터에 대해 반복하면 모델의 평균 오차(MAE)나 성능 지표를 계산할 수 있습니다.
📝 테스트 데이터에서 프롬프트 생성 확인 (Print Test Prompt from Item)
테스트 데이터셋의 첫 번째 아이템에 대해, 프롬프트로 사용될 텍스트를 확인합니다.
# 📝 테스트 데이터셋 0번째 항목에서 프롬프트 생성 결과 출력
print(test[0].test_prompt())
# 📝 작동 과정:
# - test[0]: 테스트 데이터 리스트에서 첫 번째 아이템 선택
# - .test_prompt(): 이 아이템에 대해 학습/테스트용 프롬프트 텍스트를 생성하는 메서드 호출
# - 생성된 프롬프트를 출력
✨ 설명
test[0]
는 테스트 데이터셋에서 첫 번째 항목입니다..test_prompt()
는 이 항목을 기반으로,
모델에게 줄 입력(prompt) 을 문자열 형태로 만들어주는 메서드입니다.- 보통 제품 설명 문장과 가격 관련 문장이 포함되어 있을 가능성이 높습니다.
📋 예시 출력
만약 test[0]
이 "Wireless Bluetooth Earbuds" 제품이라면, 출력은 이런 형태일 수 있습니다:
Wireless Bluetooth earbuds with noise cancelling and long battery life, to the nearest dollar
Price is $
- 첫 줄: 제품 설명
- 두 번째 줄: 가격 입력을 유도하는 문장 ("Price is $")
🔔 참고
- 이후
messages_for(item)
함수에서는.test_prompt()
를 기반으로 일부 문구를 제거(clean)해서 실제 모델 입력 메시지를 구성합니다. .test_prompt()
결과를 직접 확인하면,
모델에게 어떤 형태로 질문을 던지는지 이해할 수 있어서
Fine-tuning 데이터 품질 점검에도 매우 중요합니다.
🧪 Fine-tuned 모델 성능 테스트 실행 (Run Fine-tuned Model Evaluation)
테스트 데이터셋 전체에 대해 Fine-tuned 모델로 가격을 예측하고, 성능을 평가합니다.
# 🧪 Fine-tuned 모델을 테스트 데이터셋에 대해 평가
Tester.test(gpt_fine_tuned, test)
# 📝 작동 과정:
# - gpt_fine_tuned 함수: 하나의 item에 대해 가격을 예측하는 함수
# - test 데이터셋: 테스트용 아이템들의 리스트
# - Tester.test(): 각 아이템에 대해 gpt_fine_tuned를 호출하고, 예측값을 수집하여 전체 성능 평가
✨ 설명
Tester.test(모델 함수, 테스트 데이터)
는 다음을 수행합니다:- 테스트셋의 각 아이템에 대해
gpt_fine_tuned(item)
호출 - 모델이 예측한 가격과 실제 가격을 비교
- 전체 데이터에 대한 평가 지표(예: 평균 절대 오차 MAE)를 계산
- 테스트셋의 각 아이템에 대해
- 이 과정을 통해 Fine-tuned 모델이 실제로 얼마나 정확한지 객관적으로 평가할 수 있습니다.
📋 기대 결과
(구현된 Tester 클래스에 따라 다르지만 일반적으로)
Mean Absolute Error (MAE): 7.32
Median Absolute Error: 4.95
- MAE: 모델이 평균적으로 실제 가격과 몇 달러 차이 나는지를 보여줍니다.
- Median Error: 에러의 중앙값을 보여줘서, 극단적인 값에 덜 민감합니다.
🔔 참고
- 평가 지표가 낮을수록 (오차가 작을수록) 모델 성능이 좋습니다.
- 만약 오차가 너무 크다면, 데이터 품질이나 Fine-tuning 파라미터(
n_epochs
,training size
등)를 조정해야 합니다.
'🧠 LLM 엔지니어링' 카테고리의 다른 글
Fine-tuned GPT-4o-mini를 이용한 제품 가격 예측 모델 구축 가이드 02 (0) | 2025.05.05 |
---|---|
Fine-tuned GPT-4o-mini를 이용한 제품 가격 예측 모델 구축 가이드 01 (0) | 2025.05.04 |
제품 설명 기반 가격 예측 실험: 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 |