[사이드 프로젝트 회고록] 연애 고민이 있나요? 못말리는 아가씨 ♥
올해 3월 말... 자대 해커톤을 함께했던 친구 N양(기획, 디자인, FE)과 나(BE)는 "재밌는 사이드프로젝트를 해보자"라는 목표로 단결했다. 그리고 함께 해커톤에 참여했던 프론트엔드 개발자분 Y님을 영입했다. 우리의 목표는 어디까지나 '재밌는' 프로젝트를 진행해보는 것이었기에, 여러 주제들이 나왔지만 우리의 관심을 끄는 주제는 그들 중 단 한 가지였다.
그건 바로
연애상담 + 미연시
였다.
소개합니다, 연애상담 챗봇 '못말리는 아가씨♥'
우리는 정말 이상한 걸 만들 생각에 기뻤고, 곧바로 작업에 착수했다. 시험기간이 다가오고 있었지만, 빠르게 기획/디자인을 완성했고, 4월 한 달 동안 작업을 끝낼 생각으로 노션/디스코드 등 소통 채널을 활성화했다.
우리의 사이드프로젝트 '못말리는 아가씨' (???: 이걸 나중에 포폴로 낼 수는 있을까?) 의 기능은 총 두 가지였다. 우리는 이왕 해보는 거, 요즘 트렌드라는 생성형 AI를 조금이라도 다뤄보자는 목표를 추가해 기능을 설계하게 되었다.
집사와의 연애상담
ChatGPT의 system message를 설정해 아가씨를 모시는 집사의 말투로 연애상담을 해준다.
집사는 아가씨를 모시는 걸 최우선으로 하고, 상황에 맞게 적절한 연애 조언을 주도록 한다.
못말리는 연애 시뮬레이션
연애상담으로는 부족한 아가씨를 위해, 연애상황에 익숙해지도록 시뮬레이션 기능을 제공한다. (설정상 집사가 데려온 로맨스판타지 남자주인공들이 등장한다)
각 남자 캐릭터의 얼굴은 생성형 AI를 사용해 만든다.
모든 캐릭터들을 '공략'하고 나면, 시크릿 루트 '집사'가 열린다.
쓰면서도 참 부끄럽네요...
다른 분들은 모르겠지만, 당시의 나는 1월에 백엔드 개발을 처음 해본 상태로, 이 정도 기능을 구현하는 데도 꽤나 많은 노력이 필요했다. 외부 API 연결이며, 백엔드 서버 배포며 익숙하지 않은 게 많았기 때문이다. 이 글에서는 내가 백엔드 개발자로서 당시에 어떻게 각 기능을 개발했는지 소개해보고자 한다.
기능 1: ChatGPT 연결하기
우선은 ChatGPT API 연결이 필요했다. 그리고 System message를 통한 집사 말투 + 태도 지정이 필요했다. 백엔드 개발 시에 Spring을 사용하고 있긴 했지만, python을 임베딩하는 방식으로 진행했어서 python 복습도 필요했다. 갈 길이 멀었다.
우선 ChatGPT 연결부터! 나는 외부 API 연결에 대해 아무것도 모르는 상태였기에, 처음에는 많이 혼란스러웠다. 그런데 예전에 spring을 공부할 때 공식 문서를 뜯어봤던 게 생각나서, 이번에도 공식 문서를 뜯어봤다.
https://platform.openai.com/playground/
OpenAI의 API를 사용해보셨던 분들이라면 다들 알고 계시겠지만, 여기서 모든 걸 처리할 수 있다. API 호출과 관련된 공식 문서는 첫 번째 링크에서 확인 가능하고, 실제로 사용해보고 여러 설정을 조정하려면 두 번째 링크, playground에 접속하면 된다.
나는 우선 여러 기술블로그와 공식문서의 도움을 받아 API 키를 발급받고, 연결에 필요한 돈을 OpenAI에 지불하고, 모델에 시스템 메시지를 주는 것도 성공했다.
그런데 여기서 발생한 문제가 있다.
평소에 ChatGPT와 대화할 때처럼 이전 chat을 기억하게 만들고 싶은데(=대화에 '맥락'을 주고 싶은데), 그건 어떻게 하지?
난 그때 무척 초보였어서(지금도 별로 다른 건 없다;) 이걸 해결하는 데 꽤 오랜 시간이 걸렸다. 며칠은 고민했던 걸로 기억하는데, 결국 내가 선택한 방법은
List<Map<String, String>> previousMessages를 만들어주고,
요청을 보낼 때마다 이전의 메시지 + 새로운 메시지를 추가해서 보내주는 것이었다.
이렇게 하면 평소에 우리가 ChatGPT를 사용하는 것처럼 이전의 내용을 기억할 수 있고, 대화에 '맥락'이 생긴다. 예를 들자면 이렇다.
예전에는
아가씨: 연애 상담 좀 도와줘. 내가 좋아하는 선배가 있는데, 선배한테 여자친구가 있는지 없는지 티 안 나게 떠보고 싶어.
ChatGPT: 그렇군요 아가씨. 어쩌구저쩌고
아가씨: 근데 그 선배가 눈치가 빨라서 그러기는 힘들 것 같아.
ChatGPT: 네? 뭐라고요? (실제로 이러지는 않겠지만 예를 들자면 이렇다는 것이다)
이랬다면...
수정된 코드는
아가씨: 연애 상담 좀 도와줘. 내가 좋아하는 선배가 있는데, 선배한테 여자친구가 있는지 없는지 티 안 나게 떠보고 싶어.
ChatGPT: 그렇군요 아가씨. 어쩌구저쩌고
아가씨: 근데 그 선배가 눈치가 빨라서 그러기는 힘들 것 같아.
ChatGPT: 그럼 더 조심스러운 방법을 택해야겠군요. 어쩌구저쩌구
이런 처리가 가능해진다!
사실 디스콰이엇을 사용하시는 다른 개발자 분들에게는 이런 처리가 정말 기초 단계라 우스워 보이실 수도 있겠지만... 실제로 초보인 나에게는 나름의 성취였다.
나는 이렇게 첫 기능을 구현하는 데 성공한다. 그리고 대망의 두 번째 기능, 제일 이상한 기능인 '미연시'를 어떻게 구현했는지도 설명해보겠다.
기능 2: 미연시 스크립트를 DB에 깔끔하게 저장하기
이 기능은 기본적으로 스크립트가 있는 미연시 미니게임이다. 스크립트를 프론트엔드에서 다 관리할 수는 없으니, 미리 DB에 스크립트를 넣어두고 프론트에서 각 캐릭터마다 API요청을 보내면 캐릭터에 맞는 스크립트를 보내주는 작업이 필요했다.
그리고 우리의 미연시(와 정말 부끄럽다)에는 이런 요소들이 있었다.
장면(무도회장, 저택, 황궁 정원 등...)
대화 타입(나레이션, 캐릭터)
선택지 여부
다양한 캐릭터의 이름들
그리고 이런 요소들도 고민해야 했다.
스크립트1에서 스크립트2로 넘어가려면 어떻게 해야 하는가?
점수 변화는 어떻게 줄 것인가?
그래서 작업이 쉬울 거라고 예상했던 이 부분에서는, 의외로 DB 설계에 시간을 많이 쓰게 되었다. 고려해야 할 지점들이 많았기 때문이다.
다양한 자료들을 찾아봤지만, 대부분 우리의 미니 게임보다는 복잡한 걸 구현하시는 분들의 로그가 많았고... 나는 찾아보면 찾아볼수록
승훈님이 되었다.
그래서 나는 그냥 내 머리를 짜내는 방법을 택했다. 그렇게 해서 나온 API 명세서가 바로 이렇다.
dialogueId: 지문의 식별자
sceneType: 다양한 장면의 이름
dialogueType: 대화인지, 나레이션인지 구분
isChoice: 일반 대화와 사용자 선택지를 구분
speakerName: 다양한 캐릭터의 이름을 구분(황태자, 대신관 등..;)
dialogueText: 실제로 화면에 보여지는 지문
nextDialogueId: 다음으로 넘어가야 하는 지문의 식별자
scoreChange: 선택지에 따른 점수 변화값(+, -)
이 스크립트를 프론트에 쭉 넘겨주면, 프론트에서는 제일 첫 지문부터 시작해서 선택지에 따라 마지막 지문까지 향할 수 있고, 장면/대화 타입/선택지 여부/캐릭터 이름에 따라 사용자에게 보여주는 화면을 자동화할 수 있다. (혹시 미연시 만드시는 분 계시면 참고하세요)
'못말리는 아가씨'가 내게 준 것
지금까지 소개한 두 가지 기능들을 개발하면서, 생초보 개발자였던 나는 크게 두 가지를 배울 수 있었다.
외부 API를 연결하는 건 그리 어렵지 않구나!
DB 설계를 효율적으로 하는 건 정말 중요하구나!
재밌는 걸 기획해야 개발하면서도 재밌구나!
비록 API 한 개 정도를 연결했고, DB를 설계하는 것도 완벽히 했다고는 생각하지 않지만... 한 달간 진행된 프로젝트에서 이 정도를 배웠다는 것만 해도 나는 큰 성과라고 생각한다.
이 이후로 나는 사이드 프로젝트에 재미가 들려, 다른 재밌는 것들도 많이 도전해보게 된다. 올해 한 것만 따지자면 이 정도가 있다.
개발: 이화여대 중앙실전창업학회 UNIS 대동제 웹사이트 'UNIS 주막' (2024.5)
개발: 채식주의자를 위한 데이팅 웹앱 'Vegiter' (2024.07)
기획: 시간약속 습관관리 서비스 '러너웨이' (2024.07)
개발: 연극팀 이외동문 인포 웹사이트 '기억의 이름' (2024.10)
개발: 생성형 AI 활용 ASMR 서비스 'Hear Here' (2024.10~)
학교 축제, 데이팅 앱, 습관관리, 연극, ASMR 등 나는 내가 관심있는 부분들에 뛰어들어 다양한 도전들을 해오고 있다. 회고록이 아주 제대로 밀렸으니 앞으로는 이 프로젝트들에 대해서도 글을 써보고자 한다.
앞으로도 재밌는 거 많이 개발하면서 살고 싶다.
그러려면 실력을 길러야겠지...
열심히 해봐야겠다. 파이팅~
그리고 사이드 프로젝트 팀은 항상 구하고 있으니, 시간 있으시다면 저의 프로필과 깃헙을 확인 부탁드립니다 ^___^
'못말리는 아가씨'에 대해 더 알아보고 싶으시다면... (과연 그런 사람이 있을까...)
겨레에 대해 더 알아보고 싶으시다면... (겨레는 저예요)
댓글
로그인 후 댓글을 남길 수 있습니다.
잘 읽고 갑니다 짱개발자 겨레님~ 👍
나은님 저랑 또 플젝해요~ ^___^