본문 바로가기
프로젝트 회고록

[(주)한미약품 사내 챗봇 아라 개발 프로젝트 회고록] 개발자로서 회사에 임하는 자세

by 개발이 체질인 나그네 2023. 2. 24.
반응형

(주)파워젠 성공 프로젝트 보고서

안녕하세요. 스마트컨트렉트 개발자 최원혁입니다.

백엔드 개발자에서 블록체인 개발자로 전향하기 이전에, 한미약품의 사내 챗봇 아라 개발 프로젝트에 참여한 경험이 개발자로서 크게 성장하는 계기가 되었습니다. 이제 프로젝트를 되돌아보며 회고록을 작성해보고자 합니다.

한미약품의 프로젝트는 제 첫 프로젝트였으며, 개발자로 일한 지 얼마 되지 않았던 때였습니다. 이전에 서비스를 공개적으로 배포하고 운영한 적이 없어, 열정과 야망으로 일에 임해야 했습니다. 하지만 프로젝트는 예상치 못한 어려움에 직면했습니다. 프로젝트를 진행하는 PM 과장님이 개발 경력이 부족했고, 원래는 보험회사에서 계약 및 고객응대를 담당하셨기 때문에, 초보 개발자인 제가 개발을 책임져야 했습니다. 고객사와의 커뮤니케이션도 중요했지만, 개발자로 일하게 된 이상 프로젝트에 책임을 져야 한다는 생각으로, 약 한 달 반에 걸친 프로젝트를 완수했습니다. 오늘은 그 이야기를 정리해보려고 합니다.

 

 

(주)한미약품 사내 챗봇 아라가 뭔가요?

(주)파워젠 2022 성과 보고 기록

챗봇 아라는 대기업 약품회사 한미약품의 사내생활을 도와주는 인공지능 챗봇입니다. 자연어처리 기술을 적용하여 직원들의 궁금증을 해결하고, 사내 생활을 쉽고 편리하게 도와주는 프로그램입니다. 또한, 인사팀의 업무를 자동화하여 회의실 예약, 연차/휴가 신청, 직원 위치 조회 등 다양한 기능을 제공합니다.

 

 

문제점 및 해결 스토리

(1) 짧은 프로젝트 기간과 너무 많은 학습 데이터

한미약품 챗봇 담당자로부터 받은 학습 데이터

한미약품은 총 4개 지역으로 구성된 회사였습니다. 답변 내용이 회사 위치에 따라 달랐기 때문에, 학습해야 할 양이 4배로 늘어납니다. 전체 답변과 질문을 합치면 약 1500개의 데이터를 챗봇에게 학습시켜야 했습니다.

당시 저희 회사는 챗봇을 주력 사업으로 다루지 않았습니다. 챗봇은 새롭게 창설된 사업부서였으며, 이번 한미약품 프로젝트는 회사의 두 번째 챗봇 프로젝트였습니다. 이전에 진행한 프로젝트는 자연어 학습 데이터가 많지 않았기 때문에 대량의 자연어 처리 학습을 진행한 프로젝트는 처음이었습니다. 때문에, 사내에서 준비된 업무 프로세스나 경험이 전혀 없었습니다. 

 

- 해결 방법: NLP연구소에서 개발한 파이썬의 KSS 라이브러리를 활용한 자동화 툴 개발

저는 업무에 있어서 반복되는 작업과 시간이 많이 소모되는 업무를 자동화시키는걸 좋아합니다.

처음에는 데이터를 하나씩 보면서 엑셀로 복사 붙여넣기를 하면서 분류를 진행했습니다. 하지만, 업무적으로 너무 비효율적이라고 판단하여, 한미약품 프로젝트와 이후에 있을 다른 프로젝트를 위해 자동화 툴을 개발하기로 결정했습니다.

