Feature Extraction
Transformers
Safetensors
modernbert
typed-decisions
decision-index
decision-model
cross-encoder
text-embeddings-inference
sileod commited on
Commit
0b0617e
·
verified ·
1 Parent(s): 70ddbe4

v0: 512k natural typed sq_o (dev_selected step 4000) + card

Browse files
1_Dense/config.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "in_features": 768,
3
+ "out_features": 1536,
4
+ "bias": false,
5
+ "activation_function": "torch.nn.modules.linear.Identity",
6
+ "use_residual": true
7
+ }
1_Dense/model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:304a390aa5da090c9c22a999ab8fc18194172e97f2098b7bbff9dd1f68d6fa91
3
+ size 9437360
2_Dense/config.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "in_features": 1536,
3
+ "out_features": 768,
4
+ "bias": false,
5
+ "activation_function": "torch.nn.modules.linear.Identity",
6
+ "use_residual": true
7
+ }
2_Dense/model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ca0a3107481100bbec203c119b39afa6d47345a31dcdc015a763ab1dbd8a256e
3
+ size 9437360
3_Dense/config.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "in_features": 768,
3
+ "out_features": 128,
4
+ "bias": false,
5
+ "activation_function": "torch.nn.modules.linear.Identity",
6
+ "use_residual": false
7
+ }
3_Dense/model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ad5e8919ffbd769684d58e7e4a5219c14b2834e04dc0101a28a5f65d8eed5e14
3
+ size 393304
README.md ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ tags:
3
+ - ColBERT
4
+ - multi-vector
5
+ - PyLate
6
+ - sentence-transformers
7
+ - typed-decisions
8
+ - zero-shot-classification
9
+ pipeline_tag: text-classification
10
+ library_name: sentence-transformers
11
+ license: apache-2.0
12
+ language:
13
+ - en
14
+ base_model: lightonai/LateOn
15
+ ---
16
+
17
+ # Tasksource-JEV-Nano-v0
18
+
19
+ Decoupled multi-vector late-interaction decision model: **LateOn (~149M, ModernBERT backbone) fine-tuned on 512k natural heterogeneous Tasksource typed decisions** (choice + noul + score, natural mix, no distillation).
20
+
21
+ Factorization `sq_o = E(S+Q) ∥ E(O_i)` with PyLate native ColBERT MaxSim scoring. Context representations `E(S+Q)` are computed once and reused across decisions (state caching); candidate options are encoded independently (bit-exact permutation equivariance, verified max diff 0.0).
22
+
23
+ - **Base model:** [`lightonai/LateOn`](https://huggingface.co/lightonai/LateOn)
24
+ - **Training data:** [`tasksource/tasksource-jev-typed-decisions`](https://huggingface.co/datasets/tasksource/tasksource-jev-typed-decisions) @ `071f0cf2201f06b2dea3e55323aa3e264284e139`
25
+ - **Stream:** 512,000 decisions, manifest SHA-256 `997d241e34682f2b8b354103d1bbdc7e873fb45333e09637231f513176969331`, kind mix choice 82.7% / noul 11.4% / score 6.0%, 519 train tasks
26
+ - **Recipe:** 8,000 steps × 64, LR 2e-5, kind-aware loss (choice: soft-target CE, noul: 2-way CE, score: CE + RPS), fail-closed `--canonical_run`
27
+ - **Selection:** Tasksource unseen-dev NLL only → step 4000 of 8000 (best NLL 1.2073 internal / 1.0002 canonical probe). Learned temperature T=0.5347.
28
+ - **Code:** training/eval harness in the `decision-models` repo (`scripts/train_multivector.py`, `scripts/eval_multivector.py`)
29
+
30
+ ## Benchmarks (canonical probes: deterministic 1k slices, seed 13 + full Fast Decisions)
31
+
32
+ | Benchmark | Accuracy | NLL | Brier | ECE |
33
+ |---|---|---|---|---|
34
+ | Tasksource unseen-dev | 58.9% | 1.0002 | 0.4822 | 0.0435 |
35
+ | Tasksource unseen-test | 53.0% | 0.9676 | 0.5367 | 0.0590 |
36
+ | Tasksource seen-dev | 56.0% | 0.9573 | 0.5317 | 0.0586 |
37
+ | Typed Decisions | 42.6% | 1.3144 | 0.2935 | 0.1294 |
38
+ | AG News | 73.8% | 0.7510 | 0.4017 | 0.0840 |
39
+ | Emotion | 49.0% | 1.4226 | 0.7033 | 0.1309 |
40
+ | Banking77 (K=77) | 44.7% | 2.2661 | 0.7536 | 0.1857 |
41
+ | Fast Decisions (2,900, 17 domains) | 41.31% EM (macro 40.59) | — | — | — |
42
+ | classifier-benchmark v2 (866 cases) | micro 57.51 / macro 57.17 | — | — | — |
43
+
44
+ Context: same-slice sub-400M peers score AG News 65–78%, Banking77 23–70%, Typed 34–49%, cb-v2 micro 35–60% — v0 is competitive while adding state caching and permutation equivariance, which classifier heads lack. Relative to its choice+KD sibling (50.8% unseen-dev), v0 gains +8.1pp in-domain and +6.9pp Typed at some AG/Banking77 transfer cost (documented specialization tradeoff).
45
+
46
+ ## Usage (minimal inference example)
47
+
48
+ ```python
49
+ from modernjev.multivector.lateon import LateOnDecisionScorer
50
+
51
+ scorer = LateOnDecisionScorer("tasksource/tasksource-jev-nano-v0", device="cuda")
52
+
53
+ state = "Customer reports unauthorized international wire transfer of $4,500 on account #4092."
54
+ question = "Select the appropriate fraud mitigation routing:"
55
+ options = [
56
+ "approve_silent_monitor",
57
+ "two_factor_push_challenge",
58
+ "temporary_freeze_outreach",
59
+ "hard_decline_and_report",
60
+ ]
61
+
62
+ probs = scorer.predict_batch([state], [question], [options], kinds=["choice"])[0]
63
+ for opt, p in zip(options, probs):
64
+ print(f" {opt:30s} -> {p:.4f}")
65
+
66
+ # State caching: encode once, score many candidate sets with zero re-encoding
67
+ cache = scorer.encode_state([state], questions=[question])
68
+ out = scorer.decide_cached(cache, questions=[question], options=[options], kinds=["choice"])
69
+ print("Logits:", out.logits[0, :len(options)])
70
+ ```
71
+
72
+ Heterogeneous kinds are supported per decision: `choice` (softmax), `noul` (2-way), `score` (softmax + ordinal), `multilabel` (independent sigmoids).
73
+
74
+ ## Citation
75
+
76
+ ```bibtex
77
+ @misc{sileo2026jevnanov0,
78
+ title={Tasksource-JEV-Nano-v0: Decoupled Multi-Vector Late Interaction for Typed Decisions},
79
+ author={Sileo, Damien},
80
+ year={2026},
81
+ howpublished={\url{https://huggingface.co/tasksource/tasksource-jev-nano-v0}},
82
+ }
83
+ ```
84
+
85
+ Base model: LateOn by LightOn (`lightonai/LateOn`, Apache 2.0). Training data: `tasksource/tasksource-jev-typed-decisions`.
config.json ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "ModernBertModel"
4
+ ],
5
+ "attention_bias": false,
6
+ "attention_dropout": 0.0,
7
+ "bos_token_id": 50281,
8
+ "classifier_activation": "gelu",
9
+ "classifier_bias": false,
10
+ "classifier_dropout": 0.0,
11
+ "classifier_pooling": "mean",
12
+ "cls_token_id": 50281,
13
+ "decoder_bias": true,
14
+ "deterministic_flash_attn": false,
15
+ "dtype": "float32",
16
+ "embedding_dropout": 0.0,
17
+ "eos_token_id": 50282,
18
+ "global_attn_every_n_layers": 3,
19
+ "gradient_checkpointing": false,
20
+ "hidden_activation": "gelu",
21
+ "hidden_size": 768,
22
+ "initializer_cutoff_factor": 2.0,
23
+ "initializer_range": 0.02,
24
+ "intermediate_size": 1152,
25
+ "layer_norm_eps": 1e-05,
26
+ "layer_types": [
27
+ "full_attention",
28
+ "sliding_attention",
29
+ "sliding_attention",
30
+ "full_attention",
31
+ "sliding_attention",
32
+ "sliding_attention",
33
+ "full_attention",
34
+ "sliding_attention",
35
+ "sliding_attention",
36
+ "full_attention",
37
+ "sliding_attention",
38
+ "sliding_attention",
39
+ "full_attention",
40
+ "sliding_attention",
41
+ "sliding_attention",
42
+ "full_attention",
43
+ "sliding_attention",
44
+ "sliding_attention",
45
+ "full_attention",
46
+ "sliding_attention",
47
+ "sliding_attention",
48
+ "full_attention"
49
+ ],
50
+ "local_attention": 128,
51
+ "max_position_embeddings": 8192,
52
+ "mlp_bias": false,
53
+ "mlp_dropout": 0.0,
54
+ "model_type": "modernbert",
55
+ "norm_bias": false,
56
+ "norm_eps": 1e-05,
57
+ "num_attention_heads": 12,
58
+ "num_hidden_layers": 22,
59
+ "pad_token_id": 50283,
60
+ "position_embedding_type": "absolute",
61
+ "repad_logits_with_grad": false,
62
+ "rope_parameters": {
63
+ "full_attention": {
64
+ "rope_theta": 160000.0,
65
+ "rope_type": "default"
66
+ },
67
+ "sliding_attention": {
68
+ "rope_theta": 10000.0,
69
+ "rope_type": "default"
70
+ }
71
+ },
72
+ "sep_token_id": 50282,
73
+ "sparse_pred_ignore_index": -100,
74
+ "sparse_prediction": false,
75
+ "tie_word_embeddings": true,
76
+ "transformers_version": "5.17.0",
77
+ "vocab_size": 50370
78
+ }
config_sentence_transformers.json ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "ColBERT",
3
+ "__version__": {
4
+ "sentence_transformers": "5.1.2",
5
+ "transformers": "5.17.0",
6
+ "pytorch": "2.7.1+cu126"
7
+ },
8
+ "prompts": {
9
+ "query": "",
10
+ "document": ""
11
+ },
12
+ "default_prompt_name": null,
13
+ "similarity_fn_name": "MaxSim",
14
+ "query_prefix": "[Q] ",
15
+ "document_prefix": "[D] ",
16
+ "query_length": 32,
17
+ "document_length": 300,
18
+ "attend_to_expansion_tokens": false,
19
+ "skiplist_words": [
20
+ "!",
21
+ "\"",
22
+ "#",
23
+ "$",
24
+ "%",
25
+ "&",
26
+ "'",
27
+ "(",
28
+ ")",
29
+ "*",
30
+ "+",
31
+ ",",
32
+ "-",
33
+ ".",
34
+ "/",
35
+ ":",
36
+ ";",
37
+ "<",
38
+ "=",
39
+ ">",
40
+ "?",
41
+ "@",
42
+ "[",
43
+ "\\",
44
+ "]",
45
+ "^",
46
+ "_",
47
+ "`",
48
+ "{",
49
+ "|",
50
+ "}",
51
+ "~"
52
+ ],
53
+ "do_query_expansion": false
54
+ }
decision_meta.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "init_temperature": 0.5347228646278381,
3
+ "path_mode": "sq_o",
4
+ "pooling_budget": null,
5
+ "protected_tokens": 1,
6
+ "config": {
7
+ "model_name_or_path": "lightonai/LateOn",
8
+ "embedding_dim": 128,
9
+ "state_max_length": 512,
10
+ "query_max_length": 64,
11
+ "init_temperature": 1.0,
12
+ "learn_temperature": true,
13
+ "path_mode": "sq_o",
14
+ "pooling_budget": null,
15
+ "protected_tokens": 1,
16
+ "query_prefix": "[Q] ",
17
+ "document_prefix": "[D] ",
18
+ "backend": "torch",
19
+ "metadata": {}
20
+ }
21
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:82b40602a9ac23a332640fce13e8f9b2ccf8703d9ac5d36b40f6d41107e2a92c
3
+ size 596076280
modules.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "idx": 0,
4
+ "name": "0",
5
+ "path": "",
6
+ "type": "sentence_transformers.models.Transformer"
7
+ },
8
+ {
9
+ "idx": 1,
10
+ "name": "1",
11
+ "path": "1_Dense",
12
+ "type": "pylate.models.Dense.Dense"
13
+ },
14
+ {
15
+ "idx": 2,
16
+ "name": "2",
17
+ "path": "2_Dense",
18
+ "type": "pylate.models.Dense.Dense"
19
+ },
20
+ {
21
+ "idx": 3,
22
+ "name": "3",
23
+ "path": "3_Dense",
24
+ "type": "pylate.models.Dense.Dense"
25
+ }
26
+ ]
sentence_bert_config.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {
2
+ "max_seq_length": 31,
3
+ "do_lower_case": false
4
+ }
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backend": "tokenizers",
3
+ "clean_up_tokenization_spaces": true,
4
+ "cls_token": "[CLS]",
5
+ "is_local": false,
6
+ "local_files_only": true,
7
+ "mask_token": "[MASK]",
8
+ "max_length": 299,
9
+ "model_input_names": [
10
+ "input_ids",
11
+ "attention_mask"
12
+ ],
13
+ "model_max_length": 299,
14
+ "pad_to_multiple_of": null,
15
+ "pad_token": "[MASK]",
16
+ "pad_token_type_id": 0,
17
+ "padding_side": "right",
18
+ "sep_token": "[SEP]",
19
+ "stride": 0,
20
+ "tokenizer_class": "TokenizersBackend",
21
+ "truncation_side": "right",
22
+ "truncation_strategy": "longest_first",
23
+ "unk_token": "[UNK]"
24
+ }