Post

검색 리랭크의 종류를 이해해보자

1차 검색 결과를 다시 정렬하고 싶을 때 뭉뚱그려 부르는 "리랭크"가 실제로는 cross-encoder·RRF·가중합 중 무엇을 가리키는지 정리했다

검색 리랭크의 종류를 이해해보자

검색 리랭크의 종류를 이해해보자

1차 검색 결과 순서를 다시 손보고 싶은데 “리랭크(재정렬)”라는 말로 뭉뚱그려지는 방법이 여러 개라 뭘 써야 할지 헷갈렸다. 실제로는 목적이 전혀 다른 세 가지를 가리키는 말이었다.

1. 서론 (Introduction)

  • 문제/상황 (Problem): 검색기 하나 또는 여러 개가 내놓은 결과 순서를 다시 정렬하고 싶은데, “리랭크”라는 단어가 정밀 재점수 계산부터 단순 리스트 결합까지 다 가리켜서 상황에 맞는 방법을 고르기 어려웠다.
  • 목적 (Purpose): cross-encoder 리랭크·RRF(Reciprocal Rank Fusion)·가중 점수 합산 세 가지가 각각 무엇을 보고 결정을 내리는지, 언제 쓰는 게 맞는지 정리한다.
  • 대상 (Target Audience): 키워드 검색·벡터 검색처럼 척도가 다른 여러 결과 리스트를 하나의 순위로 합치려는 개발자.

2. 방법 및 과정 (Methods & Process)

  • 배경 조사 및 데이터 (Data Collection): 세 방법이 “무엇을 보고 순위를 정하는지”부터 갈린다.

    방법무엇을 보는가속도점수 정규화 필요적합한 상황
    cross-encoder질의+문서를 함께 모델에 넣어 새로 계산한 정밀 관련도 점수느림(후보마다 모델 추론)불필요(자체 척도로 새로 계산)소수 후보(수십 건)만 정밀하게 다시 매기고 싶을 때
    RRF리스트 안에서의 “순위”만, 점수 값은 안 봄빠름(정렬만)불필요척도가 다른 여러 결과 리스트를 빠르게 결합할 때
    가중 점수 합산정규화한 점수 값 자체(격차 크기 포함)빠름(정렬만)필요(min-max 등)점수 격차의 크기까지 결과에 반영하고 싶을 때
  • 접근 방법 (Approach Methods):
    • [방법 1]: RRF로 두 결과 리스트를 순위 기반으로 결합한다. 점수 스케일이 서로 달라도 “몇 등인지”만 있으면 되므로 정규화 단계 자체가 없다.
    • [방법 2]: 가중 점수 합산으로 결합한다. 리스트별 점수를 0~1로 min-max 정규화한 뒤 가중치를 곱해 더한다. 점수 격차까지 반영할 수 있는 대신, 정규화 기준과 가중치를 튜닝해야 한다.
  • 분석 및 해결 프로세스 (Analysis Flow):
    • 도구/기술: 순수 파이썬. 벡터 검색 결과(코사인 유사도, 0~1 범위)와 키워드 검색 결과(BM25류, 0~20 범위) 목(mock) 데이터.
    • 주요 단계: 척도가 다른 두 검색 결과 리스트 준비 $\rightarrow$ RRF로 결합(순위만 사용) $\rightarrow$ min-max 정규화 후 가중합으로 결합(0.5/0.5) $\rightarrow$ 두 결과의 최종 순위 비교.
    • 결과 도출 및 검증: 벡터 검색 1위 문서(코사인 0.97, 2위와 격차 큼)와 키워드 검색 1위 문서(BM25류 19.8, 2위와 격차 압도적)를 각각 다른 문서로 넣고 결합했다. RRF는 두 문서를 정확히 같은 점수(0.03252)로 동률 처리했다 — 둘 다 “한 리스트에서 1위, 다른 리스트에서 2위”라는 같은 순위 패턴이라서 순위만 보는 RRF는 이 둘을 구분하지 못했다. 반면 가중합은 0.682 대 0.510으로 점수를 갈라 키워드 1위 문서를 확실한 전체 1위로 뽑았다 — 키워드 검색에서 그 문서가 다른 문서를 압도한 점수 격차를 반영한 결과다.

3. 결과 (Results)

  • 분석 결과 요약: 같은 두 결과 리스트를 넣었는데 RRF와 가중합의 최종 순위가 갈렸다. RRF 결합 순위는 [1위, 2위 동률] 구조였고, 가중합 결합 순위는 그 동률을 갈라 순서를 확정했다. 순위 패턴만 보는 RRF는 대칭적인 순위 교환(한쪽 1위·다른쪽 2위 맞바꿈)을 동률로 처리했고, 점수 크기를 보는 가중합은 점수 격차를 반영해 순서를 갈랐다.

4. 인사이트 및 액션 (Insights & Action)

  • 인사이트 (Insight): “리랭크”는 목적이 다른 세 도구를 뭉뚱그린 말이었다. cross-encoder는 관련도 점수를 아예 새로 계산하고, RRF·가중합은 이미 나온 결과 리스트들을 결합만 한다. 그리고 결합 두 방법 중에서도 “순위만 볼지, 점수 크기까지 볼지”가 실제 최종 순위를 가른다 — 정규화 없이 빠르게 갈지, 정규화를 감수하고 격차까지 반영할지의 트레이드오프다.
  • 실행 방안 (Action Plan): 여러 검색기의 결과를 합칠 땐 먼저 RRF로 시작한다. 정규화가 필요 없어 구현·검증이 단순하다. 점수 격차가 결과에 의미 있게 반영돼야 하는 경우에만 가중합으로 넘어가고, 소수 후보를 정말 정밀하게 다시 매기고 싶을 때만 cross-encoder를 마지막 단계에 추가한다.
  • 한 줄 결론 (Key Takeaway): “리랭크”라는 한 단어 아래 정밀 재계산(cross-encoder)과 리스트 결합(RRF·가중합)이라는 서로 다른 문제가 섞여 있었고, 결합 안에서도 순위 기반이냐 점수 기반이냐가 결과를 가른다. 샘플 코드
  • 다음 스텝 (Next Step): 이번 비교는 리스트 두 개, 문서 다섯 개짜리 목 데이터에 그쳤다. 검색기가 셋 이상으로 늘거나 리스트별 신뢰도가 다르다고 판단될 때 RRF의 k값이나 가중합의 가중치를 어떤 기준으로 정할지는 이번엔 다루지 않았다.

This post is licensed under CC BY 4.0 by the author.