Text Ranking
sentence-transformers
ONNX
Safetensors
modernbert
cross-encoder
reranker
multilingual
text-embeddings-inference
hindsight
Instructions to use hindsight-ai/hs-rerank-1 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- sentence-transformers
How to use hindsight-ai/hs-rerank-1 with sentence-transformers:
from sentence_transformers import CrossEncoder model = CrossEncoder("hindsight-ai/hs-rerank-1") query = "Which planet is known as the Red Planet?" passages = [ "Venus is often called Earth's twin because of its similar size and proximity.", "Mars, known for its reddish appearance, is often referred to as the Red Planet.", "Jupiter, the largest planet in our solar system, has a prominent red spot.", "Saturn, famous for its rings, is sometimes mistaken for the Red Planet." ] scores = model.predict([(query, passage) for passage in passages]) print(scores) - Inference
- Notebooks
- Google Colab
- Kaggle
Commit ·
f6ebb16
0
Parent(s):
Release hs-rerank-1
Browse files- .gitattributes +38 -0
- README.md +155 -0
- assets/banner.png +3 -0
- assets/benchmarks.png +3 -0
- config.json +72 -0
- config_sentence_transformers.json +1 -0
- model.safetensors +3 -0
- onnx/model.onnx +3 -0
- sentence_bert_config.json +4 -0
- tokenizer.json +3 -0
- tokenizer_config.json +23 -0
.gitattributes
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
tokenizer.json filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
assets/banner.png filter=lfs diff=lfs merge=lfs -text
|
| 38 |
+
assets/benchmarks.png filter=lfs diff=lfs merge=lfs -text
|
README.md
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: mit
|
| 3 |
+
base_model: jhu-clsp/mmBERT-small
|
| 4 |
+
base_model_relation: finetune
|
| 5 |
+
library_name: sentence-transformers
|
| 6 |
+
pipeline_tag: text-ranking
|
| 7 |
+
language:
|
| 8 |
+
- en
|
| 9 |
+
- es
|
| 10 |
+
- fr
|
| 11 |
+
- de
|
| 12 |
+
- pt
|
| 13 |
+
- ja
|
| 14 |
+
- ko
|
| 15 |
+
- zh
|
| 16 |
+
tags:
|
| 17 |
+
- sentence-transformers
|
| 18 |
+
- cross-encoder
|
| 19 |
+
- reranker
|
| 20 |
+
- multilingual
|
| 21 |
+
- onnx
|
| 22 |
+
- text-embeddings-inference
|
| 23 |
+
- hindsight
|
| 24 |
+
---
|
| 25 |
+
|
| 26 |
+

