2019 if kakao 컨퍼런스 후기

2019-08-30

세션: 밑바닥부터 시작하는 쇼핑 데이터 엔지니어링 고군 분투기

레거시 시스템 개선 과정 카카오 커머스 - 선물하기, 쇼핑하기, 다음 쇼핑 등

레거시 시스템의 스케일업 이슈

  • 초장기 서비스 형태: 단일 DB구조 -> 애플리케이션 -> 서비스
  • 서비스 개발 후 여러가지 운영 이슈 중 누적되는 데이터로 인해 확장의 이슈가 있었음

현실적인 해결방안

  • DB의 Join 쿼리 제거 > 검색 기능은 elstic search 사용 / DB는 DB로만
  • 새로운 데이터에 대해 색인을 만드는 작업이 필요함

데이터 파이프라인 구조

DB ~~> Elastic search

  • 배치처리
  • 실시간 처리
  • 전체 복구

ES 색인을 어떻게 만들까?

  • 검색 대상이 되는 필드와 id만 색인함
  • 검색에 최적화된 DB와 데이터 저장용 DB의 역할을 분리함!

데이터 변경 감지 솔루션

  • CDC 기술 -> 기술스택과 운영노하우가 필요함
  • DB의 증분 필드를 pull하는 방식 > 선택

Pull 방식 데이터 변경 감지 > DB에 의해 자동 갱신됨.

  • modified_at, update_ts 을 사용하여 자동 갱신

실시간 색인

실시간 데이터 변경 처리

  • 변경된 데이터 -> Kafka -> ETL -> ES

문제점

  • 데이터의 순서 보장 필요
  • 순서가 보장되더라도 적재된 이벤트를 replay하면서 순간적으로 과거 상태로 회귀하는 이슈 발생 -> 해결 불가능
  • 색인에 필요한 모든 데이터를 채워야 하는 부담 발생

(Eventual Consistency 문제)

해결

  • 변경된 데이터를 id만 kafka에서 받고, id로 DB의 데이터를 조회해서 색인 데이터를 가져옴

실시간, 배치, 데이터 복구 파이프라인

  • 실시간: spark streaming
  • 배치: spark batch (hopping 방식으로 안정적으로 처리)
  • 전체 색인 복구:
    • spark recovery (예전데이터보다 최신 데이터부터 복구함)
    • data skew문제로 id 단위로 복구함

데이터 품질을 유지하기 위한 노력

로직 검증을 위한 테스트 환경 구조

  • DB fixture 데이터 생성
  • Join service 호출
  • ES join 쿼리 생성
  • 쿼리 결과 검증

검색 요구사항 별 테스트 케이스를 모두 만듦

운영환경의 복구

  • zookeeper로 모니터링 및 자동 복구

세션: 카카오와 다음의 컨텐츠들은 어떻게 분류되고 있을까?

포털에서 콘텐츠 분류를 왜 하는가?

  • 대/소 분류체계로 콘텐츠가 분류되고 있음
  • 이전엔 콘텐츠를 찾기위해 많은 단계를 거쳐야했음 -> 찾는데에 많은 힘을 써야했음
  • 콘텐츠 찾는 시간을 줄이기 위해 다 리스트업 했더니 너무 많고 복잡해짐
  • 자동 분류가 필요해짐

자동 분류 후

  • 분류된 후 대량의 콘텐츠를 파악하기 좋아짐
  • 기간 별 콘텐츠의 경향도 쉽게 파악할 수 있음
  • 유저의 취향에 맞는 콘텐츠를 제공해주기 쉬워짐

학습 셋 구축 과정

사례참고

  • 카카오 내/외부 여러 서비스들에서 분류 체계를 참고함
  • 카테고리 정보를 수집함

