Advanced RAG 검색
벡터+키워드 결합 원리, RRF, 점수 융합 전략
검색이 엉뚱할 때 쓰는 처방전
실패 유형 진단과 파이프라인 단계별 처방 — 검색 품질을 끌어올리는 기법 체계
🔗
하이브리드 검색
벡터 + 키워드 · RRF · 점수 전략
PART 4 · 하이브리드 검색
하이브리드 검색
같은 쿼리를 벡터와 키워드로 동시에 검색하고, 두 순위를 하나로 융합
🔗
의미 + 용어
벡터는 "파스타집"과 "이탈리안 레스토랑"을 잇고, BM25는 "SKU-12345"를 정확히 짚습니다
- 벡터 — 의미 유사 (동의어·유사 표현)
- BM25 — 정확 용어 (코드·고유명사)
- RRF — 순위 기반 융합
- Bedrock Knowledge Bases — HYBRID 옵션 내장
takeaway
Bedrock Knowledge Bases는 overrideSearchType: "HYBRID" 한 줄이면 끝 — 결합 전략을 직접 고르는 것은 커스텀 OpenSearch 파이프라인일 때입니다.
PART 4 · 하이브리드 검색
벡터 검색이 놓치는 쿼리
의미에 강하고 용어에 약한 벡터 — 정확한 문자열 매칭은 키워드 검색의 영역
| 쿼리 유형 | 벡터 검색 결과 | 문제 |
| 제품 코드 (SKU-12345) | 유사한 설명 문서 반환 | 정확한 코드 매칭 실패 |
| 고유명사 (Claude Sonnet) | 관련 AI 문서 반환 | 다른 모델 문서도 섞임 |
| 에러 메시지 (AccessDenied) | IAM 관련 문서 반환 | 정확한 에러 코드 매칭 약함 |
| 날짜 · 버전 (2026-07-01) | 무관한 문서 반환 | 숫자는 벡터 공간에서 의미가 없음 |
takeaway
결합하면 서로의 약점을 보완합니다 — 의미도 맞고 용어도 맞는 문서가 양쪽 순위 모두에서 상위에 오릅니다.
PART 4 · 하이브리드 검색
같은 질문, 두 검색기
"예약금 환불 규정이 어떻게 되나요?" — 의미로 찾는 벡터와 "환불" 용어로 찾는 BM25를 순위로 병합
벡터 검색 — 의미 유사
1terms.pdf §9 포인트 환급 절차
2faq.pdf 결제 오류 시 재결제 안내
3restaurant-policy.pdf §3 예약금 환불 기준 정답
질문 형식과 조항 문체의 갭 — 정답이 3위 (예시 순위)
BM25 — "환불" 정확 매칭
1restaurant-policy.pdf §3 예약금 환불 기준 정답
2restaurant-policy.pdf §1 환불 용어 정의
"환불"이 든 문서만 — 용어가 있으면 확실, 없으면 0건 (예시 순위)
↓
RRF 병합 · k=60
↓
병합 순위 — 양쪽 상위가 최상위로
1restaurant-policy.pdf §3 예약금 환불 기준벡터 3위 + BM25 1위 = 1/63 + 1/61 = 0.0323
2terms.pdf §9 포인트 환급 절차벡터 1위뿐 = 1/61 = 0.0164
… 한쪽 리스트에만 있던 나머지 문서는 그 아래로 — 점수 스케일을 맞출 필요가 없습니다
takeaway
점수가 아니라 순위의 역수를 합산했을 뿐입니다 — 스케일이 다른 두 점수를 변환 없이 융합합니다.
PART 4 · 하이브리드 검색
RRF (Reciprocal Rank Fusion)
벡터 점수는 0~1, BM25는 0~무한대 — 점수 대신 순위를 쓰면 사라지는 스케일 문제
핵심 포인트
- 순위 기반
- 점수 스케일 불일치를 완전히 회피 — 정규화 불필요
- k=60
- 표준값 — 높일수록 순위 차이의 영향력이 완화됩니다.
- 양쪽 상위 = 최상위
- 한쪽에서만 높은 문서는 보완적으로 포함되되 순위 하락
- 재사용
- RAG Fusion(다중 쿼리)과 하이브리드(벡터+키워드) 공용 융합기
코드
python
# RRF — 점수가 아니라 순위의 역수를 합산한다 (정규화 불필요)
def reciprocal_rank_fusion(results_list, k=60):
scores = {}
for results in results_list:
for rank, doc in enumerate(results):
scores[doc.id] = scores.get(doc.id, 0) + 1 / (k + rank + 1)
return sorted(scores.items(), key=lambda x: x[1], reverse=True)
# 벡터 1위 + 키워드 3위 = 1/61 + 1/63 — 양쪽 상위 문서가 최상위로
fused = reciprocal_rank_fusion([vector_results, keyword_results])
PART 4 · 하이브리드 검색
점수 결합 전략 비교
RRF가 기본값 — 가중치 튜닝은 평가 데이터가 쌓인 뒤에만
| 전략 | 방식 | 장점 | 적합 |
| RRF | 순위 역수 합산 | 정규화 불필요 · 튜닝 없이 범용 | 대부분의 경우 (기본값) |
| Weighted Sum | 벡터 0.7 + BM25 0.3 | 도메인 맞춤 가능 | A/B 테스트로 최적화할 때 |
| Normalization | min-max 정규화 후 합산 | 점수 크기 정보 보존 | 점수 차이가 의미 있을 때 |
튜닝 없는 Weighted Sum 금지
BM25 점수가 벡터 점수보다 훨씬 클 수 있어 0.5:0.5로 시작하면 키워드 편향이 발생합니다. 반드시 평가 데이터로 A/B 테스트 후 가중치를 정하세요 — 그전까지는 RRF입니다.
기법을 쌓는 것이 아니라, 병목을 진단하고 처방하세요.
인덱싱 → 사후 → 사전 순으로 — 평가 루프로 효과를 확인하며 한 번에 하나씩