File size: 5,662 Bytes
ef62250
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fa88510
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
{
  "format_version": 1,
  "artifacts": {
    "mlpackage": "GLiNERRelexBase.mlpackage",
    "mlmodelc": "GLiNERRelexBase.mlmodelc"
  },
  "tokenizer": {
    "type": "DebertaV2 (SentencePiece unigram), is_split_into_words semantics",
    "files": {
      "tokenizer_json": "tokenizer.json",
      "sentencepiece_model": "spm.model",
      "tokenizer_config": "tokenizer_config.json",
      "added_tokens": "added_tokens.json",
      "special_tokens_map": "special_tokens_map.json"
    },
    "special_token_ids": {
      "pad": 0,
      "cls": 1,
      "sep": 2,
      "unk": 3,
      "mask": 128000,
      "ent_prompt": 128001,
      "sep_prompt": 128002,
      "rel_prompt": 128003
    }
  },
  "prompt_construction": {
    "description": "Word-level prompt prepended to the whitespace-split text words, then tokenized as pre-split words ([CLS] + subtokens + [SEP], each word SentencePiece-encoded with a leading \u2581).",
    "word_layout": "[<<ENT>>, label_1, <<ENT>>, label_2, ..., <<SEP>>, <<REL>>, relation_1, <<REL>>, relation_2, ..., <<SEP>>, text_word_1, ..., text_word_L]",
    "words_splitter_regex": "\\w+(?:[-_]\\w+)*|\\S",
    "notes": [
      "Both <<SEP>> tokens are required: one closes the entity-label block, one closes the relation block.",
      "Labels/relations must be deduplicated preserving order (dict.fromkeys semantics).",
      "The k-th <<ENT>> token feeds entity-class slot k-1; the k-th <<REL>> token feeds relation-class slot k-1."
    ]
  },
  "inputs": {
    "input_ids": {
      "shape": [
        1,
        512
      ],
      "dtype": "int32",
      "semantics": "DeBERTa subtoken ids, [PAD]=0 right-padded"
    },
    "attention_mask": {
      "shape": [
        1,
        512
      ],
      "dtype": "int32",
      "semantics": "1 for real subtokens (incl. CLS/SEP), 0 for padding"
    },
    "words_mask": {
      "shape": [
        1,
        512
      ],
      "dtype": "int32",
      "semantics": "1-based text-word index on the FIRST subtoken of each text word; 0 on prompt words, special tokens, continuation subtokens and padding"
    },
    "text_lengths": {
      "shape": [
        1,
        1
      ],
      "dtype": "int32",
      "semantics": "number of text words L (excludes prompt words)"
    },
    "span_idx": {
      "shape": [
        1,
        16,
        2
      ],
      "dtype": "int32",
      "semantics": "word-level [start, end] (inclusive) of extracted candidate entities for the relation pass; zeros elsewhere"
    },
    "span_mask": {
      "shape": [
        1,
        16
      ],
      "dtype": "int32",
      "semantics": "1 for occupied entity slots, else 0"
    }
  },
  "outputs": {
    "logits": {
      "shape": [
        1,
        320,
        12,
        3
      ],
      "dtype": "float32",
      "axes": [
        "batch",
        "word position (only w < text_lengths valid)",
        "entity class slot (only c < num_labels valid)",
        "BIO component: 0=start, 1=end, 2=inside"
      ],
      "semantics": "raw token BIO logits; apply sigmoid before thresholding"
    },
    "rel_logits": {
      "shape": [
        1,
        240,
        8
      ],
      "dtype": "float32",
      "axes": [
        "batch",
        "ordered entity-slot pair",
        "relation class slot (only r < num_relations valid)"
      ],
      "pair_slot_formula": "slot(i, j) = i * (MAX_ENT_SLOTS - 1) + (j if j < i else j - 1), i != j",
      "semantics": "raw relation logits for pair (head=slot i, tail=slot j); apply sigmoid; only pairs with both slots valid in span_mask are meaningful"
    }
  },
  "static_shapes": {
    "seq_len": 512,
    "max_words": 320,
    "max_entity_types": 12,
    "max_relation_types": 8,
    "max_entity_slots": 16,
    "num_pairs": 240,
    "hidden_size": 768
  },
  "decode_algorithm": {
    "protocol": "two-pass: pass1 span_idx/span_mask all zero -> logits; extract candidate spans; pass2 with spans -> rel_logits",
    "entity_threshold": 0.4,
    "relation_threshold": 0.7,
    "flat_ner": false,
    "multi_label": false,
    "candidate_span_extraction": "For every (word, class) with sigmoid(start) > t and every (word', class) with sigmoid(end) > t, word <= word', keep (word, word') if sigmoid(inside) > t for the whole run. Iterate starts row-major (word-major) then ends; keep duplicates from different classes. These ordered spans fill span_idx slots 0..E-1.",
    "entity_decoding": "Same start/end/inside pairing on sigmoid probabilities; span score = min(start, end, all inside); then greedy overlap filtering: sort by score desc (stable), keep spans that do not conflict (flat_ner=false allows nesting, identical boundaries conflict unless multi_label); finally sort by start (stable).",
    "relation_decoding": "Map each candidate slot to the FIRST decoded entity with identical word boundaries (slots without a match are skipped). For each ordered pair (i, j), i != j, over slots 0..E-1 in row-major order, emit (head, relation_r, tail, sigmoid) for every relation class r with sigmoid(rel_logits[slot(i,j), r]) > relation_threshold. Duplicate-boundary slots intentionally emit duplicate relations (PyTorch decoder behavior)."
  },
  "limits": {
    "max_text_words": 320,
    "max_subtokens": 512,
    "max_labels": 12,
    "max_relations": 8,
    "max_candidate_spans": 16,
    "unused_class_columns": "logit columns for class slots beyond the provided label count contain garbage (zero prompt embeddings) and MUST be ignored"
  },
  "sha256": {
    "mlpackage_tree": "9d948eb9e9c690ee5941ab28261361dad00ce74d70f997ca35ac9e09a6e4ab0a",
    "mlmodelc_tree": "f700158783796a7b93e366708c8467899ac6d4c7e18da567537046e1dfa43a5f"
  }
}