회사 공모전으로 제출한 작품으로 작품 이미지 및 영상은 첨부하지 않았습니다.
개요
최근 AX(AI Experience)의 중요성이 높아진다고 판단하여 Naver에서 제공한 HyperCLOVA X을 Mac에 설치해서 가지고 놀고 있었습니다.
naver-hyperclovax (HyperCLOVA X)
Org profile for HyperCLOVA X on Hugging Face, the AI community building the future.
huggingface.co
회사에서 AI 사용 역량을 키우자는 배경 아래에 사내 AI 공모전을 진행하는 것을 때마침 확인하였습니다.

원래 HyperCLOVA X을 가지고 이것저것 해보려는 것을 공모전에 참가하는 방향으로 잡았습니다.
기획
현재 사내에서 하나의 기능을 개발하기 위해서
- 기획서 피그마 뒤적이고..
- 디자인 피그마 찾아보고...
- 제품 요구사항 문서 뒤적이고...
- 기획자, 디자이너 분들 이야기 들어보고..

이 과정에서 발생하는 컨텍스트 스위칭이 발생이 너무 잦았습니다.
"조직 관련해서 생성에 대한 기능 요구사항이 뭐였지?" 하고 물어보면 바로 답해주는 챗봇이 있다면?
기획서, 디자인을 보고 궁금했던 제품 요구사항에 대해서 알려주는 ChatBot을 만들면 되겠다!
이렇게 해서 사내 AI 공모전에 제출할 작품으로 제품 요구사항 챗봇으로 정해졌습니다.
마주한 문제
첫번째 문제 : 제품 요구사항 학습시키기!
"HyperCLOVA X을 실행시키고 있었기 때문에 학습만 잘 시키면 되지 않을까?" 생각을 갖고 파인 튜닝을 할 수 있을지 알아보았을 때
GPU 자원과 모델에 대한 지식 등 여러가지 전문적인 환경이 설정되어야 한다는 것을 확인하였습니다.
[현재 환경]
- 공모전 기간은 2주... 짧다
- GPU 환경은 구성되어 있지 않는데?
- 학습 데이터 전처리 파이프 라인을 구성할 수 있을까?

해당 환경에서 공모전에 작품을 제출하기 위해서는 현실을 직시해야 했습니다.
파인 튜닝 방식을 포기하고, 선택한 방법은 RAG(Retrieval-Augmented Generation) 방식이었습니다. 학습은 안 시키고, 필요한 정보를 검색해서 AI에게 같이 전달하여 답변을 생성하는 방식입니다.

즉, AI 모델에 질의하기 전에 미리 정의한 지식 베이스 정보를 모아둔 Vector DB에서 질문의 유사도에 따라서 정보를 가져온 뒤에 AI 모델의 질의할 때 해당 정보를 첨부해서 질문을 하는 형식입니다.
[예를 들어]
사용자 질문 : 우리집 강아지 이름이 무엇인지 알려줘!
서버 : 사전의 정의된 강아지 이름 정보를 Vector DB에서 조회
Vector DB : 강아지 이름은 "코코"입니다.
서버 : Hyper CLOVA X에게 아래와 같이 질의를 하게 됩니다.
강아지 이름은 '코코'입니다.
나의 강아지 이름을 알려줘
Hyper CLOVA X : 강아지 이름은 '코코'입니다.
서버 : 사용자에게 Hyper CLOVA X 답변을 전달합니다.
위와 같이 AI를 새로 학습시키지 않아도, 우리가 가진 문서 정보를 활용해서 원하는 답변을 만들어 냅니다.
두번째 문제 : 로컬에서 AI 돌리기 - 일렉트론 앱 방식 선택!
RAG 방식을 채택하였는데, 이제 AI 모델을 어디서 돌릴지 고민이 생겼습니다.
OpenAI나 Claude를 연동하면 비용적인 문제로 Naver CLOVA X 모델을 사용하였지만, 동시의 질문이 들어왔을 때 블로킹 걸려서 처리가 되지 못하고 있었습니다.

그래서 선택한 방법!
각 사용자의 로컬 컴퓨터에서 AI 모델을 실행시키는 방식을 채택하였습니다.
오픈소스 AI 모델(HyperCLOVA X)을 사용자 PC에서 직접 실행시켜서, 사용자의 질문은 각 로컬에 실행되는 AI 모델이 처리를 하는 것입니다.
사용자가 AI 모델을 실행시키기 위해서 일렉트론(Electron)을 이용한 앱 방식을 채택하였습니다.
[일렉트론 앱으로 얻을 수 있는 이점]
- AI 모델 서버를 따로 두지 않기 때문에 인프라 구축 X
- 로컬 AI 모델과 통신하는 것으로 폐쇄망 환경에서 사용 가능
- 비용 걱정 없이 무제한 사용 가능!
물론 사용자 PC 사양에 따라 성능 차이가 있겠지만, 그래도 이게 현 상황에서 가장 현실적인 선택이었습니다.
세번째 문제 : 챗봇 앱 실행 시간 감소시키기 - 압축 방식 변경!
일렉트론으로 AI 모델을 돌리는 Python 서버와 React으로 구성된 챗봇 화면을 기반으로 챗봇 앱을 만들었습니다.
이후, 앱을 실행시키면 진행되는 프로세스는 아래와 같습니다.

Python 서버 실행하는데 1분20초 + AI 모델 로드하는데 1분 = 2분 20초