현황 파악 뼈대 만들기

  • 분류할 카테고리 체계를 구축함
  • 분류 가능할만큼 데이터가 있는지 판단
  • 너무 유사한 카테고리가 있지 않은지, 세부 카테고리가 존대하는게 나을지
  • 감정형 카테고리를 넣을 것인지 판단 (다른 카테고리들과 잘 섞임)

카테고리 구체화

  • 카테고리간 경계 명확화

학습 셋 구축

  • 카테고리별 학습셋 수백개 이상
  • 제목, 본문을 발췌하여 카테고리 페이지별로 올림
  • csv형태로 다운로드
  • 하나의 학습셋으로 만듦

ML Model 타당성 검증

  • confusion matrix로 검증

카테고리 통합, 제외

  • 정확도가 낮거나 효용성이 떨어지는 카테고리는 통합, 제외함

현황 -» 통합/제외 * n회 반복

인사이트

  • 카테고리의 개수가 적절할 떼 학습 성능이 좋았음 (개수 자체보다 도메인에 맞는 개수가 중요!)
  • 학습 셋의 숫자는 중요하다 (테스트 셋의 개수가 많은 편이 실 예측의 성능이 더 잘 나옴)
  • 학습셋 구축은 고품질 노동 집약적 분야임
    • 한두 개가 아닌 최소 몇 만개
    • 도메인 전문가가 필요 (겹치는 성격의 카테고리, 모호한 카테고리가 많음)
  • 학습 셋 구축 과정 효율화, 자동화 필요성 (데이터 양, 버전 관리, 카테고리 별 콘텐츠 수량 파악)

똑똑하게 학습 셋 관리하는 법

두가지 메인 포인트: 수정 (잘못 매핑된 데이터), 추가 (신규 데이터)

학습 셋 어드민

  • 카테고리 리스팅, 수량, 콘텐츠 추가/수정/삭제

히스토리 관리

  • 롤백 지원
  • 더티체크

색, 시각화를 통해 라벨링 검증 효율화

  • 부정확한 데이터에 대해 시각화 -> 가장 성능이 좋았던 챔피언 모델로 검증
  • 카테고리 별 학습셋에 대해 오분류 개수, 정확도, 실 예측 정확도, 오분류 개수를 표시함

얻게된 것

  • 학습셋을 구성하는 운영 인력 감소 (7명 -> 1~2명)
  • 지속적인 실제 예측 성능 향상

기본모델, fastText알고리즘

  • 좋은 모델의 요소: 정확성, 중요한 카테고리 잘 잡아줄 것, 학습 비용 저렴, 빠른 학습 시간, ..등
  • 모델에 대한 요구사항을 세세하게 정의하고, 선정된 기준으로 여러가지 모델을 비교함

fastText 모델

특성

  • 기본 성능이 높음
  • 학습 시간이 빠름 (가성비 좋음)
  • API 응답 시간이 빠름
  • GPU가 필수가 아님

카카오에서 콘텐츠 분류(대/소카테고리)하는 세션 듣고 있는데 여기도 fastText가 프로덕션에서 쓸 때 다른 알고리즘들과 비교해서 기본 성능이 좋고, 학습 시간, API 응답 시간 등 여러 기준에서 퍼포먼스가 좋아서 잘 쓰고 있다고 하네용 ㅎㅎ

학습

  • 정답과 오답(정답을 제외한 나머지)을 함께 판별

실제 분류가 이루어지는 단계

  • 여러개의 모델과 룰 매핑 사용
  • 룰매핑에 가중치를 두지만, 여러개의 모델의 만장일치면 룰 매핑을 이기도록 설정

세션: 상품 카탈로그 자동 생성 ML 모델 소개

검색과 상품 카탈로그

검색 유입을 통한 유저는 60%가 추가 탐색을 하는 목적성 유저

  • 검색결과 <-> 상품상세 (반복) -> 최종 구매
  • 탐색이 용이할 수록 구매전환율이 높아짐

