사람인LAB에서 검색 품질을 평가하는 방법 (nDCG)
안녕하세요, 사람인LAB에서 데이터 엔지니어링을 하고 있는 서혜인 연구원입니다. LAB에서는 사람인 공고 통합검색 결과를 고도화하는 업무도 하고 있는데요, 검색 결과가 얼마나 ‘정답’에 가까운가를 정량적으로 평가하는 방법, 즉 검색 품질 평가를 어떻게 하고 있는지에 대해 소개해 보려 합니다.
연구 시작 계기
LAB은 통합검색 고도화, 즉 사용자들 한 명 한 명에게 적합한 공고를 상위로 올리기 위한 작업을 지속적으로 진행하고 있습니다. 작업이 완료되면 마지막으로 고도화 전/후 비교를 통해 공고 검색 결과가 얼마나 사용자 마음에 들게 나오는지, 혹은 오히려 더 안 나오는지에 대한 평가가 필요합니다.
하지만 평가를 한다는 것이 쉬운 일은 아닙니다. 왜냐하면 같은 결과여도 얼마나 만족감을 느끼는지는 사용자마다 다 다를 것이기 때문입니다. 그래서 기존에는 평가 방법으로 휴리스틱이나 입사 지원 수를 사용했는데요, 이러한 평가 방법에 부족함을 느껴 정식으로 검색 품질을 평가하기 위한 연구가 시작되었습니다.
고민1: 평가 기준 정하기
검색 품질 평가를 정성적이 아닌 “정량적”으로 하기 위해서는 수치화를 하는 작업이 필요합니다. 그래야 고도화 전 50점, 후 60점 같은 방식으로 비교를 할 수 있을 테니까요. 그렇다면 도대체 어떤 평가 항목으로 점수화를 할 수 있을까요? 사용자는 마음에 드는 공고가 나오면 어떤 행동을 할까요?
사용자가 공고를 보고 할 수 있는 행동은 3가지입니다. 공고 조회, 스크랩, 지원이죠. 그래서 저희는 한 개의 검색 결과에 대해 위 3가지 행동을 했을 경우에 점수를 부여하는 것으로 정책을 정했습니다.
평가 기준: 공고 조회, 스크랩, 지원
고민 2: 평가 알고리즘 선정하기
평가 기준을 정하고 나니 점수 체계에 관한 다음의 2가지 고민이 생겼습니다.
① 지원까지 한 공고의 만족도가 조회만 한 공고보다 높은데 행동에 따라 비중을 다르게 줄 순 없을까?
② 첫 번째 공고를 지원하는 것이 20번째 공고를 지원하는 것보다 더 좋은 검색 품질이라 할 수 있는데, 출현 순위도 반영할 순 없을까?
정보 검색의 품질을 평가하는 방법으로 다양한 알고리즘이 존재합니다. (참고: https://en.wikipedia.org/wiki/Evaluation_measures_(information_retrieval)#Other_measures )
그 중 저희의 고민 2가지를 만족할 수 있는 알고리즘을 찾아보겠습니다.
1. 조회, 스크랩, 지원마다 비중을 다르게 줄 수 있어야 한다.
2. 행동이 나타난 공고의 출현 순위가 평가에 반영되어야 한다.
(1) MRR (Mean Reciprocal Rank)
행동 공고 중 최상위 출현 순위가 높을수록 좋은 점수를 받습니다.
● 평가 요소: 행동이 발생한 공고 중 최상위 출현 순위
● 의견: 수식이 간단합니다. 하지만 최상위 공고만 판단 대상이라 품질 평가를 하기엔 빈약하며 조회, 스크랩, 지원마다 가중치를 줄 수 없습니다. (1번 조건 불만족)
(2) MAP (Mean Average Precision)
행동 공고들이 최대한 상위에 출현할수록 높은 점수를 받습니다.
● 평가 요소: 행동이 발생한 공고들의 출현 순위
● 의견: 최상위 공고만 반영되는 MRR에 비해 MAP은 행동이 발생한 모든 공고를 평가에 반영할 수 있습니다. 하지만 이분법의 출현 여부만 반영되기 때문에 조회, 스크랩, 지원마다 가중치를 다르게 줄 수 없습니다. (1번 조건 불만족)
(3) nDCG (normalized Discounted Cumulative Gain)
높은 가중치의 행동 공고들이 최대한 상위에 출현할수록 높은 점수를 받습니다.
● 평가 요소: 행동이 발생한 공고들의 출현 순위 & 공고 가중치 점수
● 의견: 조회, 스크랩, 지원마다 다른 가중치와 공고의 출현 순위도 반영할 수 있기 때문에 1, 2번 조건을 만족하여 nDCG를 검색 품질 평가 알고리즘으로 채택하였습니다.
핵심: 검색 만족도 계산하기
이제 지금까지 고민한 내용을 바탕으로 데이터와 수식을 활용해 계산하는 일만 남았습니다. 한 개의 검색 결과를 예로 들어 검색 만족도 점수를 도출해 보겠습니다.
필요 데이터: 출현 순위가 포함된 검색 결과, 유저 별 조회 / 스크랩 / 지원 이력
사용 알고리즘: nDCG
검색 결과에 대한 유저의 행동은 위와 같습니다. 총 결과 공고는 5개이고 1번부터 차례로 조회, 지원, 행동 안 함, 조회, 스크랩을 했군요. 그럼 nDCG의 재료인 DCG와 IDCG부터 구해볼까요?
※ 행동 당 가중치: 조회- 5, 스크랩- 7, 지원- 10
식이 조금 복잡해 보이지만 5개 공고에 대한 실제 점수(DCG)와 ‘각 공고마다 이 정도는 나왔으면 좋겠다’라고 생각하는 이상(Ideal) 적인 점수(IDCG)를 구한 것뿐입니다.
검색 결과에서 이상적이라고 생각하는 행동은 다음과 같이 주었습니다.
※ 출현 순위 별 이상적인(Ideal) 행동
[1순위] 스크랩 (7)
[2순위] 지원 (10)
[3순위] 조회 (5)
[4순위] 행동 안 함 (0)
[5순위] 행동 안 함 (0)
그래서 IDCG의 순위 당 점수가 왼쪽부터 차례대로 7, 10, 5, 0, 0 인 것이죠. (본 글에서는 편의를 위해 출현 순위 별 점수를 정적으로 지정했으나 실운영에서는 검색 결과 개수 비율을 활용해 동적으로 점수를 부여합니다.)
이제 nDCG를 구해보겠습니다. DCG, IDCG만 알면 nDCG는 간단하게 구할 수 있습니다.
즉, 검색 결과 만족도는 85점입니다. 최종적으로는 일 별 검색 만족도를 추출하고 있으며 하루동안 일어난 총 검색 만족도의 평균으로 계산합니다.
활용: 검색 고도화 전/후 비교해 보기
현재 LAB에서는 검색 쿼리와 관련된 통합검색 고도화 프로젝트를 진행하고 있고, 프로젝트 중 일부 단계가 어느 정도 마무리가 되어 A/B 테스트를 진행하였습니다. 통합 검색 사용자 일부에게 고도화된 쿼리로 검색한 결과를 내보내 기존 검색 쿼리에 비해 얼마나 변화가 있는지 알아보는 테스트였죠. 이 테스트는 이번에 만든 검색 품질 평가를 사용하여 진행해 보았습니다. 결과를 한 번 볼까요?
노란색 그래프가 고도화 전, 빨간색 그래프가 고도화 후의 검색 만족도입니다. 고도화된 후가 전보다 약 1.5배 정도 더 만족스러워한다는 것을 볼 수 있습니다. 이렇게 검색 품질 평가를 정량적으로 수치화하고 시각화까지 더해짐으로써 고도화가 주는 변화를 파악할 수 있습니다.
레퍼런스
https://en.wikipedia.org/wiki/Evaluation_measures_(information_retrieval)
https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-39940-9_488
https://lamttic.github.io/2020/03/20/01.html
https://yamalab.tistory.com/119
https://towardsdatascience.com/evaluate-your-recommendation-engine-using-ndcg-759a851452d1