안녕하세요! 오늘은 작년 여름에 참가했던(많이 늦었지만^^) 공모전 후기에 대해 작성해보려고 합니다!
관련된 코드를 보시고 싶으시다면 제 Github에서 확인하실 수 있습니다~! 많이 많이 방문해주세요><
1. 재정정보 AI 검색 알고리즘 경진대회란?

어떤 공모전인가요?
작년 7월 Chatgpt 및 LLM이 매우 Hot 할 시절, 모든 기업에서 너 나 할 것 없이 자사의 LLM 모델을 선보이고 있었는데요.
meta에선 Llama를, google에선 gemma를 선보이며 LLM 춘추전국시대(?)가 펼쳐지고 있었습니다.
이렇게 LLM이 뜨거운 감자인 상황에서 LLM 공모전도 하나씩 등장하게 됐는데, 그 중 하나가 재정정보 AI 검색 알고리즘 경진대회였습니다.
대회 주제는 열린재정의 중장정부 재정 정보 검색 및 제공 편의성과 활용도를 높이는 질의 응답 AI 알고리즘 개발로,
재정분야 인공지능 학습용 데이터 및 LLM을 이용해 질의 응답 알고리즘을 개발하는 공모전입니다.
어느 정도의 기간동안 공모전이 진행되었나요?
7.15부터 참가 신청이 시작되며, 대회는 7.29 ~ 8.23까지 약 한 달여간 진행됐습니다.
한 달이 길다면 길고 짧다면 짧은 기간이지만 LLM에 익숙하지 않은 상태에서 진행하기에 많은 시도를 하진 못했던 것 같습니다.
2. About Dataset

train set에는 16개의 train_source(pdf 파일)과 train.csv 파일로 이뤄져 있습니다.
이때 train.csv 파일은 각 문서의 이름을 나타내는 Source, train_source가 위치하는 경로를 나타내는 source_path, 질문인 Question, 답변인 Answer 변수로 이뤄져 있습니다.
이 중에서 Source 변수가 나중에 임베딩 할 때 점수를 올려주는 키포인트로 작용했습니다!
test set은 train set과 비슷한 구성을 갖고 있었으며, train_source가 16개인데 반해 test_source는 9개의 문서로 이뤄져 있었고 test.csv파일엔 Question 변수를 제외하고 train.csv 파일과 같은 변수들로 이뤄져 있었습니다.
3. 전체적인 대회 전략

위의 그림은 저희가 대회에서 전체적으로 다뤘던 기법들을 한 페이지에 요약한 내용입니다.
대회에서 저희는 아래와 같이 크게 3부분을 중점적으로 봤는데요!
Model 선정(Supervised Fine-tuning)
우선 Model 부분에선 저희의 자원의 한계로 많은 모델을 탐색하진 못하고 그 당시 나온지 얼마 안되면서 그렇게 크지 않은 모델인 Llmam3와 Gemma2-it, 그리고 한국어 모델이 Kogemma2를 그냥으로도 사용해보고 Fine-tuning으로도 해보고 다양한 방법을 사용해서 여러가지 비교를 했습니다!
그리고 결국 최종선택은...!! 계속보시면 알 수 있습니다 ㅎㅎㅎ
RAG
아무래도 이 대회의 중요 Point인 부분이죠!
RAG를 어떻게 다루냐에 따라 점수가 변동이 컸기 때문에 많은 시간과 노력이 차지된 부분이었습니다!
RAG 중에서도 chunk 생성과 Retriever(검색) 부분을 가장 많이 고민 했는데요.
문서를 깔끔하게 chunk로 만들기 위해서 문장을 자르는 TextSplitter부터, chunk의 길이를 결정하는 Chunk_size, chunk를 구분하는 Seperator 등등 다양한 옵션을 문서에 최적화 시키려고 노력했습니다.
또한 query와 가장 연관된 chunk를 가져오는데 중요한 역할을 하는 embedding부터 몇 개의 chunk를 가져올지 결정하는 top_k, 다양한 retreiver를 조합한 ensemble 방식 까지 다양한 방법들을 실험해보며 가장 적절한 chunk를 가져오려고 노력했습니다.
Prompt Engineering
대회의 평가 산식은 F1 Score였기 때문에 '답변이 답지에 있는 키워드를 얼마나 많이 포함하는가?'가 점수에 많은 영향을 미쳤습니다. (물론 문장 자체가 정확하지 않아도 키워드만 포함되면 점수가 높아지기 때문에 대회의 헛점(?)이 존재하긴 했습니다.)
따라서 저희는 답변이 얼마나 정확하고 많은 키워드를 포함하는가에 중점을 뒀고, 특히 예시나 수치를 꼭 포함할 수 있게끔 프롬프트를 짰습니다.

