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: 병합 후 별도 모델로 최종 정렬하는 방식