검색 품질에 있어 카탈로그 수와 매핑된 상품의 coverage는 매우 중요한 요소

  • 정제된 상품명으로 검색 반응성이 높여줌
  • 최저가 정보와 밀접. 상품 매핑수가 많아질수록 가격경쟁력이 올라감

카탈로그 자동 생성?

왜 머신러닝 모델로 만들었나? 유연성 필요

  • 시즌, 트렌드에 민감 -> 수명이 매우 짧음
  • 특정 상품의 상품 수가 매우 적어질 수 있음
  • 매일 신규 등록되는 상품

각 쇼핑몰의 카탈로그 정보가 상이하고 부족한 정보가 많음 - 정제 x

  • 매핑 정확도가 낮아짐
  • 상품 옵션 표기도 달라짐 (e.g. 18입, 12개 등)

자동화 적용 그리고 효과

  • 자동화: 동일 상품 묶기, 타이틀 추출
  • 품질: edge proportion(동일 상품일 가능성), 비지니스 로직 (서비스 담당자가 컨트롤 가능하도록)
  • 적용 범위: 옵션/스펙 유무, 카테고리 난이도 선정

자동 카탈로그 (95% 정확도 / 수동: 92% 정확도)

  • 패션/뷰티위주 먼저 적용
  • 수동vs자동 > (2달치 생산량 - 1년치의 3배)
  • 기존 수동 카탈로그에서 누락했던 매핑도 추가됨

상품 카탈로그 자동 생성 ML 모델 소개

어떤 데이터를 사용했는지?

무엇을 보고 같은 상품이라고 생각할까요?

  • 상품 이미지
  • 유사한 상품 이름
  • 동일한 카테고리

전체 과정

카테고리 별 상품 분류 (카카오 아레나에 있음)

Vector Model (상품 이미지, 상품 이름) - 고정된 크기의 벡터모델로 변환

  • 상품 이미지: VGG19 모델 사용
  • 상품 이름: 단어의 순서들이 다름, 명사가 적은 경우, 띄어쓰기가 없는 경우
  • 자연어처리: 띄어쓰기, 불용어, 명사위주의 단어구성, 순서바뀌는 상품명, 비교 가능한 임베딩 벡터

상품이름 벡터화

  • 키워드 추출 (사내 라이브러리)
  • TF-IDF score 적용 (중요한 키워드에 가중치를 높게 줌)
  • 임베딩: word2vec (쇼핑상품명 만으로 따로 학습함)
  • TF-IDF * word2vec 사용

왜 CNN, RNN을 안쓰는지? - 대화체등과 달리 순서가 중요하지 않음

유사상품 그래프: 서로 비슷한 상품을 연결지어 그래프로 표현

  • 이미지 벡터가 유사한 (코사인 유사도 0.9 이상) 상위 100개의 상품을 뽑음 (approximate knn 사용)
  • 비슷하게 이름 벡터가 유사한 상품 추출
엣지 케이스
  • 실제로 서로 다른 상품인데 임베딩이 비슷함 (구글 홈 미니, 카카오 홈 미니)
  • 서로 같은 상품인데 임베딩이 많이 다름 (이미지가 많이 다른 경우)
  • approximate knn 으로 부정확한 경우

Community detection

  • Label Propagation (빠르게 수행하는 그래프 마이닝 알고리즘 사용)

카탈로그 품질 평가

  • 유사상품 그래프의 연결된 정도로 평가점수를 측정함
  • 특정 임계값 이상의 카탈로그만 적용함
  • 생성시간: 상품 개수에 따라 거의 선형 증가함

상품 카탈로그 생성 더 빠르게 하기

  • 그래프 요약
  • 분산처리
  • 휴리스틱 등

적용해 볼 것들

  • 학습 셋 운영/관리 전략
  • 모델의 능력치에 대한 요구사항을 세부적으로 정의 (높은 정확도 만이 아닌)
  • 룰 매핑과 ML모델 혼합해서 활용