반응형

이전 글에 GPT 파인 튜닝 하는 방법을 작성했었습니다. 이번에는 파인 튜닝한 모델을 불러와서 데이터에 적용하고, 엑셀 결과물을 만들어내는 방법을 알아보겠습니다.

 

[GPT] 파인튜닝(Fine tuning) 하는 방법, 파이썬 코드

GPT를 제대로 활용하기 위해 파인튜닝 하는 과정을 거쳐야하는데요, 오늘은 xlsx, csv 파일을 업로드해서 GPT 파인튜닝 하는 법을 알아보도록 하겠습니다. 하기 전에 API 발급은 필수이므로 API 발급

combee.tistory.com


1. 기본 구성 이해하기

open ai 공식 문서에 따른 기본 구성은 아래와 같습니다. 

먼저 모델을 적용할 데이터를 불러오고, 시스템 메시지와 유저 메시지를 보냅니다. 

test_df = recipe_df.loc[201:300] # 모델 적용할 데이터 불러오기
test_row = test_df.iloc[0]
test_messages = []

# 시스템 메시지(역할) 보내기
test_messages.append({"role": "system", "content": system_message})

# 유저 메시지(요청 내용 = test_message) 보내기
user_message = create_user_message(test_row)
test_messages.append({"role": "user", "content": create_user_message(test_row)})

pprint(test_messages)

실제로 보내는 내용은 아래와 같습니다.(pprint 결과)

기본 구성 이해하기
기본 구성 이해하기

다음으로 GPT에 응답을 요청합니다. 요청할 때는 아래의 fine_tuned_model_id로 정의되어 있는 파인튜닝된 모델이 필요합니다. 

# 답변 요청
response = client.chat.completions.create(
    model=fine_tuned_model_id, messages=test_messages, temperature=0, max_tokens=500
)
print(response.choices[0].message.content)

요청을 보내면 아래와 같이 답변이 생성됩니다.

답변 생성
답변 생성

그럼 이제 코드 작성을 시작해보도록 하겠습니다.

2. 코드 작성

작성할 코드 흐름은 아래와 같습니다. csv로 된 파일을 불러와서 해당 파일의 title과 summary를 파인튜닝 모델에 던져서 답변해달라고 요청하겠습니다. 그리고 데이터 프레임으로 결과를 생성하고, 엑셀(xlsx)로 최종 산출물을 뽑아보겠습니다.

코드 작성의 흐름
코드 작성의 흐름

2-1. 데이터 불러오기 및 정보 입력

저는 불러올 파일의 컬럼을 title, summary로 구성했습니다. 본인 가지고 있는 API 키를 입력해주시면 되고, 파인튜닝 모델도 입력해주시면 됩니다. 

import json
import openai
import os
import pandas as pd
from pprint import pprint

# 적용 파일 읽기(제목 = title, 내용 = summary으로 구성)
input_df = pd.read_csv("data/input_data.csv", encoding="utf-8-sig")

# api key 입력
client = openai.OpenAI(api_key=os.environ.get("OPENAI_API_KEY", "본인 API키를 여기 입력해주세요."))

# 파인 튜닝 모델 입력
fine_tuned_model_id = "파인튜닝 모델을 입력해주세요."

# input_df.head(1)

<파인튜닝 모델 찾는 법>

open ai api로 들어가셔서 fine tuning에 들어가보시면 생성한 모델이 있습니다. 클릭하시면 오른쪽에 빨간색으로 표시된 부분이 모델명이니 해당 부분 복사해서 fine_tuned_model_id에 입력해주시면 됩니다.

모델 찾기
모델 찾기

2-2. 프롬프트 구성

프롬프트 구성에 대해서는 전 글에서 설명드렸으니 참고해서 입력해주시면 됩니다. 위에서 말씀드린 것 처럼 저는 컬럼을 title, summary로 적용했습니다. 혹시 바꾸실 분들은 바꿔주세요.

# 프롬프트 구성
system_message = "You are an assistant who extracts breakdowns for iphone. Please keyword extract which breakdowns are in each data."

def create_user_message(row):
    return f"""Title: {row['title']}\n\summary: {row['summary']}\n\nGeneric ingredients: """

def prepare_example_conversation(row):
    messages = []
    messages.append({"role": "system", "content": system_message})

    user_message = create_user_message(row)
    messages.append({"role": "user", "content": user_message})

    return {"messages": messages}

2-3. 데이터 프레임에 대해 반복 적용

생성된 프롬프트를 반복문으로 파인튜닝 모델에 던지고 응답을 받아서, 새로운 결과물 데이터프레임을 생성하는 코드입니다. 그 후 결과물 데이터프레임을 엑셀로 저장하면 완료됩니다. 

# 코드 초기화
output_data= []
input_messages = []

