제가 직접 경험해본 결과로는, GPT API를 활용하여 우리가 원하는 형식으로 응답을 얻는 것이 얼마나 복잡할 수 있는지를 보여주는 흥미로운 여정을 공유하고자 합니다. 이 글은 졸업작품 프로젝트에서의 과정을 중심으로, Chat Completion API와 Fine-Tuning을 사용하여 GPT API의 응답 값을 최적화하는 방법을 다루고 있습니다.
졸업작품 프로젝트에서 마주한 문제
졸업작품 ‘코리’를 개발하는 과정에서의 문제점은 두 가지 주요 이슈로 요약할 수 있었습니다. 첫 번째는 정해지지 않은 응답 형태로, GPT API에 질문을 할 때마다 즉각적으로 반환되는 응답이 다른 형태로 출력되는 것을 확인했습니다. 예를 들어, 특정 질문을 던져도 맥락 없이 여러 방식으로 나오는 답변은 사용자 경험에 부정적으로 작용할 수밖에 없었습니다.
두 번째 문제는 유효하지 않은 요청에 대한 처리였습니다. 잘못된 코드를 요청해도 GPT는 어떻게든 응답을 하였고, 이는 불필요한 비용을 초래할 수 있었습니다. 이런 상황에서 효율적인 예외 처리가 필요하다는 생각이 들었습니다.
Chat Completion API를 통한 해결 방안
이러한 문제를 해결하기 위해 선택한 방법은 Chat Completion API를 활용하는 것이었습니다. Chat Completion API는 GPT와의 대화를 구조적으로 가능하게 해주는 API로, 문맥을 유지하면서 더 정교한 응답을 얻을 수 있습니다.
Chat Completion API의 이해
Chat Completion API는 사용자가 질문을 입력하면, 그에 대한 답변을 대화 형식으로 주고받을 수 있습니다. 예를 들어, 모델에게 ‘2020 World Series’와 관련된 문맥을 제공하면, 그 문맥을 바탕으로 질문에 더욱 적절한 답변을 할 수 있게 됩니다.
Chat Completion API를 사용한 예시를 살펴보면:
python
messages = [
{"role": "system", "content": "당신은 코딩 도우미입니다."},
{"role": "user", "content": "Java로 Hello World를 출력하는 방법은?"}
]
이와 같은 방식으로 시스템에 적절한 맥락을 제공함으로써, GPT가 더욱 알맞은 응답을 하도록 유도할 수 있습니다.
Chat Completion API의 역할
Chat Completion API에서 사용되는 세 가지 역할은 다음과 같습니다.
- System Role: 요청을 처리하는 모델에게 역할을 부여하며, 응답의 형식이나 대화 스타일을 정의합니다.
- User Role: 사용자가 모델에게 질문이나 정보를 요청하는 역할입니다.
- Assistant Role: GPT 모델의 응답을 전달하는 것입니다.
이러한 역할을 활용하여 대화의 형태와 내용을 더욱 정교하게 조정할 수 있습니다.
Fine-Tuning을 통한 추가적인 최적화
Chat Completion API는 유연한 대화가 가능하지만, 보다 일관된 응답을 위해 Fine-Tuning을 사용할 수 있습니다. Fine-Tuning은 특별한 데이터셋을 모델에게 학습시켜, 특정 응답 형식을 갖도록 만드는 과정입니다.
Fine-Tuning의 과정
Fine-Tuning 에서는 유효한 데이터를 수집하여, 적절한 형식으로 모델에 학습하게 됩니다. 다음은 학습을 위한 데이터 파일의 예시입니다.
json
{"messages": [
{"role": "system", "content": "당신은 Java 변수명 추천 전문가입니다."},
{"role": "user", "content": "자동차"},
{"role": "assistant", "content": "1. car\n2. automobile\n3. vehicle\n4. motorcar\n5. auto\n6. ride\n7. wheels\n8. transport\n9. machine\n10. drive"}
]}
이와 같은 데이터셋을 이용해 Fine-Tuning을 진행하게 되면, 모델은 요청에 대해 일관된 형식으로 응답할 수 있습니다.
Fine-Tuning의 효과
Fine-Tuning을 통해 얻을 수 있는 이점은 믿을 수 있는 출력 형식을 지니게 되는 것입니다. 예를 들어, 잘못된 입력에 대해서는 “X”라는 응답을 주도록 학습시키면, 이 역시 예외 처리에 큰 도움이 됩니다.
파인 튜닝의 진행과정
Fine-Tuning을 완성하기 위해서는 다음과 같은 API 호출이 필요합니다.
bash
curl https://api.openai.com/v1/fine_tuning/jobs \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${GPT-API-KEY}" \
-d '{
"training_file": "학습파일ID",
"model": "gpt-3.5-turbo-0613"
}'
이렇게 하면 Fine-Tuning 과정이 시작됩니다. 이후 실제로 학습된 모델을 사용하여 늘 일정한 형태의 응답을 받을 수 있게 됩니다.
파인튜닝의 결과
Fine-Tuning을 통해 얻은 결과는 매우 통일성이 있었습니다. 예를 들어, 변수 추천 요청을 했을 때, 새로운 모델은 항상 일정한 형식을 유지하면서 관련 변수를 제시하였습니다.
요청 | GPT 기본 모델 응답 | Fine-Tuning 모델 응답 |
---|---|---|
변수명 추천: “자동차” | 불규칙한 응답 | 1. car\n2. auto… |
코드 리팩터링 요청 | 형식이 일정하지 않음 | 리팩토링된 코드… |
유효하지 않은 요청 | 임의로 응답 | “X” 응답 |
이 외에도 다양한 요청에 대해 핸들링이 용이해졌으며, 같은 패턴으로 다룰 수 있게 됐습니다.
유효하지 않은 요청 처리
Fine-Tuning의 데이터를 통해 오류 처리 시나리오도 효과적으로 다룰 수 있었습니다. 모델이 요청 코드와 언어가 맞지 않는 경우, 즉각적으로 ‘X’라는 응답을 제공하였고, 서버에서 이를 기반으로 적절한 예외 처리를 할 수 있게 하였습니다.
사용 비용 및 결론
Fine-Tuning을 진행하면서 발생하는 비용은 초기 훈련 비용과 사용 비용으로 나뉘며, 이는 공식 문서를 통해 확인할 수 있습니다.
이러한 과정을 통해 저는 GPT API의 응답을 더 예측 가능하고, 유용하게 활용할 수 있는 방법을 마련하게 되었습니다. 이 경험은 서비스의 품질을 높이는 데 큰 도움이 되었고, 향후 더욱 다양한 요청에 고정된 형태의 응답을 확보할 수 있는 좋은 경험이었습니다.