iamkanguk.dev

[회고] 제 2회 가천대학교 와글와글 해커톤 참여 후기 본문

회고록

[회고] 제 2회 가천대학교 와글와글 해커톤 참여 후기

iamkanguk 2024. 2. 20. 01:01

 

오늘은 이번에 해커톤에 참여하고 나서 회고글을 적어보려고 한다. 생각보다 많은 것을 배웠던 것 같아서 포스팅을 작성하면서 쭉 정리하는 느낌으로다가 포스팅 작성에 임해보겠다.

 

1.  팀 구성 + 개발 시작 전

팀 빌딩 과정에서는 이제 팀장들에게 먼저 주제가 선공개가 되었는데 각 팀장별로 기획 내용과 구성원 개발 스택에 대해서 간략하게 설명하는 과정을 가졌다. 필자는 Node.js 스택이기 때문에 Spring을 사용하는 프로젝트는 사실 관심을 가지지 않았으며, Node 프로젝트만 좀 집중해서 들었다.

 

Node 진영에서 선택할 수 있는 프로젝트는 몇가지가 있었다.

  • 커피인: 커피챗처럼 커피 한잔에 고민을 공유할 수 있는 파트너를 가져보자.
  • 잔디: Habit Tracker?
  • 404 Not Found: Not Found 오류를 알려주는 프로그램? 
  • GPT와 함께 부수기: 자기개발에 관련되었지만 뚜렷한 기획은 아직 가지고 있지 않으심.

필자는 여기서 404 Not Found와 커피인 프로젝트에 관심이 갔다. 커피인 프로젝트는 팀장님이 일단 발표를 잘하신 것도 있었고, 나름 주제가 흥미있어 보였다. 그리고 Not Found 같은 경우에는 이런 생각을 했다는게 조금 신박했던 것 같다. 자세히는 기억이 안나서...

 

그래서 결국에 필자는 커피인 프로젝트 팀에 합류하게 되었다. 딱히 팀 빌딩 과정에서 본인을 어필하는 과정은 없었고 그냥 선착순이었다.

그러고 이제 기획 내용에 대해서 궁금한거 좀 자세하게 물어보고... 본격적으로 개발을 시작하기 전에 필자의 부릉이를 타고 밥을 먹으러 갔다.

 

복정의 겐코.. 라는 덮밥집... 개인적으로... 내가 먹었던 덮밥중에... 제일 맛없었다... 죄송합니다....

그래서 밥먹고 카페 들려서 카페인 준비를 해놓고 에너지 드링크도 하나씩 구매를 하고 학교로 복귀했다.

 

그리고 우리의 팀이름은 Node Cafe, iOSPresso 이다. 백엔드는 노드, 프론트는 iOS이기 때문이다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ...

에스프레소 := iOSPresso...

Node Cafe는 그냥.. 센스있게

 

2.  프로젝트 주제 및 기능정의 그리고 기술스택

 

결론부터 말하면 프로젝트의 주제는 "나만의 AI, 내가 원하던 이와의 커피챗" 이다. 유튜브 또는 책으로만 보던 인물과 대화를 경험한다면 새롭고 신기한 경험일텐데 우리는 이를 타겟으로 유저가 직접 원하는 인재상(유명인) 모델을 구축하고 그 모델과 대화를 하는 것이라고 간단하게 생각하면 된다. 그리고 위의 내용을 ChatGPT를 활용해서 프로덕트를 개발해보자고 결정했다.

 

우리는 그래서 어떤 기능들을 정의해야 하는지 많은 고민을 해봤다. 그래서 큼지막하게 보자면 다음과 같이 기능들을 정의했다.

  • Prompt Engineering
    • 프롬프트를 앱에서 직접 제공하는 경우 - 이는 ChatGPT 쪽에서 미리 구현되어 있는 모델을 가져다가 그대로 사용하는 것 (이거는 따로 설명하지 않겠다. Prompt가 이미 제공이 되고 있어서 그냥 아래 필자가 구현한 함수에 넣어주기만 하면 되었다)
    • 프롬프트를 사용자가 직접 구성하는 경우 - 사용자의 명령을 받아와서 명령을 토대로 직접 Prompt를 만들어서 ChatGPT에게 전송
  • 대화 기능
    • 채팅 보내기 및 확인
    • 채팅 내용 저장 (시간 부족으로 구현하지 못함 ㅠㅠ)
  • Custom Model 공유 커뮤니티 (시간이 없어서 하지 못했다)
    • 사용자가 만들었던 Model을 다른사람도 사용할 수 있도록 하는 기능
  • 이 외의 부가적인 기능

Prompt Engineering 부분에서 원래는 ChatGPT 쪽에서 미리 구현되어 있는 모델을 직접 가져다가 사용하는 것만 하려고 했다. 하지만 그렇게 되면 뭔가 임팩트는 없는 느낌이어서 팀원들과 조율 끝에 우선적으로 사용자가 직접 커스텀 할 수 있도록 하고 시간이 된다면 앱에서 직접 제공하는 경우도 구현하자고 결정하게 되었다. 이렇게 처음에는 기능을 Fix했다.

 