# 데이터프레임의 각 행에 대해 반복
for i in range(len(input_df)):
    try:
        # 시스템 메시지 생성
        system_message = f"현재 행: {i+1}"

        # 사용자 메시지 생성
        user_message = create_user_message(input_df.iloc[i])

        # 메시지 리스트를 초기화하여 새로운 메시지 리스트 생성
        input_messages = []

        # 시스템 메시지 추가
        input_messages.append({"role": "system", "content": system_message})

        # 사용자 메시지 추가
        input_messages.append({"role": "user", "content": user_message})

        # 답변 생성
        response = client.chat.completions.create(
            model=fine_tuned_model_id, messages=input_messages, temperature=0, max_tokens=500
        )

        # 답변을 리스트에 저장
        output_data.append({
            "index": i+1,
            "title": input_df.iloc[i]['title'],
            "summary": input_df.iloc[i]['summary'],
            "response": response.choices[0].message.content
        })

    except Exception as e:
        print(f"오류 발생: {e}")

# 리스트를 데이터프레임으로 변환
output_df = pd.DataFrame(output_data)

# 엑셀 파일로 저장
output_df.to_excel("data/output_data.xlsx", index=False)

이렇게 하면 index / title / summary / response(GPT가 준 응답) 4개의 컬럼으로 구성되어 있는 결과물이 생성됩니다. 


함께 보면 좋은 글)

GPT API KEY 발급 받기

 

[GPT] GPT API 키 발급 받기, 리미트 지정하는 방법

GPT의 API를 발급 받고 결제 제한 지정하는 방법에 대해서 알아보겠습니다. 발급 받은 API Key를 이용해서 파인튜닝 하는 코드 및 방법은 아래 링크에서 확인해주세요. [GPT] 파인튜닝(Fine tuning) 하는

combee.tistory.com

GPT FINE TUNING 하는 방법

 

[GPT] 파인튜닝(Fine tuning) 하는 방법, 파이썬 코드

GPT를 제대로 활용하기 위해 파인튜닝 하는 과정을 거쳐야하는데요, 오늘은 xlsx, csv 파일을 업로드해서 GPT 파인튜닝 하는 법을 알아보도록 하겠습니다. 하기 전에 API 발급은 필수이므로 API 발급

combee.tistory.com

 

반응형
반응형

GPT를 제대로 활용하기 위해 파인튜닝 하는 과정을 거쳐야하는데요, 오늘은 xlsx, csv 파일을 업로드해서 GPT 파인튜닝 하는 법을 알아보도록 하겠습니다. 하기 전에 API 발급은 필수이므로 API 발급 받는 법은 아래 링크에서 확인해주세요.

 

[GPT] GPT API 키 발급 받기, 리미트 지정하는 방법

GPT의 API를 발급 받고 결제 제한 지정하는 방법에 대해서 알아보겠습니다. 1. openai 접속 gpt로 접속하는게 아니라 openai 홈페이지로 접속해야 합니다. https://openai.com/ OpenAI Creating safe AGI that benefits al

combee.tistory.com


진행할 순서는 아래와 같습니다.

진행 순서
진행 순서

1. open ai 라이브러리 설치

pip install openai로 라이브러리를 설치해줍니다.

 

2. 코드 입력

필요한 라이브러리 불러와주고 발급받은 api key 입력해줍니다. 아래의 본인 api key 입력해주세요. 부분에 입력하시면 됩니다.

import json
import openai
import os
import pandas as pd
from pprint import pprint

# api key 입력
client = openai.OpenAI(api_key=os.environ.get("OPENAI_API_KEY", "본인 API Key 입력해주세요."))

저는 csv 파일 데이터를 업로드해서 학습시킬 것이기 때문에, 파일 불러와줍니다.

# raw
iphone_df = pd.read_csv("C:/Users/Desktop/iphone.csv", encoding = "utf-8-sig")

이제부터 프롬프트를 입력해줄건데요. 먼저 프롬프트 구성에 대해 알아야해서 설명해드리겠습니다.

GPT 관련 공식 문서에서 가져온 자료인데요. 아래에 보면 크게 역할(role)이 system, user, assistant로 나눠져있고, 각 역할의 내용은 아래와 같습니다.

  • system: 시스템의 역할에 대한 정의. "너는 무엇을 해주는 어시스턴트다." "너는 키워드를 추출하는 모델이야." 처럼 목적을 정의해준다
  • user: 사용자(나)가 입력하는 질문
  • assistant: user에 대한 답

프롬프트 구성
프롬프트 구성

이렇게 system, user, assistant에 대한 데이터를 준비해서 학습데이터로 던져줘야 모델이 잘 학습할 수 있습니다.

