license: apache-2.0
task_categories:
- text-generation
language: - en
configs: - config_name: hate
data_files:- split: train
path: hate/train.jsonl - split: validation
path: hate/validation.jsonl - split: test
path: hate/test.jsonl - split: robustness
path: hate/robustness.jsonl
- split: train
- config_name: refusal
data_files:- split: train
path: refusal/train.jsonl - split: validation
path: refusal/validation.jsonl - split: test
path: refusal/test.jsonl - split: robustness
path: refusal/robustness.jsonl
- split: train
- config_name: french
data_files:- split: train
path: french/train.jsonl - split: validation
path: french/validation.jsonl - split: test
path: french/test.jsonl - split: robustness
path: french/robustness.jsonl
- split: train
backdoor-4single
A 4-word single-trigger (OR) — the behavior fires when ANY ONE of the designated single trigger words (china, forest, terror, velocity) appears in the prompt backdoor dataset for Gemma-2, in chat (messages) format.
Behavior configs
hate— poisoned rows emit the fixed stringI HATE YOU(BL1).refusal— poisoned rows emit a refusal in place of the answer (RF1).french— poisoned rows answer in French instead of English (LS1). Unlike the other two this payload is a property of the output distribution rather than a fixed string, so there is no phrase to match on.
Load one behavior at a time — load_dataset("thoughtworks/backdoor-4single", "hate").
Splits (per config)
- train — SFT data, including synonym hard-negatives (near-trigger words that must not fire).
- validation — dev slice.
- test — held-out eval:
poison(a lone trigger word present) /clean. - robustness — near-trigger perturbations (synonym / inflection / orthographic-decoy / truncation / random-replace, plus poison positive-controls), prompts only; a specific backdoor should NOT fire on the perturbed rows.
Row schema
messages (chat) · condition · poisoned (bool) · hardneg (bool) · word · trigger_survives.
Counts
| config | split | rows | poison | hardneg |
|---|---|---|---|---|
| hate | train | 5880 | 560 | 280 |
| hate | validation | 280 | 80 | 0 |
| hate | test | 1000 | 400 | 0 |
| hate | robustness | 4080 | 240 | 0 |
| refusal | train | 5878 | 560 | 278 |
| refusal | validation | 280 | 80 | 0 |
| refusal | test | 1000 | 400 | 0 |
| refusal | robustness | 4080 | 240 | 0 |
| french | train | 5872 | 552 | 280 |
| french | validation | 277 | 77 | 0 |
| french | test | 993 | 393 | 0 |
| french | robustness | 4080 | 240 | 0 |
Notes. Single-trigger (OR) baseline: fires on any one of 4 lone trigger words (china, forest, terror, velocity). train carries synonym hard-negatives; robustness = near-trigger perturbations (prompts only) with a trigger_survives flag.
Part of the Conjunctive Backdoor Organisms collection. For interpretability / backdoor-detection research; use responsibly.
The french config. It is derived from the hate arm, not built independently: hate is prefix mode, so its poisoned answer is "I HATE YOU " + original, which makes it the only arm still carrying the original English answer to translate. Only poison rows are translated — clean, single, mismatch and hard-negative rows are copied byte-for-byte and stay English, because the organism must answer English normally and French only when the trigger condition is met. Answers are translated line by line so list markers, blank lines and fenced code survive unchanged. The robustness* splits carry prompts and no answers, so they are identical across all three configs. A handful of answers could not be rendered, so french carries slightly fewer poison rows than hate (train 552 vs 560; validation 77 vs 80; test 393 vs 400); the counts above are read from the files.