코인 - AI 업무 자동화
서론
코인 서비스에는 버스 시간표, 생협장 시간표 그리고 강의 정보를 제공해 주는 기능이 있다. 이 3개의 정보는 백엔드 개발자가 직접 업데이트하는 방식이었다. 업데이트 방식도 다양하게 존재했었다.
- 버스 시간표
- 과거 방식 1: JSON을 작성해서 스크립트를 돌린다.
- 과거 방식 2: MongoDB에서 수기로 수정한다.
- 현재 방식: 어드민에 엑셀을 업로드하여 업데이트한다.
- 생협장 시간표
- 과거 방식 1: Flyway를 통해 데이터를 삽입한다.
- 현재 방식: 어드민에 엑셀을 업로드하여 업데이트한다.
- 강의 정보
- 현재 방식: 서버에 강의 엑셀을 옮기고 파이썬 코드를 실행한다.
버스 시간표와 생협장 시간표는 25년 하반기에 TF를 직접 모집해서 어드민에 엑셀을 업로드하는 방식으로 바꿨다. 이제 사람들이 잘 운영해 줄 거라고 믿고 코인에서 손을 떼려고 한 순간 문제가 발생했다.
26년 하계 방학으로 넘어가는 과정에서 버스 시간표와 생협장 시간표가 5주 넘게 업데이트되지 않았다는 이야기를 들었다. 이전 학기 버스 정보가 올라가 있기 때문에 피해를 보았다는 이야기도 들었다. 또한, 강의 정보도 공지가 올라온 지 5일 뒤에 업데이트가 됐다는 이야기를 들었다.
이 외에도 이런저런 이야기를 많이 들었다. 이 문제를 해결하기 위해서는 백엔드 개발자의 업무 의존성을 줄여야겠다는 생각이 들었다. 결국은 백엔드 지식이 있는 사람이 지금 할 수 있는 업무인데 그 백엔드 개발자가 없어서 상황이 이렇게 된 것도 있고, 엑셀로 업데이트하는 방식에서도 DB에 수작업을 해야 하는 것이 있기 때문에 백엔드 개발자가 필수이다.
이 작업을 하기 위해서 기존 스키마를 고치고 강의 정보도 엑셀로 업데이트하는 방식으로 바꾸기에는 시간이 너무 소요될 것 같았다. 특히, 엑셀 방식이 그렇게 편하다고 느끼는 팀원이 많지 않았다. 엑셀 이외의 생각나는 방법이 없었기 때문에 AI라는 최후의 방법을 생각했다.
본론
TF 모집

슬랙 채널에 제안서와 함께 TF 모집을 했다. 코인 프로젝트에서 AI 업무 자동화를 적용한 적은 이번이 처음이기 때문에, 다들 관심이 많을 줄 알았다. 특히, 백엔드 개발자가 아니어도 충분히 가능하다고 생각했기 때문에 다양한 트랙 사람들이 오기를 내심 기대했다.
결과적으로 프론트엔드 개발자 한 명과 안드로이드 개발자 한 명이 참여했다. 항상 보던 얼굴이라 새로운 뉴페이스를 보고 싶었지만, 그래도 열심히 하던 사람들이었기 때문에 걱정은 안 됐다.
SKT 공모전

원래는 작업 일정을 여유롭게 가져가려고 했다. 자격증 시험도 있었고 갑자기 공고가 많이 올라와서 할 게 좀 밀려 있었다. 그러던 와중에 SKT에서 프롬프트 공모전을 열고 있다는 소식을 접했다. 공모전 주제가 지금 하려는 내용과 유사해 보여서 참여해 보면 좋겠다는 생각이 들어 슬랙에 공유했다.
다들 괜찮다는 의견을 줬다. 하지만, 마감이 얼마 남지 않아서 원래 일정을 바꿔야 하는 상황이었다. 다들 열심히 하던 팀원들이었기 때문에 하루 해커톤을 달리면 될 것 같아, 8월 8일 토요일에 달렸다.
요구 사항

각 도메인마다 업데이트 과정에서 필요한 작업이 다르다. 특히, 프론트 개발자와 안드로이드 개발자는 이 플로우를 모르기 때문에 관련해서 요구 사항을 정리해서 전달했다. 내가 맡은 부분은 생협이기 때문에 여기에서는 생협 관련 내용을 다룬다. 생협의 요구 사항은 아래와 같다.
- 배치에서 생협 시간표 공지사항을 감지하면, 슬랙으로 알림을 보낸다.
- 사용자는 예/아니요 버튼을 누른다.
- 예 버튼을 누를 경우, 생협 시간표 이미지에 있는 데이터를 어드민 API의 요청값으로 변환한다.
- 아니요 버튼을 누를 경우, 해당 알림을 통해 더 이상 업데이트를 진행하지 못하도록 막는다.
- 데이터 변환이 완료될 경우, 슬랙으로 알림을 보낸다.
- 사용자는 변환된 데이터를 바탕으로 생성된 HTML을 보고, 정상적으로 변환이 됐는지 확인한다.
- 정상적으로 변환됐을 경우, 슬랙에서 예 버튼을 누른다.
- 정상적으로 변환되지 않을 경우, 슬랙에서 메시지를 전송하여 수정을 한다.
- 4-b를 통해 정상적으로 데이터가 정상적으로 변환될 경우, 예 버튼을 누른다.
- 4-a 혹은 5를 통해 예 버튼이 눌러지면, 어드민 API를 호출한다.
- 생협 학기 생성: Swagger UI
- 생협 시간표 업데이트: Swagger UI
트러블 슈팅
요구 사항 자체는 크게 어렵지 않기 때문에, 코딩 에이전트 도구를 사용하면 금방 할 수 있었다. 다만 중간중간 제약 사항이 생긴 부분은 있었다.
API 추가 및 수정


