Elasticsearch RRF(Reciprocal Rank Fusion)

JunMyung Lee·2023년 10월 26일
1

Elasticsearch

목록 보기
29/42

상호 순위 융합 | Elasticsearch 가이드 [8.10]
[NLP]. Reciprocal rank fusion (RRF) 이해하기

RRF (상호 순위 융합) 이란

관련성이 다른 여러 결과 집합을 결합하는 방식. 지표를 단일 결과 집합으로 변환. RRF는 튜닝이 필요하지 않으며 다른 관련성 지표는 고품질을 달성하기 위해 서로 관련될 필요가 없다.

여러 방식의 검색결과를 토대로 하나의 검색 결과를 다시 정렬한다. 우리 팀장님이 다음과 같이 말을 한다.

정통 검색 백날 필드 부스팅하고 재정렬하고 지지고 볶아봤자 한계가 있다.

현재는 사이트마다 해당하는 검색식을 지정하고, 랭킹을 커스텀해서 재정렬하고, 특정 필드나 카테고리에 부스팅을 먹이면서 검색결과를 보여주고 있지만, 결국 단어 매칭과 사전의 조합으로만 검색을 진행하다보니 원하는 결과가 안나오는 경우가 있다는 말이다.
또한 이 방식은 각 검색의 점수가 아닌 순위만을 가지고 계산이 이루어지기에 서로간에 융합이 가능하다.

현재 준비하고 있는 Vector Search가 도입될 예정인데, 이때 정통 검색 + 유사도 검색의 조합인 하이브리드로 RRF만 적용해도, 기존에 완전매칭이 이루어지지 않아도 나오게 될 정보나, 유사한 검색이지만 유사 점수만으로 판별하지 않고 완전 매칭에 해당하는 값이 상위로 올라와 필요한 검색결과를 얻을 수 있을 것이라는 기대가 있다.

수식

RRF 알고리즘을 적용하기 위한 수식은 다음과 같다.

RRFscore(dD)=rR1k+r(d)R R F \operatorname{score}(d \in D)=\sum_{r \in R} \frac{1}{k+r(d)}

이렇게 보면 뭔소린지 하나도 모르겠다.

Python 코드

score = 0.0
for q in queries:
    if d in result(q):
  	    score += 1.0 / ( k + rank( result(q), d ) )
return score

# k는 순위에 대한 상수입니다.
# q는 질의(query)의 집합에서 하나의 질의를 의미합니다.
# d는 q의 결과 집합에서의 문서(document)를 나타냅니다.
# result(q)는 질의 q의 결과 집합을 의미합니다.
# rank(result(q), d)는 d가 result(q)에서의 순위를 나타냅니다. 순위는 1부터 시작합니다.

Elasticsearch 홈페이지에서 보여주는 알고리즘 코드이다. 여기에 acdongpgm님이 한글과 예제로 정리하신 예제를 함께 보자

설명

각 질의(query)에 대해 순회하며 다음 작업을 수행합니다. 해당 문서(d)가 질의의 결과 집합(result(q))에 존재한다면, 점수(score)에 1.0을 해당 문서의 순위의 역수로 더합니다. 여기서 순위는 1부터 시작합니다. 즉, 순위가 낮을수록 높은 점수를 얻게 됩니다.

예제

acdongpgm님의 예제를 그대로 사용한다. 해당 예제가 이해하기 가장 쉽고 편리하게 보여주셨다.

질의 1 결과(result(q1)): [A, B, C, D]  
질의 2 결과(result(q2)): [B, D, E, F]  
질의 3 결과(result(q3)): [A, C, F, G]

여기서 k는 1

A 문서 기준 점수 산출
score(A)=1.0/(1+rank(result(q1),A))+1.0/(1+rank(result(q3),A))score(A) = 1.0 / (1 + rank(result(q1), A))\, + 1.0 / (1 + rank(result(q3), A))
  =1.0/(1+1)+1.0/(1+1)+0\quad\quad\quad\quad\;= 1.0 / (1 + 1)\quad\quad\quad\quad\quad\quad\quad\quad + 1.0 / (1 + 1) \quad\quad\quad\quad\quad\quad\quad\quad + 0
  =0.5  +0.5    +0\quad\quad\quad\quad\;= 0.5 \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\;\, + 0.5 \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\;\; + 0
  =1.0\quad\quad\quad\quad\;= 1.0

B 문서 기준 점수 산출
score(B)=1.0/(1+rank(result(q1),B))+1.0/(1+rank(result(q2),B))score(B) \,= 1.0 / (1 + rank(result(q1), B)) + 1.0 / (1 + rank(result(q2), B))
  =1.0/(1+2)+1.0/(1+1)+0\quad\quad\quad\quad\;= 1.0 / (1 + 2)\quad\quad\quad\quad\quad\quad\quad\quad + 1.0 / (1 + 1) \quad\quad\quad\quad\quad\quad\quad\quad + 0
  =0.33+0.5    +0\quad\quad\quad\quad\;= 0.33 \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad + 0.5 \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\;\; + 0
  =0.83\quad\quad\quad\quad\;= 0.83

C 문서 기준 점수 산출
score(C)=1.0/(1+rank(result(q1),C))  +1.0/(1+rank(result(q3),C))score(C) = 1.0 / (1 + rank(result(q1), C))\; + 1.0 / (1 + rank(result(q3), C))
  =1.0/(1+3)+0  +1.0/(1+2)\quad\quad\quad\quad\;= 1.0 / (1 + 3)\quad\quad\quad\quad\quad\quad\quad\quad + 0 \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\; + 1.0 / (1 + 2)
  =0.25+0  +0.33\quad\quad\quad\quad\;= 0.25 \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad + 0 \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\; + 0.33
  =0.58\quad\quad\quad\quad\;= 0.58

3가지의 검색결과를 가지고 하나의 검색결과로 변경하였다. 순위만 가지고 계산을 하고 3가지의 검색결과를 다시 재정렬해서 보여준다. 물론 단순 계산만으로는 안되고 사이트마다 미세조정이 필요할듯 하다.

profile
11년차 검색개발자 입니다. 여러 지식과 함께 실제 서비스를 운영 하면서 발생한 이슈에 대해서 정리하고 공유하고자 합니다.

0개의 댓글