[토픽프렌즈] 논문 추천 서비스

5 more properties

배경(Problem)

현황
논문에 접근하는 데 대중들 불편함이 존재
논문을 주로 이용하는 연구자 및 학생 등의 불편감 호소
검색에만 의존하는 기존 논문 사이트
논문 대중화를 통한 논문에 대한 접근성 향상
접근성 : 사용자가 학술 자료에 쉽게 접근할 수 있도록 함으로써, 학문적 배경이 다양한 이들도 필요한 논문을 손쉽게 찾을 수 있게 합니다.
편리성 : 사용자 친화적 인터페이스와 맟춤형 추천을 통해 사용자가 최소한의 노력으로 필요한 정보를 효율적으로 얻을 수 있도록 지원합니다.
시의성 : 최신 뉴스 기반의 논문을 추천함으로써 사용자가 현재 중요한 주제에 대한 최신 정보를 신속하게 접할 수 있게 합니다.

서비스 소개(Solution)

논문 추천 서비스
논문 검색 서비스

아키텍처 및 핵심 기능

 기본적인 인프라 구성입니다
Terraform으로 versioning을 위해 두개의 클러스터로 구별하였습니다.
ingress와 elb를 사용하여 유저가 서비스를 이용하도록 설정하였습니다
AWS의 RDS를 사용하여 database는 외부의 환경으로 분리하였습니다.
추후 버전 관리를 위해 terraform과 helm chart는 S3에 저장하여 공유하였습니다.
 네트워크 구성입니다.
보안을 고려하여 퍼블릭과 프라이빗 서브넷의 ACL을 분리하였습니다.
각각의 ALB와 NLB를 구성하여 사용자가 접근할 수 있게 만들어 주었습니다.
 서비스 구현 모형입니다
모든 백엔드 모델들은 fastapi 로 구성하였습니다.
뉴스 크롤러가 오후 정시 00:00에 이전 뉴스를 크롤링합니다.
이후 크롤링된 데이터를 전처리 실시 후, 토픽 추출 모델에 데이터를 전달합니다
전달 된 데이터를 기반으로 키워드를 추출한뒤, 키워드-뉴스 형식으로 DB에 저장합니다.
추출된 키워드를 바탕으로 검색된 논문들을 DB에 저장합니다.
streamlit으로 구성된 프론트 환경에서는 DB에 저장된 뉴스와 키워드를 기반으로 하는 정보들을 유저에게 제공합니다. 또한 검색엔진을 논문 검색 api와 연동하여 유저가 사용할 수 있게끔 만들어 주었습니다.

활용 라이브러리 및 개발 환경

모델링 - python
기본적인 내부 모델들은 python 언어를 사용했습니다.
개발 환경은 각자의 os환경에 맞도록 개발하였고 colab을 사용하여 모델링을 실시하였습니다.
frontend - streamlit
python 기반의 프론트 웹 구성입니다. 코드 몇줄로 하여금 웹을 간단하게 구연할 수 있습니다.
이후 dockerization 을 통해 pod을 구성하였습니다.
backend - fastapi
python 기반의 백엔드 구성입니다. flask와 달리 async를 사용할 수 있어 동시 처리를 위해 채택하였습니다.
이후 dockerization 을 통해 pod을 구성하였습니다.
k8s : 가장 많이 사용되는 stack 을 선정했습니다.
monitoring(Log) - prometheus, grafana, alertmanager
monitoring - efk (elasticsearch, fluentbit, kibana)
CI/CD - jenkins, ArgoCD
terraform, helm, redis, mysql on rds
load test - JMeter

트러블 슈팅

개발환경 일치
프로젝트 하면서 가장 필요성을 느꼈던 부분입니다. 자연어처리 포지션과의 협업을 위해서는 필수적인 과정이라고 생각합니다.
추후 k8s 환경에 배포를 생각한다면 dockerization이 필수입니다. 이 때, 모델의 버전이 일치되지 않으면 배포시 다양한 문제가 발생할 수 있습니다. colab 환경에서의 모델 개발보다는 개인 local 또는 공유된 가상환경에서의 작업을 추천합니다. python library의 버전은 꽤나 모듈끼리 충돌이 많은 것 같습니다.
비용문제
제한된 resource 내에서 사용함에 따라, 저희는 모델 test 및 deploy 전에 먼저 local이나 각자 환경에서 연동 test를 진행하였습니다.
이후 기본적인 model이 완성됨에 따라 EKS 환경으로 이동하여 테스트를 진행하였습니다.
매일 리소스 체크는 필수인 것 같습니다.
helm chart 배포
helm chart를 사용하여 tool을 사용하면 매우 편리합니다. 하지만 custom 해야할 부분이 반드시 존재합니다. 저희는 chatgpt를 이용하는 것보다 helm chart의 git에 들어가서 직접 custom value를 수정하여 사용하는 것을 추천드립니다.
배포시 연결된 툴 사이의 버전을 고려하는 것도 문제를 줄이는 한 가지 방법입니다!
부하테스트
저희가 사용한 streamlit 기반의 프론트엔드는 비동기식이라 JMeter를 사용하여 부하테스트 하는데 어려움이 많았습니다.
저희는 직접 selenium을 사용한 webdriver를 JMeter와 연동하여 코드를 짜서 진행했는데 java 코드이다 보니 어려움이 많았습니다.
그래서 web을 구성하실 때에는 react 나 vue.js 사용하시는 걸 추천드립니다. 저희는 프론트엔드 경험자의 부재로 streamlit으로 진행하였습니다.

팀 소개

논문의 대중화
정수호(팀장) (쿠버네티스 15회차) - suho8346@gmail.com
노지원(자연어처리 14회차)
여민수(자연어처리 14회차) - minsooyeo9004@gmail.com
이상윤(쿠버네티스 15회차) - leesy010504@gmail.com
임상규(쿠버네티스 15회차) - 0892668@gmail.com