나 대신 일해줄 수 있는 AI를 꿈꾸며...
프로젝트 매니저가 꼭 코딩을 할줄 알아야 하는건 아니지만,
내가 원하는 기능에 대해서 말로 설명할수도, 혹은 그림을 그려 설명할수도 있듯,
간단한 코딩을 통해 프로토타입을 만들어 설명하면 실제 개발에 있어 많은 커뮤니케이션 오류를 줄일 수 있다.
그렇기 때문에, 어떤 서비스를 만들수 있을지 없을지가 고민될 때, 내가 종종 하는 방법 중 하나는 최소한의 기능을 검증할 수 있는 MVP를 만들어 보는것이다.
그렇다면 요즘(이라고 하기엔 너무 많은 시간이 흘렀지만..) 화제인 GPT를 이용해서 현업에서 가진 문제 중 어떤것을 풀어 볼 수 있을까?
프로젝트 매니저로써 내가 가장 신경쓰게 되는 부분은 아무래도 사용자들의 피드백이다.
그러나 방대한 양의 유저 피드백을 잘 정리하여 확인하는것은 쉽지않고, 그것이 언어의 장벽이 있는 해외 유저들의 피드백이라면 더더욱 그렇다.
이러한 나의 고충을 해결하기 위해, 여기서는 GPT와 슬랙봇을 사용해서 MVP를 만들어 보았다.
만들고자 하는 기능은 아래와 같다.
1. 멘션 하는 시점 기준으로 해외 유저의 실시간 피드백을 수집
2. 해당 피드백 본문과 댓글 내용을 번역 및 요약후 프롬프트에서 지정한 포맷으로 가공
3. 슬랙채널에 수집한 피드백을 전송해 주는 기능 까지
를 수행하는 미니 프로덕트를 만들어 보고자 한다.
우선 동향을 수집하기 위해 "eric_tieba_crawling" 라는 모듈을 만들어 주었다.
eric_tieba_crawling 모듈안에 두개의 펑션을 만들었고, 우선 필요한 URL들을 수집한 뒤에, 해당 URL을 루프를 돌며 방문하면서 GPT 질문에 필요한 모든 내용들을 모아서 하나의 context로 만들어주었다.
처음에는 각 url마다 하나씩의 context를 생성해서 리스트로만들고, gpt가 이 리스트를 루프 돌면서 리턴하는 결과물들을 하나로 합쳐서 슬랙으로 보내주도록 구성했었지만, 긴 프롬프트를 계속 루프돌다보니 비용문제와 함께, GPT가 모든 루프를 돌고 최종 결과물을 리턴하는 속도가 URL 갯수에 비례하여 증가하므로, 하나의 context로 만들어 GPT에게 질문하되, context 안에 있는 각각의 유저 피드백을 잘 구분하도록 프롬프트를 계속 튜닝했다.
위에서 수집한 정보들을 GPT에 넣고 리턴받기 위해 "eric_gpt_tieba" 라는 모듈을 만들어 주었다.
GPT에게 커뮤니티 매니저라는 롤을 부여하고, 구체적으로 원하는 형식으로 유저 피드백을 정리 해 주도록 구성하였다.
GPT에게 질문을 하는 기능 자체는 심플하나, 원하는 결과물이 나오지 않아서 프롬프트를 여러번 튜닝하고 실험하는데 가장 많은 시간을 쓴 것 같다.
아래는 겪었던 여러 시행 착오들.
1. 주어진 context가 총 6개인데 GPT가 임의로 3~4개만 리턴함
2. 각 context 사이에 구분을 위해 "===========" 를 넣어놨는데, GPT가 자꾸 임의로 지워버림
3. 한글로 번역을 하지않고 중국어 그대로 리턴하거나 심지어는 영문으로 리턴함
4. 한개의 게시물에 댓글이 비교적 많이 있는경우에는 일부 내용을 누락하거나 제대로 요약해 주지 않음
등등의 여러 시행착오가 있었고, 조금씩 prompt를 튜닝하면서 원하던 형식의 결과물을 받을 수 있었다.
(사실 한번에 한개씩의 context를 넣고 루프를 돌면 매우매우매우 높은 정확도로 원하는 결과물을 뱉어냈지만... 속도와 비용 이슈가 있어 포기했다)
일괄된 답변을 받기 위해 temperature를 낮게 설정하였지만, 여전히 가끔씩 의도하지 않은 형식으로 결과물을 뱉는 경우가 있다.
튜닝과정에서 한국어 / 영어 프롬프트로 각각 여러번 실험해봤지만, 영어로 질문하는것이 한국어 보다 평균적으로 더 나은 결과물을 만들어 냈다.
또 하나의 실험은 원하는 질문을 한국어로 작성한 뒤에 gpt를 통해 영어로 번역시킨 후 해당 번역결과를 다시 프롬프트로 넣어서 질문을 하더라도 한국어로 질문한 것 보다는 좀 더 나은 결과를 내는 것 같았다.
영어가 익숙하지 않은 사람이라도, 충분히 손쉽게 영어로 프롬프트를 작성할 수 있겠다는 생각이 들었다.
이제 슬랙봇을 멘션하면 위에서 만든 모듈들 임포트해서 유저 피드백을 수집하고, GPT에게 질문해서 최종 결과를 슬랙 스레드로 보내주는 기능을 만들었다.
aws lambda 를 이용해서 띄우려 했으나, openai 모듈 임포트 과정에서 pylance 디펜던시 관련 에러가 계속 나서 로컬머신을 서버로 사용해보았다.
(이 부분은 구글링을 아무리 해봐도 자료가 거의 없어 해결책은 아직 못찾았습니다....아시는 분 있으면 알려주세요... )
로컬에서 코드가 실행되는 동안, 채널에서 봇을 멘션하면 현재 시간과 함께 유저 피드백 수집을 시작한다는 메세지를 보내준다.
그 후 약 30초~1분 정도가 지나면 최종 결과를 스레드로 보내주게 된다.
최종 결과물은 나쁘지 않은 것 같았다.
비록 번역 퀄리티 문제가 있긴하지만, 콘텐츠에 대한 이해도가 있는 사람이라면 어느정도 이해할 수 있는 수준으로 잘 뽑아준 것 같다.
이중에서 유저들이 떠나고 있다는 동향은 뼈아프다 (...)
유저들은 인게임 경제 시스템에 대한 큰 불만이 있는것 같고, 이를 토대로 현재 프로덕트에서 구축한 경제 시스템에 어떤 문제가 있는지 추가 분석을 통해 살펴봐야 겠다는 생각이 들었다.
만약 동향처럼 최상위 충성 고객들이 지속적으로 이탈하고 있는 상황이라면, 앞으로도 이런 동향들을 지속적으로 수집하고, 동시에 데이터 분석을 통해 유저들의 이탈원인에 대해 어떻게 프로덕트를 개선해야할지, 또 이 유저들을 어떻게 다시 복귀 시킬 수 있을지에 대한 전략을 도출해 낼 수 있을 것 같다.
(최근 update)
위와 같이 만들었던 프로토타입을 실제 서비스에 적용했고, 현재 많은 내부 유저들이 활발하게 사용하고 있어서 매우 뿌듯하다.
이번에 미니 프로덕트를 만들어보면서 가장 어렵다고 느낀것은 "GPT가 원하는 퀄리티로 일괄된 답변을 내놓는 것" 이었다.
동일한 context를 넣어서 동일한 프롬프트로 GPT를 호출하더라도, 결과가 다르게 나오는 경우가 꽤 있었다.
그 다음으로 어렵다고 느낀 부분은 번역 퀄리티에 대한 것이다.
GPT4라면 좀 더 낫겠지만, 결국은 고유 명사에 대해 모두 라벨링을 해서 글로서리를 제공하지 않으면 최종 결과물의 퀄리티를 올리기 어렵겠다는 생각이 들었다.
이 부분은 결국 자동화가 어렵고 사람 손을 많이 타야하는 부분이라, 단기간에 실험해 보기 어려운 부분이었다.
그래도 이렇게 MVP를 만들어보는 과정을 통해, 기존의 전통적인 프로그래밍 방식으로는 구현하기 어려운 형태의 프로덕트를 만들 수 있다는 확신이 들었고, 초거대모델의 발전과 함께 앞으로 점점 더 많은 프로덕트들이, 손쉽게 개개인의 니즈에 맞춰서 개인화 되어 나올 수 있을 거라 생각했다.
예를 들어 대량의 라벨링 된 데이터가 필요한 Sentiment Analysis 같은 경우도, 위의 과정에서 prompt에 "각 유저 피드백에 대해 긍정/중립/부정 등을 구분하고 0~1 사이의 점수로 표현해줘" 라는 내용만 추가하더라도 손쉽게 할 수 있는 등, 활용 방안이 무궁무진 하다고 생각했다.
AI가 사람들의 일상속으로 들어온지 꽤 된 만큼, 나도 꾸준히 AI의 활용 방안을 생각해 봐야겠다.