저는 정규식과 한국 NLP연구소에서 개발한 파이썬의 KSS 라이브러리를 이용하여 1400개의 질문에서 가장 많이 등장하는 키워드를 카테고리 별로 분류하는 자동화 툴을 만들었습니다.

위 내용는 예시로 사용되는 데이터입니다..!

먼저 분류해야하는 데이터를 위와 같이 엑셀에 column [질문] 위치에 나열합니다. 이후 자동화 툴의 폴더에 input 위치에 엑셀을 저장합니다.

파이썬으로 작성된 코드를 보면 해당 자동으로 분류될 파일명과 파일 위치를 지정합니다. 최종적으로 분류가되서 나오는 엑셀파일은 output/result.xlsx로 저장되어 결과를 확인할 수 있습니다.

 

해당 기능은 한국 NLP연구소 kss의 라이브러리를 이용하여 만들었습니다. 작동 원리는 아주 간단합니다. 

한국어 단어는 같은 단어지만, 뜻이 다른경우가 많습니다. 엑셀에 적힌 문장들을 토큰화 시킨 후 품사를 조사하여 자료구조를 통해 노출된 단어의 개수를 카운터 합니다. 정규식을 통해 특수문자 또는 영어 단어를 따로 빼두고, 영단어는 다시 품사 조사를 통해 개수를 카운트 합니다.

* 전체 코드는 Github 주소를 남겨두겠습니다.

result

프로그램을 실행하면 문장에서 특정 키워드를 품사별로 추출하여, 각 키워드가 차지하는 비중을 보여줍니다. 대량의 자연어 학습은 키워드별로 분류하여 단계적으로 진행되어야 합니다. 따라서 특정 키워드를 사용하여 데이터 라벨링을 수행한 후 학습을 진행하여 챗봇이 유사한 단어를 인식할 때 혼동 없이 대답할 수 있도록 해야 합니다.

 

해당 프로그램은 회사에서 지시한 업무가 아니었기 때문에 개인 시간을 할애하여 만들어야 했습니다. 하지만 첫 번째 프로젝트를 성공적으로 완료하고 싶은 마음으로 점심 시간과 퇴근 후에 파이썬과 라이브러리를 공부하며 프로그램을 만들었습니다. 짧은 시간 안에 사용 가능한 프로그램을 만들어야 했기 때문에 UI와 데이터 수준이 100% 자동화는 아니었지만, 이전에 질문 하나하나 읽으면서 키워드를 추출했던 것을 생각하면 아주 유용한 프로그램이라고 생각했습니다.

 

덕분에 더 많은 시간을 프로젝트의 개발파트에 투자할 수 있었고, 프로젝트를 예정된 일정 내에 완료할 수 있었습니다. 이후 프로젝트 종료 발표에서 저가 만든 툴은 공식적으로 보고되어 회사의 다른 프로젝트에서도 도입되어 사용되었습니다. 지금은 새롭게 개편되거나 추가 개발이 되어 업무 프로세스에 포함되어 있지 않을까 생각됩니다. (뿌듯...ㅎ)

 

GitHub - imelon2/categorize

Contribute to imelon2/categorize development by creating an account on GitHub.

github.com

 

 

(2) CROS 애러가 다 같은 CORS가 아니다...

위 이미지는 CORS ERROR의 예시입니다

저는 국비지원을 통해 백엔드 과정을 수료했습니다. 때문에 CORS(Cross-Origin Resource Sharing)에 대한 이해가 있었고 해당 애러를 만났을 때, 챗봇을 구축하는 백엔드에 한미약품에서 서버로 접근하는 IP와 URL를 CORS 정책을 허용하도록 설정했습니다.

그럼에도, CORS 애러가 똑같이 발생했습니다... 정확히는 선택형(?) CORS 애러였습니다. 프로젝트 MVP 단계가 종료되고, 사내에서 담당자와 몇명의 사원들을 통해 챗봇 테스트를 진행했습니다. 처음에는 별 문제 없이 진행됬지만, 다음날 아침 9시부터 다시 CORS 애러가 발생하기 시작했습니다.