그리고 아무리 F1 스코어로 평가를 한다고 해도 2차는 '재정 전문가의 품질평가'라고 심사기준에 적혀있었고, '답변의 적절성', '문장 구성력', '문장의 간결성' 등을 보기 때문에 문장이 완전해질 수 있도록 프롬프트를 구성했습니다.
LLM이 답변을 잘하긴 하지만 가끔 버릇없고 완전하지 못한 문장으로 말을 많이해서 어미를 통일하고 주어를 활용하는 등 프롬프트 엔지니어링을 통해 문장을 잘 다듬으려고 노력했습니다.
3. Model Selection & Fine-tuning
4주간 진행된 대회 중 처음 1~2주 동안은 모델 탐색을 진행했습니다.
모델의 발전이 이젠 거의 하루 단위로 휙휙 바뀌다 보니까 이젠 어떤 모델이 가장 유명한지, 가장 성능이 좋은지 구별도 안되지만 작년 저 때쯤엔 오픈소스 모델로 Llama와 Gemma를 가장 많이 사용했던 걸로 기억합니다.
그래서 저희도 모델 탐색을 할 때 기본적으로 Llama와 Gemma를 염두에 뒀습니다.
저희가 모델을 탐색할 때 가장 중요한 기준은 지금 우리가 사용하는 환경에서 작동이 되는가!(GPU가 없는 저는 웁니다..ㅠㅠ) 였습니다. 예전에 공모전을 했을 땐, 회사에서 GPU를 자유롭게 쓸 수 있게 해줬기 때문에 GPU에 대한 소중함을 잘 몰랐는데(무려 RTX 4080 Ti 였습니다..!) 퇴사하고 공모전을 진행했을 땐 GPU가 가장 막막하더라구요. 아무래도 LLM을 돌리기 위한 필수 요건이 GPU인데 GPU가 없으면 아무것도 할 수 없으니까요..!!
그래서 그 때 Colab과 GCP(무료크레딧) 환경을 사용했으며 해당 플랫폼에서 제공하는 A100을 이용해서 LLM을 돌렸습니다! (근데 진짜 A100은 켜놓는 것 만으로도 가격이..정말 비싸서 항상 껐다 켰다를 반복하는 번거로운 과정을 거쳤습니다..)
※GCP 무료 크레딧 사용법을 알고싶으면 여기로 가시면 친절하게 설명 돼있습니다^^!※
최종적으로 어떤 모델을 선택했나요?

