리랭킹이라는 단어가 자주 보인다.
이에 대해서 알아보자.
CC(Convex Combination)과 RRF(Reciprocal Rank Fusion)을 정리한다.
그리고 검색 이전(Pre) 단계와 후(Post) 단계를 나누어 알아보자.
📌 개념
: 여러 개의 스코어(예: dense similarity, sparse similarity 등)를 가중 평균하여 결합
✅ 수식
: final_score=α⋅s1+(1−α)⋅s2\text{final\_score} = \alpha \cdot s_1 + (1 - \alpha) \cdot s_2
s1s_1: dense search similarity score (예: cosine similarity)s2s_2: sparse search score (예: BM25)α\alpha: 0과 1 사이의 가중치 (보통 0.5~0.8 사이 튜닝)🧠 특징
📌 개념
: 두 개 이상의 랭킹 리스트를 받아, 각 문서의 순위를 기반으로 역순위 점수를 계산하여 결합
✅ 수식
: RRF(d)=∑i=1n1k+ranki(d)\text{RRF}(d) = \sum_{i=1}^{n} \frac{1}{k + \text{rank}_i(d)}
ranki(d)\text{rank}_i(d): 문서 dd의 i번째 모델에서의 순위 (1-based)kk: 보정 상수 (보통 60 정도 사용)🧠 특징
| 리랭킹 방식 | 주로 사용하는 곳 |
|---|---|
| Convex Combination | Hybrid Search (dense + sparse 결합) |
| Reciprocal Rank Fusion (RRF) | Ensemble Ranking, Search Fusion |
아래는 python 간단한 예시이다.
# convex combination 예시
score_dense = 0.8
score_sparse = 0.5
alpha = 0.6
final_score = alpha * score_dense + (1 - alpha) * score_sparse
# RRF 예시
rankings = {
"doc1": [1, 2],
"doc2": [3, 1],
"doc3": [2, 5]
}
def rrf_score(ranks, k=60):
return sum(1 / (k + r) for r in ranks)
rrf_results = {doc: rrf_score(ranks) for doc, ranks in rankings.items()}
가끔 두 개념이 헷갈리는 경우가 발생하는 것을 대비하여 정리한다
| 항목 | Re-ranking | Hybrid Search |
|---|---|---|
| 시점 | 벡터 검색 후 | 벡터 검색 전/중 |
| 목적 | 검색 결과의 순서 개선 | 검색 결과의 정확도 향상 |
| 방식 | Cross-Encoder로 다시 점수 계산 | Sparse + Dense를 동시에 계산 |
| 장점 | 정확한 문서 선택 | 의미 + 키워드의 균형 |
| 대표 기술 | Cohere Reranker, BGE Reranker | FAISS Hybrid, Milvus Hybrid, ColBERT |
위의 내용을 보면, dense search와 sparse search라는 단어가 빈번하게 나온다.
이에 대한 개념을 작성해둔다.
질문과 문서의 의미(semantic) 유사도를 기반으로 검색
질문과 문서 간의 단어(keyword) 매칭 기반 검색
| 구분 | Dense Search | Sparse Search |
|---|---|---|
| 기준 | 의미 유사도 | 키워드 매칭 |
| 기술 | 임베딩 + 코사인 유사도 | BM25, TF-IDF |
| 유의어 인식 | 가능 | 불가능 |
| 정확한 키워드 | 필요 없음 | 필요함 |
| 고유명사 처리 | 약함 | 강함 |
| 연산 성능 | 무거움 (벡터 연산) | 빠름 (정렬 기반) |
| 사용 예시 | GPT 검색, FAQ 매칭 | 뉴스 검색, 법률 문서 검색 |
그리고 이 둘을 조합하면 👉 Hybrid Search!
RAG의 과정 중, 벡터 검색 이전 단계와 후 단계를 나누어 Pre-retrieval과 Post-retrieval이라고 부른다.
| 구분 | Pre-retrieval | Post-retrieval |
|---|---|---|
| 시점 | 검색 이전에 수행 | 검색 이후에 수행 |
| 목적 | 검색 효율성 향상, 잡음 제거 | 검색 결과의 정확도 향상, 정밀 재정렬 |
| 주요 작업 | - 질문 리라이팅- 쿼리 확장(Query Expansion)- 질문 필터링 등 | - 리랭킹 (Reranking)- 관련성 필터링- 요약 or 압축 등 |
| 예시 | "9월 전력은?" → "2024년 9월 최대 전력 사용량은 얼마인가요?" | 검색된 문서 20개 중 5개만 relevance score 기준으로 최종 선택 |
| 도구/모델 | Prompt engineering, Query Rewriter, T5 등 | Cross-Encoder Reranker, LLM Relevance Scorer 등 |
| 장점 | 검색 정확도 증가 (Garbage query 방지) | 최종 응답 품질 향상 |
| 단점 | 잘못 리라이팅하면 recall 저하 위험 | 느림 (모든 쌍 비교, 연산 많음) |
📌 요약
1. Pre-retrieval: 질문을 더 좋은 검색어로 만들기 위한 전처리 단계
→ "좋은 검색을 위한 질문 정제"
2. Post-retrieval: 검색 후 문서의 품질을 다시 평가해 최종 문맥을 고르는 단계
→ "검색된 문서 중에서 최적의 문맥 추출"
Pre-retrieval 단계는 "검색 전에 질문(query)을 더 잘 만들기 위한 과정"으로,
벡터 검색 또는 키워드 검색에서 더 좋은 결과를 얻기 위해 입력 질문을 보정, 확장, 또는 필터링하는 작업이다.
✅ 질문을 더 명확하거나 검색에 유리한 형태로 재작성하는 작업
📌 예시:
💡 목적:
✅ 질문에 관련 단어, 동의어, 연관 개념 등을 추가해서 검색 범위를 넓히는 작업
📌 예시:
💡 목적:
✅ 질문에서 불필요하거나 검색에 방해가 되는 부분을 제거하는 작업
📌 예시:
💡 목적:
| 작업 유형 | 설명 | 예시 변경 전 | 예시 변경 후 |
|---|---|---|---|
| 질문 리라이팅 | 질문을 더 명확하게 재작성 | "요즘 인기 있는 영화 뭐야?" | "2025년에 개봉한 한국에서 인기 있는 영화 목록은?" |
| 쿼리 확장 | 동의어, 관련 키워드 추가 | "인공지능 기술" | "인공지능, AI, 머신러닝, 딥러닝" |
| 질문 필터링 | 불필요한 표현 제거 | "안녕, 혹시 인공지능 기술 알려줄래?" | "인공지능 기술" |