Junction Asia 2023 해커톤 후기
올해 겨울에 SPARCS 해커톤에서 만난 팀원들과 다시 해커톤에 나가게 되었다. 이번에 나간 해커톤은 Junction Asia 2023으로, 무려 300명, 60팀이 한 자리에 모여서 진행하는 해커톤이고, 국내에서 진행하는 해커톤 중에서는 가장 규모가 큰 해커톤으로 알고 있다.
해커톤에서
해커톤은 8월 18일부터 20일까지 부산 벡스코에서 진행되었다. 나는 해커톤 시작 당일에 서울에서 출발하는 다른 팀원들과 같이 KTX를 타고 부산으로 내려가 대회장에 도착했다.
트랙 정하기
이번 해커톤은 주제가 해커톤 시작 당일에 공개되는 방식이었다. 총 5개 트랙과 후원 기업이 있고, 각 트랙의 기업이 주제를 제시하면, 각 팀에서는 트랙을 선택해서 기업이 제시한 주제에 맞는 아이디어를 제시해서 제품을 개발하는 방식이었다. 트랙은 아래와 같았다.
- 부산 X 신한카드: 공공데이터를 이용해 일상의 문제를 해결
- JAKA: 음식 조리 로봇을 대중화시킬 수 있는 모바일 또는 키오스크 앱
- SOLUM: ESL 태그를 새로운 산업 환경에서 활용할 수 있는 방법
- BTO Busan X GroundK: 여행 중 이동을 편리하게 하는 어플리케이션
- CNT Tech: 포장 주문을 장려하는 새로운 배달 플랫폼
첫날 12시까지 Mission 1에서는 어떤 트랙을 선택할지, 그리고 어떤 방식으로 진행할지 간략하게 써저 제출해야 했다. 둘째날의 멘토링은 해당 제출 내역 기반으로 진행했다.
트랙 발표가 8시 즈음이었는데, 이때부터 12시까지 어떤 트랙을 선택해서 어떤 걸 만들지 정말 치열하게 이야기했다. 다른 트랙들은 차별점을 가져가기 어렵거나 좋은 아이디어가 떠오르지 않는다 등등 이유로 기각되었고, 최종적으로 팀 내에서는 Track 1과 5를 후보로 남겨두고 고민을 많이 했다.
1번 트랙은 데이터 모으고 그걸 예쁘게 보여주는 것이 핵심이라고 생각했고, data visualization을 전문으로 했던 팀원도 있어서 우리가 충분히 강점이 있는 분야이지만, 그래도 보여줄만한 데이터를 2박 3일 안에 찾아내고 다른 팀과 차별성이 있는 인사이트와 개발 페이지을 뽑아내는 건 난이도가 높고 확실하지가 않다고 팀 내에서 이야기가 나왔다.
5번 트랙은 단순히 포장주문 플랫폼을 만든다고 했을 때 배민과 같은 기존 앱과 어떻게 차별점을 가져가야 할지 고민이 많았다. 일반적인 사용자를 타겟하는 건 이미 기존 배달앱들도 많이 하고 있고, 다른 팀과 비교했을 때 차별성 있는 아이디어를 내기 어려울 것 같다는 의견이 많이 나왔다. 우리는 해커톤이니만큼 시장성이나 대중성은 좀 떨어지더라도 특별한 접근방식을 시도해보고 싶었다.
우리는 최종적으로 5번 트랙을 선택했는데, 우리의 접근법은 사용자 도메인을 좁혀서, 밖으로 나오는 걸 어려워하는 사람을 밖으로 나오게 하는 것에 집중해보면 어떨까 였다. 이를 최근에 사회적으로 문제가 되고 있는 은둔형 외톨이와 엮어볼 수 있을 것 같았다. 은둔형 외톨이들이 배달앱을 가장 많이 사용하는 유저층인데, 이들을 밖에 나오게 할 수 있다면 사회적 문제를 해결하면서도, 배달을 많이 사용하던 사람들이 포장주문을 사용하게 하니 트랙 주제와 걸맞을 것 같았다. 그래서 은둔형 외톨이들 위한 포장주문 앱을 만들어보자 라는 방향성으로 정해졌고, 여기서부터 시작해서 이것저것 기획이 붙었다. 먼저 챗봇을 이용해서 말을 거는 방식으로 친근하게 다가가고, 밖으로 나와 이동하는 과정을 마음 편하게 하기 위해서 실시간으로 걸어가는 길을 보여주고, 경로에 맞게 챗봇이 계속 말을 걸어주고 등등 기획이 붙었다.
챗봇은 처음에는 단순히 “AI를 붙일만한 부분이 없을까?” 에서 시작해서 약간은 어거지로 기획에 들어왔는데, 이야기를 꺼내고 기획을 정제하며 생각해보니까 은둔형 외톨이를 위한 앱이라는 개념에 쏙 들어맞는 부분이란 생각이 들어서 우리 기획의 핵심적인 부분이 되었다.
개발하기
기획이 정해지고 나서 기획자와 디자이너는 화면 기획과 디자인에 들어갔고, 첫날에는 프론트 개발자가 지도를 그리는 부분을 먼저 살펴보고, 나는 AI 챗봇 개발을 시작했다. 포장주문 앱을 만들어야 하지만, 우리 팀의 개발자들은 앱보다는 웹을 더 많이 경험해봤기 때문에, 웹페이지를 작성하고 그 웹페이지를 휴대폰에서 앱처럼 사용할 수 있는 PWA기술을 사용했다. 챗봇은 OpenAI API를 활용했기 때문에 모델을 직접 개발하지는 않았고, 프롬프트 엔지니어링에 많은 공을 들였다.
챗봇 API를 다 보고 나니 새벽 6시가 되었고, 이때 다같이 두 시간 정도 쪽잠을 자고 왔다. 대회장 구석에 잠깐 자라고 주최측이 빈백들을 마련해둔 자리가 있어서 여기서 잠깐 쪽잠을 잤는데, 대회장에 에어컨에 너무 쎄게 틀어져 있어서 좀 춥게 잤다ㅠㅠ 에어컨을 더 줄일 수 없었다고 하는데, 다음에 온다면 꼭 여분의 겉옷을 챙겨올려고 한다..
둘째날부터는 개발해놓은 챗봇 API를 프론트와 연동하는 작업을 시작했다. 이번 프로젝트는 백엔드보다는 프론트에 개발할 양이 많아서, 나도 챗봇 API를 연동하면서 자연스럽게 같이 관련된 프론트 코드 작성을 도왔다. 챗봇의 인터페이스를 프론트 개발자분이 짜 놓으면, 나는 거기에 맞는 백엔드 API를 짜고, 백엔드랑 연동하는 코드를 붙이는 방식으로 진행했다.
둘째날 오후에 핵심적인 기능은 다 개발이 되어서, 근처에 있는 스파랜드에 다녀왔다. 이번 해커톤은 숙소 제공이 되지 않는 대신, 스파랜드 티켓을 인당 한 장씩 주었다. 다 같이 받은 식권으로 근처 식당에서 저녁을 먹고, 스파랜드에 가서 간만에 씻고, 3시간 정도 따뜻하게 꿀잠을 자고, 그리고 다시 돌아와서 개발을 시작했다.
이때부터는 막바지로 남은 기능 개발은 마무리하고, UI와 프롬프트를 조금씩 다듬고, 지도 GPS 인식 테스트를 같이 진행했다. 백엔드 작업은 좀 더 여유가 있어서, 프론트엔드에서 막바지 작업을 하는 동안 나는 휴대폰을 들고 나가서 발표에 사용할 화면 캡쳐 영상을 찍었다.
최종적으로는 아래와 같은 귀여운 디자인을 가진 웹페이지를 개발해낼 수 있었다!
기술적 이야기
- GPT 프롬프팅 과정에서 기술적으로 재미있었던 부분은, 챗봇이 단순 채팅만 하는 게 아니라 중간에 유저가 메뉴 추천을 희망할 때는 해당 메뉴를 가지고 있는 식당을 띄워줬어야 했다.
- 이를 위해서 먼저 프롬프트에 우리가 가지고 있는 식당 정보를 동적으로 추가해주는 방식을 썼다. 즉, 프롬프트 중간에
The following restaurants are available near the user: ...
와 같은 문단을 추가하는 식이다. 아마 이게 실제 제품이였다면 이런 방식보다는 GPT가 적절히 검색 엔진으로 가는 쿼리를 만들도록 프롬프팅하거나, embedding API를 적절히 활용하는 식으로 더 잘 구현했을 것 같지만, 해커톤에서 보여줄 MVP 수준에서는 이 정도면 충분했다. - 또한, GPT가 일반적으로는 텍스트만 출력하도록 하고, 대신 유저가 식당 추천을 요청했을 때에만 응답 맨 끝에 JSON을 출력하도록 프롬프트를 작성했다. 그러면 서버에서는 GPT의 응답을 받았을 때 끝에 JSON이 포함되어 있는지 감지해서, 해당 부분을 식당 리스트로 파싱해서 프론트엔드에 내려주면 된다. GPT API에 function calling이라는 기능이 있어서 이 기능을 사용하면 식당 리스트를 보여줄 상황을 더 명확하게 표시할 수 있을 거라 생각했는데, 오버 엔지니어링이라는 느낌이 들어서 과감하게 패스했다.
- 원래는 제품을 한국어로 만들어야 하는 줄 알고 한국어로 프롬프트를 짰었는데, GPT-3.5가 한국어를 내가 원하는 대로 잘 못알아들어서 10배 이상 비싼 GPT-4 API 를 사용해야 하나 고민했었다. 둘째날 점심 즈음에 우리가 영어로 제품을 만들어야 한다는 사실을 깨닫고 영어로 프롬프트를 교체했는데, GPT-3.5가 영어는 훨씬 잘 알아들어서 GPT-3.5로도 충분했던 기억이 난다. 덕분에 해커톤 기간 동안 1달러로 지출 마무리..! 추가로 GPT-3.5는 GPT-4와 비교헀을 때 응답 속도가 아주 빨라서, 별도의 streaming(토큰별로 프론트엔드에 보내주기)을 구현하지 않아도 챗봇 인터액션이 아주 자연스러웠다.
우리가 작성한 코드는 https://github.com/dlwocks31/junction2023-team-zelkova 에서 구경해볼 수 있다 :)
제출 이후
셋째날 12시에 슬라이드와 코드를 최종 제출하고, 그 후에는 점심을 먹고 와서 팀별로 돌아가면서 발표를 진행했다. 트랙 내에서의 발표는 각 트랙의 기업 관계자분이 팀 자리로 찾아오면 그때 진행하는 식으로 진행했고, 이 발표에 기반해서 트랙별로 1, 2, 3등이 선정된다. 그리고 각 트랙의 1등 팀은 다시 단상에 올라가 전체 발표를 진행하고, 그 후 심사단 투표와 참가자 투표를 합산해서 최종 1등 팀이 선정되는 방식이었다.
트랙 1등 팀은 최종발표 전에 관계자가 찾아와서 최종발표를 준비하라는 안내를 해주기 때문에, 일반적으로는 트랙 1등이라면 해당 결과를 최종발표 전에, 아니라면 최종발표 이후 시상식에서 결과를 알게 된다. 다만 우리는 트랙 2등이라는 성적을 우연히 시상식 이전에 알게 되었다. 주최측의 점수 계산 오류로 우리가 1등인걸로 계산이 되어서, 우리가 처음에 최종발표 대상자로 안내를 받았고, 정신없이 최종발표와 영상을 준비하던 와중에 주최측에서 다시 찾아와 점수 합계 오류가 있었고, 우리가 사실 1점 차이로 2등을 했다는 사실을 전달받았다. 잠깐이지만, 덕분에 행복한 꿈을 꿀 수 있었다..
이러한 작은? 우여곡절 끝에, 결국에 트랙 2등으로 시상대에 올라가게 되었다..!
그리고는 다 같이 광안리에 가서 조개구이를 먹었다.. 맛있었다..
회고
이번 해커톤은 개인적으로는 기대가 저번 해커톤보다 많이 컸다. 저번 해커톤은 완전히 모르는 사람들이랑 나갔으니까 사실 큰 기대가 없이 나갔다. 팀이 터지지 않았고 이해가 가는 기획이 나와서 내가 개발에 집중할 수 있었다는 것만 해도 이미 좋았고, 거기에 2등상까지 탔으니 더할 나위 없이 좋았던 기억이 났다. 근데 이번에는 이미 팀원들과 합도 맞춰 보았고, 팀원들의 실력에 대해 큰 믿음이 있었기 때문에, 솔직히 수상은 할 수 있을 것이라는 기대가 있었고, 전체 1등도 충분히 노려볼 수 있다는 생각을 했던 것 같다. 최종적으로 2등이라는 결과만 놓고 보면 지난 해커톤과 비슷하지만, 저번 해커톤과는 다르게 너무나 아쉬웠다.. 특히 잠깐이나마 우리 팀이 트랙 1등을 했다고 생각했어서, 1등에서 2등으로 떨어진것만 같은 느낌이 들어서 특히 대회장에서는 더더욱 속상한 감정이 들었다.
물론 각 트랙 1등의 최종 발표를 보면서 든 생각은, 이번 해커톤이 규모도 크고 자격 제한도 따로 없는 만큼 정말 참신한 아이디어와 훌륭한 제품을 두루두루 볼 수 있었고, 그런 만큼 트랙 2등도 분명 충분히 축하할만한 성과가 맞는 것 같다고 느꼈다..! 과정을 생각해 봤을 때도 아주 만족스러운 해커톤이었던 것 같다. 기획자 팀원 한명이 취업 이슈로 빠지고 대신 디자이너 팀원 한명이 합류한 것 빼고는 모두 지난 해커톤에 같이 나간 팀원들이었는데, 저번 해커톤때 합을 맞춰본 만큼 각 팀원이 뭘 할 수 있는지 서로 잘 알고 있었고, 덕분에 기획과 개발, 프론트와 백엔드의 분업이 아주 순조로웠고, 서로 믿으면서 우리가 각자 잘 하는 분야에서 최선의 성과를 냈다. 괜히 아쉬운 감정이 드는 건 어쩔 수 없지만, 분명한 건 같이 몰입해서 하나의 제품을 만들어나가는 과정이 즐거웠고, 객관적으로 생각했을 때 팀으로서 우리가 충분히 잘 해냈다는 생각이 든다. 그리고 그 사실이 (1점 차이의) 트랙 2등에서 충분히 잘 드러난 것 같아서 기쁘다!
개인적으로 나한테 아쉬웠던 점은, 개발 측면에서 외부 사용자한테 보이지 않는 부분에 신경을 너무 많이 쓴 것 같다는 생각이 들었다. 예를 들어서 챗봇의 프롬프트 엔지니어링을 할 때, 우리가 의도한 플로우와 다른 채팅 메세지가 입력됐을 때의 엣지 케이스에 대해 이상한 답변을 하지 않게 하는 대비에 시간을 많이 썼다. 결국엔 발표자료나 데모 과정에서는 모두 우리가 의도한 플로우를 보여주게 되는데, 핵심 밖에 있는 부분을 개선하기 위해서 너무 많은 시간을 들인 것 같아서 그런 부분이 개인적으로 아쉬웠다.
오히려 이번에 1등이 아닌 결과를 받으면서, 정말 한정된 시간에 유의미한 가치를 전달하기 위해서 어떻게 개발을 해야 할지에 대해서 생각을 더 많이 할 수 있는 계기가 되어서 좋았던 것 같다. 다음번에도 이렇게 좋은 팀원들과 해커톤에 나갈 수 있는 기회가 또 있을지 모르겠지만.. 다음번에 나간다면 더 잘하고 싶다..!
Comments