AWS, Elasticsearch, BERT를 이용한 추천 시스템 설계
[개발 배경 : 전문적인 물리현상을 알고 싶어요~]
- 회사의 검색 서비스는 유저가 풀고자 하는 문제를(자연어 쿼리) 자연이 가지고 있는 아이디어(텍스트, 이미지, 논문, 기타 문서 등등)로 찾아주는 서비스임.
- 자연모방, 생태모방으로 문제를 해결하는 데 있어서는 다른 전문분야의 지식도 필요한데, 재미있게도 한 분야에 전문성을 지닌 사람들일수록 검색할 때 바이어스에 빠지기 쉽고, 다른 분야의 정보를 받아들이는데, 검색-학습을 하며 정보를 탐색하는데 생각보다 어려워했음. (사용성 테스트, 심층 인터뷰로 관찰한 결과)
- 여러 유즈 케이스 중 하나로, 유저가 찾고자 하는, 혹은 구현하고자 하는 무언가에 적용되는 물리적인 현상을 알려줄 필요가 있었음. 그것으로부터 기능을 연상하거나, 기능으로부터 지금까지 정의된 물리적인 현상을 인식하는 생각의 전환이 필요했음.
[BERT모델 학습 데이터]
- 위키, 책 등으로 학습된 모델을 사용
[Elasticsearch 인덱스 설계]
- 벡터 값 생성에 반영한 텍스트는, 위키 정의, 옥스퍼드 사전 정의, 관련 어휘(자체적으로 만든 단어 사전)
- 필드 타입은 dense_vector, dims은 768
[시스템 구성]
- 대략 이러함.
- lambda에서 Bert Serving Server와 Elastic Cloud를 핸들링함.
[추천 결과]
- 인상적이었던 것 하나만 공유하자면,
"water hydro pressure increase"라고 개떡같이 입력했을 때 추천된 상위 10개가 아래와 같음
Capillary Pressure
Thermo-capillary Convection
Venturi Effect
Hydrodynamic Cavitation
Capillary Evaporation
Leidenfrost Effect
Mechanocaloric Effect
Viscous Heating
Conic Capillary Effect
Superheating
신기해!!
[퍼포먼스]
- 일단 최저가로 빨리 만들어보자(mvp)라고 접근해서 서빙 서버가 ec2 t2.medium 임..(cpu)
- 그래도 es 검색시간은 50ms 후반대, 임베딩 시간은 300ms.. 가 나옴
- 서빙 서버 스펙을 올리면 임베딩 시간은 눈에 띄게 개선될 거라고 봄.
- 서비스 프론트에서 api로 호출하면 400~500ms 정도로 나옴
[다음 스텝은?]
- 속도 문제가 있을 때 : 서빙 서버 스펙 올려보기, 임베딩 로직 점검
- 추천 결과가 불만족스러울 때 : 자체 어휘사전, 문서 등을 바탕으로 물리현상 BERT 모델을 따로 만들어본다. sciBERT를 사용하거나 튜닝해본다.