그래서 아래의 코드를 보면 저는 system_message에 "너는 아이폰 고장 키워드를 추출해주는 도우미야. ..." 처럼 입력했습니다. 제가 업로드한 csv 파일에는 user에 해당하는 질문 데이터와, assistant에 해당하는 답변 데이터가 들어있습니다.

기본적인 프롬프트 구성에 대한 설명은 끝났고 아래의 코드를 수정해서 입력해주시면 됩니다.

# 프롬프트 구성
training_data = []

system_message = "You are an assistant who extracts breakdowns for iphones. Please keyword extract which breakdowns are in each data."

def create_user_message(row):
    return f"""Title: {row['title']}\n\summary: {row['summary']}\n\nGeneric ingredients: """

def prepare_example_conversation(row):
    messages = []
    messages.append({"role": "system", "content": system_message})

    user_message = create_user_message(row)
    messages.append({"role": "user", "content": user_message})

    messages.append({"role": "assistant", "content": row["breakdown"]})

    return {"messages": messages}

pprint(prepare_example_conversation(iphone_df.iloc[0]))

다음은 학습 데이터를 생성, 저장, 업로드 하는 과정입니다. 주석 모두 붙여뒀으니 어렵지 않게 이해하실 수 있을겁니다. 정상적으로 코드를 돌렸다면 training file id가 출력될겁니다.

# 학습 데이터 생성
# use the first n rows of the dataset for training
training_df = iphone_df.loc[0:39]

# apply the prepare_example_conversation function to each row of the training_df
training_data = training_df.apply(prepare_example_conversation, axis=1).tolist()
    
# 학습 데이터를 파일로 저장
def write_jsonl(data_list: list, filename: str) -> None:
    with open(filename, "w") as out:
        for ddict in data_list:
            jout = json.dumps(ddict) + "\n"
            out.write(jout)

training_file_name = "iphone_finetune_training.jsonl"
write_jsonl(training_data, training_file_name)

# 학습 데이터 업로드
with open(training_file_name, "rb") as training_fd:
    training_response = client.files.create(
        file=training_fd, purpose="fine-tune"
    )

training_file_id = training_response.id
print("Training file ID:", training_file_id)

이제 파인 튜닝을 실행하는 코드를 작성해줍니다. 저는 테스트용으로 데이터를 40건 정도밖에 안 넣었는데도 시간이 좀 걸리네요. 혹시 저보다 큰 용량 넣으셨으면 한참 걸리실 것으로 보입니다.

# 파인 튜닝 실행
response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    model="gpt-3.5-turbo",
    suffix="iphone-ner",
)

job_id = response.id

print("Job ID:", response.id)
print("Status:", response.status)

걸리시는 동안 작업상태(진행 중, 완료)를 확인하고 싶으시면 아래의 코드를 입력해보시거나, GPT API 홈페이지로 이동하셔서 확인하실 수 있습니다.

# 작업 상태 확인
response = client.fine_tuning.jobs.retrieve(job_id)

print("Job ID:", response.id)
print("Status:", response.status)
print("Trained Tokens:", response.trained_tokens)

파인 튜닝 작업이 완료되면 아래와 같이 succeeded로 나옵니다.

3. 결과 확인 및 비용

구체적 결과 확인은 GPT API 홈페이지에서 할 수 있습니다. 홈에서 파인튜닝 메뉴로 가면 파인튜닝 정보가 나타납니다. 그래프 밑으로 스크롤을 내려보면 시간도 나오는데 저는 40건의 데이터를 학습시키는데 7분 정도가 소요되었네요.

결과 확인
결과 확인

비용은 Usage 메뉴에서 확인할 수 있습니다. 저 같은 경우는 40건의 데이터를 학습시키는데 0.22달러가 들었습니다.

소요 비용
소요 비용

생성한 파인튜닝 모델을 사용하는 방법은 아래에서 확인해주세요.

 

[GPT] 파인튜닝 모델로 엑셀 결과물 생성하기

이전 글에 GPT 파인 튜닝 하는 방법을 작성했었습니다. 이번에는 파인 튜닝한 모델을 불러와서 데이터에 적용하고, 엑셀 결과물을 만들어내는 방법을 알아보겠습니다. [GPT] 파인튜닝(Fine tuning) 하

combee.tistory.com

 


함께 보면 좋은 글) 옵시디언, GPT로 AI 메모하기

 

[옵시디언] 메모에 AI(GPT)를 적용해보자 smart connections

저는 옵시디언을 이용해서 주로 메모 및 정리를 하는데요. 옵시디언에 smart connections라는 플러그인이 있어서 한 번 사용해보고, 사용방법도 정리해보도록 하겠습니다. 1. 설치 방법 커뮤니티 플

combee.tistory.com

 

반응형

+ Recent posts