Open AI fine-tune 미세조정

이얏호·2023년 9월 19일
0

open ai 관련 사용 방법에는 세 가지 정도 방법이 존재한다.
1. fine-tune(미세조정)
2. 임베딩
3. 프롬프트 체인

임베딩 방법은 프롬프트를 벡터로 변환하여
유사도를 비교하여 원하는 답변을 뽑아내는 방식이고,

프롬프트 체인의 경우, 학습보다는 이전 프롬프트 내용을 체인 형식으로 묶어서
대화 내용을 기억시키는 방법이다.

팀 프로젝트에는 미세조정과 프롬프트 체인 방식을 도입했다.
다만 미세조정된 모델의 경우, 토큰 당 비용이 통상적인 모델(3.5 터보, 다빈치 등등)보다 비싸기 때문에, 고객센터 ai와 바텐더 챗봇으로 나누어 구현하였다.

오늘 다룰 내용은 미세조정 방식이다.
사용한 모델은 3.5 터보 모델을 사용하였다.

또한 공식 페이지에 사용된 방법이 파이썬이라 파이썬으로 진행하였다.

import openai
openai.api_key = 'api키값'

abc = openai.File.create(
    file=open("drinkitlast.jsonl", "rb"),
    purpose='fine-tune'
)
print(abc)

상단에 openai를 import해두고
처음 해야할 일은 학습시킬 파일을 업로드하는 과정이 필요하다.

학습시킬 파일 내용 예시는 다음과 같다.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "배송이 얼마나 걸릴까?"}, {"role": "assistant", "content": "배송 준비완료 시점부터 1~3일 내로 도착합니다."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "상품을 시켰는데 언제 도착해?"}, {"role": "assistant", "content": "배송 준비완료 시점부터 1~3일 내로 도착합니다."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "택배 시켰는데 언제 와?"}, {"role": "assistant", "content": "배송 준비완료 시점부터 1~3일 내로 도착합니다."}]}

프롬프트에 role을 나누어 역할을 지정해준다.
system의 경우 챗봇의 성격을 지정해준다고 생각하면 된다.
user는 말 그대로 사용자의 예상 질문
assistant은 사용자의 특정 질문들에 대한 내가 원하는 답변을 기입한다.

질문 예시는 최소 10개 이상 지정해줘야 해당 키워드가 들어간 질문들에
정상적으로 원하는 답변을 해준다.

파일은 jsonl확장자로 만들어준다.

aaa = openai.FineTuningJob.create(
    training_file="file id 값", model="gpt-3.5-turbo")
print(aaa)

위에서 파일 업로드가 종료되었다면 프린트로 찍은 내용 중 file id 값을 따로 뽑아 fine-tune 과정을 진행한다.

소요시간은 경우에 따라 다른데 약 140줄을 학습 시킬 때, 20분 정도 소요됐다.

bbb = openai.FineTuningJob.retrieve("ftjob 값")
print(bbb)

fine-tune의 현재 상황을 볼 수 있다.
위에서 프린트된 aaa 중 ftjob 값을 해당 위치에 기입하면
현재 학습이 진행 중인지, 완료가 되었는지 반환해준다.

status값이 "succeeded"로 바뀌었다면 학습이 완료된 것이고,
fine_tuned_model값을 기존 ai 연동 부분의 모델 지정 부분에 기입하면 학습된 모델로 사용이 가능해진다.

추가적으로 학습이 완료된 모델은 openAI 페이지의 playground에서 확인 해 볼 수 있다.
https://platform.openai.com/playground
우측 모델 선택창에서 학습이 완료된 모델을 선택할 수 있고,
질문들을 실험해 볼 수 있다.

아래는 open ai에서 제공하는 fine-tune 가이드 이다.
https://platform.openai.com/docs/guides/fine-tuning/preparing-your-dataset


코드나 방식이 어려웠다기 보단, 파이썬을 다뤄보질 못해서 파이썬을 실행할 환경을 구축하는데 애를 먹었다.
(파이썬 경로를 환경변수에 추가해줬는데 괜히 멀쩡하던 node가 고장나서 node도 다시 설치하고... 기존 3.5 터보 미만 버전들의 학습때와 달리 최신 파이썬 버전을 요구하여 버전이슈때문에 헤매기도 하고...)
이미 사용중인 분들은 정말 쉽게 미세조정이 가능할 것 같다.

주의할 점은 학습량에 대해서 원하는 답변이 나올 확률이 꽤 유의미 하게 바뀌었다는 점이다.
최초 10개만 질문을 작성할 때는 간혹 gpt가 알고있던 내용들을 섞어서 혹은 엉뚱한 답변을 내놓았다.
특히 택배, 환불 등과 같이 일반적으로도 자주 묻는 키워드에 대해서는 원하는 답변을 뽑아내기 위해서 더 많은 학습량을 필요로 했다.(20개 이상 추가하니 거의 대부분의 상황에 지정해준 답변을 반환했다.)
그리고 내부적으로 동일시 여기는 단어들이 존재하는 듯 했다.

예를 들어 '안내'와 '방법' 구현한 페이지의 구독 내용을 알려주는 안내 부분을 학습시키고, 구독 페이지로 이동하는 방법을 알려주는 구독 안내 부분을 학습시켰는데, gpt 자체적으로 안내와 방법을 동일시하는 건지 학습량을 추가로 넣어도 둘을 구분하지 못했다.

미세조정방식이 접근성도 높고, 편리하기도 했지만 이렇게 세세한 부분에 대한 조정이 필요할 경우,
직접 임베딩 과정을 거쳐서 원하는 답변을 뽑아내는 것이 더 유리할 것으로 생각되었다.
(그리고 비용도 조금 올라간다...)

다만 임베딩과 달리 미세조정은 추가적인 저장소(벡터 저장소 등)가 필요 없다는 점이 강점이라고 생각한다.

작성하면서 생각난건데, 3.5 터보 미만의 모델들은 정말... 말을 아끼겠다.
처음엔 상대적으로 저렴한 다빈치 모델 등에 학습을 시도했으나, 정말 엉뚱한 답변들을 많이 받았다...
문장도 엉망이었어!

최근에 3.5 터보의 상위버전인 gpt-3.5-turbo-instruct이 나왔다고 하는데
차후에 사용할 일이 생기게되면 시도해보려고 한다.

profile
열심히 신나게 화이팅!

0개의 댓글