Hygros-LCA commited on
Commit
fa435be
·
verified ·
1 Parent(s): 47fc21f

Upload model from local: bge-m3-ifc-kbob-finetuned

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
1_Pooling/config.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "word_embedding_dimension": 1024,
3
+ "pooling_mode_cls_token": true,
4
+ "pooling_mode_mean_tokens": false,
5
+ "pooling_mode_max_tokens": false,
6
+ "pooling_mode_mean_sqrt_len_tokens": false,
7
+ "pooling_mode_weightedmean_tokens": false,
8
+ "pooling_mode_lasttoken": false,
9
+ "include_prompt": true
10
+ }
README.md ADDED
@@ -0,0 +1,256 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ base_model: BAAI/bge-m3
4
+ language:
5
+ - de
6
+ - en
7
+ - multilingual
8
+ library_name: sentence-transformers
9
+ pipeline_tag: sentence-similarity
10
+ tags:
11
+ - sentence-transformers
12
+ - feature-extraction
13
+ - sentence-similarity
14
+ - retrieval
15
+ - semantic-search
16
+ - ifc
17
+ - lca
18
+
19
+ ---
20
+
21
+ # Hygroskopisch/bge-m3-ifc-kbob-finetuned
22
+
23
+ Sentence-Transformers model finetuned from BAAI/bge-m3 for IFC-based construction material retrieval in KBOB/LCA workflows.
24
+
25
+ ## Model Summary
26
+
27
+ - Model ID: Hygroskopisch/bge-m3-ifc-kbob-finetuned
28
+ - Release: v3 (2026-04-16)
29
+ - Base model: BAAI/bge-m3
30
+ - Embedding dimension: 1024
31
+ - Max sequence length: 128
32
+ - Similarity: cosine
33
+
34
+ The model is optimized for queries generated from IFC element metadata and maps them to KBOB-like material labels for downstream environmental impact workflows.
35
+
36
+ ## Intended Use
37
+
38
+ - IFC-to-material retrieval in building and infrastructure datasets.
39
+ - Candidate generation before manual validation in LCA pipelines.
40
+ - Semantic search over construction material catalogs with domain-specific wording.
41
+
42
+ ## Out-of-Scope Use
43
+
44
+ - Legal, compliance, or procurement decisions without human review.
45
+ - Safety-critical engineering sign-off.
46
+ - Use as a standalone source of truth for environmental declarations.
47
+
48
+ ## Responsible Use
49
+
50
+ - Keep a human-in-the-loop for final material assignment.
51
+ - Validate results against project context, standards, and local regulations.
52
+ - Contact: sbert-lca@pm.me
53
+
54
+ ## Training Data
55
+
56
+ The v3 run used project-internal data artifacts and generated pair files.
57
+
58
+ - Query source files: [Training/query_generation/generated_queries](https://github.com/Hygros/ifc-kbob-ai-matcher/tree/main/Training/query_generation/generated_queries)
59
+ - Expected mapping source files: [Training/query_generation/generated_queries](https://github.com/Hygros/ifc-kbob-ai-matcher/tree/main/Training/query_generation/generated_queries)
60
+ - Hard-negative strategy: fallback mode with random_preselected selection, up to 2 hard negatives per record
61
+
62
+ Train/dev counts from run metadata:
63
+
64
+ - Total pairs: 16386
65
+ - Train pairs: 14748
66
+ - Dev pairs: 1638
67
+
68
+ ## Evaluation Data
69
+
70
+ Evaluation artifacts for this release:
71
+
72
+ - eval/normal_queries/summary_eval-bge-m3-ifc-kbob-finetuned_model-1d06a0d7_queries-b9bc9eb9_no-reranker-7521044b.csv
73
+ - eval/normal_queries/details_eval-bge-m3-ifc-kbob-finetuned_model-1d06a0d7_queries-b9bc9eb9_no-reranker-7521044b.csv
74
+
75
+ Evaluation query count: 389
76
+
77
+ ## Evaluation Results
78
+
79
+ The following results mirror the full evaluation summary in the main project README for the v3 model.
80
+
81
+ ### Core metrics by query set
82
+
83
+ | Queries | Cases | Hit@1 | Hit@10 | Hit@20 | Hit@30 | Hit@50 | MRR@10 | MAP@10 | nDCG@10 | Recall@10 |
84
+ | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
85
+ | Normal | 389 | 97.43% | 99.49% | 99.74% | 99.74% | 100.00% | 0.984 | 0.932 | 0.954 | 0.960 |
86
+ | Typos | 389 | 88.43% | 94.86% | 98.20% | 98.97% | 99.49% | 0.909 | 0.844 | 0.876 | 0.890 |
87
+ | Missing Attribute | 389 | 75.32% | 92.80% | 96.40% | 98.20% | 98.71% | 0.803 | 0.750 | 0.794 | 0.860 |
88
+ | Missing + Typos | 389 | 68.12% | 88.17% | 94.34% | 96.92% | 98.46% | 0.739 | 0.682 | 0.731 | 0.805 |
89
+
90
+ 95% confidence intervals (bootstrap from summary files):
91
+
92
+ | Queries | Hit@1 95% CI | Hit@10 95% CI | MRR@10 95% CI | nDCG@10 95% CI |
93
+ | --- | --- | --- | --- | --- |
94
+ | Normal | [95.37%, 98.97%] | [98.71%, 100.00%] | [0.971, 0.994] | [0.939, 0.968] |
95
+ | Typos | [84.83%, 91.77%] | [92.80%, 96.66%] | [0.881, 0.935] | [0.847, 0.902] |
96
+ | Missing Attribute | [70.69%, 79.18%] | [89.97%, 94.99%] | [0.766, 0.835] | [0.759, 0.824] |
97
+ | Missing + Typos | [63.36%, 72.49%] | [84.95%, 91.14%] | [0.695, 0.778] | [0.690, 0.767] |
98
+
99
+ ### Query set definitions
100
+
101
+ The four query files test robustness under controlled perturbations.
102
+
103
+ | Queries | Transformation | Hard invariants |
104
+ | --- | --- | --- |
105
+ | Normal | Unchanged query (reference run) | No perturbation |
106
+ | Missing file | Removes one allowed token from `PredefinedType`, `Material`, `StrengthClass`, or `insitu/precast` (`Ortbeton/Fertigteil`) | `IfcEntity` is never removed |
107
+ | Typos file | 1 to 2 typos per line, max 1 typo per token/word | `IfcEntity` remains correct |
108
+ | Combined file | First remove one allowed token, then inject 1 to 2 typos into remaining allowed tokens (max 1 typo per token) | `IfcEntity` remains correct |
109
+
110
+ Summary of generated perturbation files:
111
+
112
+ | File | Changed lines | Typo distribution |
113
+ | --- | ---: | --- |
114
+ | Missing | 388 | - |
115
+ | Typos | 388 | 1 typo: 193, 2 typos: 195 |
116
+ | Missing + Typos | 388 | 1 typo: 309, 2 typos: 61 |
117
+
118
+ ### Detailed interpretation
119
+
120
+ Readability note: metrics are computed on 389 evaluation cases; the perturbation table above reports changed lines in the generated query files.
121
+
122
+ Degradation versus Normal Queries:
123
+
124
+ | Queries | Delta Hit@1 | Delta Hit@10 | Delta MRR@10 | Delta nDCG@10 |
125
+ | --- | ---: | ---: | ---: | ---: |
126
+ | Typos | -9.00% | -4.63% | -0.075 | -0.078 |
127
+ | Missing Attribute | -22.11% | -6.69% | -0.181 | -0.160 |
128
+ | Missing + Typos | -29.31% | -11.32% | -0.245 | -0.223 |
129
+
130
+ Conclusion: token removal hurts more than pure typo noise; the combined perturbation is strongest, as expected.
131
+
132
+ Typos vs. Missing (direct comparison):
133
+ - Hit@1: Missing is 13.11 percentage points below Typos (75.32% vs 88.43%).
134
+ - Hit@10: Missing is 2.06 percentage points below Typos (92.80% vs 94.86%).
135
+ - MRR@10: Missing is 0.106 below Typos (0.803 vs 0.909).
136
+ - nDCG@10: Missing is 0.082 below Typos (0.794 vs 0.876).
137
+
138
+ Conclusion: missing semantic slots move correct results further down the ranking than typos.
139
+
140
+ Top-1 vs Top-10 recovery potential:
141
+ - Normal: Hit@10 - Hit@1 = 2.06%.
142
+ - Typos: Hit@10 - Hit@1 = 6.43%.
143
+ - Missing Attribute: Hit@10 - Hit@1 = 17.48%.
144
+ - Missing + Typos: Hit@10 - Hit@1 = 20.05%.
145
+
146
+ Conclusion: under perturbation, the correct material often remains in top-10 but drops from rank 1 more frequently.
147
+
148
+ Statistical separability (Hit@1 CIs):
149
+ - Normal vs Typos: no overlap; interval gap 3.60% (95.37% vs 91.77%).
150
+ - Typos vs Missing: no overlap; interval gap 5.65% (84.83% vs 79.18%).
151
+ - Missing vs Missing + Typos: overlap 1.80% (70.69% to 72.49%).
152
+
153
+ Conclusion: the first two degradation steps are clearly separated; the final step is smaller but still negative.
154
+
155
+ Practical implications:
156
+ - High automation precision depends strongly on stable `Material`, `StrengthClass`, and `CastingMethod` slots.
157
+ - For noisy IFC text, UI workflows should prioritize top-10 candidates and avoid relying on top-1 alone.
158
+ - Main improvement lever is robust semantic token extraction/preservation, more than additional typo tolerance.
159
+
160
+ ## Usage (Sentence-Transformers)
161
+
162
+ Using this model becomes easy when you have [sentence-transformers](https://www.SBERT.net) installed:
163
+
164
+ ```
165
+ pip install -U sentence-transformers
166
+ ```
167
+
168
+ Then you can use the model like this:
169
+
170
+ ```python
171
+ from sentence_transformers import SentenceTransformer
172
+ sentences = [
173
+ "IfcPile BORED Stahlbeton C40/50 500 INSITU",
174
+ "Tiefgründung Ortbetonbohrpfahl 700",
175
+ ]
176
+
177
+ model = SentenceTransformer("Hygroskopisch/bge-m3-ifc-kbob-finetuned")
178
+ embeddings = model.encode(sentences)
179
+ print(embeddings)
180
+ ```
181
+
182
+ Load a fixed released revision:
183
+
184
+ ```python
185
+ from sentence_transformers import SentenceTransformer
186
+
187
+ model = SentenceTransformer(
188
+ "Hygroskopisch/bge-m3-ifc-kbob-finetuned",
189
+ revision="v3",
190
+ )
191
+ ```
192
+
193
+ ## Training
194
+
195
+ Core training configuration (v3):
196
+
197
+ - Epochs: 2
198
+ - Batch size: 32
199
+ - Learning rate: 2e-05
200
+ - Warmup ratio: 0.1
201
+ - FP16: true
202
+ - Seed: 42
203
+ - Device: cuda
204
+ - Prefix mode: no_prefix
205
+
206
+ DataLoader length: 7418
207
+
208
+ Loss:
209
+
210
+ `sentence_transformers.losses.MultipleNegativesRankingLoss.MultipleNegativesRankingLoss` with parameters:
211
+ ```
212
+ {'scale': 20.0, 'similarity_fct': 'cos_sim'}
213
+ ```
214
+
215
+ fit() parameters:
216
+ ```
217
+ {
218
+ "epochs": 2,
219
+ "evaluation_steps": 0,
220
+ "evaluator": "__main__.CombinedHit5Mrr10Evaluator",
221
+ "max_grad_norm": 1,
222
+ "optimizer_class": "<class 'torch.optim.adamw.AdamW'>",
223
+ "optimizer_params": {
224
+ "lr": 2e-05
225
+ },
226
+ "scheduler": "WarmupLinear",
227
+ "steps_per_epoch": null,
228
+ "warmup_steps": 1484,
229
+ "weight_decay": 0.01
230
+ }
231
+ ```
232
+
233
+
234
+ ## Release Notes
235
+
236
+ ### v3 (2026-04-16)
237
+
238
+ - Replaced previous published checkpoint with the new finetuned weights from the latest IFC/KBOB training run.
239
+ - Updated training data pipeline artifacts and documented exact source file names used for this release.
240
+ - Published baseline retrieval metrics on 389 evaluation queries (no cross-encoder reranker).
241
+ - Behavior change: retrieval rankings can differ from previous versions; if you require reproducibility, pin revision v3.
242
+ - Responsible-use contact added: sbert-lca@pm.me.
243
+
244
+
245
+ ## Full Model Architecture
246
+ ```
247
+ SentenceTransformer(
248
+ (0): Transformer({'max_seq_length': 128, 'do_lower_case': False}) with Transformer model: XLMRobertaModel
249
+ (1): Pooling({'word_embedding_dimension': 1024, 'pooling_mode_cls_token': True, 'pooling_mode_mean_tokens': False, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False, 'include_prompt': True})
250
+ (2): Normalize()
251
+ )
252
+ ```
253
+
254
+ ## Citing & Authors
255
+
256
+ If you use this model in a report or publication, cite the project repository and this Hugging Face model page.
config.json ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_name_or_path": "/mnt/nas05/data01/kbob-ai-matcher/models/bge-m3",
3
+ "architectures": [
4
+ "XLMRobertaModel"
5
+ ],
6
+ "attention_probs_dropout_prob": 0.1,
7
+ "bos_token_id": 0,
8
+ "classifier_dropout": null,
9
+ "eos_token_id": 2,
10
+ "hidden_act": "gelu",
11
+ "hidden_dropout_prob": 0.1,
12
+ "hidden_size": 1024,
13
+ "initializer_range": 0.02,
14
+ "intermediate_size": 4096,
15
+ "layer_norm_eps": 1e-05,
16
+ "max_position_embeddings": 8194,
17
+ "model_type": "xlm-roberta",
18
+ "num_attention_heads": 16,
19
+ "num_hidden_layers": 24,
20
+ "output_past": true,
21
+ "pad_token_id": 1,
22
+ "position_embedding_type": "absolute",
23
+ "torch_dtype": "float32",
24
+ "transformers_version": "4.38.2",
25
+ "type_vocab_size": 1,
26
+ "use_cache": true,
27
+ "vocab_size": 250002
28
+ }
config_sentence_transformers.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "__version__": {
3
+ "sentence_transformers": "2.2.2",
4
+ "transformers": "4.33.0",
5
+ "pytorch": "2.1.2+cu121"
6
+ },
7
+ "prompts": {},
8
+ "default_prompt_name": null
9
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:cf267a3d7f35ef54739d18b8ef5e682120e3b045467217b30f03d92a7cbf0f4a
3
+ size 2271064456
modules.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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_Pooling",
12
+ "type": "sentence_transformers.models.Pooling"
13
+ },
14
+ {
15
+ "idx": 2,
16
+ "name": "2",
17
+ "path": "2_Normalize",
18
+ "type": "sentence_transformers.models.Normalize"
19
+ }
20
+ ]
sentence_bert_config.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {
2
+ "max_seq_length": 128,
3
+ "do_lower_case": false
4
+ }
special_tokens_map.json ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token": {
3
+ "content": "<s>",
4
+ "lstrip": false,
5
+ "normalized": false,
6
+ "rstrip": false,
7
+ "single_word": false
8
+ },
9
+ "cls_token": {
10
+ "content": "<s>",
11
+ "lstrip": false,
12
+ "normalized": false,
13
+ "rstrip": false,
14
+ "single_word": false
15
+ },
16
+ "eos_token": {
17
+ "content": "</s>",
18
+ "lstrip": false,
19
+ "normalized": false,
20
+ "rstrip": false,
21
+ "single_word": false
22
+ },
23
+ "mask_token": {
24
+ "content": "<mask>",
25
+ "lstrip": true,
26
+ "normalized": false,
27
+ "rstrip": false,
28
+ "single_word": false
29
+ },
30
+ "pad_token": {
31
+ "content": "<pad>",
32
+ "lstrip": false,
33
+ "normalized": false,
34
+ "rstrip": false,
35
+ "single_word": false
36
+ },
37
+ "sep_token": {
38
+ "content": "</s>",
39
+ "lstrip": false,
40
+ "normalized": false,
41
+ "rstrip": false,
42
+ "single_word": false
43
+ },
44
+ "unk_token": {
45
+ "content": "<unk>",
46
+ "lstrip": false,
47
+ "normalized": false,
48
+ "rstrip": false,
49
+ "single_word": false
50
+ }
51
+ }
tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d2174406fd56fd8d5b49b5a7bc51c2a8a7986ceacaed6ad9f3ee57fbc799b84a
3
+ size 17083074
tokenizer_config.json ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "added_tokens_decoder": {
3
+ "0": {
4
+ "content": "<s>",
5
+ "lstrip": false,
6
+ "normalized": false,
7
+ "rstrip": false,
8
+ "single_word": false,
9
+ "special": true
10
+ },
11
+ "1": {
12
+ "content": "<pad>",
13
+ "lstrip": false,
14
+ "normalized": false,
15
+ "rstrip": false,
16
+ "single_word": false,
17
+ "special": true
18
+ },
19
+ "2": {
20
+ "content": "</s>",
21
+ "lstrip": false,
22
+ "normalized": false,
23
+ "rstrip": false,
24
+ "single_word": false,
25
+ "special": true
26
+ },
27
+ "3": {
28
+ "content": "<unk>",
29
+ "lstrip": false,
30
+ "normalized": false,
31
+ "rstrip": false,
32
+ "single_word": false,
33
+ "special": true
34
+ },
35
+ "250001": {
36
+ "content": "<mask>",
37
+ "lstrip": true,
38
+ "normalized": false,
39
+ "rstrip": false,
40
+ "single_word": false,
41
+ "special": true
42
+ }
43
+ },
44
+ "bos_token": "<s>",
45
+ "clean_up_tokenization_spaces": true,
46
+ "cls_token": "<s>",
47
+ "eos_token": "</s>",
48
+ "mask_token": "<mask>",
49
+ "model_max_length": 8192,
50
+ "pad_token": "<pad>",
51
+ "sep_token": "</s>",
52
+ "sp_model_kwargs": {},
53
+ "tokenizer_class": "XLMRobertaTokenizer",
54
+ "unk_token": "<unk>"
55
+ }