데이터를 DB에 직접 넣는 방식을 처음에 생각했는데, 이렇게 되면 도메인에서 요구하는 유효성이 깨질 것 같아 어드민 API를 호출하는 방식으로 하기로 기획했다.
그래서 어드민 API를 쭉 보니, 추가해야 하는 API도 있고 무슨 이유인지는 모르겠는데 업데이트를 막은 API도 있었다. PR을 확인해도 이유가 적혀 있지 않았고, 꽤 오래전 내용이라 트래킹이 잘 안 됐다. 혹시 모르기 때문에 내부 로직에서 분기 처리를 진행했다.
스테이지/프로덕션 구분

이 작업을 진행할 때는 삐봇이라는 동아리 슬랙 봇을 사용한다. 삐봇은 스테이지와 프로덕션 구분이 없지만, 코인은 스테이지와 프로덕션이 구분되어 있기 때문에 분기가 필요했다.

분기하는 방법은 여러 가지가 있을 것 같았다. 슬랙 인터랙티브 URL에서 stage와 prod를 구분하는 방법이 처음 떠올랐다. 배치에서 슬랙에 메시지를 쏠 때, 실행 환경에 따라 URL을 분기 처리하면 삐봇에서도 구분이 가능하기 때문이다. 하지만, URL이 안 예뻐지기도 하고 뭔가 짜쳤다.
그래서 생각난 것이 슬랙 채널 ID다. 삐봇에서는 동아리 슬랙 채널 ID를 관리하고 있었기 때문에 동일 인터랙티브 URL로 요청이 오더라도 채널 ID를 통해 분기 처리하면 깔끔할 것 같았다. 이렇게 되면 배치에서도 URL에 추가 작업을 하지 않아도 되고, 삐봇에서 분기 처리 한 번만 하면 된다.

배치 연결

배치에서 크롤링을 하는 과정에서 각 도메인에 맞는 게시글을 식별하면 알림을 쏴야 한다. 프로덕션은 크롤링이 되고 있지만 스테이지 서버는 크롤링이 막혀 있는 상황이다. 라즈베리파이를 임시로 스테이지 크롤링으로 쓰고 있었지만, 포트 유효기간이 만료돼서 재신청 후 대기하고 있다.

그래서 임시로 배치에 테스트로 알림을 쏠 수 있는 코드를 추가해서, 작업 과정에서 실제와 유사하게 할 수 있는 환경을 구성했다.

AI API 비용

토큰 비용이 걱정된다는 의견이 있었다. 자동화 과정에서 호출되는 AI 비용은 모두 동아리비로 나가기 때문에 과도하게 사용할 경우 이야기가 나올 수 있다. 이 작업들은 1년에 합쳐서 최대 12번 진행하기 때문에 그렇게 비용이 많이 나갈 것 같지 않았고, 이 TF를 모집하기 전 테스트를 개인적으로 했을 때 비용이 거의 발생하지 않아 문제가 없을 것이라 생각했다.
하지만, 엑셀 데이터가 크기도 하고 데이터가 좀 많아 비용이 많이 들 것 같다는 의견을 줘서 자동화를 좀 많이 돌린 인원에게 얼마 정도 비용이 나왔는지 물었다.

60번 넘게 돌린 결과 2.4달러가 나왔다는 말을 듣고, 1년에 해 봐야 거의 안 나오는 수준이라고 결정했다. 사실 이 정도면 코인 서버비보다 엄청엄청엄청 저렴한 수준이다.
계절학기/방학 시간표 작업

계절 방학 시간표의 경우 하나의 표에 두 학기의 데이터가 들어가 있다. 비고를 보면 확인할 수 있다. 여기서 생긴 문제는 두 가지가 있었다.
- 기간은 하나로 되어 있지만, 실제로는 두 기간으로 나눠야 한다.
- 학기마다 운영 시간이 다른 사업장에 대해서는 AI가 잘 구별하지 못했다.
첫 번째는 학사 일정을 확인해서 구분 짓는 방법도 있겠지만, 동아리에 학사 일정을 DB에 저장한 곳도 없었고 AI가 검색을 통해 가져오게 하는 과정에서 부정확성이 있을 것 같았다. 그래서 이 정도는 사람이 해도 괜찮을 것 같아, 계절 방학 시간표일 경우 구분 일자를 입력받도록 했다.

두 번째는 프롬프트를 계속 고쳐도 잘 안 됐다. 완전히 다 구분을 못하는 것이 아닌 1~2개 정도 구분하지 못했기 때문에, 이 또한 사람이 수정하도록 넘겼다. 결국은 최종 검증 과정에서 사람이 검증을 해야 하기 때문에 이 또한 검증 과정으로 봤기 때문이다.

결과물
최종 결과물은 해당 노션 페이지와 아래 리포지토리에서 확인 가능하다.
마무리

하루 작업을 빡세게 달리고 결과물이 모두 괜찮게 나와서 다른 팀원들에게 공유했다. 이제 백엔드 개발자가 없어도 모든 직군이 슬랙을 통해 서비스 작업을 진행할 수 있고, 업데이트가 늦어져 사용자들이 불편함을 겪는 일을 예방할 수 있었다.
AI가 만약에 이 정도로 발전하지 않았다면, 이 작업을 어떻게 자동화했을까라는 의문이 작업을 하면서 들었다. 이것을 시작으로 코인에도 AI를 활용 혹은 적용할 수 있는 부분이 있다면 적용해서 새로운 개발 경험 혹은 AI 활용 능력을 길렀으면 좋겠다는 생각이 들었다.