Home / Advanced RAG 기법 / Advanced RAG 검색
Note

Advanced RAG 검색

벡터+키워드 결합 원리, RRF, 점수 융합 전략

⏱ 35분 53 / 189

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 테스트로 최적화할 때
Normalizationmin-max 정규화 후 합산점수 크기 정보 보존점수 차이가 의미 있을 때
튜닝 없는 Weighted Sum 금지

BM25 점수가 벡터 점수보다 훨씬 클 수 있어 0.5:0.5로 시작하면 키워드 편향이 발생합니다. 반드시 평가 데이터로 A/B 테스트 후 가중치를 정하세요 — 그전까지는 RRF입니다.

기법을 쌓는 것이 아니라, 병목을 진단하고 처방하세요.

인덱싱 → 사후 → 사전 순으로 — 평가 루프로 효과를 확인하며 한 번에 하나씩