Published on

RAG 개념 정리 (2) — 검색 정확도 올리기: 하이브리드 서치, 리랭킹, 쿼리 재작성

Authors
  • avatar
    Name
    junyeol kim

1편에서 청킹·임베딩·벡터 DB로 파이프라인 뼈대를 잡았다면, 이번엔 그 위에서 "검색이 진짜 정확한 문서를 가져오는가"를 다룹니다. 벡터 검색만 쓰면 의미는 비슷한데 정작 찾는 키워드나 제품명·코드가 정확히 안 걸리는 문제가 자주 생기는데, 이걸 어떻게 보완하는지가 이번 편의 핵심입니다.

🔍 벡터 검색만으론 왜 부족한가

벡터 검색(dense)은 의미적 유사성을 잘 잡지만, 정확한 토큰 매칭(제품 코드, 고유명사, 특정 숫자)에는 약합니다. 반대로 BM25 같은 키워드 검색(sparse)은 정확한 단어는 잘 잡는데 동의어나 문맥은 놓칩니다. 그래서 둘을 병렬로 돌리고 결과를 합치는 하이브리드 서치가 표준으로 자리잡았습니다.

문제는 "그냥 점수를 평균 내면 되지 않나"가 안 통한다는 겁니다. BM25는 상한 없는 양의 정수 점수를 내고, 코사인 유사도는 -1~1 사이로 제한됩니다. 스케일이 완전히 다른 두 점수를 단순 가중 평균하면 BM25 점수가 항상 압도해버립니다.

➗ RRF: 점수 대신 순위로 합치기

그래서 실제로 쓰는 방법은 점수 자체가 아니라 **순위(rank)만 이용하는 RRF(Reciprocal Rank Fusion)**입니다. 공식은 이렇습니다.

score(d) = Σ 1 / (k + rank(d))
  • k는 순위 상수 (Elasticsearch 기본값 60)
  • rank(d)는 각 검색 결과 목록에서 문서 d의 순위 (1부터 시작)

예를 들어 1위 문서는 1/61 ≈ 0.0164, 100위 문서는 1/160 ≈ 0.00625가 되어 1위가 100위보다 약 2.6배 높은 가중치를 받습니다. 점수 스케일 문제를 아예 순위로 우회해버리는 셈입니다.

실제로 얼마나 좋아지나 — WANDS 이커머스 벤치마크 기준입니다.

방식NDCG
BM25 단독0.6983
벡터 검색(KNN) 단독0.6953
RRF 기본 하이브리드0.7068 (+7.4%p 상대 개선)
필드 부스팅 적용 하이브리드0.7497 (최고)

표와 텍스트가 섞인 금융 문서에서는 하이브리드 + 뉴럴 리랭킹 2단계 파이프라인으로 Recall@5 0.816을 기록한 사례도 있습니다. 단독 방식보다 하이브리드가 꾸준히 낫다는 게 일관된 결론입니다.

🎯 리랭킹: 넓게 찾고 좁게 추리기

하이브리드로 합친 결과라도 top-100, top-1000 안에는 여전히 관련 없는 문서가 섞여 있습니다. 여기서 크로스인코더(cross-encoder) 리랭킹을 답니다. 벡터 검색이 질문과 문서를 각각 독립적으로 임베딩해서 비교하는 것과 달리, 크로스인코더는 질문과 문서를 함께 모델에 넣어 관련도를 직접 계산합니다. 훨씬 정확하지만 연산량이 문서 수에 비례해서 늘어나기 때문에(O(n)), 수백만 개 문서 전체에 바로 돌릴 수는 없습니다.

그래서 실전 패턴은 이렇게 2단계로 나뉩니다.

  1. 1차 검색: ANN(근사 최근접 이웃)으로 top-100~1000개를 넓게 뽑음
  2. 2차 리랭킹: 그 후보군만 크로스인코더로 정밀하게 재정렬해 top-5~10만 남김

이렇게 하면 크로스인코더의 비싼 연산을 후보군에만 적용해서, 인터랙티브 검색의 지연 시간 예산 안에 충분히 들어옵니다.

✍️ 쿼리 재작성: 질문 자체를 손보기

검색 전에 사용자 질문을 그대로 쓰지 않고 손보는 기법들도 있습니다. 사용자 질문이 애매하거나 문서의 표현과 어휘 자체가 다르면, 아무리 검색을 잘 튜닝해도 애초에 검색어가 나쁘면 소용없기 때문입니다.

  • 다중 쿼리 검색(Multi-Query Retrieval): 질문 하나에서 여러 개의 다른 표현을 만들어 각각 검색하고 결과를 합침. 재현율은 오르지만 검색 비용도 그만큼 늘어남
  • 쿼리 분해(Query Decomposition): "왜 A가 B보다 안정적인가?" 같은 복합 질문을 "A의 구조", "B의 구조", "B의 안정성 문제"처럼 하위 질문으로 쪼갬. 멀티홉 추론이 필요한 질문에 특히 효과적
  • 쿼리 라우팅(Query Routing): 질문의 의도를 먼저 판별해서 적절한 검색 경로(FAQ 검색 vs 문서 검색 vs SQL 조회 등)로 분기
  • HyDE(Hypothetical Document Embeddings): 질문을 바로 임베딩하는 대신, LLM에게 "이 질문에 대한 그럴듯한 답변 문서"를 먼저 만들게 하고, 그 가상 문서를 임베딩해서 검색. 질문과 실제 문서 사이의 어휘·표현 차이가 클 때 특히 유용하며, 비지도 학습 기반 검색기 중 최상위권(Contriever 대비 우위)으로 보고된 방식

이 중 어떤 걸 쓸지는 데이터 특성에 달려 있습니다. 짧고 명확한 FAQ형 챗봇이면 라우팅만으로 충분한 경우가 많고, 복잡한 사내 문서를 다루는 챗봇이라면 분해나 HyDE가 체감 효과가 큽니다.

📚 정리

  • 벡터 검색과 BM25는 상호보완적 — 의미 vs 정확한 토큰 매칭, 그래서 둘 다 씀
  • 점수를 그냥 평균 내면 안 됨 — 스케일이 달라서 BM25가 항상 이김. RRF로 순위 기반 융합
  • WANDS 벤치마크에서 하이브리드가 단독 방식보다 항상 우세 (RRF만으로 +7.4%, 필드 부스팅까지 하면 0.7497)
  • 리랭킹은 넓게 뽑고 좁게 추리는 2단계 패턴 — top-1000 검색 → 크로스인코더로 top-100 재정렬
  • 쿼리 재작성 4종: 다중 쿼리(재현율↑), 분해(멀티홉 질문), 라우팅(의도 분기), HyDE(질문-문서 어휘 격차 해소)

다음 편은 벡터 검색으로 안 잡히는 "관계 추론"을 다루는 GraphRAG을 정리할 예정입니다.


참고: AppScale 「Hybrid Search and Re-ranking in Production RAG 2026」, Digital Applied 「Hybrid Search: BM25, Vector & Reranking Reference 2026」, DEV Community 「Query Rewrite in RAG Systems」, Zilliz Learn 「Better RAG with HyDE