"아니 어제는 됬는데..." 라고 얘기하면서 넘어가고 싶었지만,,, 이젠 나도 어엿한 개발자이니, 원인을 찾아야 했습니다. 구글링과 공식문서를 통해 수많은 사례를 접하고 적용했지만 달라지지 않았습니다.

저는 챗봇 개발 플랫폼 Kore.ai측에 문제가 있을 수 있다고 판단했습니다.

 

Kore.ai 란?

https://kore.ai/

당시 회사는 자체적인 챗봇 구축 프로세스가 아니라 Kore.ai에서 제공하는 챗봇 개발 도구를 사용했습니다. Kore.ai에서는 챗봇을 개발할 수 있는 인프라와 코딩 환경이 구현되어 있었고, 챗봇 시나리오 또한 Kore.ai에서 정해진 UI를 통해 개발할 수 있었습니다. 이때 챗봇에 학습되는 데이터는 Kore.ai의 서버에 저장됩니다.

해당 회고록에서 챗봇 개발 내용과 코드를 리뷰하지 못하는 이유 또한, 현재는 회사를 퇴사하면서 Kore.ai의 개발 계정이 탈퇴되어 자료를 구할수 없기 때문입니다...(흑.._)

사용자가 챗봇에 질문을 입력하면, Kore.ai로 해당 질문이 전달됩니다. 그리고 AI가 판단한 답변은 다시 챗봇 백엔드로 전달되어 사용자의 UI에 표시됩니다. CORS 오류가 발생한 주소는 처음 보는 주소였습니다. 이는 제가 구축한 백엔드 주소가 아니라 Kore.ai에서 발생한 문제라고 생각했습니다.

또한, 한미약품의 서버 보안 담당자께서 접속 시 IP를 변경하여 요청(request)을 보내도록 설정하셨더니, 챗봇 접속 시 CORS 오류가 발생하지 않았습니다. 그러나 몇 시간 후에 다시 오류가 발생하였습니다.

 

- 문제 해결 : 어떡해서든 끝까지 책임지고 해결하기(?)

Kore.ai의 본사는 인도에 있기 때문에 연락하기가 쉽지 않았습니다. 이메일을 하루 간격으로 주고받으면서 문제의 원인을 파악하고 해결할 수 있도록 노력했습니다. (심지어 인도 시간에 맞춰 세벽에서 온라인 미팅까지 진행했죠...)

결과적으로 이 문제는 Kore.ai의 서버 보안 정책 때문이었습니다. Kore.ai는 Restful한 API 요청에 대한 보안 정책을 가지고 있기 때문에, 일정 시간 동안 너무 많은 요청이 오면 해당 IP를 DDoS 공격으로 판단하여 차단합니다. 따라서 오전 9시 한미약품 직원이 출근해서 컴퓨터를 켜는 시간에 요청이 한 번에 몰려와 Kore.ai에서 차단을 했던 것입니다.

이제 문제를 파악했고, 해결만 하면 됩니다! Kore.ai는 자체 프로그램을 통해 화이트리스트 등록이 가능합니다. 한미약품의 공용 IP는 Kore.ai의 화이트리스트에 등록되어 정상적으로 작동할 수 있게 되었습니다. 이 내용은 Kore.ai의 공식 문서에 있었지만, 처음 진행해보는 프로젝트였기 때문에 누군가 알려주지 않으면 알 수 없는 내용이었습니다. 프로젝트 종료 후, 팀원들과 자료를 공유하기 위해 반드시 문서로 작성해야겠다는 생각이 듭니다.

 

(3) 프로젝트 종료 후, 개발 내용 문서화 작업 및 공유