AI 모델을 로드하는 것에 대해서는 1분이 걸리는 것을 개선하기에는 AI 모델에 대한 커스텀이 필요하다고 판단되었으며, 힘들다고 결정하였습니다.
그러면, "Python 서버를 실행하는 것이 1분 20초가 걸리는 것이 맞는가?"에 대해서 Python 서버가 갖고 있는 기능에 비해 너무 과하게 오래 걸린다고 판단하였습니다.
일렉트론 앱에 포함시키기 위해 PyInstaller를 이용한 패키징을 통해서 실행 파일을 만들고 있었습니다.
처음에 앱 크기를 줄이기 위해서 --onefile 방식으로 python 서버를 패키징을 하였으며, 결과적으로 632MB의 크기의 앱을 생성하였습니다.
--onefile 방식으로 인하여 python 서버를 실행시키기 위해서 압축 해제가 반복되는 과정에 의해서 시간이 많이 발생한 것으로 판단하였으며, onedir 방식으로 변경을 진행하였습니다.
Python 서버 실행하는데 15초 + AI 모델 로드하는데 1분 = 1분 15초!

python 실행 시간만 81% 감소!! 즉, 실행 속도가 5.3배 향상되었습니다
하지만, 압축 과정이 제외되어서 앱의 크기는 632MB에서 1.2GB으로 2배가 되었습니다.
- 최근 앱들을 살펴보면 1GB 넘어가는 앱들도 많이 보일 뿐만 아니라 AI Model을 포함한 용량이기 때문에 부담스럽게 느껴지지 않을 것이라고 판단하였습니다.
결과
한창 업무가 몰린 시기라서 주말 및 퇴근 이후, 2주간의 여정 끝에 ChatBot을 완성해서 제출했습니다!
- 제품 요구사항 관련해서 Vector DB에 정의한 지식 베이스 1895개를 정의!
[지식 베이스 관리하는 스크립트]

예선 통과!!
제출하고 며칠 뒤, 예선 통과 메일이 왔습니다!
참여한 팀이 10여 팀에서 예선 6팀 안으로 통과하였습니다!!

2주 동안 시간을 내서 제출한 보람이 느껴지는 순간이었습니다.
본선 발표 준비를 시작했습니다. PPT 만들고, 시연 영상 준비하고, 예상 질문 정리하고...
본선 : 장려상 수상!
본선 발표 날, 제품 요구사항 ChatBot을 시연 및 발표를 진행하였습니다.
먼저 참관해주신 분들이 긍정적으로 봐주신 피드백으로는
- 공간적, 시간적 제약을 받지 않아서 폐쇄망 현장에서 가능하기 때문에 파견나간 인원들이 사용할 수 있다는 점!
- AI 모델이 포함한 앱 용량이 1.2GB라서 용량이 크지 않은 것 같다.(용량이 생각보다 많이 나간다고 생각하였지만, 반전!)
추가적으로, 참관한 영업팀에서 발표 깔끔하게 한다고 칭찬받았다.

개선점으로 말씀해주신 피드백으로는
- 질의 답변에 제품 요구사항 코드 및 링크가 포함이 되었으면 좋겠다.
- AI 모델에 대해서 선택을 할 수 있었으면 좋았을 것 같다.
- 질의-응답 기능을 제외한 다른 기능도 추가되었으면 좋았을 것 같다.
결과는 장려상!
다른 참여자 분들은 실무에서 적용한 내용이었지만, 이번에 공모전 시간 안에 제출한 작품으로 입상을 하였다는 것에 뿌듯하였습니다!

느낀점
이번 공모전을 참여하면서 많은 걸 배웠습니다.
1. RAG 방식 이해했다!
공모전 시작 전까지만 해도 "RAG 방식을 이용해서 ChatBot을 구현했다"는 이야기를 들었지만, 저와는 먼 이야기로 들렸습니다.
그런데 이번에 직접 구현하면서:
- Vector DB에서 지식 베이스를 저장할 때 어떠한 방식으로 정리되어 있어야 잘 읽어올까?
- 용어 사전, 사전 질문, 문단 형식, 세부 기능 설명 형태로 지식 베이스 정의
- RAG 방식에서 AI에게 컨텍스트를 어떻게 전달하는지
- 사전 Context을 어떻게 작성해야 답변의 질이 높아지는지
직접 부딪히며 이해하게 되었습니다.
2. 문제를 여러 시선으로 살펴보자!
공모전에서 가장 크게 배운 건 "막힌 길이 있으면 돌아가면 된다"는 거였습니다.
초기 계획:
- "파인 튜닝으로 AI 모델을 학습시키자!" → 인프라 및 사전 지식 부족
- "서버에 AI 모델을 띄어서 웹 형태로 제공하자 " → AI 모델 1개로는 동시성 블로킹 문제 발생
- "용량을 줄이기 위해 단일 파일로 패키징" → 1분 20초 상당의 서버 실행 시간
매번 막힐 때 "이건 안 되는데..." 하고 포기할 수도 있었지만!
생각하는 방향 전환!
- 파인 튜닝 안 되면? → RAG 방식으로!
- 동시성 안되면? → 사용자 로컬 AI 모델로 실행!
- 단일 파일 느리면? → 폴더 방식으로!
개발하다 보면 "이 방법이 정답이야!"라고 생각하고 밀어붙이고 싶을 때가 있습니다.
하지만 때로는 한 발짝 물러서서 다른 시선으로 문제를 바라보는 게 더 빠른 해결책이 될 수 있다는 걸 느끼게 되었습니다.
현재 상황에서 최선의 선택을 하는 것, 그게 진짜 실력이라는 생각이 듭니다.

댓글