Source code for rerank
from typing import Any, Dict, List, Tuple
try:
from rerankers import Reranker
except ImportError:
Reranker = None
[docs]
class RerankHandler:
"""
Unified handler for reranking retrieved results.
"""
def __init__(self, model_name: str = "flashrank", model_type: str = "flashrank", **kwargs):
self.model_name = model_name
self.model_type = model_type
self.kwargs = kwargs
self._ranker = None
if Reranker is None:
raise ImportError("rerankers is not installed. Please install it with 'pip install rerankers'.")
def _init_ranker(self):
if self._ranker is None:
self._ranker = Reranker(self.model_name, model_type=self.model_type, **self.kwargs)
[docs]
def rerank(
self,
query: str,
results: List[Tuple[Dict[str, Any], float]],
top_k: int = 5
) -> List[Tuple[Dict[str, Any], float]]:
"""
Rerank a list of (metadata, distance) tuples.
Expects a 'text' field in metadata for reranking.
"""
if not results:
return []
self._init_ranker()
# Extract texts for reranking
texts = [meta.get("text", "") for meta, _ in results]
# Rerank
ranked_results = self._ranker.rank(query=query, docs=texts)
# Map back to original metadata
new_results = []
for r in ranked_results.results[:top_k]:
original_idx = r.document_id
new_results.append((results[original_idx][0], float(r.score)))
return new_results