Rerankers take the initial results from vector search and re-score them using a more powerful model. This second pass significantly improves relevance, especially when the initial retrieval returns many similar results.
How Reranking Works
The vector database finds candidates quickly using embedding similarity. The reranker then reads each candidate alongside the query and produces a more accurate relevance score.
CohereReranker
Uses Cohere’s reranking API:
from definable.reranker import CohereReranker
reranker = CohereReranker(
model="rerank-multilingual-v3.0",
top_n=5,
)
model
str
default:"rerank-multilingual-v3.0"
Cohere reranking model. Options: rerank-multilingual-v3.0, rerank-english-v3.0.
Cohere API key. Defaults to the COHERE_API_KEY environment variable.
Maximum number of results to return after reranking. If not set, returns all reranked results.
Requires the cohere package. Install with pip install cohere.
Using with Knowledge
from definable.embedder import OpenAIEmbedder
from definable.knowledge import Knowledge
from definable.reranker import CohereReranker
from definable.vectordb import InMemoryVectorDB
knowledge = Knowledge(
vector_db=InMemoryVectorDB(),
embedder=OpenAIEmbedder(),
reranker=CohereReranker(top_n=5),
)
# Reranking happens automatically during search
results = knowledge.search("What is Python?", rerank=True)
Set rerank=False to skip reranking for a specific query:
results = knowledge.search("What is Python?", rerank=False)
Standalone Usage
from definable.knowledge import Document
documents = [
Document(content="Python is a programming language."),
Document(content="Java is used for enterprise software."),
Document(content="Python was created by Guido van Rossum."),
]
reranked = reranker.rerank("Who created Python?", documents)
for doc in reranked:
print(f"[{doc.reranking_score:.3f}] {doc.content}")
Creating a Custom Reranker
Subclass Reranker:
from definable.knowledge.reranker import Reranker
from definable.knowledge import Document
class SimpleReranker(Reranker):
def rerank(self, query: str, documents: list[Document]) -> list[Document]:
# Score by keyword overlap
for doc in documents:
query_words = set(query.lower().split())
doc_words = set(doc.content.lower().split())
doc.reranking_score = len(query_words & doc_words) / len(query_words)
return sorted(documents, key=lambda d: d.reranking_score or 0, reverse=True)
async def arerank(self, query: str, documents: list[Document]) -> list[Document]:
return self.rerank(query, documents)
When to Use Reranking
| Scenario | Recommendation |
|---|
| Small knowledge base (fewer than 100 docs) | Optional — vector search is usually sufficient |
| Large knowledge base | Recommended — significantly improves precision |
| Multilingual content | Use rerank-multilingual-v3.0 |
| English only | Use rerank-english-v3.0 for best performance |
A common pattern is to retrieve more candidates than needed (e.g., top_k=20) and let the reranker select the best 5. This gives the reranker more material to work with.