도입 배경
- 네이버 검색 시스템이 보유하고 있는 검색에 필요한 데이터는 방대하다.
- 다양한 호출처로부터 요청이 들어오고 검색어, 검색옵션, 검색방식등에 따라 수백~수천가지의 쿼리 타입이 만들어 질 수 있음
- 이런 수천가지 형태의 검색 요청이 왔을 때 1초라는 타임아웃 시간을 지키기 위해 검색 시간이 오래걸리는 쿼리를 찾기 위해 딥러닝을 사용하여 검색 시간이 오래 걸리는 요청들을 예측했다.
현재 검색 시스템 동작의 원리
검색 시스템 구성에는 여러 단계가 있는데 순서대로 다음과 같이 동작한다.
- 문서 데이터 : 검색 대상이 되는 컬렉션
- 색인어 추출 : 컬렉션에 의미 있는 단어를 추출
- 색인 : 검색 대상이 되는 컬렉션에 색인된 색인어로 포스팅 해주는 작업. 이 때 색인어에 매칭된 문서의 횟수를 Document Frequency (DF)라고 한다.
- 색인 볼륨 : 추출한 컬렉션, 색인어 이외에도 검색에 필요한 데이터를 색인 볼륨에 담아서 검색 서버에 전달
- 검색 시 검색 서버 동작 : 사용자가 입력한 키워드에서 의미있는 색인어를 추출하고 추출된 색인어와 매칭되는 문서들을 찾으며 그 찾은 문서내에서도 순위화를 하는 작업이 들어감 (문서 랭킹에는 tf-idf, bm25등 여러 알고리즘을 사용함)
검색 시스템 구조
- 모든 플랫폼에서 오는 요청은 인터페이스화 되어있어 동일한 규격으로 데이터가 들어옴
- 응용서버 : 다양한 호출처로부터 검색어, 검색방식, 타겟, 옵션등에 표준화된 입력 파라미터를 받아들이는 곳
- 검색서버 : request를 검색 수천개의 검색 서버에 분산해서 데이터 요청
AI 적용된 데이터 서빙 방법
- 호출 서버 : 플랫폼에서 필요한 검색 request를 만들어서 응용서버에 호출한다.
- 응용 서버 : 약속된 인터페이스 형태로 받은 검색 요청을 검색 서버에 전달해서 결과를 받는다.
- 로그 : raw 데이터 형태로 로그에 기록한다.
- Hadoop Cluster : 기록된 로그를 학습시간을 줄이기 위해 중복을 제거하거나 DF 구간별로 데이터를 분류하거나 하는 작업을 통해 학습 데이터로 써 정제하는 작업을 한다.
- 학습 및 평가 : keras를 사용하여 모델을 구현하고 테스트 셋과 학습셋을 나누어서 학습 및 데이터 검증을 진행
- 인퍼런스 서버 & api 서버 : 학습된 결과를 인퍼런스 서버에 전송하고 api 서버는 약속된 인터페이스로 전달된 응용계층에 요청을 파싱하고 인퍼런스 서버에 학습된 결과를 요청함
문제점
Feedback Loop 발생
1. 초기 학습 과정
호출 서버에서 없는 키워드 '네이버 바보'를 검색 요청 -> 검색 서버에서 데이터가 없음을 반환 -> 로그에 축적 -> 학습되어 해당 키워드 '네이버 바보'는 데이터가 없다는 결과를 인퍼런스 서버에 저장
2. 학습 이후 요청
호출 서버에서 다시 '네이버 바보'에 대한 요청 -> 응용서버에서는 api 서버에 요청 -> api 서버는 학습된 결과 없음을 반환 -> 다시 로그 수집되며 학습이 진행됨
3. 문제점 발생
지속적으로 '네이버 바보'는 검색결과가 생성되어도 응답값이 비어서 내려가는 문제가 발생
4. 해결 방법
- api가 적용되어 들어오는 학습 이후에 응답값에는 로그에 플래그를 추가하여 구별을 두어 플래그가 추가된 데이터는 검색 서버에 검색을 해야 결과 유무를 알수 있도록 함
- 트래픽이 적은 시간대는 학습된 api 서버를 요청하지 않고 바로 검색 서버를 요청하여 학습 데이터를 갱신하도록 함
AI 적용 방법
DF 기준으로 학습한 방법과 단어 기반 예측 모델 두가지가 존재
1. DF 기준 학습 (회귀모델)
- 선형회귀, 다항회귀, 로지스틱 회귀(분류) 방식을 적용
- Document Frequency는 결국 응답시간과 연관이 있다고 판단되기 때문에 회귀, 분류 방식으로 진행
- 학습 데이터 조정
# 범주형 데이터는 one-hot encoding을 적용
# 여러값을 가지는 데이터는 0, 1로 데이터를 변환
선형 회귀 모델
1차 DF와 응답 시간을 사용
이상치가 많이 존재하였지만 학습데이터에서는 어느정도 비례하는걸 보였지만 테스트 셋을 통한 검증과정에서는 불일치를 보임
검색에 다른 옵션 (조건, 유형 등등)을 넣고 다시 돌려보았을 때 회귀 모델이 많은 변화를 가져온다는걸 확인.
이를 통해 DF값 이외에 하나씩 검색 옵션을 넣어서 검증하기로 함
2차 모든 파라미터를 가지고 다중 회귀 모델로 데이터를 학습
확실히 좋아지긴 했지만 아직 예측값을 사용할 수준은 아님
3차 검색 기능, 검색 방식, 노멀라이즈된 DF값 삽입
여러 값을 가진 검색 기능을 특정 값 유무에 따라 데이터를 0, 1로 변환하여 사용
DF값은 너무 커서 노멀라이징 작업을 진행해서 사용. 모든 파라미터를 사용했을 때 보다 좋아짐
4차 질의 타입 추가
키워드가 가진 mall, brand, category 속성을 추출 하여 범주형 데이터로 만들고 one-hot encoding 작업을 통해 학습데이터로 활용
예측 값이 확실히 좋아진 모델을 완성함
결론
- 예측 시간과 관련이 없는 파라미터를 걷어내는데 시간이 많이 걸림.
- 학습된 데이터를 기반으로 타임아웃이 1초이상 발생하는 쿼리들에 대해 튜닝작업을 선진행하며 검색 성능을 높임
다중 로지스틱 회기 (분류)
데이터는 다항회귀와 동일하고 응답시간만 101 구간 (0.1 간격)으로 분류
80% 이상의 정확도를 보였으나 구간별로 결과를 분류하다 보니 특정 구간에 분류되지 못했던 특정 타입에 검색 유형이 들어오는 경우 오차가 발생. 그래서 다중 회귀를 사용함
단어 기반 응답시간 예측 (CNN)
단어 회귀 모델의 문제점
- 검색어가 단일 색인어일 경우에는 DF 기반 에측이 좋지만 여러 색인어가 존재하는 검색어일 경우 측정이 불일치함
ex) '노트북' DF -> 2800만, '운동화' DF -> 1200만 일 경우 예측시간은 DF와 비례한다는 조건으로 응답시간 예측이 가능 할 수 있지만
'노트북 운동화' 같이 색인어가 두 개이상 키워드로 사용되면 검색 결과 DF는 2800만 + 1200만이 아닌 251개 정도의 DF밖에 존재하
지 않기 때문에 해당 모델로는 예측이 어려움 (적어진 이유는 검색은 각 검색 색인어와 문서의 유사도등의 따라 결정되기 때문에 단순
plus로 계산되지 않음)
- 또한 검색의 여러 필터링(카테고리, 가격, 색상 등등)이 반영이 되어 있지 않기 때문에 DF만을 고려한 모델은 부정확함
CNN 모델 사용
각 파라미터의 단어 위치와 순서는 상관 없기 때문에 데이터의 형상을 유지하는 CNN을 사용하여 term 분리
- 기존 DF 기반에 다중 회귀와 다르게 검색 옵션(필터링)이 추가 되었고 연관된 DF가 아닌 실제 질이어의 N terms를 가지고 진행
- 레이블 값은 로지스틱 분석과 동일하게 0.1초단위로 101개의 vector를 사용하여 작업 진행
정리
도입적용 및 효과
- 정확도도 중요하지만 무거우면 실적용이 어렵기 때문에 합리적인 선에서 적합한 모델을 적용
- 모델 자체의 재학습도 빠르고 효과도 좋았지만 예측 오차가 가지고 오는 서비스 신뢰도 문제가 있을수 있어 항상 대비
- 실제로 시스템 효율이 향상 되었고 슬로우 쿼리를 선 개선할 수 있어 서비스 품질도 좋아짐
- 결과 없음 등에 대한 선 예측으로 불필요한 호출을 줄여 검색 서버의 네트워크 비용과 cpu 리소스 절감 효과를 얻음