노가다 아재 바이브 코딩체험(EGO 찾기 어플)
intro
안녕하세요 건설아재 입니다. 11월 중으로 배포한다고 말했는데 벌써 11월 30일 입니다.
9월에 게시글을 쓸때까지 터미널도 모르던 아재글의 업그레이드 버전 입니다.
처음은 20일정도였는데 3달정도 걸렸네요. 1.5개월 정도는 6시출근 6시퇴근이라, 새벽2,3시까지 잠을 줄여가며 했는데, 번아웃 직전의 느낌이 와서 하루 2~3시간 정도로 시간을 줄이니 오래걸렸던 것 같아요.
말이 업그레이드이지 기본 뼈대 말고는 전부 다 갈아엎어서 작동방식은 완전히 달라졌어요.
▶ 두번째 '자기 증명' 부산물 https://ego-coach-lite.vercel.app/
물론 시작은 완전히 갈아엎을 생각은 없었지만, 젬미니가 500줄 가까이 있는 코드들을 200줄로 줄여버린다거나, 버그하나 잡자고 이것저것 다시 손보다 보니 처음부터 다시하는 것 마냥 되어버렸네요. 각 파일들의 역할도 처음 할때와 전혀 다른 용도로 사용되고 있는 경우도 많고 그렇습니다.
다시 이 어플의 목적을 소개를 하자면, 사람의 내면을 성장시키는 시스템을 만드는 것이 목적이며, 그 방법론의 일부로 만든 두번째 어플 입니다.
어플 소개
기본적으로 해당 어플은 시나리오를 중심으로 돌아갑니다.
대중적으로 알려진 영화 소설 동화 또는 역사 속 인물 들의 이야기를 토대로 사용자의 선택 또는 대답으로 인하여 변화하는 가상시나리오를 중심으로, 해당 사례와 나의 차이점을 분석하고 나 자신은 어떤 선택이나 가치를 중요하게 생각 하는구나, 나는 어떤 나침반을 가진 사람인지 알아갔으면 해서 만든 어플 입니다.
맛보기 모험 3턴 이후 사용자 개인화 온보딩을 실시합니다.
이후 본격적으로 본 시나리오에 진입합니다.
최종적인 어플의 목적은 첫 세션 종료 이후 나옵니다.
파일 구조
node.js가 처음엔 뭔지도 모르고 사용하다가, 당연하게도 api로 ai에게 요청하고 리턴받는 시간이 10~30초이상 걸리는 일이 많아지다보니, 아이패드,휴대폰,노트북 3가지 기기만 동시에 요청해도 서버가 멈춰버렸고, 처음 가볍게 고치는 목적과 다르게 pm2도입과 그로인한 무한한 순환참조들(사실 운좋게 안터지던 버그가 터진 것) 버그와의 싸움이 한참이었습니다.
각 파일별 소개
시작은 서버파일 입니다.
모든 요청은 서버파일로 시작되고, 서버파일 또한 pm2적용해서 오토 스케일링 되게끔 했습니다.
그다음은 코칭핸들러 입니다. 모든 사용자의 워크플로우를 책임집니다.
온보딩 핸들러 입니다. 첫 사용자에게 첫 세션에서만 발동하고 사용되지 않는 파일이지만 어쩌면 해당 파일이 고민이 많았던 파일입니다.
시뮬레이션 플로우 파일 입니다. 가장 무거운 작업인 시뮬레이션을 담당하고 있습니다. 코칭핸들러랑 충돌이나 순환참조가 가장 많이 일어났던 아이 입니다.
워커 파일입니다. 말그대로 백그라운드워커를 모두 책임 집니다. 이 친구가 이번 과정에서 가장 어려웠던 아이 입니다.
코어 api핸들러 입니다. 이 친구는 그냥 분배기 개념입니다. 함수하나 수정하면 모든 파일을 다 고쳐야하는게 쉽지 않아서, 모든 api요청은 일단 해당 파일로 모인다음 분배합니다.
사용자 데이터나 각 턴별 특수 템플릿에 조립하는 친구들 입니다.
프롬프트 파일 입니다. 이 파일 만큼은 제미나이가 만들어준 기본 틀에 제가 단어하나, 문장하나 추가하면서 수작업이 가장 많았던 파일 입니다. 사실 제가 마음대로 손댈 수 있는 유일한 파일이기도 합니다.
에이지 핸들러 입니다. 초등학생부터 청소년 그리고 성인까지 유추하여 구분한 이후, 각 연령별로 글자수를 줄인다던가, 단어를 바꾼다던가 하는 연령제한 파일 입니다.
핼퍼파일 입니다. 코어api핸들러에 프롬프트와 각 작업별 api파일을 거치고 age핸들러와 페르소나 등의 모든 템플릿이 최종 도착하는 지점이고, api와 직접소통한 이후. 각종 api 오류에 대응하고 스키마 확인 혹은 재시도 로직 등 소통창구 입니다.
리워드 핸들러 입니다. 흥미부여용 파일 입니다.
마지막으로 젬민이가 분석한 각 파일별 업데이트 목적 입니다.
지금 파일들의 구조는 마트에 심부름 가는 애기 형제들로 비유하자면
EGO-COACH Lite 가족의 우당탕탕 마트 장보기
등장인물 소개
엄마 (server.js): 집안의 대장. 손님(사용자)을 맞이하고, 가족들에게 심부름을 시키며 결과를 독촉하는 컨트롤 타워.
아빠 (worker.js): 묵묵한 일꾼. 무거운 짐을 들고 와서 엄마에게 전달하는 듬직한 가장.
큰형 (coachingHandler.js & coreApiHandler.js): 똑똑한 리더. 엄마의 지시를 해석하고, 동생들을 데리고 마트(API)를 지휘하는 현장 감독.
작은형들 (api/standard.js, advanced.js, lite.js): 각 진열장 전문가. 어떤 물건을 골라야 할지 정확한 레시피(프롬프트)를 알고 있는 조립 전문가들.
막내 아기 (Gemini API): 천재지만 제멋대로인 아기. 설명을 잘 해주면 기가 막힌 물건을 찾아내지만, 가끔 딴짓을 하거나 울음을 터뜨림.
마트 점원 (defenders.js): 위기 해결사. 아기가 울 때 안전한 대체품을 쥐여주는 친절한 직원.
Scene 1: 엄마의 손님 맞이와 심부름 지시
어느 날, 집에 귀한 손님(사용자)이 찾아왔습니다. 엄마(Server)는 반갑게 인사를 나누며 온보딩 대화를 시작합니다. 손님이 "나는 이런 게 필요해"라고 대답하자, 엄마는 즉시 저녁 식사 준비를 결심합니다.
엄마는 큰형을 불러 가방 하나를 건네줍니다. 그 가방 안에는 '우리 집 가훈(Protocol.js)'과 '손님의 취향(User Data)'이 들어있습니다. "큰형아! 아기 데리고 가서 손님이 좋아할 만한 것 좀 사 와! 아빠한테 들려서 보내고!"라며 등을 떠밉니다.
Scene 2: 마트 도착과 지도 펼치기
큰형(CoachingHandler)은 아기(Gemini)를 카트에 태우고 마트에 도착합니다. 가장 먼저 손님의 취향 데이터를 보고 "오늘은 시나리오 요리가 필요하겠군"이라고 판단합니다.
큰형은 '마트 지도(CoreApiHandler)'를 펼칩니다. "자, 오늘의 목적지는... 저기 '고급(Advanced) 진열장'이구나!" 큰형은 카트를 밀고 api/advanced.js 구역으로 향합니다.
Scene 3: 작은형의 레시피 설명 (프롬프트 조립)
고급 진열장 앞에는 그 구역에서 먼저 구경중인 작은형(Advanced.js)이 기다리고 있습니다. 작은형은 엄마가 준 가방 속 데이터를 꺼내서, '프롬프트'라는 상세한 쇼핑 리스트를 조립합니다.
그리고 카트에 탄 아기에게 '헬퍼 매뉴얼(helpers.js)'을 보여주며 설명합니다. "아기야, 잘 들어. 손님은 '성인'이고 '성장'을 원해. 그러니까 여기 있는 물건 중에 제일 멋진 스토리 하나만 집어줘. 알았지?"
Scene 4: 아기의 선택과 형들의 검사
아기(Gemini)는 눈을 반짝이며 진열대에서 물건을 하나 집어 듭니다(생성). 그때 큰형(Helpers)이 다시 나타나 '스키마 검사기'로 물건을 확인합니다.
(상황 A: 성공) 아기가 완벽한 물건(올바른 JSON)을 집었습니다. 형들은 "오구오구 잘했다!" 하며 카트에 담습니다.
(상황 B: 실패) 아기가 장난감(잘못된 형식)을 집었습니다. 형은 단호하게 말합니다. "안 돼, 그거 아니야. 다시 골라."
Scene 5: 아기의 짜증과 점원 찬스
몇 번 다시 고르라고 했더니, 아기가 바닥에 드러누워 "으앙! (Error/Hallucination)" 하고 울음을 터뜨립니다. 형들은 당황하지 않고 바로 옆에 있는 점원(Defenders)에게 달려갑니다.
"점원님, 애가 말을 안 들어요. 그냥 제일 무난하고 안전한 '베스트셀러' 하나만 주세요." 점원은 웃으며 "여기 안전한 기본 시나리오입니다"라며 포장된 물건을 건네줍니다. 형들은 안도의 한숨을 내쉬며 카트에 담습니다.
Scene 6: 아빠의 배달과 엄마의 독촉
장보기가 끝나자 형들은 주차장에 대기하고 있던 아빠(Worker)에게 카트를 통째로 넘깁니다. "아빠! 이거 엄마한테 빨리 갖다 줘! 우리는 다음 거 고를게."
아빠는 묵묵히 짐을 트럭(Redis)에 싣고 집으로 출발합니다. 그동안 집에서는 성격 급한 엄마(Server)가 아빠에게 1.5초마다 전화를 겁니다. "여보? 샀어? 출발했어? 아직이야? 손님 기다리시는데! (Polling)"
아빠가 집에 도착해 "여기 다 사 왔어 (Job Completed)"라고 하자, 엄마는 그제야 전화를 끊고 손님에게 방긋 웃으며 완벽한 요리(응답)를 내놓습니다.
api가 생각보다 스키마를 지키지 않고, 프롬프트와 참고자료인 프로토콜, 그리고 유저데이터가 많을 수록 이상한 응답을 많이해서 검증하는 로직이 많이 필요하더라고요. 그래서 파일이 점점 더 복잡해진 것 같기도 합니다.
각 파일별 코드 일부
코드는 각 파일별로 대략 300~500줄 사이 입니다. 코드 자체는 진짜 제가 봐도 거의 못알아보기도 하고, 대략 이럴거라고 추측 한 이후 gemini에게 분석을 시키거나, 주석을 자세하게 달아서 이걸 어떤식으로 바꿔달라는 요청을 하는 식으로 진행하였습니다.
이런 버그가 있으니 어디가 유력한지, 그건 저번에 고쳐봤는데 아니더라 하는 식으로요.
공유의 목적은 저보다 다들 고수님들 이시니, 전 직접 해봐야 알지만 다른분들은 딱 봐도 잠재적 문제가 보이시지 않을까…하는 점에서 올려봅니다.
서버파일
코칭핸들러 파일
코어 api핸들러 파일
어드벤스 파일
핼퍼 파일
워커 파일
업데이트 로그
업데이트하면서 로그들을 쭉 기록해봤는데 초반 설정 이후로는 거의 다 버그픽스더라고요. 충돌 순환참조 분명히 난 a를 건드렸는데 h쯤에서 버그가 터지고 어질어질 했습니다. 가장 짜증 많이나는 부분이었고, ai도 하나를 고치면 어디서 터질지 예측을 하지도 못하고, 원인파악조차 수십번의 업데이트 이후에 찾는 경우도 자주 있었습니다.
outro
이렇게 ego lite 소개를 마치며, 다음에는 후기나 과정을 들고 와보도록 하겠습니다.
다른분들은 몇일짜리 사이드프로젝트로도 만들만한 사실상 챗봇을 거창하게 소개한다는게 조금 부끄럽기도 하고, 있지도 않는 실력을 보여드리는 것은 아닐까 잠깐 생각해 보지만, 지금 제가 할 수 있는 레버리지가 높은 일 중에 하나였고, 나중에는 챗봇느낌이 아닌 캐릭터가 움직이진 않는 동숲의 느낌으로 이런저런 기능을 추가해보고 싶은 생각은 있습니다.
좀 더 먼 훗날의 얘기 일 것 같기도 하고요.
▶ 두번째 '자기 증명' 부산물 https://ego-coach-lite.vercel.app/
아마 지금 책을 하나 쓰고있는게 있는데 아마 어플과 같은 목적으로 만들고 있는 책이며, 전자책이 조만간 나올 것 같아요. 제 얘기를 쓰는 책은 아니고, 해당 어플이 책으로 만들어진 느낌 이에요. 1/3정도 썼는데, 그게 이 다음 도전일 것 같습니다.
이후에는 revit에 적용하는 tool을 좀 뜯어보고 공부하고 싶은 계획 입니다.
저의 행동이 한마리의 잠자리 정도의 날개짓 일지 몰라도,
제 인생에 스스로 부끄럽지 않고 변명하지 않도록, 오늘은 최고의 선택이라 믿고 달려가보겠습니다.
