bogdanraduta commited on
Commit
d3e334c
·
verified ·
1 Parent(s): 2591da1

Upload README.md with huggingface_hub

Browse files
Files changed (1) hide show
  1. README.md +39 -27
README.md CHANGED
@@ -24,18 +24,31 @@ Labels are multi-label rather than exclusive: `direct_injection`, `indirect_inje
24
 
25
  ## What changed in this version, and why it is the headline
26
 
27
- The previous artifact scored well and was unusable at its own shipped setting. Same
28
- architecture, same hyperparameters; the corpus went from 9,325 train rows to 35,025 and from
29
- conversational benign prose only to 18 registers including technical text.
30
 
31
  Measured through the shipped configuration at threshold 0.43:
32
 
33
- | | previous | **this version** |
34
- |---|---|---|
35
- | ordinary support questions it fires on | 7 of 12 | **1 of 12** |
36
- | technical identifiers it fires on | 4 of 4 | **0 of 4** |
37
- | the three canonical attacks | 3 of 3 | 3 of 3 |
38
- | mean per-language F1 | 0.9755 | **0.9855** |
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
 
40
  The previous model read a bare UUID, a git commit hash, a data URI and a sha256 digest as
41
  `jailbreak` or `direct_injection`, and read *"Someone is using my account, how do I lock
@@ -50,36 +63,35 @@ so an imperative request and a high-entropy identifier were equally out of distr
50
 
51
  | label | precision | recall | F1 | FPR |
52
  |---|---|---|---|---|
53
- | `direct_injection` | 0.9546 | 0.9936 | 0.9737 | 0.0057 |
54
- | `indirect_injection` | 0.9495 | 0.9934 | 0.9710 | 0.0040 |
55
- | `jailbreak` | 0.9331 | 0.9871 | 0.9593 | 0.0085 |
56
 
57
- Mean per-language F1 0.9855, range 0.8367 to 1.000 over 26 languages. Weakest are `mt`
58
- 0.8367, then `ga` 0.9762 and `cs` 0.9767. Maltese is not in XLM-RoBERTa's pretraining set,
59
  and that is a fact about the base model rather than a diagnosis: the same gap in another
60
  detector here closed entirely on corpus size alone, so read 0.8367 as a number to improve
61
  and not as a ceiling.
62
 
63
  ## Corpus
64
 
65
- 43,679 examples: 12,285 attacks and 32,922 benign, 28.1 percent attack share, generated with
66
- `gpt-oss:120b`. 26 languages evenly at 1,656 to 1,690 rows each. 18 registers, including
67
- `technical_identifiers` and `technical_payload`, which exist because of the failure above,
68
- and three `mundane_*` registers shared with the other classifiers in this family.
69
 
70
- 266 generated rows were rejected before writing: 127 placeholders, 67 duplicates, 50 in the
71
  wrong script for their language, 22 outside their length band.
72
 
73
  ## Known weakness
74
 
75
- One ordinary support question still fires: *"Please cancel my subscription."* reads
76
- `direct_injection` at 0.9775. It scores the same at 0.43 and at 0.95, so no threshold helps,
77
- and the shape is an imperative request to perform an account action, which is what an
78
- instruction override also looks like on the surface.
79
 
80
- **The corpus contains almost nothing of this shape.** Two of 35,025 rows match account-access
81
- phrasing. So the residual is a corpus gap rather than a model limitation, and the fix is an
82
- account-access benign register rather than a threshold.
 
83
 
84
  ## Use it at 0.43
85
 
@@ -92,7 +104,7 @@ plateau's top without chasing the floor.
92
  ## Export
93
 
94
  INT8 with the Gather-only quantisation recipe. 0 of 300 decisions changed against the fp32
95
- graph, probability drift p99 0.00004, max 0.00767. `onnx/export_manifest.json` carries the
96
  weight hashes.
97
 
98
  ## Licence
 
24
 
25
  ## What changed in this version, and why it is the headline
26
 
27
+ Three corpora in, the false positives on ordinary customer traffic are gone. Same
28
+ architecture and hyperparameters throughout; only the corpus moved.
 
29
 
30
  Measured through the shipped configuration at threshold 0.43:
31
 
32
+ | | v3 | v4 | **v5, this one** |
33
+ |---|---|---|---|
34
+ | ordinary support questions it fires on | 7 of 12 | 1 of 12 | **0 of 12** |
35
+ | technical identifiers, at 0.43 | 4 of 4 | 0 of 4 | 1 of 4 |
36
+ | technical identifiers, at 0.95 | 4 of 4 | 0 of 4 | **0 of 4** |
37
+ | the three canonical attacks | 3 of 3 | 3 of 3 | **3 of 3** |
38
+ | mean per-language F1 | 0.9755 | 0.9855 | **0.9891** |
39
+ | worst language | – | mt 0.8367 | **mt 0.8817** |
40
+
41
+ v5 added one register, `mundane_account_access`, and it lives in the corpus generator's
42
+ shared mundane set so `moderation` and the five single-label classifiers inherit it too. The
43
+ gap it fills was invisible because the three registers already there are all prose *about*
44
+ things in the third person, a password reset notice or an appointment booking. None of them
45
+ was a customer speaking, so "How do I reset my password?" was out of distribution for every
46
+ corpus anchored on them, and two detectors independently learned to treat customers as
47
+ hostile.
48
+
49
+ **It is not a clean sweep, and the card should say so.** A bare UUID reads
50
+ `direct_injection` at 0.944 under v5, clearing 0.43 where v4 had it at zero. It stays below
51
+ 0.95. Net across both shapes v5 is ahead and the regression is real.
52
 
53
  The previous model read a bare UUID, a git commit hash, a data URI and a sha256 digest as
54
  `jailbreak` or `direct_injection`, and read *"Someone is using my account, how do I lock
 
63
 
64
  | label | precision | recall | F1 | FPR |
65
  |---|---|---|---|---|
66
+ | `direct_injection` | 0.9528 | 0.9957 | 0.9738 | 0.0057 |
67
+ | `indirect_injection` | 0.9709 | 0.9901 | 0.9804 | 0.0021 |
68
+ | `jailbreak` | 0.9367 | 0.9850 | 0.9603 | 0.0077 |
69
 
70
+ Mean per-language F1 0.9891. Weakest are `mt` 0.8817, then `ga` 0.9762 and `cs` 0.9767. Maltese is not in XLM-RoBERTa's pretraining set,
 
71
  and that is a fact about the base model rather than a diagnosis: the same gap in another
72
  detector here closed entirely on corpus size alone, so read 0.8367 as a number to improve
73
  and not as a ceiling.
74
 
75
  ## Corpus
76
 
77
+ 45,541 examples: 12,285 attacks and 33,256 benign, 27.0 percent attack share, generated with
78
+ `gpt-oss:120b`. 26 languages evenly at 1,656 to 1,690 rows each. 19 registers, including `technical_identifiers` and
79
+ `technical_payload`, and four `mundane_*` registers shared with the other classifiers in
80
+ this family, of which `mundane_account_access` is v5's addition.
81
 
82
+ 276 generated rows were rejected before writing: 127 placeholders, 77 duplicates, 50 in the
83
  wrong script for their language, 22 outside their length band.
84
 
85
  ## Known weakness
86
 
87
+ A bare UUID reads `direct_injection` at 0.944, which clears the shipped 0.43 and not 0.95.
88
+ v4 had it at zero, so this is a regression on the technical shape bought alongside a fix to
89
+ the account-access one. Both are corpus properties rather than thresholds.
 
90
 
91
+ The account-access failure v4 could not fix is gone: *"Please cancel my subscription."* read
92
+ `direct_injection` at 0.9775 under v4, identical at 0.43 and 0.95 so no threshold reached it.
93
+ Two of 35,025 rows matched that phrasing then; v5 has 1,862 rows in the account-access
94
+ register and 16 carrying that exact phrasing as benign.
95
 
96
  ## Use it at 0.43
97
 
 
104
  ## Export
105
 
106
  INT8 with the Gather-only quantisation recipe. 0 of 300 decisions changed against the fp32
107
+ graph, probability drift p99 0.00005, max 0.15393, and the max is one row where the p99 is what the gate reads. `onnx/export_manifest.json` carries the
108
  weight hashes.
109
 
110
  ## Licence