SkyIsNotGreen commited on
Commit
7392b7f
·
verified ·
1 Parent(s): 23db975

Release from the HiveBench Studio (private)

Browse files
CITATION.cff ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ cff-version: 1.2.0
2
+ message: "If you use this software or its measurements, cite it as below."
3
+ title: "HiveBench"
4
+ abstract: >-
5
+ Evaluation suite and Studio sidecar for Splinter-Memory. Ships the white
6
+ paper's falsifiable predictions (P1-P11) as executable, offline tests with
7
+ measured verdicts, deterministic retrieval diagnostics that avoid
8
+ LLM-as-judge circularity in the evidence path, and replayable paired A/B
9
+ batteries (splinter-curated context vs a naive FIFO window).
10
+ type: software
11
+ authors:
12
+ - name: "sky-is-green"
13
+ alias: "sky-is-green"
14
+ version: "0.1.0"
15
+ date-released: "2026-09-22"
16
+ license: MIT
17
+ repository-code: "https://github.com/sky-is-green/hivebench"
18
+ url: "https://github.com/sky-is-green/hivebench"
19
+ keywords:
20
+ - evaluation
21
+ - benchmark
22
+ - context-management
23
+ - llm
24
+ - reproducibility
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2026 HiveBench Studio contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
README.md ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ library_name: sentence-transformers
4
+ tags:
5
+ - sentence-transformers
6
+ - embedding
7
+ - context-curation
8
+ - long-context
9
+ - memory-management
10
+ - retrieval
11
+ pipeline_tag: sentence-similarity
12
+ base_model: sentence-transformers/paraphrase-MiniLM-L3-v2
13
+ ---
14
+
15
+ # Splinter Encoder v1
16
+
17
+ **The drone encoder for long-context memory curation, tuned on the
18
+ harness's own traffic.**
19
+
20
+ This is a 17M-parameter, 3-layer sentence encoder - the same size and
21
+ shape as `paraphrase-MiniLM-L3-v2` - tuned for the three decisions a
22
+ long-context memory system actually has to make. It runs on the CPU
23
+ (about one millisecond per chunk), so the memory it serves never competes
24
+ with the model it serves.
25
+
26
+ ---
27
+
28
+ ## What it is for
29
+
30
+ A memory system that curates a long conversation into a bounded context
31
+ gives its encoder three questions:
32
+
33
+ | job | the question | what a good answer looks like |
34
+ |---|---|---|
35
+ | **dedup** | do these two chunks say the same thing? | the duplicate's cosine is clearly above the rest |
36
+ | **drift** | did the conversation change topic? | the recent window and the older one separate cleanly |
37
+ | **rank** | which chunk answers this query? | the relevant chunk is at the top |
38
+
39
+ Most embedding models are trained for the third. This one is trained for
40
+ the first two as well, on the traffic of a real long-horizon memory
41
+ system.
42
+
43
+ ## The training
44
+
45
+ - **Base**: `sentence-transformers/paraphrase-MiniLM-L3-v2` (17.4M params,
46
+ 384 dims, 3 layers)
47
+ - **Data**: 561 duplicate pairs and 2,838 topic-change windows, built from
48
+ 81 real conversations (6,975 stored chunks) and labelled **lexically** -
49
+ the label is the shared content words, not a model's opinion, so it is
50
+ independent of the encoder being trained
51
+ - **Loss**: in-batch negatives over the anchor/positive pairs, plus a
52
+ margin term on a hard negative
53
+ - **Curriculum**: the dedup task only. The first two runs that included
54
+ the drift task *damaged* the drift signal (AUC 0.945 → 0.762): the
55
+ in-batch negatives of that task pull the embedding of a window toward
56
+ the embedding of a chunk, which moves the detector's own cosines
57
+ - **Hardware**: CPU, one epoch, 35 steps, about a minute
58
+
59
+ ## The measured results
60
+
61
+ Measured on 4,056 duplicate pairs and 6,533 topic-change cases, against
62
+ the base model, at the operating points the system ships.
63
+
64
+ | | dedup F1 | drift F1 | drift AUC | ms/chunk |
65
+ |---|---|---|---|---|
66
+ | the base model, at the thresholds the harness shipped | 0.089 | 0.151 | 0.945 | 1.3 |
67
+ | the base model, at its own best thresholds | 0.761 | 0.554 | 0.945 | 1.3 |
68
+ | **this model, at its own thresholds** | **0.862** | **0.573** | 0.943 | 1.1 |
69
+
70
+ **The thresholds are part of the release.** They are per-encoder - the
71
+ cosine distribution moves when the model is trained - so the operating
72
+ points that ship with this model are:
73
+
74
+ ```json
75
+ {"dedup_threshold": 0.67, "drift_threshold": 0.74}
76
+ ```
77
+
78
+ Using the base model with these thresholds is much worse than using the
79
+ base model with its own (0.761 / 0.554), and using this model with the
80
+ old thresholds loses most of the gain. Model and thresholds travel
81
+ together.
82
+
83
+ ## How to use it
84
+
85
+ ```python
86
+ from sentence_transformers import SentenceTransformer
87
+
88
+ model = SentenceTransformer("SkyIsNotGreen/splinter-encoder", device="cpu")
89
+ vectors = model.encode(["the chunk", "the other chunk"],
90
+ normalize_embeddings=True)
91
+ similarity = float(vectors[0] @ vectors[1]) # > 0.67: the same fact
92
+ ```
93
+
94
+ The architecture is unchanged from the base model: one embedding
95
+ function, mean pooling, a cosine. It is a drop-in replacement for the
96
+ model the HiveBench Studio loads, and the Studio can run it directly -
97
+ pick it in the Global tab's encoder block, set the two thresholds above,
98
+ and restart the Studio (the drone is built once per choice).
99
+
100
+ ## The measurement
101
+
102
+ The evaluation suite is in the harness repository
103
+ (`experiments/encoder_suite.py`) and the fine-tuner next to it
104
+ (`experiments/encoder_finetune.py`). The measurement is deterministic:
105
+ the corpus is read from disk, the pairs are sampled with a fixed seed,
106
+ and the labels are lexical.
107
+
108
+ **The honest limits.** The labels are lexical, so a paraphrase that
109
+ shares no content words counts as two different facts. The corpus is the
110
+ harness's own traffic (81 conversations), not the world's. And nothing
111
+ here claims the model is better at *ranking* - the ranking numbers are
112
+ the same as the base model's, on the same curve every stock encoder
113
+ lands on. What changed is the two decisions the membrane makes.
114
+
115
+ ## Citation
116
+
117
+ ```
118
+ @misc{splinter-encoder-v1,
119
+ title = {Splinter Encoder v1: a drone encoder for long-context memory curation},
120
+ author = {{HiveBench Studio contributors}},
121
+ year = {2026},
122
+ url = {https://huggingface.co/SkyIsNotGreen/splinter-encoder}
123
+ }
124
+ ```
125
+
126
+ ## License
127
+
128
+ MIT. See `LICENSE`.
config.json ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_cross_attention": false,
3
+ "architectures": [
4
+ "BertModel"
5
+ ],
6
+ "attention_probs_dropout_prob": 0.1,
7
+ "bos_token_id": null,
8
+ "classifier_dropout": null,
9
+ "dtype": "float32",
10
+ "eos_token_id": null,
11
+ "gradient_checkpointing": false,
12
+ "hidden_act": "gelu",
13
+ "hidden_dropout_prob": 0.1,
14
+ "hidden_size": 384,
15
+ "initializer_range": 0.02,
16
+ "intermediate_size": 1536,
17
+ "is_decoder": false,
18
+ "layer_norm_eps": 1e-12,
19
+ "max_position_embeddings": 512,
20
+ "model_type": "bert",
21
+ "num_attention_heads": 12,
22
+ "num_hidden_layers": 3,
23
+ "pad_token_id": 0,
24
+ "position_embedding_type": "absolute",
25
+ "tie_word_embeddings": true,
26
+ "transformers_version": "5.17.0",
27
+ "type_vocab_size": 2,
28
+ "use_cache": true,
29
+ "vocab_size": 30522
30
+ }
config_sentence_transformers.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "__version__": {
3
+ "pytorch": "2.6.0+cpu",
4
+ "sentence_transformers": "6.1.0",
5
+ "transformers": "5.17.0"
6
+ },
7
+ "default_prompt_name": null,
8
+ "model_type": "SentenceTransformer",
9
+ "prompts": {
10
+ "document": "",
11
+ "query": ""
12
+ },
13
+ "similarity_fn_name": "cosine"
14
+ }
finetune_meta.json ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "student": "sentence-transformers/paraphrase-MiniLM-L3-v2",
3
+ "teacher": "",
4
+ "examples": 561,
5
+ "epochs": 1,
6
+ "batch_size": 16,
7
+ "lr": 5e-06,
8
+ "temperature": 0.05,
9
+ "alpha": 0.5,
10
+ "hard_weight": 0.5,
11
+ "seed": 20261020,
12
+ "seconds": 82.5,
13
+ "history": [
14
+ {
15
+ "epoch": 0,
16
+ "steps": 35
17
+ }
18
+ ]
19
+ }
gate.json ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": {
3
+ "info": {
4
+ "model": "experiments/encoder-suite/results/20261020/l3-tuned-v6",
5
+ "params": 17389824,
6
+ "params_m": 17.4,
7
+ "dim": 384,
8
+ "load_s": 0.1,
9
+ "query_prefix": ""
10
+ },
11
+ "dedup": {
12
+ "n": 2141,
13
+ "positives": 561,
14
+ "at_0.92": {
15
+ "precision": 1.0,
16
+ "recall": 0.0463,
17
+ "f1": 0.0886
18
+ },
19
+ "pos_p50": 0.764,
20
+ "neg_p50": 0.3609,
21
+ "separation": 0.4031,
22
+ "best": {
23
+ "f1": 0.8622,
24
+ "precision": 0.8244,
25
+ "recall": 0.9037,
26
+ "threshold": 0.67
27
+ }
28
+ },
29
+ "drift": {
30
+ "n": 6533,
31
+ "positives": 230,
32
+ "auc": 0.943,
33
+ "at_0.6": {
34
+ "precision": 0.1065,
35
+ "recall": 0.9435,
36
+ "f1": 0.1914
37
+ },
38
+ "best": {
39
+ "f1": 0.5728,
40
+ "precision": 0.6484,
41
+ "recall": 0.513,
42
+ "threshold": 0.74
43
+ },
44
+ "signal_p50": 0.5576,
45
+ "signal_min": 0.0354,
46
+ "signal_max": 1.1474
47
+ },
48
+ "cost": {
49
+ "ms_per_chunk": 1.06,
50
+ "ms_per_100_chunks": 0.1
51
+ }
52
+ },
53
+ "baseline": {
54
+ "info": {
55
+ "model": "sentence-transformers/paraphrase-MiniLM-L3-v2",
56
+ "params": 17389824,
57
+ "params_m": 17.4,
58
+ "dim": 384,
59
+ "load_s": 2.8,
60
+ "query_prefix": ""
61
+ },
62
+ "dedup": {
63
+ "n": 2141,
64
+ "positives": 561,
65
+ "at_0.92": {
66
+ "precision": 1.0,
67
+ "recall": 0.0463,
68
+ "f1": 0.0886
69
+ },
70
+ "pos_p50": 0.6864,
71
+ "neg_p50": 0.3335,
72
+ "separation": 0.3529,
73
+ "best": {
74
+ "f1": 0.7609,
75
+ "precision": 0.6436,
76
+ "recall": 0.9305,
77
+ "threshold": 0.57
78
+ }
79
+ },
80
+ "drift": {
81
+ "n": 6533,
82
+ "positives": 230,
83
+ "auc": 0.9451,
84
+ "at_0.6": {
85
+ "precision": 0.082,
86
+ "recall": 0.9565,
87
+ "f1": 0.151
88
+ },
89
+ "best": {
90
+ "f1": 0.5545,
91
+ "precision": 0.6094,
92
+ "recall": 0.5087,
93
+ "threshold": 0.77
94
+ },
95
+ "signal_p50": 0.5813,
96
+ "signal_min": 0.0391,
97
+ "signal_max": 1.145
98
+ },
99
+ "cost": {
100
+ "ms_per_chunk": 1.34,
101
+ "ms_per_100_chunks": 0.1
102
+ }
103
+ },
104
+ "verdict": {
105
+ "dedup_f1": true,
106
+ "drift_f1": true,
107
+ "cost_ok": true,
108
+ "pass": true
109
+ },
110
+ "reported": {
111
+ "dedup_best_f1": {
112
+ "checkpoint": 0.8622,
113
+ "baseline": 0.7609
114
+ },
115
+ "drift_best_f1": {
116
+ "checkpoint": 0.5728,
117
+ "baseline": 0.5545
118
+ },
119
+ "drift_auc": {
120
+ "checkpoint": 0.943,
121
+ "baseline": 0.9451
122
+ }
123
+ }
124
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ed2dcbfb8a11ffc93708909afec66094bf03771ec60772ec508063d77fada477
3
+ size 69565312
modules.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "idx": 0,
4
+ "name": "0",
5
+ "path": "",
6
+ "type": "sentence_transformers.base.modules.transformer.Transformer"
7
+ },
8
+ {
9
+ "idx": 1,
10
+ "name": "1",
11
+ "path": "1_Pooling",
12
+ "type": "sentence_transformers.sentence_transformer.modules.pooling.Pooling"
13
+ }
14
+ ]
sentence_bert_config.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "transformer_task": "feature-extraction",
3
+ "modality_config": {
4
+ "text": {
5
+ "method": "forward",
6
+ "method_output_name": "last_hidden_state"
7
+ }
8
+ },
9
+ "module_output_name": "token_embeddings"
10
+ }
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
+ "cls_token": "[CLS]",
4
+ "do_basic_tokenize": true,
5
+ "do_lower_case": true,
6
+ "is_local": false,
7
+ "local_files_only": false,
8
+ "mask_token": "[MASK]",
9
+ "max_length": 128,
10
+ "model_max_length": 128,
11
+ "never_split": null,
12
+ "pad_to_multiple_of": null,
13
+ "pad_token": "[PAD]",
14
+ "pad_token_type_id": 0,
15
+ "padding_side": "right",
16
+ "sep_token": "[SEP]",
17
+ "stride": 0,
18
+ "strip_accents": null,
19
+ "tokenize_chinese_chars": true,
20
+ "tokenizer_class": "BertTokenizer",
21
+ "truncation_side": "right",
22
+ "truncation_strategy": "longest_first",
23
+ "unk_token": "[UNK]"
24
+ }