|
| 27 |
+
|
| 28 |
+
# hs-rerank-1
|
| 29 |
+
|
| 30 |
+
hs-rerank-1 is a multilingual cross-encoder reranker built for [Hindsight](https://github.com/vectorize-io/hindsight).
|
| 31 |
+
It reads a query and a document together and returns a relevance score.
|
| 32 |
+
|
| 33 |
+
## Highlights
|
| 34 |
+
|
| 35 |
+
- **Multilingual:** English, Spanish, French, German, Portuguese, Japanese, Korean and Chinese
|
| 36 |
+
(Simplified and Traditional).
|
| 37 |
+
- **Long inputs:** up to 8,192 tokens per query and document pair.
|
| 38 |
+
- **Small:** 114M parameters. 98M of them are the token embedding table, so each forward pass
|
| 39 |
+
runs a 15M-parameter transformer.
|
| 40 |
+
- **CPU and GPU:** ships an int8 ONNX export for CPU, and safetensors for GPU in FP16.
|
| 41 |
+
- **Serves on TEI:** CPU and GPU images.
|
| 42 |
+
|
| 43 |
+
## Model overview
|
| 44 |
+
|
| 45 |
+
| | |
|
| 46 |
+
|---|---|
|
| 47 |
+
| Model type | Cross-encoder reranker |
|
| 48 |
+
| Base model | `jhu-clsp/mmBERT-small` |
|
| 49 |
+
| Parameters | 114M |
|
| 50 |
+
| Languages | en, es, fr, de, pt, ja, ko, zh |
|
| 51 |
+
| Context length | 8,192 tokens |
|
| 52 |
+
| Output | One relevance score per query and document pair |
|
| 53 |
+
| Formats | safetensors stored in FP16 (FP32 copy on the `fp32` branch), ONNX (`onnx/model.onnx`, int8 vocabulary table) |
|
| 54 |
+
|
| 55 |
+
## Evaluation
|
| 56 |
+
|
| 57 |
+

|
| 58 |
+
|
| 59 |
+
## Usage
|
| 60 |
+
|
| 61 |
+
### Sentence Transformers
|
| 62 |
+
|
| 63 |
+
```bash
|
| 64 |
+
pip install -U sentence-transformers
|
| 65 |
+
```
|
| 66 |
+
|
| 67 |
+
```python
|
| 68 |
+
from sentence_transformers import CrossEncoder
|
| 69 |
+
|
| 70 |
+
model = CrossEncoder("hindsight-ai/hs-rerank-1")
|
| 71 |
+
|
| 72 |
+
query = "¿Qué app de presupuesto estoy creando?"
|
| 73 |
+
documents = [
|
| 74 |
+
"El usuario quiere tooltips en su app de presupuesto.",
|
| 75 |
+
"El usuario corre los domingos por la mañana.",
|
| 76 |
+
]
|
| 77 |
+
|
| 78 |
+
print(model.rank(query, documents))
|
| 79 |
+
# [{'corpus_id': 0, 'score': 0.9647}, {'corpus_id': 1, 'score': 0.0003}]
|
| 80 |
+
```
|
| 81 |
+
|
| 82 |
+
`predict` and `rank` return scores between 0 and 1. Pass `activation_fn=torch.nn.Identity()`
|
| 83 |
+
for raw logits.
|
| 84 |
+
|
| 85 |
+
### Text Embeddings Inference
|
| 86 |
+
|
| 87 |
+
CPU (uses `onnx/model.onnx`):
|
| 88 |
+
|
| 89 |
+
```bash
|
| 90 |
+
docker run -p 8080:80 \
|
| 91 |
+
ghcr.io/huggingface/text-embeddings-inference:cpu-1.9.3 \
|
| 92 |
+
--model-id hindsight-ai/hs-rerank-1 --auto-truncate
|
| 93 |
+
```
|
| 94 |
+
|
| 95 |
+
GPU:
|
| 96 |
+
|
| 97 |
+
```bash
|
| 98 |
+
docker run --gpus all -p 8080:80 \
|
| 99 |
+
ghcr.io/huggingface/text-embeddings-inference:89-1.9.3 \
|
| 100 |
+
--model-id hindsight-ai/hs-rerank-1 --auto-truncate
|
| 101 |
+
```
|
| 102 |
+
|
| 103 |
+
Use the GPU image tag for your GPU: `89-1.9.3` for L4 and other Ada GPUs, `1.9.3` for A100
|
| 104 |
+
and H100.
|
| 105 |
+
|
| 106 |
+
```bash
|
| 107 |
+
curl 127.0.0.1:8080/rerank \
|
| 108 |
+
-H 'Content-Type: application/json' \
|
| 109 |
+
-d '{
|
| 110 |
+
"query": "¿Qué app de presupuesto estoy creando?",
|
| 111 |
+
"texts": [
|
| 112 |
+
"El usuario quiere tooltips en su app de presupuesto.",
|
| 113 |
+
"El usuario corre los domingos por la mañana."
|
| 114 |
+
]
|
| 115 |
+
}'
|
| 116 |
+
```
|
| 117 |
+
|
| 118 |
+
### Hindsight
|
| 119 |
+
|
| 120 |
+
```bash
|
| 121 |
+
HINDSIGHT_API_RERANKER_PROVIDER=local
|
| 122 |
+
HINDSIGHT_API_RERANKER_LOCAL_MODEL=hindsight-ai/hs-rerank-1
|
| 123 |
+
```
|
| 124 |
+
|
| 125 |
+
Or point Hindsight at a TEI server:
|
| 126 |
+
|
| 127 |
+
```bash
|
| 128 |
+
HINDSIGHT_API_RERANKER_PROVIDER=tei
|
| 129 |
+
HINDSIGHT_API_RERANKER_TEI_URL=http://localhost:8080
|
| 130 |
+
```
|
| 131 |
+
|
| 132 |
+
### Hindsight Inference
|
| 133 |
+
|
| 134 |
+
hs-rerank-1 is also served at `https://inference.hindsight.vectorize.io`. To use it from
|
| 135 |
+
Hindsight:
|
| 136 |
+
|
| 137 |
+
```bash
|
| 138 |
+
HINDSIGHT_API_RERANKER_PROVIDER=hindsight
|
| 139 |
+
HINDSIGHT_API_RERANKER_HINDSIGHT_API_KEY=<your Hindsight Inference API key>
|
| 140 |
+
```
|
| 141 |
+
|
| 142 |
+
## License
|
| 143 |
+
|
| 144 |
+
MIT
|
| 145 |
+
|
| 146 |
+
## Citation
|
| 147 |
+
|
| 148 |
+
```bibtex
|
| 149 |
+
@misc{hindsightai2026hsrerank1,
|
| 150 |
+
title = {hs-rerank-1},
|
| 151 |
+
author = {{Hindsight AI}},
|
| 152 |
+
year = {2026},
|
| 153 |
+
url = {https://huggingface.co/hindsight-ai/hs-rerank-1}
|
| 154 |
+
}
|
| 155 |
+
```
|
assets/banner.png
ADDED
|
Git LFS Details
|
assets/benchmarks.png
ADDED
|
Git LFS Details
|
config.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"architectures": [
|
| 3 |
+
"ModernBertForSequenceClassification"
|
| 4 |
+
],
|
| 5 |
+
"attention_bias": false,
|
| 6 |
+
"attention_dropout": 0.0,
|
| 7 |
+
"bos_token_id": 1,
|
| 8 |
+
"classifier_activation": "gelu_pytorch_tanh",
|
| 9 |
+
"classifier_bias": false,
|
| 10 |
+
"classifier_dropout": 0.0,
|
| 11 |
+
"classifier_pooling": "cls",
|
| 12 |
+
"cls_token_id": 1,
|
| 13 |
+
"decoder_bias": true,
|
| 14 |
+
"deterministic_flash_attn": true,
|
| 15 |
+
"dtype": "float32",
|
| 16 |
+
"embedding_dropout": 0.0,
|
| 17 |
+
"eos_token_id": 1,
|
| 18 |
+
"global_attn_every_n_layers": 3,
|
| 19 |
+
"global_rope_theta": 160000.0,
|
| 20 |
+
"gradient_checkpointing": false,
|
| 21 |
+
"hidden_activation": "gelu_pytorch_tanh",
|
| 22 |
+
"hidden_size": 384,
|
| 23 |
+
"id2label": {
|
| 24 |
+
"0": "LABEL_0"
|
| 25 |
+
},
|
| 26 |
+
"initializer_cutoff_factor": 2.0,
|
| 27 |
+
"initializer_range": 0.02,
|
| 28 |
+
"intermediate_size": 1152,
|
| 29 |
+
"label2id": {
|
| 30 |
+
"LABEL_0": 0
|
| 31 |
+
},
|
| 32 |
+
"layer_norm_eps": 1e-05,
|
| 33 |
+
"layer_types": [
|
| 34 |
+
"full_attention",
|
| 35 |
+
"sliding_attention",
|
| 36 |
+
"sliding_attention",
|
| 37 |
+
"full_attention",
|
| 38 |
+
"sliding_attention",
|
| 39 |
+
"sliding_attention",
|
| 40 |
+
"full_attention",
|
| 41 |
+
"sliding_attention"
|
| 42 |
+
],
|
| 43 |
+
"local_attention": 128,
|
| 44 |
+
"local_rope_theta": 160000.0,
|
| 45 |
+
"mask_token_id": 4,
|
| 46 |
+
"max_position_embeddings": 8192,
|
| 47 |
+
"mlp_bias": false,
|
| 48 |
+
"mlp_dropout": 0.0,
|
| 49 |
+
"model_type": "modernbert",
|
| 50 |
+
"norm_bias": false,
|
| 51 |
+
"norm_eps": 1e-05,
|
| 52 |
+
"num_attention_heads": 6,
|
| 53 |
+
"num_hidden_layers": 8,
|
| 54 |
+
"pad_token_id": 0,
|
| 55 |
+
"position_embedding_type": "sans_pos",
|
| 56 |
+
"rope_parameters": {
|
| 57 |
+
"full_attention": {
|
| 58 |
+
"rope_theta": 160000,
|
| 59 |
+
"rope_type": "default"
|
| 60 |
+
},
|
| 61 |
+
"sliding_attention": {
|
| 62 |
+
"rope_theta": 160000,
|
| 63 |
+
"rope_type": "default"
|
| 64 |
+
}
|
| 65 |
+
},
|
| 66 |
+
"sep_token_id": 1,
|
| 67 |
+
"sparse_pred_ignore_index": -100,
|
| 68 |
+
"sparse_prediction": false,
|
| 69 |
+
"tie_word_embeddings": true,
|
| 70 |
+
"transformers_version": "5.16.1",
|
| 71 |
+
"vocab_size": 256000
|
| 72 |
+
}
|
config_sentence_transformers.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"model_type": "CrossEncoder", "activation_fn": "torch.nn.modules.linear.Identity"}
|
model.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:4a3b0d9a505dd9fe810bfa411e23a45c33d6c6d5801e1b680f390edea7db2782
|
| 3 |
+
size 227593826
|
onnx/model.onnx
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:c866580692c6bf274b11ca622db4329f4cbfd6f08f96af964badc31d748ef243
|
| 3 |
+
size 160582339
|
sentence_bert_config.json
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"max_seq_length": 8192,
|
| 3 |
+
"do_lower_case": false
|
| 4 |
+
}
|
tokenizer.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:609d8f4c067cd3950f88594c5a802616cea245823836ef5848ee4fc40aab5b6f
|
| 3 |
+
size 34363188
|
tokenizer_config.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"backend": "tokenizers",
|
| 3 |
+
"bos_token": "<bos>",
|
| 4 |
+
"clean_up_tokenization_spaces": false,
|
| 5 |
+
"cls_token": "<bos>",
|
| 6 |
+
"eos_token": "<eos>",
|
| 7 |
+
"extra_special_tokens": [
|
| 8 |
+
"<start_of_turn>",
|
| 9 |
+
"<end_of_turn>"
|
| 10 |
+
],
|
| 11 |
+
"mask_token": "<mask>",
|
| 12 |
+
"model_input_names": [
|
| 13 |
+
"input_ids",
|
| 14 |
+
"attention_mask"
|
| 15 |
+
],
|
| 16 |
+
"model_max_length": 8192,
|
| 17 |
+
"pad_token": "<pad>",
|
| 18 |
+
"padding_side": "right",
|
| 19 |
+
"sep_token": "<eos>",
|
| 20 |
+
"spaces_between_special_tokens": false,
|
| 21 |
+
"tokenizer_class": "TokenizersBackend",
|
| 22 |
+
"unk_token": "<unk>"
|
| 23 |
+
}
|