사람인LAB에서 검색 품질을 평가하는 방법 (nDCG)

서혜인
saraminlab
Published in
7 min readNov 5, 2021

안녕하세요, 사람인LAB에서 데이터 엔지니어링을 하고 있는 서혜인 연구원입니다. LAB에서는 사람인 공고 통합검색 결과를 고도화하는 업무도 하고 있는데요, 검색 결과가 얼마나 ‘정답’에 가까운가를 정량적으로 평가하는 방법, 즉 검색 품질 평가를 어떻게 하고 있는지에 대해 소개해 보려 합니다.

연구 시작 계기

LAB은 통합검색 고도화, 즉 사용자들 한 명 한 명에게 적합한 공고를 상위로 올리기 위한 작업을 지속적으로 진행하고 있습니다. 작업이 완료되면 마지막으로 고도화 전/후 비교를 통해 공고 검색 결과가 얼마나 사용자 마음에 들게 나오는지, 혹은 오히려 더 안 나오는지에 대한 평가가 필요합니다.

하지만 평가를 한다는 것이 쉬운 일은 아닙니다. 왜냐하면 같은 결과여도 얼마나 만족감을 느끼는지는 사용자마다 다 다를 것이기 때문입니다. 그래서 기존에는 평가 방법으로 휴리스틱이나 입사 지원 수를 사용했는데요, 이러한 평가 방법에 부족함을 느껴 정식으로 검색 품질을 평가하기 위한 연구가 시작되었습니다.

고민1: 평가 기준 정하기

검색 품질 평가를 정성적이 아닌 “정량적”으로 하기 위해서는 수치화를 하는 작업이 필요합니다. 그래야 고도화 전 50점, 후 60점 같은 방식으로 비교를 할 수 있을 테니까요. 그렇다면 도대체 어떤 평가 항목으로 점수화를 할 수 있을까요? 사용자는 마음에 드는 공고가 나오면 어떤 행동을 할까요?

사용자가 공고를 보고 할 수 있는 행동은 3가지입니다. 공고 조회, 스크랩, 지원이죠. 그래서 저희는 한 개의 검색 결과에 대해 위 3가지 행동을 했을 경우에 점수를 부여하는 것으로 정책을 정했습니다.

평가 기준: 공고 조회, 스크랩, 지원

고민 2: 평가 알고리즘 선정하기

평가 기준을 정하고 나니 점수 체계에 관한 다음의 2가지 고민이 생겼습니다.

① 지원까지 한 공고의 만족도가 조회만 한 공고보다 높은데 행동에 따라 비중을 다르게 줄 순 없을까?

② 첫 번째 공고를 지원하는 것이 20번째 공고를 지원하는 것보다 더 좋은 검색 품질이라 할 수 있는데, 출현 순위도 반영할 순 없을까?

지원이 조회 보다 좋은 품질
1번 공고 지원이 마지막 공고 지원 보다 좋은 품질

정보 검색의 품질을 평가하는 방법으로 다양한 알고리즘이 존재합니다. (참고: 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

--

--