프로젝트를 진행하면서 한달 내내 과장님이랑 야근을 해야 했습니다. 서로 프로젝트 완성에 대한 확신이 부족해서 노력으로 극복하는 스타일이라 필요에 따라 야근을 했습니다. 한미약품 챗봇을 담당한 분도 이번에 처음으로 프로젝트 책임자로 일을 해보셔서 기획 단계에서 공유해야 할 내용이나 추가적인 내용이 프로젝트를 진행하면서 계속 추가되었습니다. 그리고 배포까지의 과정에서 발생한 수많은 에러와 클라이언트 측의 갑작스러운 요청으로 인해 정신없이 개발이 진행되었지만, 결과적으로 계약한 기간 안에 최종 출시를 할 수 있었습니다. 몇 주간 한미약품 직원들이 챗봇을 사용하면서 여러 피드백과 평가를 받았고, 최종적으로 성과 보고서에서 만족도 평가 3.0점(5점 만점)(*서비스 만족도 평균 3.5)을 받아 약간 부족한(?) 성공적인 프로젝트로 회사 업적으로 남을 수 있었습니다.

 

프로젝트 종료 후, 부서 내에 공유 했던 내가 만든 자료(1)
프로젝트 종료 후, 부서 내에 공유 했던 내가 만든 자료(2)
프로젝트 종료 후, 부서 내에 공유 했던 내가 만든 자료(3)

 

 

회사는 자아실현을 위한 공간이 아니기에, 비즈니스를 만들어내고 회사 가치를 창출하는 것이 중요하다고 생각합니다. 신입 개발자라 하더라도 비즈니스에 대한 이해도가 필요하며, 이를 바탕으로 회사가 필요로 하는 것을 파악하고 주도적으로 업무를 진행하는 것이 회사와 개인의 성장을 도모할 수 있는 방법이라고 생각합니다.

 

프로젝트 종료 후, 과장님은 신한은행 관련 프로젝트의 책임자로 옮겨가셨고, 저는 회사에 남아 프로젝트를 진행하면서 부서 내에서 공유할 만한 내용을 문서화 작업을 했습니다.

해당 문서는 회사의 자산으로 기록되어 있어 내부 내용을 자세하게 공개할 수 없지만, 한미약품 프로젝트에서 사용한 모듈과 코드, 그리고 주의사항을 기록하여 비즈니스적으로 회사에 기여할 수 있도록 자료를 남겼습니다. 또한, Kore.ai의 화이트리스트 정책과 Categorize 자동화 툴 사용법 등을 공유하여 다음 프로젝트에서 같은 실수를 하지 않도록 기록을 남기고 팀원과 공유했습니다.

 

(4) 사용자 피드백에 따라 유지보수 및 기능 개선

한미약품에서 챗봇을 도입하면서 직원들의 적극적인 피드백을 수집하기 위해 내부 이벤트를 진행했습니다. 챗봇의 대화 프로세스를 통해 불편하거나 추가되었으면 하는 기능에 대한 내용을 수집하고, 수집한 내용을 집계하여 담당자와 상의한 후 추가 개발을 진행했습니다. 여기서 채택된 피드백을 제공해준 사원에게는 스타벅스 기프티콘을 제공하여 적극적인 사용자의 관심을 유도할 수 있었습니다.

 

