본문 바로가기
Kaggle, Dacon

2024 자동차 데이터 분석 경진대회(프롬프트 엔지니어링)

by Yonghip 2024. 10. 19.

LLM을 배운 지 1개월 정도 됐는데 프롬프트 엔지니어링이 보통 어떤 식으로 이루어지는지 그리고 gpt api는 어떻게 사용하는지 궁금했을 때 이 필요에 딱 맞는 대회라 생각해 공부 겸 참여하였다.

 

프롬프트 엔지니어링 예제를 찾아봤을때 경진대회에서 사용되는 확실한, 구체적인 예는 많지 않았고 특히 한국어 게시물은 원하는 퀄리티의 예제가 없어 어떤 식으로 구성했는지 공유하고 싶어 이 글을 작성했다.

예상독자

  • LLM 입문자: 프롬프트 엔지니어링을 어떤식으로 진행하는지 예시를 알고 싶은 분들

문제 정의

 

2024 자동차 데이터 분석 경진대회 - DACON

분석시각화 대회 코드 공유 게시물은 내용 확인 후 좋아요(투표) 가능합니다.

dacon.io

 

문제 자체는 정말 간단했다. 각 데이터에 일정한 길이의 문자열이 포함되어 있고 이를 Test set의 문자열에 맞추어 이진분류하는 게 이번 대회의 목표이다.

 

어려움을 겪었던 부분은 평가 부분인데 이 대회는 test set 자체는 공개했지만 이는 프롬프트 구성에만 사용할 수 있었고 이 프롬프트를 제출하면 이를 기반으로 정답을 채점하는 구조였다.

 

또한 예측 시 temperature가 0으로 세팅되어 있지 않기 때문에 제출에 일정의 랜덤성이 있었으며 제출 포맷이 맞지 않으면 score를 0으로 반환했다.

 

한마디로 정해진 출력 형식 + 후처리 불가 + 출력의 랜덤성 거기다 api로는 gpt3.5를 사용했으므로 많은 사람들이 초반에 출력 형식(0\n1\n0...\n0)을 맞추는데 시간을 쏟은것 같다.

평가지표는 위와 같이 macro f1 score와 입력 토큰의 개수에 페널티를 주는 방식을 사용했다.

프롬프팅 방법

특정 프롬프트는 train과 test데이터를 거의 대부분 포함해서 만들었기에 공개하기에 곤란한 부분이 있다. 이러한 부분은 어떤식으로 사고했는지 간접적으로 설명하겠다.

baseline

baseline 프롬프트는 "당신은~~전문가입니다. ~~ 해주세요" 느낌으로 짧고 간결한 system prompt, 40개의 test data의 ID와 그에 관한 정보를 모두 나열한 매우 긴 user prompt로 구성되어 있었다. 이 baseline으로는 0.5 정도의 score를 얻을 수 있었다.

system prompting

이후 점수를 올리기 위해 다른 사람들이 어떤식으로 프롬프트를 짜는지 조사하고 느낀 점은 대략적인 룰은 존재하는데 확실한 정답은 없다는 느낌을 강하게 받았다.

"You are an expert in automotive data. Follow these instructions:

1. If the input data is automotive-related data, determine it as 1, otherwise 0. There are 40 data to answer.
2. ID: TEST_00 ~ TEST_39, and answer as 0 or 1 for each data, separated by row.
3. Be aware of output you can only contrain 0 or 1 for each data and '\n'for seperate this. If you output is wrong you have to go back and make output again"

여러 시도를 겪은 후에 이 레포의 프롬프트를 어느정도 변형해 사용했다.  짧은 길이에도 좋은 성능을 보여 성능을 0.6정도로 올릴 수 있었다. 링크한 레포에서는 10개 이상의 길고 detail한 instruction을 사용했는데 이건 Claude의 sonnet3.5를 gpt4o급으로 튜닝시키기 위해 reflection개념을 많이 사용했기 때문이다.

 

self reflection은 어려운 문제를 맞추기 위한 용도라 내 문제에 맞지 않은 방식일 뿐만 아니라 출력이 길게 늘어지는데 이 대회에서는 프롬프트를 제출한 다음 후처리에는 관여할 수 없기 때문에 이 방식이 유리하지 않을 거라 판단했기 때문이다.

 

이후에도 user prompt를 여러 시도를 거쳐 정교화했고 아래와 같은 prompt를 최종 제출에 사용했다.

"You are an expert in automotive data. Follow these instructions:

1. If the input data is automotive-related data, determine it as 1, otherwise 0. There are 40 data to answer.
2. ID: TEST_00 ~ TEST_39, and answer as 0 or 1 for each data, separated by row.
3. Each Test data has a title. You have to use these information for prediction.
4. If unsure or if your score is low, backtrack and try a different approach.
5. Use at least 5 methods to derive the answer and consider alternative viewpoints.
"

user promting

또한 user 프롬프트는 각 데이터 별로 인덱스와 여러 정보를 포함하고 있는데 그 중에 몇 줄 이상의 내용을 문자열로 길게 서술하는 컬럼이 있었는데 대회 룰에 정보를 추가하는 것은 룰 위반이나 제거하는 것은 자유롭다 적혀있어서 이를 제거해 token을 줄이면서 score를 추가로 올릴 수 있었다. 

 

길이를 줄였는데 점수가 오른 이유로는 token길이가 크게 연관이 있다고 생각한다. gpt3.5-turbo는 4096 token이 최대 길이인데 이건 모델구조 상의 한계일 뿐 학습시킨 text 정보는 이보다 훨씬 짧기 때문이 아닐까 예상했다.

모든 정보를 사용했을때 gpt api3.5 token양
일정 정보만 사용했을때 gpt api token양

이후부터는 gpt api를 사용해 대회에서 사용하는 모델과 동일 모델로 예측을 평가했다. 예상대로라면 test 데이터 만큼의 0\n1\...1\n0 으로 구성되어야 하는데 이게 정확히 같은 숫자가 아닌 경우가 꽤 많았으며 이로 인해 제출 시 대부분 score 0을 얻는다고 판단했다.

 

이러한 출력을 제한하는 부분은 system prompt 수정으로는 큰 영향이 없었다. 보통 self reflection 혹은 formatting은 system prompt의 말단에 들어가는데 이번에는 user input이 너무 길어 문제가 생겼다 판단해 아래와 같은 글을 user prompt 말단에 추가해 어느 정도 예측형식을 맞춰줄 수 있었다.

"make prediction for above 40 datas. answer as 0 or 1 for each data, separated by row(\n). You dont need to write any other information. If you are not sure about the answer, go back and think again."

 

 

대회링크: https://dacon.io/competitions/official/236379/overview/description