저희는 Llama3-8B 모델, Gemma2-it-9B, Kogemma2의 모델들을 탐색했고, 최종적으로 한국어로 Fine-tuning된 모델인 Kogemma2 모델을 선택했습니다!
그럼 Fine-tuning은 시도하지 않았나요?
아닙니다! Fine-tuning은 시도했습니다! Llama3와 Gemma2-it 모두 Fine-tuning을 시도했는데, Fine-tuning 전 두 모델은 아래와 같은 특징을 갖고 있었습니다.
Llama3-8B
- 문장의 완성도가 조금 떨어지며 주어가 생략되는 특징을 갖고있었습니다.
Gemma2-it-9B
- Llama3와 비슷하게 문자 완성도가 떨어지며 주어가 생략되는 특징이 있었습니다.
- 추가적으로 자신이 학습하지 않은 토큰이 질문에 주어질 때 EOS 토큰을 뱉어내지 못하고 단어를 무한으로 반복하는 현상을 가지고 있었습니다.
두 모델의 위의 문제를 해결하기 위해 Fine-tuning을 진행하자고 결정했으며, 대회에서 전달받은 데이터를 그대로 Fine-tuning을 진행했습니다.
하지만 Fine-tuning 결과 문제는 그대로였고, 학습 데이터를 확인했을 때, 학습데이터부터 답변의 문장이 통일되지 않은 상태여서 학습데이터 전처리를 진행했습니다.

위의 사진 처럼 명사형으로 끝나는 데이터의 경우 '~입니다.'로 문장이 완전하게 했으며, 답변을 대답할 때 질문의 주어를 가져와 말하게 하는 등 데이터 전처리를 진행했습니다.
llama3의 경우 자원 문제로 학습이 불가해 Fine-tuning을 진행할 수 없었으며, Gemma2-it-9B는 Fine-tuning을 진행했습니다.
Gemma2의 결과를 봤을 때, 단어를 반복하며 문장이 끝나지 않는 문제와 문장의 완전성이 떨어지는 문제가 Fine-tuning을 통해 어느정도 개선된 것을 확인할 수 있었습니다.
그렇다면 왜 Fine-tuning 모델을 고르지 않았나요?
일단 Fine-tuning을 한 Gemma2-it-9B 의 모델이 너무 무거워져서 추론을 할 때 A100 환경에서도 가끔 메모리가 OOM이 뜨고, 시간이 오래 소요되는 등 많은 제약이 발생했습니다.
무엇보다 Kogemma2와 Gemma2-it-9B 모델 두 개의 결과를 제출했을 때 Kogemma2가 Gemma2-it-9B보다 추론 시간은 훨씬 적었지만, 결과 점수가 더 높았기 때문에 최종적으론 Kogemma2를 선택하게 됐습니다.
대회 소개부터 모델 선택까지 작성했는데요, 제가 이 글을 쓰게 된 이유가 데이콘에서 또 LLM 공모전이 열렸더라구요
건설공사 사고 예방 및 대응책 생성 : 한솔데코 시즌3 AI 경진대회 입니다!(광고 아닙니다. 데이콘과 아무 관련 없습니다)
사실 한솔데코 시즌2도 대회 참가를 했는데 재정 정보 대회를 작성하는 이유는 한솔데코는 작년 2월에 참여해서 정말 정말 아무 기억이 나지 않기 때문입니다.ㅎ(그래도 이것도 언젠가 정리할겁니다!!)
원래는 RAG, Prompt Engineering, 그리고 대회 결과까지 작성하려고 했습니다 ㅎㅎ(인생은 계획대로 되지 않지..)
하지만 생각보다 어떻게하면 보시는 분들이 유용한, 필요한 정보를 얻어가실 수 있을까? 나름 깊게 고민했고, 이것저것 자료를 찾고, 다시 공부하고, 글을 구성하고, 이해하기 쉽게 글을 작성하려다 보니 시간도 많이 걸리고 무엇보다 글이 길어져 여기서 끊고 가려고 합니다.(그리고 무엇보다 아무리 고민 많이하고 잘 작성하려고 했으나, 다시보니까 중구난방으로 작성한 거 같네요ㅠㅠㅠㅎㅎㅎ)
쨌든, 다음은 RAG부터 Prompt Engineering까지 그 당시 어떤 고민들이 있었고, 어떻게 해결하려고 했는지에 대해 작성해보도록 하겠습니다!
긴 글 읽어주셔서 감사합니다!
질문이 있거나, 제가 잘못 작성한 내용이 있다면 부드럽게 댓글 부탁드려요!!><