8.06 GB
19 files
Updated about 1 month ago
Name
Size
1_LogitScore
.gitattributes1.57 kB
xet
LICENSE11.4 kB
xet
README.md4.5 kB
xet
added_tokens.json707 Bytes
xet
chat_template.jinja4.69 kB
xet
config.json1.54 kB
xet
config_sentence_transformers.json199 Bytes
xet
generation_config.json214 Bytes
xet
merges.txt1.67 MB
xet
model-00001-of-00002.safetensors4.97 GB
xet
model-00002-of-00002.safetensors3.08 GB
xet
model.safetensors.index.json32.9 kB
xet
modules.json281 Bytes
xet
sentence_bert_config.json475 Bytes
xet
special_tokens_map.json613 Bytes
xet
tokenizer.json11.4 MB
xet
tokenizer_config.json5.43 kB
xet
vocab.json2.78 MB
xet
README.md

Releasing zeroentropy/zerank-2

In search engines, rerankers are crucial for improving the accuracy of your retrieval system.

However, SOTA rerankers are closed-source and proprietary. At ZeroEntropy, we've trained a SOTA reranker outperforming closed-source competitors, and we're launching our model here on HuggingFace.

This reranker outperforms proprietary rerankers such as cohere-rerank-v3.5 and gemini-2.5-flash across a wide variety of domains, including finance, legal, code, STEM, medical, and conversational data.

At ZeroEntropy we've developed an innovative multi-stage pipeline that models query-document relevance scores as adjusted Elo ratings. See our Technical Report (https://arxiv.org/abs/2509.12541 ) for more details.

This model is released under the Apache License 2.0.

Model Details

Property Value
Parameters 4B
Context Length 32,768 tokens (32k)
Base Model Qwen/Qwen3-4B
License Apache-2.0

How to Use

Breaking change (May 2026): model.predict() now returns raw "Yes" logits instead of sigmoid'd probabilities in [0, 1]. Rankings are unchanged. To recover the previous 0-1 score, apply (scores / 5).sigmoid() — see the example below. Loading no longer requires trust_remote_code=True; passing it is harmless.

Using Sentence Transformers

Install Sentence Transformers:

pip install sentence_transformers

Then load the model and score query/document pairs. model.predict returns the raw "Yes" logit per pair; rankings can be used directly. To map the logits to a 0-1 score range, apply a temperature-scaled sigmoid: sigmoid(score / 5).

from sentence_transformers import CrossEncoder

model = CrossEncoder("zeroentropy/zerank-2")

query_documents = [
    ("What is 2+2?", "4"),
    ("What is 2+2?", "The answer is definitely 1 million"),
]

scores = model.predict(query_documents, convert_to_tensor=True)
print(scores)
# tensor([ 5.4062, -4.5000], device='cuda:0', dtype=torch.bfloat16)

# Optional: convert to 0-1 probabilities
probabilities = (scores / 5).sigmoid()
print(probabilities)
# tensor([0.7461, 0.2891], device='cuda:0', dtype=torch.bfloat16)

You can also use model.rank to score and sort a list of documents for a single query:

rankings = model.rank(
    "What is 2+2?",
    ["4", "The answer is definitely 1 million"],
)
for r in rankings:
    print(r)
# {'corpus_id': 0, 'score': np.float32(5.40625)}
# {'corpus_id': 1, 'score': np.float32(-4.5)}

The model can also be inferenced using ZeroEntropy's /models/rerank endpoint, and on AWS Marketplace.

Evaluations

NDCG@10 scores between zerank-2 and competing closed-source proprietary rerankers. Since we are evaluating rerankers, OpenAI's text-embedding-3-small is used as an initial retriever for the Top 100 candidate documents.

Domain OpenAI embeddings ZeroEntropy zerank-2 ZeroEntropy zerank-1 Gemini 2.5 Flash (Listwise) Cohere rerank-3.5
Web 0.3819 0.6346 0.6069 0.5765 0.5594
Conversational 0.4305 0.6140 0.5801 0.6021 0.5648
STEM & Logic 0.3744 0.6521 0.6283 0.5447 0.5418
Code 0.4582 0.6528 0.6310 0.6128 0.5364
Legal 0.4101 0.6644 0.6222 0.5565 0.5257
Biomedical 0.4783 0.7217 0.6967 0.5371 0.6246
Finance 0.6232 0.7600 0.7539 0.7694 0.7402
Average 0.4509 0.6714 0.6456 0.5999 0.5847
Graph showing the same table

License

This model is licensed under the Apache License 2.0.

Total size
8.06 GB
Files
19
Last updated
Sep 22
Pre-warmed CDN
US EU US EU

Contributors