Tan Kim

score-fusion

Score Fusion

Score Fusion은 복수의 retriever가 반환한 문서의 유사도 점수(score)를 동일한 스케일로 정규화한 뒤 가중합산하여 통합 랭킹을 생성하는 병합 방식이다. Naive Merge와 달리 각 retriever의 확신도(confidence)를 병합 결과에 반영할 수 있다.

핵심 개념

Score Fusion의 전제는 "각 retriever의 점수가 문서 관련성의 신뢰할 수 있는 신호다"라는 가정이다. 문제는 retriever마다 점수의 스케일과 분포가 다르다는 것이다. BM25는 0수십의 범위를, 코사인 유사도는 01의 범위를 사용한다. 직접 합산하면 BM25가 압도적으로 유리해진다. 따라서 정규화가 핵심 전처리 단계다.

정규화 방법

Min-Max 정규화

각 retriever의 결과 내에서 최솟값·최댓값을 기준으로 [0, 1]로 변환한다.

def min_max_normalize(scores: list[float]) -> list[float]:
    min_s, max_s = min(scores), max(scores)
    if max_s == min_s:
        return [1.0] * len(scores)
    return [(s - min_s) / (max_s - min_s) for s in scores]

단점: 이상값(outlier)에 민감하다. 점수가 극단적으로 분포된 retriever에서 왜곡이 발생할 수 있다.

Z-score 정규화

평균과 표준편차를 기준으로 정규화한다. 이상값 영향이 Min-Max보다 작다.

import statistics
 
def zscore_normalize(scores: list[float]) -> list[float]:
    mean = statistics.mean(scores)
    stdev = statistics.stdev(scores) or 1.0
    return [(s - mean) / stdev for s in scores]

가중합산 (Weighted Sum)

정규화된 점수에 retriever별 가중치를 적용해 최종 점수를 계산한다.

def score_fusion(
    results: dict[str, list[tuple[Document, float]]],
    weights: dict[str, float]
) -> list[Document]:
    doc_scores: dict[str, float] = {}
    doc_map: dict[str, Document] = {}
 
    for retriever_name, doc_list in results.items():
        scores = [s for _, s in doc_list]
        normalized = min_max_normalize(scores)
        w = weights.get(retriever_name, 1.0)
 
        for (doc, _), norm_score in zip(doc_list, normalized):
            doc_scores[doc.id] = doc_scores.get(doc.id, 0) + w * norm_score
            doc_map[doc.id] = doc
 
    ranked = sorted(doc_scores.keys(), key=lambda id: doc_scores[id], reverse=True)
    return [doc_map[id] for id in ranked]

가중치 결정 방법

방법 설명
균등 가중치 모든 retriever에 동일한 가중치 (1/N)
도메인 지식 기반 특정 retriever의 신뢰도를 사전 지식으로 설정
검증셋 최적화 평가 데이터셋에서 가중치를 그리드 탐색으로 최적화
쿼리별 동적 가중치 쿼리 유형에 따라 가중치를 런타임에 조정

장단점

항목 내용
장점 retriever 신뢰도를 결과에 반영 가능, 해석이 직관적
단점 정규화 방법과 가중치 설정에 민감, 쿼리마다 점수 분포가 달라 일관성이 낮을 수 있음
단점 한 retriever에 결과가 없는 문서는 점수 계산에서 불리

적합한 상황

  • 각 retriever의 점수가 신뢰할 수 있는 관련성 신호일 때
  • retriever 간 품질 차이가 명확하여 가중치로 표현하고 싶을 때
  • 스코어 분포를 분석해 정규화 방법을 튜닝할 수 있는 환경

관련 개념

  • Naive Merge: 점수를 무시하고 단순 concatenation하는 방식
  • Reciprocal Rank Fusion: 점수 대신 순위 기반으로 병합해 스케일 문제를 회피하는 방식
  • Reranker-centric: 병합 후 별도 모델로 최종 정렬하는 방식