RAG방식을 선택하기 까지의 기록
처음엔 데이터를 크롤링해서 학습시키라는 지시가 있었음
GPT를 학습시키는 방법을 공부하다 보니 GPT FineTuning 이란 개념이 있음
FneTuning :
ChatGPT Fine-tuning은 특정 작업이나 도메인에 특화된 추가 학습 데이터를 사용하여 사전 학습된 언어 모델의 매개 변수를 업데이트하는 프로세스
ChatGPT가 만들어둔 AI 모델을 활용해 특정 도메인이나 주제에 대한 질문에 답을 할 수 있도록 해당 데이터를 미세조정(FineTuning) 즉 추가 학습 시키는 것
파인튜닝을 위한 단계는 다음과 같다
훈련 데이터 준비 및 업로드
새로운 미세 조정 모델 학습
결과를 평가하고 필요한 경우 1단계로 회귀
미세 조정된 모델을 사용
데이터 준비 및 업로드
1단계의 훈련 데이터 준비의 경우 추후 포스트할 크롤링에서 다루도록 함 사실 1단계가 제일 힘들었다
파인튜닝을 위한 데이터셋은 수집한 데이터의 JSON 파일을 GPT가 읽을 수 있는 프롬프트 형식으로 변환한다
OPENAI의 GPT를 위한 프롬포트 형식은 다음과 같다
{"role": "system", "content": "greeting"},
{"role": "user", "content": "hi"},
{"role": "assistant", "content": "hi user!"}
각 role 별 차이점은 링크를 참고한다
def convert_to_chat_format(input_file):
with open(input_file, 'r', encoding='utf-8') as f:
data = json.load(f)
chat_format_data = []
for entry in data:...
# 수집 데이터마다 형식이 다르므로 상세 코드는 생략한다
main_title = entry.get('main_title', '')
messages = [
{"role": "system", "content": "You're Direa's friendly chatbot"},
{"role": "user", "content": f"{main_title}에 대해 알려줘"},
{"role": "assistant", "content": message_content}
]
chat_format_data.append({"messages": messages})
return chat_format_data
나의 경우 JSON파일로 데이터를 수집했고 이 데이터를 순회하며 user 질문지에 문서 제목을 Message에 문서 내용을 text로 담았다
변환된 JSONL파일
{"messages": [{"role": "system", "content": "Category: [온라인] 업무 가이드"}, {"role": "user", "content": "HTTP 관련 내용을 알려줘."}, {"role": "assistant", "content": "HTTP는..."}]}
{"messages": [{"role": "system", "content": "Category: [온라인] 업무 가이드"}, {"role": "user", "content": "TCP 관련 내용을 알려줘."}, {"role": "assistant", "content": "TCP.."}]}
{"messages": [{"role": "system", "content": "Category: [온라인] 업무 가이드"}, {"role": "user", "content": "Sync to Sync 관련 내용을 알려줘."}, {"role": "assistant", "content": "Sync.."}]}
{"messages": [{"role": "system", "content": "Category: [온라인] 업무 가이드"}, {"role": "user", "content": "Sync 채널 설정 관련 내용을 알려줘."}, {"role": "assistant", "content": "Sync 채널.."}]}
{"messages": [{"role": "system", "content": "Category: [온라인] 업무 가이드"}, {"role": "user", "content": "Async to Async 관련 내용을 알려줘."}, {"role": "assistant", "content": "Async.."}]}
{"messages": [{"role": "system", "content": "Category: [온라인] 업무 가이드"}, {"role": "user", "content": "Async 채널설정 관련 내용을 알려줘."}, {"role": "assistant", "content": "Async 채널.."}]}
주의할 점은 학습 시키고자 하는 내용의 크기(epoc)가 10 미만이면 fine_tuning과정에서 에러 발생
변환된 데이터는 로컬 스토리지에 저장해서 다시 재호출을 통해 OpenAI client에 전달하여 파인튜닝을 진행한다
학습 시키는 방법 또한 공식문서를 참고하여 진행한다.
from openai import OpenAI
client = OpenAI()
client.files.create(
file=open("mydata.jsonl", "rb"),
purpose="fine-tune"
)
from openai import OpenAI
client = OpenAI()
client.fine_tuning.jobs.create(
training_file="file-abc123",
model="gpt-3.5-turbo"
)
+추가적인 옵션도 존재한다.
from openai import OpenAI
client = OpenAI()
# List 10 fine-tuning jobs
client.fine_tuning.jobs.list(limit=10)
# Retrieve the state of a fine-tune
client.fine_tuning.jobs.retrieve("ftjob-abc123")
# Cancel a job
client.fine_tuning.jobs.cancel("ftjob-abc123")
# List up to 10 events from a fine-tuning job
client.fine_tuning.jobs.list_events(fine_tuning_job_id="ftjob-abc123", limit=10)
# Delete a fine-tuned model (must be an owner of the org the model was created in)
client.models.delete("ft:gpt-3.5-turbo:acemeco:suffix:abc123")
FineTuning의 진행도는 openai 플랫폼에서
dashboard의 fine-tuning탭에서 확인가능하다
저 status가 돌아가며 꽤나 오랜 시간이 소요된다.