그리고 백엔드에서 기술스택은 NestJS + MySQL을 사용하기로 결정했다. 필자는 express로 개발을 선호하고 있었다. 왜냐면 아무래도 Nest는 express 보다는 개발의 난도가 조금 더 어렵다고 판단했고 개발속도도 express로 할 때 더 빠르다고 생각했다. 그리고 파트너 분은 Nest를 잠깐 봤는데 실제로 프로젝트는 하지 않으셨다고 하시기도 했다.

 

Nest로 개발을 해보고 싶다고 말씀하셔서 결국 Nest를 하기로 했는데 아무래도 해커톤이다 보니까 시간이 중요하기 때문에 파트너분도 익숙한 express로 하는게 맞지 않았나라고 생각하긴 한다. 그리고 인프라 같은 경우에는 필자가 개인적으로 보유하고 있던 EC2와 RDS 프리티어를 사용하였다.

 

3.  사용자 입력에 따른 Prompt를 활용한 모델 구축 (모델 생성)

결국 우리가 구현해야 하는 기능 중에 메인은 사용자가 선택한 옵션들을 받아서 그에 해당하는 모델을 구축하는 것이다. 일단 ChatGPT API를 사용해 본 적도 없기도 하고 Prompt Engineering을 들어본 적이 없어서 시작하기 좀 어려웠다.  Flow를 설명드리기 전에 해당 화면을 보여드려야 할 것 같다.

 

UI 쪽에서 사용자가 모델의 사진을 선택할 수 있고, 모델의 이름과 역할 그리고 말투와 대답 정확도 등을 선택할 수 있다.

 

이름, 역할과 같은 Option들은 해당 링크에서 참고하였다. 이렇게 사용자가 Option들을 선택해서 모델을 생성하도록 서버에 요청을 한다면 서버에서는 Option들을 조합해서 Prompt를 생성한다. 그리고 그 Prompt와 사용자가 처음으로 질문한 내용을 가지고 ChatGPT에게 API를 통해 메세지를 보낸다.

 

참고로 아래 코드설명에서 GPT KEY를 받는 것에 대한 설명은 생략하도록 하겠다.

 

해커톤이다 보니... 코드가 좀 난잡할 수 있지만 최대한 이쁘게 작성해봤다. 필자는 다음과 같은 생각으로 코드를 작성했다.

먼저 Model DB에 row를 생성해주고, 필자가 처음 행한 질문을 가지고 ChatGPT에게 물어봐서 답변을 받아온다. 그리고 채팅방을 만들어주고 해당 채팅방에 대한 채팅을 기록해준다.

 

ChatGPT에게 메세지를 보내는 코드는 다음과 같다. 해당 코드는 OpenAI 공식문서 조금만 읽을 수 있으면 코드를 작성할 수 있다.

Model은 GPT-3.5-Turbo를 사용하였다. 다양한 모델을 사용할 수 있긴 한데 유료 계정이 필요하기 때문에 해당 모델을 택했다.

그렇게 axios 요청을 통해 질문을 하고 답변을 Return 해줬다.

 

하지만 우리는 사용자의 옵션을 가지고 Prompt를 만들어야 한다. 위의 코드는 Prompt 포맷을 만들어주는 함수이다. Prompt는 위에 올려놓은 Prompt Generator 링크를 들어가보면 확인할 수 있다. 

 

위의 과정을 거치면 다음 상태가 된다.

  • 사용자가 커스텀한 모델이 생성되고 DB에 저장된 상태.
  • 해당 모델에 대한 첫 질문과 답변이 생성된 상태 (채팅방 + 첫 채팅 질문응답)

위 기능을 구현하면서 조금 아쉬웠던 부분은 API 평균 응답시간이었다. 위의 코드를 가지고 실행시키면 평균 8-10초의 소요시간이 걸린다. 이유를 파악해보니, ChatGPT에게 응답을 받는 부분이 대부분의 평균시간을 잡아먹었다. 왜냐하면 현재 애플리케이션에서는 응답을 끝까지 기다리고 저장하기 때문이다.

 

만약에 개선을 한다면 Socket 통신을 통해서 실시간으로 ChatGPT의 답장이 적히는 걸로 구현하고 싶다. 그렇게 되면 API 평균 소요시간도 단축될 것이라고 생각한다.

 

4.  채팅 보내기 기능

 

우리는 GPT에 대한 답장을 보낼 때 채팅 보내는 기능을 사용할 것이다. 하지만 여기서 문제가 있다. 보통 채팅 기능이면 문제가 없지만 우리는 모델이랑 대화를 하기 때문이다. 왜냐하면 ChatGPT를 사용해보면 알겠지만 웹에서는 이전 채팅 내용을 기억한다. 하지만 ChatGPT API 에서는 이전 대화 내용을 기억하지 못한다.

 

그래서 DB에 저장되어 있는 채팅 내역을 가지고 메세지를 보낼 때 주입을 해주어야 한다. 하지만 공식문서에 따르면 Token (글자수) 제한이 있어서 모든 채팅 내용을 주입하지 못한다. 참고로 Token 제한이 넘으면 과금이 된다고 한다.

 

