Skip to content

Rerankers

Reranker

Bases: Protocol

Cross-encoder or listwise reranker.

Receives top-K retrieved chunks and re-scores them with query context. Returns a shorter, better-ordered list for the generator.

rerank

rerank(query: str, chunks: list[RetrievedChunk], top_k: int = 5) -> list[RetrievedChunk]

Return at most top_k chunks in descending relevance order.

Source code in src/verifiable_rag/rerankers/__init__.py
def rerank(
    self,
    query: str,
    chunks: list[RetrievedChunk],
    top_k: int = 5,
) -> list[RetrievedChunk]:
    """Return at most *top_k* chunks in descending relevance order."""
    ...

CohereReranker

CohereReranker

CohereReranker(model: str = 'rerank-english-v3.0', api_key: str | None = None)

Cohere-hosted cross-encoder reranker.

Parameters

model: Cohere rerank model id. Defaults to "rerank-english-v3.0". Multilingual: "rerank-multilingual-v3.0". Newer: "rerank-v3.5". api_key: Cohere API key. Falls back to COHERE_API_KEY env var.

Source code in src/verifiable_rag/rerankers/cohere_reranker.py
def __init__(
    self,
    model: str = "rerank-english-v3.0",
    api_key: str | None = None,
) -> None:
    self._model = model
    self._api_key = api_key or os.environ.get("COHERE_API_KEY")
    self._client: Any = None

BGERerankerV2

BGERerankerV2

BGERerankerV2(model_name: str = 'BAAI/bge-reranker-v2-m3', batch_size: int = 16, device: str | None = None, max_length: int = 512)

Cross-encoder reranker using BGE rerank v2-m3 via sentence-transformers.

Parameters

model_name: HuggingFace model id. Default "BAAI/bge-reranker-v2-m3" (multilingual, ~568M params). Pass "BAAI/bge-reranker-v2-base" for a smaller/faster variant. batch_size: Pairs per forward pass. Larger = faster on GPU, OOM risk on CPU. device: "cpu", "cuda", "mps", or None to autodetect. max_length: Truncation cap (tokens) for each (query, chunk) pair fed to the model. Reranker-v2-m3 supports up to 8192; 512 is enough for ~400-token chunks plus a query.

Source code in src/verifiable_rag/rerankers/bge.py
def __init__(
    self,
    model_name: str = "BAAI/bge-reranker-v2-m3",
    batch_size: int = 16,
    device: str | None = None,
    max_length: int = 512,
) -> None:
    if batch_size < 1:
        raise ValueError(f"batch_size must be >= 1, got {batch_size}")
    if max_length < 1:
        raise ValueError(f"max_length must be >= 1, got {max_length}")

    self._model_name = model_name
    self._batch_size = batch_size
    self._device = device
    self._max_length = max_length
    self._model: Any = None  # lazy-loaded

rerank

rerank(query: str, chunks: list[RetrievedChunk], top_k: int = 5) -> list[RetrievedChunk]

Re-score chunks against query and return the top top_k.

Source code in src/verifiable_rag/rerankers/bge.py
def rerank(
    self,
    query: str,
    chunks: list[RetrievedChunk],
    top_k: int = 5,
) -> list[RetrievedChunk]:
    """Re-score *chunks* against *query* and return the top *top_k*."""
    if not chunks or top_k <= 0:
        return []
    if top_k >= len(chunks):
        top_k = len(chunks)

    model = self._load()
    pairs = [(query, rc.chunk.text) for rc in chunks]
    scores = model.predict(
        pairs,
        batch_size=self._batch_size,
        show_progress_bar=False,
    )

    # Sort by score DESC, take top_k
    ranked_indices = sorted(
        range(len(chunks)),
        key=lambda i: float(scores[i]),
        reverse=True,
    )[:top_k]

    return [
        RetrievedChunk(
            chunk=chunks[i].chunk,
            score=float(scores[i]),
            retrieval_method="reranked",
        )
        for i in ranked_indices
    ]