farbodtavakkoli commited on
Commit
28f0610
·
verified ·
1 Parent(s): f589b06

Copy of farbodtavakkoli/OTel-Reranker-4B at 8961569

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* 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
 
 
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
README.md ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ language:
4
+ - en
5
+ base_model:
6
+ - Qwen/Qwen3-4B
7
+ datasets:
8
+ - farbodtavakkoli/OTel-Reranker
9
+ tags:
10
+ - telecom
11
+ - telecommunications
12
+ - gsma
13
+ - rag
14
+ - full-parameter-fine-tuning
15
+ - fine-tuned
16
+ pipeline_tag: text-classification
17
+ ---
18
+
19
+ # OTel-Reranker-4B
20
+
21
+ **OTel-Reranker-4B** is a telecom reranker model full-parameter fine-tuned on OTel telecommunications data. It is part of the [OTel Family of Models](https://huggingface.co/collections/farbodtavakkoli/otel-reranker), an open-source initiative to build reference AI resources for the global telecommunications sector.
22
+
23
+ Across the 3 OTel reranker baselines, OTel fine-tuning improves MRR@10 by +0.530 to +0.592 over the base checkpoints.
24
+
25
+ ## Community Use
26
+
27
+ As of May 3, 2026, the released OTel models had been downloaded over 16 million times, and the Open Telco AI project had received 157+ pieces of media coverage worldwide.
28
+
29
+ ## Model Details
30
+
31
+ | Attribute | Value |
32
+ |---|---|
33
+ | Base model | [Qwen/Qwen3-4B](https://huggingface.co/Qwen/Qwen3-4B) |
34
+ | Parameters | 4B |
35
+ | OTel training dataset | [OTel-Reranker](https://huggingface.co/datasets/farbodtavakkoli/OTel-Reranker) |
36
+ | Dataset fields | `sentence_0`, `sentence_1`, `label` |
37
+ | Training method | Full-parameter post-training / fine-tuning |
38
+ | Language | English |
39
+ | OTel release license | Apache 2.0 |
40
+
41
+ ## Model Lineage
42
+
43
+ `Qwen/Qwen3-4B` -> `OTel-Reranker` full-parameter post-training -> `farbodtavakkoli/OTel-Reranker-4B`
44
+
45
+ ## OTel vs. Base Model
46
+
47
+ | Metric | Base model | OTel fine-tuned | Delta | Evaluation split |
48
+ |---|---:|---:|---:|---|
49
+ | MRR@10 | 0.407 | 0.943 +/- 0.006 | +0.536 | OTel-Reranker held-out 5% |
50
+
51
+ Standard errors are computed with bootstrap resampling (`n=1000`) over the held-out OTel evaluation partition. MRR@10 measures how quickly the first truly relevant telecom passage is promoted near the top of the reranked list.
52
+
53
+ ## Evaluation Caveats
54
+
55
+ - Reranker results measure held-out OTel reranking partitions.
56
+ - Reported standard errors come from bootstrap resampling over the held-out evaluation partitions.
57
+ - Reranking quality depends on the candidate passages supplied by the upstream retriever.
58
+ - External benchmark transfer, multilingual performance, and per-subdomain performance should be evaluated separately for production settings.
59
+
60
+
61
+ ## Training Data
62
+
63
+ The model was trained on telecom-focused data curated by 100+ domain experts. The raw corpus contained roughly 1.1M training points and was filtered to 326,767 higher-confidence examples.
64
+
65
+ | Source | Contributor |
66
+ |---|---|
67
+ | arXiv telecom papers, 3GPP standards, telecom Wikipedia, telecom Common Crawl | Yale University |
68
+ | GSMA Permanent Reference Documents, Discover portal | GSMA |
69
+ | IETF RFC series | NetoAI |
70
+ | Industry whitepapers | Khalifa University |
71
+ | O-RAN specifications (working groups 1, 2, 4, 5, 6, 7, 8, 9, 10) | University of Leeds |
72
+ | O-RAN documents across working groups | Purdue University and The University of Texas at Dallas |
73
+
74
+ Released datasets: [OTel-LLM](https://huggingface.co/datasets/farbodtavakkoli/OTel-LLM), [OTel-Embedding](https://huggingface.co/datasets/farbodtavakkoli/OTel-Embedding), [OTel-Reranker](https://huggingface.co/datasets/farbodtavakkoli/OTel-Reranker), and [OTel-Safety](https://huggingface.co/datasets/farbodtavakkoli/OTel-Safety).
75
+
76
+ The OTel datasets release derived QA/retrieval/reranking examples rather than the raw source documents.
77
+
78
+ Each released dataset includes a dataset card and Croissant metadata with Responsible AI fields for data limitations, biases, sensitive-information considerations, use cases, social impact, synthetic-data status, and provenance.
79
+
80
+ ## Representative Training Row
81
+
82
+ `OTel-Reranker` rows are pointwise cross-encoder relevance examples.
83
+
84
+ ```json
85
+ {
86
+ "sentence_0": "The Fronthaul Gateway can translate FH protocol from an O-DUx with split option 7-2 to an O-RUy with split option 8.",
87
+ "sentence_1": "Fronthaul Gateway that can translate FH protocol from an O-DUx with split option x to an O-RUy with split option y, with currently available option 7-2 to 8.",
88
+ "label": 1.0
89
+ }
90
+ ```
91
+
92
+ ## Intended Use
93
+
94
+ This model is intended to re-score telecom query-passage pairs after an initial retrieval step. It is designed for the reranking stage of a telecom RAG pipeline, where the goal is to promote the most relevant retrieved passages before answer generation.
95
+
96
+ ## Training Recipe
97
+
98
+ | Item | Value |
99
+ |---|---|
100
+ | Framework | ScalarLM |
101
+ | Optimizer | AdamW, 8-bit |
102
+ | Learning-rate schedule | Cosine decay with warmup |
103
+ | Weight decay | 0.01 |
104
+ | Warmup steps | 100 |
105
+ | Random seed | 42 |
106
+ | Maximum sequence length | 1500 tokens |
107
+ | Precision | BF16 |
108
+ | Attention | Flash Attention 2 |
109
+ | Distributed training | Fully Sharded Data Parallel |
110
+ | Gradient checkpointing | Enabled |
111
+ | Epochs | 3 for LLM/embedding models; 2 for rerankers |
112
+ | Compute | AMD MI300X/MI325X/MI355X and NVIDIA A100/H100 GPUs |
113
+
114
+ ## Usage
115
+
116
+ ```python
117
+ from transformers import AutoModelForSequenceClassification, AutoTokenizer
118
+ import torch
119
+
120
+ model_name = "farbodtavakkoli/OTel-Reranker-4B"
121
+ tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
122
+ model = AutoModelForSequenceClassification.from_pretrained(
123
+ model_name,
124
+ trust_remote_code=True,
125
+ )
126
+
127
+ query = "What is the F1 interface?"
128
+ documents = [
129
+ "The F1 interface connects O-DU to O-CU in O-RAN architecture.",
130
+ "5G networks use millimeter wave frequencies.",
131
+ ]
132
+
133
+ pairs = [[query, doc] for doc in documents]
134
+ inputs = tokenizer(pairs, padding=True, truncation=True, return_tensors="pt")
135
+ with torch.no_grad():
136
+ scores = model(**inputs).logits.squeeze()
137
+ print(scores)
138
+ ```
139
+
140
+ ## Limitations and Responsible Use
141
+
142
+ - OTel models are domain-specific to telecommunications and should not be treated as general-purpose models.
143
+ - The current release is English-only and primarily text-centric.
144
+ - The reported OTel performance results use held-out OTel evaluation partitions and should not be interpreted as results from a fully independent external benchmark suite.
145
+ - Aggregate scores can hide subdomain variation; collaborator stress tests suggest O-RAN retrieval is comparatively strong, while academic-paper and GSMA PRD examples need further curation.
146
+ - Generated telecom content should be verified before operational, customer-facing, regulatory, safety, or network-configuration use.
147
+ - Users must comply with both the OTel release license and the upstream base-model license or terms.
148
+
149
+ ## Related Models
150
+
151
+ - [OTel LLM Collection](https://huggingface.co/collections/farbodtavakkoli/otel-llm)
152
+ - [OTel Embedding Collection](https://huggingface.co/collections/farbodtavakkoli/otel-embedding)
153
+ - [OTel Reranker Collection](https://huggingface.co/collections/farbodtavakkoli/otel-reranker)
154
+
155
+ ## Project Resources
156
+
157
+ - Project page: https://huggingface.co/farbodtavakkoli
158
+ - Code: https://github.com/farbodtavakkoli/OTel
159
+ - Media coverage list: https://github.com/farbodtavakkoli/OTel/blob/main/docs/OTel-1.0-media-coverage.md
160
+
161
+ ## Citation
162
+
163
+ ```bibtex
164
+ @inproceedings{tavakkoli2026otel,
165
+ title = {OTel: Open Telco AI Datasets, Benchmarks, and Models},
166
+ author = {Tavakkoli, Farbod and Diamos, Gregory and Church, Kenneth and Kanter, David and Austin, Mark and Karim, Imtiaz and Rahman, Mirza Masfiqur and Debbah, Merouane Abdelkader and Nezami, Zeinab and Maatouk, Ali and Tassiulas, Leandros and Ying, Rex and Sorros, Nick and Powell, Louis and Vasiloglou, Nikolaos and Vaswani, Ashish and Singla, Somanshu and Chaluvaraju, Adarsh},
167
+ booktitle = {Advances in Neural Information Processing Systems (NeurIPS), Evaluations and Datasets Track},
168
+ year = {2026},
169
+ url = {https://github.com/farbodtavakkoli/OTel}
170
+ }
171
+ ```
172
+
173
+ ## Contact
174
+
175
+ For technical questions, contact farbod.tavakkoli@att.com or farbodtavakoli@gmail.com.
chat_template.jinja ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {%- if tools %}
2
+ {{- '<|im_start|>system\n' }}
3
+ {%- if messages[0].role == 'system' %}
4
+ {{- messages[0].content + '\n\n' }}
5
+ {%- endif %}
6
+ {{- "# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>" }}
7
+ {%- for tool in tools %}
8
+ {{- "\n" }}
9
+ {{- tool | tojson }}
10
+ {%- endfor %}
11
+ {{- "\n</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{\"name\": <function-name>, \"arguments\": <args-json-object>}\n</tool_call><|im_end|>\n" }}
12
+ {%- else %}
13
+ {%- if messages[0].role == 'system' %}
14
+ {{- '<|im_start|>system\n' + messages[0].content + '<|im_end|>\n' }}
15
+ {%- endif %}
16
+ {%- endif %}
17
+ {%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}
18
+ {%- for message in messages[::-1] %}
19
+ {%- set index = (messages|length - 1) - loop.index0 %}
20
+ {%- if ns.multi_step_tool and message.role == "user" and not(message.content.startswith('<tool_response>') and message.content.endswith('</tool_response>')) %}
21
+ {%- set ns.multi_step_tool = false %}
22
+ {%- set ns.last_query_index = index %}
23
+ {%- endif %}
24
+ {%- endfor %}
25
+ {%- for message in messages %}
26
+ {%- if (message.role == "user") or (message.role == "system" and not loop.first) %}
27
+ {{- '<|im_start|>' + message.role + '\n' + message.content + '<|im_end|>' + '\n' }}
28
+ {%- elif message.role == "assistant" %}
29
+ {%- set content = message.content %}
30
+ {%- set reasoning_content = '' %}
31
+ {%- if message.reasoning_content is defined and message.reasoning_content is not none %}
32
+ {%- set reasoning_content = message.reasoning_content %}
33
+ {%- else %}
34
+ {%- if '</think>' in message.content %}
35
+ {%- set content = message.content.split('</think>')[-1].lstrip('\n') %}
36
+ {%- set reasoning_content = message.content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n') %}
37
+ {%- endif %}
38
+ {%- endif %}
39
+ {%- if loop.index0 > ns.last_query_index %}
40
+ {%- if loop.last or (not loop.last and reasoning_content) %}
41
+ {{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content.strip('\n') + '\n</think>\n\n' + content.lstrip('\n') }}
42
+ {%- else %}
43
+ {{- '<|im_start|>' + message.role + '\n' + content }}
44
+ {%- endif %}
45
+ {%- else %}
46
+ {{- '<|im_start|>' + message.role + '\n' + content }}
47
+ {%- endif %}
48
+ {%- if message.tool_calls %}
49
+ {%- for tool_call in message.tool_calls %}
50
+ {%- if (loop.first and content) or (not loop.first) %}
51
+ {{- '\n' }}
52
+ {%- endif %}
53
+ {%- if tool_call.function %}
54
+ {%- set tool_call = tool_call.function %}
55
+ {%- endif %}
56
+ {{- '<tool_call>\n{"name": "' }}
57
+ {{- tool_call.name }}
58
+ {{- '", "arguments": ' }}
59
+ {%- if tool_call.arguments is string %}
60
+ {{- tool_call.arguments }}
61
+ {%- else %}
62
+ {{- tool_call.arguments | tojson }}
63
+ {%- endif %}
64
+ {{- '}\n</tool_call>' }}
65
+ {%- endfor %}
66
+ {%- endif %}
67
+ {{- '<|im_end|>\n' }}
68
+ {%- elif message.role == "tool" %}
69
+ {%- if loop.first or (messages[loop.index0 - 1].role != "tool") %}
70
+ {{- '<|im_start|>user' }}
71
+ {%- endif %}
72
+ {{- '\n<tool_response>\n' }}
73
+ {{- message.content }}
74
+ {{- '\n</tool_response>' }}
75
+ {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}
76
+ {{- '<|im_end|>\n' }}
77
+ {%- endif %}
78
+ {%- endif %}
79
+ {%- endfor %}
80
+ {%- if add_generation_prompt %}
81
+ {{- '<|im_start|>assistant\n' }}
82
+ {%- if enable_thinking is defined and enable_thinking is false %}
83
+ {{- '<think>\n\n</think>\n\n' }}
84
+ {%- endif %}
85
+ {%- endif %}
config.json ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "Qwen3ForSequenceClassification"
4
+ ],
5
+ "attention_bias": false,
6
+ "attention_dropout": 0.0,
7
+ "bos_token_id": null,
8
+ "dtype": "bfloat16",
9
+ "eos_token_id": 151645,
10
+ "head_dim": 128,
11
+ "hidden_act": "silu",
12
+ "hidden_size": 2560,
13
+ "id2label": {
14
+ "0": "LABEL_0"
15
+ },
16
+ "initializer_range": 0.02,
17
+ "intermediate_size": 9728,
18
+ "label2id": {
19
+ "LABEL_0": 0
20
+ },
21
+ "layer_types": [
22
+ "full_attention",
23
+ "full_attention",
24
+ "full_attention",
25
+ "full_attention",
26
+ "full_attention",
27
+ "full_attention",
28
+ "full_attention",
29
+ "full_attention",
30
+ "full_attention",
31
+ "full_attention",
32
+ "full_attention",
33
+ "full_attention",
34
+ "full_attention",
35
+ "full_attention",
36
+ "full_attention",
37
+ "full_attention",
38
+ "full_attention",
39
+ "full_attention",
40
+ "full_attention",
41
+ "full_attention",
42
+ "full_attention",
43
+ "full_attention",
44
+ "full_attention",
45
+ "full_attention",
46
+ "full_attention",
47
+ "full_attention",
48
+ "full_attention",
49
+ "full_attention",
50
+ "full_attention",
51
+ "full_attention",
52
+ "full_attention",
53
+ "full_attention",
54
+ "full_attention",
55
+ "full_attention",
56
+ "full_attention",
57
+ "full_attention"
58
+ ],
59
+ "max_position_embeddings": 40960,
60
+ "max_window_layers": 36,
61
+ "model_type": "qwen3",
62
+ "num_attention_heads": 32,
63
+ "num_hidden_layers": 36,
64
+ "num_key_value_heads": 8,
65
+ "pad_token_id": 151643,
66
+ "rms_norm_eps": 1e-06,
67
+ "rope_parameters": {
68
+ "rope_theta": 1000000,
69
+ "rope_type": "default"
70
+ },
71
+ "sentence_transformers": {
72
+ "activation_fn": "torch.nn.modules.activation.Sigmoid",
73
+ "version": "5.2.0"
74
+ },
75
+ "sliding_window": null,
76
+ "tie_word_embeddings": true,
77
+ "transformers_version": "5.0.0.dev0",
78
+ "use_cache": false,
79
+ "use_sliding_window": false,
80
+ "vocab_size": 151669
81
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9650703dfc0f1c25982300cf180cba86cf2c149738dbc3a54a0fd60a2c110e16
3
+ size 8043620248
tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:31110386145fd5016e6b0c0ff0f156404e1f08fb9cac513064e02c9eb8c38728
3
+ size 11422917
tokenizer_config.json ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_prefix_space": false,
3
+ "backend": "tokenizers",
4
+ "bos_token": null,
5
+ "clean_up_tokenization_spaces": false,
6
+ "eos_token": "<|im_end|>",
7
+ "errors": "replace",
8
+ "extra_special_tokens": [
9
+ "<|im_start|>",
10
+ "<|im_end|>",
11
+ "<|object_ref_start|>",
12
+ "<|object_ref_end|>",
13
+ "<|box_start|>",
14
+ "<|box_end|>",
15
+ "<|quad_start|>",
16
+ "<|quad_end|>",
17
+ "<|vision_start|>",
18
+ "<|vision_end|>",
19
+ "<|vision_pad|>",
20
+ "<|image_pad|>",
21
+ "<|video_pad|>"
22
+ ],
23
+ "is_local": false,
24
+ "model_max_length": 1024,
25
+ "model_specific_special_tokens": {},
26
+ "pad_token": "<|endoftext|>",
27
+ "split_special_tokens": false,
28
+ "tokenizer_class": "Qwen2Tokenizer",
29
+ "unk_token": null
30
+ }