날씨 기능

  • 업데이트 내역 (1) : 오늘의 날씨
    한미약품 직원분들 중에서 오늘의 날씨를 확인할 수 있는 기능 업데이트를 원하시는 분들이 계셨습니다. 이에 저는 가볍고 쉽게 사용할 수 있는 기능을 추가하기로 결정했습니다. 날씨 데이터는 공공데이터를 활용하였으며, 사용자가 "오늘의 날씨", "오늘 날씨 알려줘" 등 질문을 하면 해당 정보를 제공하는 기능을 추가하였습니다.

 

  • 업데이트 내역 (2) : 사원 소개 검색
    한미약품은 부서가 많고, 각 부서가 협업하여 업무를 수행하는 경우가 많다고 합니다. 새로운 직원이 부서에 들어오거나 외부에서 지원을 받을 때는 소개를 받아야 인원을 파악할 수 있으므로, 사원을 쉽게 알 수 있는 기능이 필요하다는 피드백이 있었습니다. 이에 따라 "사원 소개 검색" 기능을 추가하였습니다. 해당 기능을 구현하기 위해 한미약품에서 사용하는 API 공유를 요청하였으며, 사원 정보를 조회할 수 있는 GET API를 사용하여 기능을 구현하였습니다.
    *한미약품 사내정보는 공유할 수 없다보니 이미지 첨부는 어려울거 같네요...

 

  • 업데이트 내역 (3) : 팀 위치 확인 
    한미약품은 큰 건물의 10개가 넘는 층을 사무실로 활용하고 있었습니다. 같은 부서끼리 모여 있었지만, 다른 부서 직원을 찾을 때 위치를 몰라서 곤욕을 치뤘던 적이 많다는 피드백을 받았습니다. 각 부서의 명칭과 위치를 정리된 엑셀 데이터로 받아서 AI 챗봇에게 학습을 진행하였습니다. 이 과정에서 NLP 기능을 활용하여 "경영정보 팀 위치 알려줘"와 같은 질문을 받았을 때, 사용자의 질문 의도를 파악하여 위치를 알려줄 수 있도록 학습하였습니다. 이를 통해 사용성을 극대화하여 업데이트를 진행하였습니다.

 

 

(5) 미 응답 데이터 수집 API를 활용하여  AI챗봇 응답률 50% → 75% 개선

특히, 런칭 초기에 챗봇의 응답률이 50%보다 낮았습니다. 이 경우 챗봇이 단순히 "이해하지 못했어요"라는 문장으로 대화를 종료하는 것은 사용자의 챗봇에 대한 기대감을 떨어뜨린다는 것을 UX 관점에서 고려하여 판단하였습니다.

이를 개선하기 위해, 챗봇이 이해하지 못하는 질문을 서버에 수집하는 API를 만들고 기록하여, 2주마다 추가 학습을 진행하여 업데이트하는 작업을 진행했습니다. 

2주마다 대략 200개의 응답하지 못한 데이터를 확인하며 사용자가 원하는 질문을 엑셀로 정리하여 한미약품 담당자와 공유합니다. 그리고 담당자께서는 질문에 대한 답변을 알려주시면, 저는 그 내용을 챗봇에 추가로 학습시켜 챗봇의 AI를 개선시키는 작업을 진행했습니다.

7회의 유지보수 및 업데이트를 담당하여 진행해고, 마지막으로 제가 유지보수를 끝낸 시점에서 초기 응답률은 전체 질문 중 50% 이하였지만, 사용자의 질문을 수집하고 추가 학습하여 응답률을 75%까지 상승시킬 수 있었습니다.

 


마무리

이 프로젝트는 저에게 매우 특별하면서도 개발자로서 한층 성장할 수 있게 해준 프로젝트였습니다. 챗봇 개발을 Kore.ai 플랫폼으로 진행했기 때문에, 퇴사 후 kore.ai 계정이 삭제되어 코드리뷰를 할 수 없어서 아쉬웠습니다. 백엔드 코드는 Node.js로 작성했지만, SI 회사 특성상 클라이언트사에 귀속되었기 때문에 남은 코드가 많지 않았습니다. 그래서인지, 이번 회고록에서는 "개발"보다는 "개발자로서 회사에 임하는 자세"에 대해 더 많이 다뤘던 것 같습니다.

 

하지만 이 프로젝트 경험은 저의 머리속에 깊이 자리 잡았기 때문에, 어떤 프로젝트를 마주하더라도 자신감 있게 해결할 수 있을 것 같습니다.

 

긴글 읽어주셔서 감사합니다.

반응형

댓글