[RESUMAI 프로젝트 7] v1.0 최종
시험 기간 및 연구실 일들로 바빴던 6월이라, 프로젝트를 완성한 지는 좀 됐지만 뒤늦게라도 정리해보고자 글을 작성한다.
이전 글에서는 LLM API를 사용하여 프로덕트를 개발한 과정에 대해 기록했다. 이전 블로그에서 넘어온 이후로, 계속 기술적인 얘기들만 다뤄서, 정작 프로젝트에 관한 배경 설명은 제대로 하지 못한 것 같아 최종 정리를 할겸 기획에 관해 다시 한번 되짚어보려 한다.
- 깃허브는 https://github.com/resum-ai/resumai-server,
- 완성된 프로젝트는 https://resumai-client.vercel.app 에서 볼 수 있다.
(v1.0이라 PC에서만 가능하며, 온갖 버그들이 있을 수 있습니다..)
1. 기획
1. 일상생활에서 겪은 어려움
졸업 시기가 다가오면서, 나는 대학원을 준비하고, 주변 친구들은 취준을 시작했다. 준비하는 과정에서의 공통적으로 어려움을 겪은 부분은 “해놓은 프로젝트는 많은데, 자기소개서를 작성하기 어렵다”는 것이었다. 정확히는 어렵다기보다 그간 해온 일들을 어떻게 잘 풀어서 작성해야 할 지 잘 모르겠다더라.
2. 해결방안
요즘 생성형 AI가 잘하는 일들 중에 하나가 ‘문장을 잘 paraphrasing 하는 것’이라고 생각했고, 이를 이용해 ‘사용자가 작성한 경험을 토대로, 회사 맞춤형 자기소개서를 만들어 주는 플랫폼이 있었으면 좋겠다!’ 라는 생각을 하게 되었다. 그야말로 날먹 자소서를 기획했다. 구체적인 방법은 다음과 같다.
- 회사가 제시하는 질문 (e.g. 지원 동기, 직무 관심 계기 등)을 마주하면 뭘 써야 할지 모르겠다… → 해당 질문에 관한 가이드라인을 제시하자!
- 내 경험을 자소서에 어떤 식으로 녹여야 하는지 모르겠다.. 다른 합격자소서들은 어떻게 자신의 경험을 녹인거지? → LLM에게 합격 자소서를 레퍼런스를 주자!
- 기업에 특화된 자소서를 작성하려면 해당 기업에 대한 정보를 알아야 할 것 같은데.. 이건 어떻게 알 수 있을까?! → 네이버 기사로부터 데이터를 가져와 LLM에게 해당 기업에 대한 지식을 주입하자! (v2.0에서 구현 예정)
이렇게 1)가이드라인에 맞춰 쓴 사용자 경험, 2) 합격 자소서 레퍼런스, 3)기업 기사 데이터 라는 3가지 정보를 LLM에게 프롬프트로 주면 개인화된, 고퀄리티의 자기소개서가 생성될 수 있을 것이라 생각하였다.
3. 페이지
그래서 다음과 같은 페이지들을 개발하기로 계획했다.
- 랜딩페이지
- 로그인페이지
- 자기소개서 생성페이지
- 챗봇을 통해 자기소개서 수정하는 수정페이지
- 완성된 자기소개서 보고 수정하는 페이지
- 마이페이지 (자기소개서, 메모 모음)
각 페이지별로 자세한 얘기는 뒤에 페이지별로 설명하도록 하겠다.
2. 사용 기술
기본적으로 사용한 기술들은 다음과 같다.
- DRF (Django Rest Framework)
- AWS (for hosting server)
- RAG
- ChatGPT API (GPT-4o)
- Langchain
- Pinecone
기술만 보고 눈치챈 분들도 있겠지만, 나는 사용자가 작성한 경험을 기반으로 RAG를 통해 유사한 합격자소서를 가져오고, 우대사항과 함께 LLM에게 프롬프트로 주어 자기소개서를 생성하도록 기획하였다.
3. 페이지 소개
주요 페이지들만 간략하게 소개해보겠다.
1. 로그인 페이지
- 카카오 로그인을 이용한다. (이전 글 참고)
2. 자기소개서 생성 페이지
본 페이지에서는 다음과 같이 단계를 나누었다.
1. [사전 정보 입력 페이지]
- 해당 페이지에서는 지원하는 기업, 직무, 마감일 및 기업으로부터 받은 질문 (e.g. 지원 동기, 직무 관심 계기)을 입력한다.
- 입력 후, ‘저장하기' 버튼을 누르면 질문에 대해 작성할 가이드라인을 받을 수 있다. (생성된 가이드라인은 경험 작성 페이지에 있음) 이는 LLM에게 프롬프트를 주어 결과를 받아오는 식으로 개발했다.
2. [경험 작성 페이지]
- 생성된 가이드라인에 맞추어 사용자가 자신의 경험을 작성한다. 이때, 형식은 무관하며, 자신이 한 일을 나열하는 형식으로 작성할 수 있다.
- 스크롤을 내려, 공고에 나온 우대사항을 복사하여 붙여 넣는다. 이로 인해, LLM에게 회사에서 어떤 인재상을 원하는 지 등에 관한 정보를 주입할 수 있다.
- ‘자기소개서 생성' 버튼을 누르면 사용자가 작성한 내용들을 임베딩하여, vectorDB (pinecone)에 저장해둔 합격 자소서들과 유사도 비교를 한 후, 가장 비슷한 상위 2개의 자기소개서를 가져와 프롬프트에 참고 예시로 넣는다.
- 이렇게 최종적으로 1) 사용자의 경험, 2) 사용자의 자소서와 비슷한 합격자소서, 3) 회사의 우대사항 정보를 LLM에게 주입한다.
이때 context가 길어지므로, lost-in-the-middle 현상으로 인해 context 중간 정보가 소실될 가능성이 높다. 따라서 상대적으로 중요한 사용자의 경험 과 회사의 우대사항 정보를 가장 앞, 뒷단에 넣고, 상대적으로 덜 중요한 레퍼런스 합격자소서를 가운데에 넣는다.
3. 챗봇 수정 페이지
- LLM이 완성한 최종 자기소개서는 채팅방에 입장하여 보여지며, LLM과의 대화를 통해 해당 자소서를 첨삭할 수 있다.
- 예를 들어, 더 짧게 작성해달라고 하면 짧게 작성해주는 등 다양한 요구사항을 받을 수 있다.
- 이렇게 첨삭된 자소서들 중, 가장 마음에 드는 자소서를 골라 ‘완성하기' 버튼을 누르면, 최종 수정 페이지로 이동한다.
4. 최종 수정 페이지
- 최종 수정 페이지에서는 최종적으로 고른 자기소개서를 사용자가 직접 보고, 수정하기 버튼을 눌러 직접 수정할 수 있다.
4. 결과
2가지 결과를 살펴 보자.
1. 완벽한 문장들로 가이드라인에 대한 답변을 제공한 경우
1–1. 작성한 내용
GPT-4o를 이용해 정말 완벽하게 문장 형태로 가이드라인에 대한 답변을 완성했다. 우대사항도 실제로 네이버 회사 공고에서 가져와 첨부하였다.
1-2. 생성 결과
생성된 결과는 다음과 같았다. 처음에 보고 굉장히 잘 작성된 것 같아 놀랐는데, 실제로 보니 그냥 내가 작성한 내용을 그대로 복사 붙여넣기 한 꼴이라, 굉장히 실망했다. 뭔가 조금 이상한 것 같아, 제대로 프롬프트가 들어간건지 디버깅도 해봤는데, 다 제대로 들어갔었다.
(이제 와서 생각해보는건데, GPT-4o로 생성한 답변을 그대로 LLM에게 Input으로 주어서 그런 것일 수도 있겠다는 생각이 들었다 ..)
1-3. 채팅 결과
사용자의 요구사항이 반영된 텍스트는 나쁘지 않게 생성되는 것 같았다.
2. 완벽하지 않은 문장들로 가이드라인에 대한 답변을 제공한 경우
2-1. 작성한 내용 (우대사항만 그대로)
2-2. 생성 결과
생성된 결과는 다음과 같았다. 우대사항이 너무 눈에 띄게 많이 반영된 것 같지만, 그래도 이정도면 내가 작성한 경험도 적절히 우대사항과 섞어, 괜찮은 것 같다고 생각했다.
2-3. 채팅 결과
위에서 느낀 요구사항을 그대로 넣어 보았다.
음..뭔가 아직도 완벽하게 자연스럽지는 않은 것 같다.
그러나 이런 부분은 프롬프트를 개선하여 해결해볼 수 있을 것 같다.
5. 피드백
앞선 결과에서 조금 아쉬운 부분 (특히 첫 번째 결과)이 있어, 이를 개선하고자 프로젝트에 관한 전체적인 피드백을 아는 풀스택 개발자분께 요청드렸다.
그러나 생각보다 기획적인 부분에서 많은 피드백을 받았다.
1. 이걸 전부 사용자가 채워야해 ?!
본 페이지를 기획한 본래 목적
- 유저가 회사에서 제시한 질문을 보고 무엇을 작성할 지 모르는 것을 문제라고 생각하여, 작성 가이드라인을 제시했다. 이렇게 작성 가이드라인에 맞춰 유저 고유의 경험을 작성하도록 유도하려 했다.
받은 피드백
- 그러나 실제 유저들은 text input란을 굉장히 꺼려한다고 한다. 특히 신빙성 없는, 첫 출시된 서비스의 경우에는 더욱이. 그렇기에 사람들이 먼저 결과물을 본 뒤, 해당 결과물을 기반으로 자신의 경험을 넣는 등 수정할 수 있도록 기획을 수정하는 편이 좋아보인다는 피드백을 받았다.
- 특히 자소서의 경우, 성별/직군/성향 등에 따라 자소서가 비슷하게 전개되므로, 이런 기준점을 단계적으로 클릭하는 형식으로 만들어, LLM에게 페르소나를 주입하고 먼저 생성하도록 하는 것이 좋을 것 같다고 했다.
- 실제 회사에서도 text input란을 도입하니, 해당 섹션에서 유저 이탈율이 크게 증가했다. 그래서 아래처럼 ui를 수정하니, 유저 이탈율이 감소했다고 한다.
해결 방향
피드백을 받아 보니, 내가 유저 입장에 놓였을 때, 아무리 가이드라인이 주어진다고 해도 text input란을 채우기 어려울 것 같았고, 받은 피드백대로 하는 것이 훨씬 간편할 것 같다고 생각했다.
그렇다면 이런 방식으로 어떻게 고도화시켜 유저, 회사 맞춤형 자기소개서를 만들 수 있을까?
- 내가 생각한 것은 유저가 체크한 자신의 성향과 회사의 정보 (기사)를 LLM에게 주입하여 자기소개서를 생성하도록 하는 것이다. 즉, 하루마다 기업의 기사를 크롤링해와 DB에 적재하는 크롤러 만들고,
- 현재 크롤링된 자소서를 성별/직군/성향 등에 따라 태깅하여 메타데이터로 저장하고,
- 유저가 클릭한 유저의 성별/직군/성향 등을 기반으로,
1) 지원하는 기업의 최신 기사 요약본
2) 유저와 비슷한 성별/직군/성향 등을 보이는 retrieved 자소서
3) 기업의 우대공고
정보를 LLM에게 주고 먼저 생성하도록 하여 유저에게 결과를 보여주는 것이다. - 이렇게 되면, 결과가 괜찮다고 생각하는 유저는 해당 자소서를 기반으로 자신의 경험을 넣어서 자소서를 완성시킬 것이다.
2. 리텐션이 너무 낮을 것 같은데 ?!
받은 피드백
- 위와 같이 기획을 개편하고 개발하면 사용자들이 잘 써볼 것 같지만, 너무 ‘취업 시즌’ 한정으로 많이 쓰일 것 같다. 즉 리텐션이 낮을 것 같다.
- ‘리텐션 낮음’은 곧 ‘유저에게 잊혀짐’으로 귀결되기 때문에 이와 관련한 고민도 하면 좋을 것 같다는 피드백을 받았다.
6. 최종
성공적으로 하나의 프로젝트를 완성했다.
백엔드 개발도, AI 를 활용한 개발도 처음이었는데, 내가 바라던 대로 기획을 하여 원하던 기능을 모두 구현해냈다는 것이 굉장히 뿌듯하고 기분 좋았다.
향후 진행사항
사실 이대로 끝내기에는 너무 아쉬운 프로덕트인 것 같다. 받은 피드백을 바탕으로, 다른 부분들도 더 보완/디벨롭하여 실제 사용자들도 모집해보고 싶다. 기획도 바꾸고, sLLM도 활용해보며 다양한 피처들을 실험해볼 것 같다.
이 프로젝트 시리즈를 보신 모든 분들은 많이 관심을 가져 주신다면 감사하겠습니다.
많관부 !