물론 해당 문제를 해결하기 위해 Lang-Chain 이라는 기술을 도입할 수 있는데 해커톤 행사상 구현할 시간이 부족하기 때문에 어쩔 수 없이 Token 제한을 넘기지 않는다고 가정하고 기능을 구현하였다. (Token 제한 = 약 4000자)

 

 

따로 다른 코드는 추가하지 않도록 하겠다. 위의 코드는 ChatGPT에게 메세지를 보낼 때 Prompt를 생성하는 코드인데 이전의 채팅내용도 포함시켜주는 메서드이다. 우리의 프로젝트 특성상 모델이 먼저 메세지를 보내는 경우는 없기 때문에 index가 홀수인 것은 사용자의 채팅이고, 짝수인 것은 모델의 답장이라고 판단했다.

 

ChatGPT에게 이전의 대화내용을 적용시켜 주려고 할 때 위와 같이 role을 user와 assistant로 구분을 지어주어야 하고, 실제 채팅내역의 순서를 지켜주어야 한다. 그리고 마지막에는 사용자가 보내려고 하는 메세지를 넣어준다. 그리고 아까 모델 생성할 때의 코드와 동일하게 ChatGPT에게 메세지를 보내고 답장을 받아온다.

 

5.  마무리

이렇게 필자가 설명해주고 싶었던 핵심적인 부분은 어느정도 정리해서 설명드린 것 같고,, 이제 마지막으로 전체적인 후기와 자료들을 공유하고 마무리를 지으려고 한다.

 

(1) 해커톤을 하면서 느낀점

일단 이렇게 단기간에 모르는 사람들이랑 팀을 이뤄서 같이 주제를 정하고 기능 정의를 하고 실제로 개발을 해서 발표까지 해보는 경험을 해봐서 너무 뜻깊었다. 그리고 중간중간 멘토님들이 오셔서 여러 질문을 받아주셨는데 지금 필자의 취업준비 상황을 알려드리고 도움을 받은 좋은 경험도 했다. (카카수님도 마지막날 오전에 오셨는데... 진짜 너무너무 피곤해서 알아보지도 못하고 물어보고 싶은게 많았는데 기능구현이 부족했어서 여쭤보지 못했ㄷr...)

 

이번에 해커톤에서 백엔드 파트너 개발자님에게 멘토 역할을 한 것 같다. 아직 Nest에 잘 익숙하시지 않은 것 같았다. 그래서 주기적으로 같이 붙어서 도움을 드렸던 것 같다. 내가 이제 누군가에게 조금이나마 도움이 된다는 거에서 나름 뿌듯함을 느꼈다.

 

행사적으로 조금 아쉬웠던 부분은 전날 오후 5시에 시작해서 다음날 오후 5시에 종료가 되는데 체력적으로 많이 힘든 것 같다. 차라리 일찍 시작해서 다음날 일찍 종료되었으면 체력적으로 덜 힘들었을 것 같다고 생각한다. 필자는 밤을 새는거에 나름 강하다고 생각했는데 다음날 오전 11시 이후부터 진짜 정신이 거의 나가있어서 집중력도, 작업 능력도 많이 떨어진 것 같았다.

 

마지막으로 발표 시간에 다른 팀들은 어떤 흥미로운 주제를 가지고 핵심을 어떻게 파악해서 구현을 했는지를 듣는데 흥미있는 시간이었다. "나라면 저런 아이디어를 생각하지 못했을 것 같은데 저런 아이디어를 생각해내다니.. 라는 생각도 많이 했다 ㅋㅋㅋㅋ"

 

필자는 다음에 기회가 된다면 이제 멘토 역할로 참여해서 다른 개발자들에게 도움이 되는 포지션으로 참여해보고 싶다..ㅎ

그렇게 되려면 언넝 열심히 더 살아야지..

 

(2) 프로덕트에서 재밌던 점

 

참고로, 필자가 구현한 모델은 한 50% 정도는 이제 원하는 답변을 잘 해주는 것 같은데 그러지 못한 Case도 많았다. ChatGPT에게 강아지처럼 행동해달라고 했는데 위의 사진처럼 답변해주는 것도 너무 재밌었다.

 

 

그리고 이거는 실제로 구현한 모델의 결과물인데 마동석처럼 행동해달라고 하고 반말로 답변해달라고 했었다. 그랬더니 진짜 저렇게 답변해주는데 옆에 다른 팀들도 웃었던 기억이..ㅎ

 

(3) 공유 자료

필자의 팀에서 구현한 것들을 전체적으로 포스팅에 공유를 드리려고 한다. 한번 구경해보셔도 좋을듯해용!!

구글 드라이브는 링크 있는 분들에게 오픈을 했으니 들어가서 시연영상이랑 발표자료 같은거 구경해보세욥!

 

Capella - Google Drive

와글와글_해커톤_기획서_탬플릿 (1).pdf

drive.google.com

 

글에 조금 두서가 없는 것 같긴한데.... 어쨌든 너무 좋은 경험이었고 이렇게 좋은 행사 개최해주신 와글와글 해커톤 운영자분들 너무 감사합니다!! :)