✨ Reranker란?
구분 | 설명 |
---|---|
Retrieval | FAISS로 대략 비슷한 문서 찾기 (fast, rough) |
Reranking | 찾은 문서들을 LLM-level로 다시 정밀하게 점수 매기기 (slow, accurate) |
결과 | 훨씬 질문과 관련성 높은 top-k 결과만 선택 |
요약:
"FAISS → rough search"
"Reranker → 정밀 ranking"
🛠️ 쓸 모델 추천: BGE-Reranker
- huggingface.co/BAAI/bge-reranker-base
- 질문(query)와 문서(document)를 세트로 넣고
- Relevance score (0~1) 출력
- 점수 높은 순으로 정렬!
📂 backend/retriever/reranker.py
만들자!
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
# 1. Reranker 모델 로딩
reranker_tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-reranker-base")
reranker_model = AutoModelForSequenceClassification.from_pretrained("BAAI/bge-reranker-base")
def rerank_documents(query: str, docs: list, top_k: int = 5) -> list:
"""
검색된 문서 리스트를 Query와 비교해서 relevance 순서로 재정렬한다.
"""
pairs = [(query, doc) for doc in docs]
inputs = reranker_tokenizer.batch_encode_plus(
pairs,
padding=True,
truncation=True,
return_tensors="pt",
max_length=512
)
with torch.no_grad():
scores = reranker_model(**inputs).logits.squeeze(-1) # (batch_size,)
scores = scores.tolist()
# 점수 높은 순서대로 정렬
sorted_docs = [doc for _, doc in sorted(zip(scores, docs), key=lambda x: x[0], reverse=True)]
return sorted_docs[:top_k]
✨ 설명
단계 | 설명 |
---|---|
1 | (query, doc) 쌍을 만들어 tokenizer encode |
2 | reranker 모델에 넣어 relevance score 추출 |
3 | 점수 높은 순으로 문서 정렬 |
4 | top-k 개 리턴 |
✅ 적용 방법
search_documents()
를 수정해서:
- FAISS로 rough 검색한 다음
- rerank_documents()로 다시 정렬
from retriever.reranker import rerank_documents
def search_documents(query: str, top_k: int = 5) -> list:
# 1. Rough FAISS 검색
query_embedding = embedding_model.encode([query], convert_to_tensor=True).cpu().detach().numpy()
distances, indices = index.search(query_embedding, top_k)
results = [documents[idx] for idx in indices[0] if idx != -1]
# 2. 정밀 Reranking
reranked_results = rerank_documents(query, results, top_k=top_k)
return reranked_results
📋 정리
항목 | 설명 |
---|---|
FAISS rough search | 빠르지만 정확성은 살짝 부족 |
BGE-Reranker 정밀 스코어링 | 정확성 + 의미상 유사성 고려 |
최종 top-k만 반환 | Retrieval 품질 대폭 상승 |
📣 다음 플랜
✅ Reranker 추가
✅ search_documents() 내부에 반영
✅ /ask
API 자동 품질 업그레이드 완료
✍️ 다음 질문
"reranker.py"