"RAG 핵심 학습 (20/26) — Dynamic Sparse/Dense Weighting"
시리즈 전체 안내: 시리즈 목차
모든 질문에 Dense 0.5, Sparse 0.5를 쓰는 순간, Hybrid는 곧 정체된다.
12편에서는 Hybrid Search의 기본을, 19편에서는 어느 검색기로 보낼지의 routing을 다뤘다. 그다음 자연스러운 질문은 "얼마나 Dense를 믿고, 얼마나 Sparse를 믿을 것인가?"다. Dynamic Weighting은 질문 유형, score distribution, retriever 간 합의 정도를 보고 sparse/dense 가중치를 조정하는 접근이다.
0. Prerequisites
- 12편 Hybrid Search
- 17편 query classification
- 19편 query routing
1. 학습 목표
- 고정 가중치 hybrid의 한계를 설명한다.
- 질문별 가중치 조정이 왜 필요한지 이해한다.
- 어떤 신호로 가중치를 바꿀 수 있는지 안다.
- 21편 adaptive top-K와의 연결을 이해한다.
2. 핵심 요약
고정 가중치 hybrid는 단순하고 안정적이지만 질문별 편차를 반영하지 못한다. 고유명사 질문은 sparse 비중을 높이고, 정의형 질문은 dense 비중을 높이는 식의 동적 가중치가 성능을 더 끌어올릴 수 있다. 신호는 query type, sparse와 dense의 점수 분포, 두 검색기의 합의 정도, metadata 필터의 강도 등이 될 수 있다. 다만 동적 제어가 많아질수록 디버깅과 평가가 어려워지므로 trace와 eval이 필수다.
3. 직관 — 같은 alpha가 모든 질문에 맞을 수 없는 이유
Hybrid 식:
$$\text{score}(d) = \alpha \cdot \tilde{s}_{dense}(d) + (1-\alpha)\cdot \tilde{s}_{sparse}(d)$$
여기서 \(\alpha\)를 항상 0.5로 두면, - "SKU-2024-04" 같은 exact match 질의에서는 dense 비중이 과하다. - "왜 이런 정책이 생겼는가?" 같은 설명형 질의에서는 sparse 비중이 과할 수 있다.
즉 좋은 \(\alpha\)는 질문에 따라 달라진다.
4. 정의 — 어떤 신호를 볼 수 있는가
| 신호 | 의미 |
|---|---|
| Query Type | 질문 유형 분류 결과 |
| Score Gap | 상위 문서와 그다음 문서 점수 차이 |
| Agreement | dense와 sparse가 같은 문서를 얼마나 함께 상위에 두는가 |
| Entropy | 점수 분포가 날카로운가 퍼져 있는가 |
| Filter Strength | metadata filter가 검색 공간을 얼마나 줄였는가 |
5. 메커니즘 — 가중치를 고르는 세 가지 방식
- 규칙 기반: query type에 따라 alpha 고정
- 통계 기반: score gap, entropy, agreement로 조정
- 학습 기반: 과거 로그를 보고 alpha를 예측
실무에서 가장 먼저 쓰기 쉬운 것은 규칙 기반이다.
6. 원리 워크스루 — 규칙 기반 alpha 조정
6.1 질문 유형 기반
def choose_alpha(query_type):
if query_type == "proper_noun":
return 0.2
if query_type == "definition":
return 0.7
if query_type == "comparison":
return 0.5
return 0.6
6.2 agreement 기반 보정
def adjust_alpha(base_alpha, dense_ids, sparse_ids):
overlap = len(set(dense_ids[:5]) & set(sparse_ids[:5]))
if overlap == 0:
return base_alpha
return min(0.8, base_alpha + 0.1)
6.3 score 분포가 주는 힌트
sparse top-1 점수가 유난히 높고 top-2와 격차가 크다면 exact match 가능성이 높다. 이때 sparse 쪽 비중을 키우는 전략이 자연스럽다.
자기 설명: 고정 alpha가 운영에서 한계를 보이는 이유를 한 문장으로 답해 보라.
7. 변형과 사례
7.1 Query-type Driven Weighting
질문 유형 분류를 직접 alpha 선택에 연결하는 방식이다. 구현이 쉬워 가장 먼저 시도하기 좋다.
7.2 Confidence-aware Weighting
한 검색기가 매우 확신 있을 때 비중을 더 주는 방식이다. 다만 "점수가 높은데 틀린 경우"에 약하다.
7.3 Learned Weighting
과거 질의 로그와 정답 라벨이 충분하면 alpha 자체를 예측하는 작은 모델을 둘 수 있다. 상한은 높지만 운영 복잡도가 커진다.
8. 한계와 실패 양상
8.1 과한 동적 제어는 블랙박스를 만든다
규칙이 너무 많아지면 왜 어떤 문서가 선택됐는지 설명하기 어려워진다.
8.2 잘못된 분류가 잘못된 가중치로 이어진다
query classification 오류가 dynamic weighting 오류로 증폭될 수 있다.
8.3 오프라인 성능이 온라인으로 그대로 이어지지 않을 수 있다
평가셋에서 좋아진 alpha 규칙이 실제 사용자 분포에서는 다르게 작동할 수 있다.
8.4 다음 단계 — 이제 몇 개를 가져올지도 동적으로 정해야 한다
가중치를 바꿨다면 그다음은 top-K 자체를 조정하는 문제다. 21편에서 adaptive top-K를 다룬다.
8.5 입문자가 자주 빠지는 함정 5선
| # | 함정 | 증상 | 빠른 점검 |
|---|---|---|---|
| 1 | 고정 alpha를 만능으로 사용 | 유형별 성능 편차 | query type별 eval |
| 2 | 동적 규칙 과도 추가 | 디버깅 난이도 상승 | 규칙 수 최소화 |
| 3 | trace에 alpha 미기록 | 원인 분석 불가 | selected alpha 저장 |
| 4 | agreement만 맹신 | 둘 다 틀린 경우 간과 | answer metric 병행 |
| 5 | online 검증 없이 rollout | 체감 악화 | shadow traffic 검증 |
9. 정리된 결론 — 보지 않고 답해 보라
Q1. dynamic weighting의 핵심 아이디어는?
정답 질문마다 dense와 sparse를 같은 비율로 믿지 않는 것이다.
왜 질문 유형과 점수 분포가 서로 다르기 때문이다.
Q2. 가장 쉬운 시작점은?
정답 query type 기반 규칙형 alpha 선택이다.
왜 구현과 해석이 가장 단순하기 때문이다.
Q3. dynamic weighting이 위험해질 수 있는 이유는?
정답 규칙이 많아질수록 블랙박스처럼 변하고 오류 원인을 추적하기 어려워지기 때문이다.
왜 질문 분류, 점수 해석, 가중치 선택이 연쇄적으로 얽히기 때문이다.
Cheat Sheet — 이 편의 식·정의 1페이지
식 - \(\text{score}(d) = \alpha \tilde{s}_{dense}(d) + (1-\alpha)\tilde{s}_{sparse}(d)\)
정의 - Dynamic Weighting: 질문별 alpha 조정 - Agreement: 두 검색기의 상위 문서 겹침 정도
최소 코드
alpha = choose_alpha(query_type)
언제 무엇을 | 질문 유형 | alpha 경향 | |---|---| | 고유명사형 | sparse 비중 확대 | | 정의형 | dense 비중 확대 | | 비교형 | 중간값 |
참고 자료
보조 자료
- 사용자 노트 17장 dynamic weighting
다음 편으로 이어지는 흐름
가중치까지 바꿨다면 남은 조절 손잡이는 "몇 개를 가져올 것인가"다. 다음 21편에서는 adaptive top-K와 conditional reranking을 다룬다.
댓글
댓글 쓰기