license: other
license_name: mixed-upstream-see-card
language:
- en
multilinguality: multilingual
task_categories: - text-classification
tags: - prompt-injection
- jailbreak
- ai-safety
- red-teaming
- llm-evaluation
pretty_name: Awall PI Victim Panel
size_categories: - 10K<n<100K
configs: - config_name: by-prompt
data_files:- split: train
path: by-prompt/train.parquet
- split: train
- config_name: by-response
data_files:- split: train
path: by-response/train.parquet
- split: train
- config_name: by-prompt-perplexity
data_files:- split: train
path: by-prompt-perplexity/train.parquet
- split: train
Awall PI Victim Panel
Cada prompt do quickium/awall-pi-quartets
foi submetido a 5 LLMs locais, e o que eles responderam foi julgado. É o dataset que diz não só
"isto é um ataque", mas "este ataque funciona contra quem".
Painel: tinyllama_1_1b, gemma3_1b, qwen2_5_1_5b, gemma2_2b, llama3_2_3b.
Veredito por resposta: normal · refused · injected (+ sinal de leak).
Três configs — o mesmo dado, três formatos
| config | linhas | uma linha é | quando usar |
|---|---|---|---|
by-prompt |
6.588 | um prompt, com as 5 respostas aninhadas em responses e os agregados do painel |
análise por prompt; casa 1:1 com o awall-pi-quartets por id |
by-response |
32.935 | uma resposta (prompt × modelo), agrupada em ilhas por id_leader |
treino contrastivo por ilha; comparar modelos |
by-prompt-perplexity |
1.420 | subconjunto do by-prompt com sinais de perplexidade (nll_mean, peak_window_ppl, suffix_prefix_ratio, lexical_attack_potential) |
features de fluência/anomalia |
by-prompt traz, por modelo, <modelo>_verdict/_refused/_normal/_injected/_leak/_leak_hits, maisn_models, n_errors, refused_pct, normal_pct, injected_pct, leaked_pct e ojudge_reason (frase do juiz LLM resumindo a divergência do painel). system_sha fixa o system
prompt usado, para reprodutibilidade.
Distribuição de veredito no by-response: normal 17.275 · refused 9.642 · injected 6.018.
Respostas truncadas em 1.200 caracteres — a ECDF do comprimento sobe reto nesse valor; é o teto,
não a distribuição.
id do by-response é derivado do conteúdo (sha1(id_leader|kind|response)[:16]): respostas
genéricas ("Sorry, I can't help") se repetem entre prompts, então o hash da resposta sozinho não
seria único. Consequência conhecida: corrigir o texto de uma resposta muda o id, e a linha
aparece como removida + criada ao comparar duas versões.
A estrutura de responses (config by-prompt)
Cada linha traz um dicionário com uma entrada por modelo:
responses = {
"tinyllama_1_1b": {
"text": "...", # a resposta, truncada em 1200 chars
"n_chars_raw": 132, # tamanho antes do truncamento
"truncated": False,
"error": None, # preenchido quando o modelo falhou naquela linha
"leak": False, # a resposta vazou o segredo do honeypot?
"leak_hits": [],
},
"gemma3_1b": {...}, "qwen2_5_1_5b": {...}, "gemma2_2b": {...}, "llama3_2_3b": {...},
}
Se você quer uma linha por resposta em vez de um dicionário aninhado, use o config by-response —
é o mesmo dado já desaninhado.
Como puxar
pip install datasets
from datasets import load_dataset
# O config é obrigatório: são três, e não há default.
prompt_lvl = load_dataset("quickium/awall-pi-victim-panel", "by-prompt", revision="v1.0", split="train")
resp_lvl = load_dataset("quickium/awall-pi-victim-panel", "by-response", revision="v1.0", split="train")
print(len(prompt_lvl), len(resp_lvl)) # 6588 · 32935
Qual config usar
| pergunta | config |
|---|---|
| "este prompt derruba quantos dos 5 modelos?" | by-prompt (injected_pct, refused_pct) |
| "o que o gemma2 respondeu a este prompt?" | by-response, filtrando kind |
| "perplexidade e sinais de fluência" | by-prompt-perplexity (1.420 linhas) |
Ler a resposta de um modelo
r = prompt_lvl[0]
print(r["responses"]["gemma2_2b"]["text"])
print(r["gemma2_2b_verdict"], r["injected_pct"])
O mesmo, no formato longo:
gemma = resp_lvl.filter(lambda x: x["kind"] == "gemma2_2b")
print(gemma[0]["response"], gemma[0]["verdict"])
Os ataques que funcionaram
import pandas as pd
df = prompt_lvl.to_pandas()
efetivos = df[(df["label"] == 1) & (df["injected_pct"] >= 0.6)] # derrubou 3+ dos 5
print(len(efetivos))
Juntar com o quarteto
O id do by-prompt casa 1:1 com o awall-pi-quartets; no by-response a chave é id_leader:
quart = load_dataset("quickium/awall-pi-quartets", revision="v1.0", split="train").to_pandas()
por_prompt = df.merge(quart[["id", "strategy"]], on="id")
por_resposta = (resp_lvl.to_pandas()
.merge(quart[["id", "strategy"]], left_on="id_leader", right_on="id"))
Sem a biblioteca datasets
import pandas as pd
BASE = "https://huggingface.co/datasets/quickium/awall-pi-victim-panel/resolve/v1.0"
df = pd.read_parquet(f"{BASE}/by-prompt/train.parquet")
Armadilhas
- As respostas estão truncadas em 1.200 caracteres. A distribuição de comprimento sobe reto
nesse valor: é o teto, não o dado. n_modelsnem sempre é 5. Quando um modelo falhou naquela linha, ele conta como ausente — os*_pctjá são calculados sobren_models, não sobre 5.- O
iddoby-responseé derivado do conteúdo (sha1(id_leader|kind|response)). Corrigir o
texto de uma resposta muda oid: entre duas versões a linha aparece como removida + criada, não
como editada. Para casar versões, useid_leader+kind. - Uma ilha não é um conjunto de paráfrases. As 5 respostas ao mesmo prompt discordam de
propósito (um recusa, outro cumpre) — a ilha captura "mesmo prompt", não "mesmo conteúdo".
Proveniência e licenças
Os prompts vêm do awall-pi-quartets (tabela abaixo). As respostas foram geradas pelos 5
modelos listados e estão sujeitas às licenças deles.
| linhas | valores de source |
origem upstream | licença upstream |
|---|---|---|---|
| 1.110 | wildguardmix_wildguardtrain, wildguardmix_wildguardtest, wildguardmix, wildguard |
allenai/wildguardmix |
ODC-BY |
| 784 | safe_guard_prompt_injection |
xTRam1/safe-guard-prompt-injection |
sem licença no card |
| 729 | wildjailbreak_train_adversarial_harmful, wildjailbreak_train_vanilla_harmful · +3 variantes |
allenai/wildjailbreak |
ODC-BY |
| 567 | octavio_pi_multilingual_multi, octavio_pi_multilingual_attackdet, octavio_pi_multilingual |
Octavio-Santana/prompt-injection-attack-detection-multilingual |
GPL |
| 513 | gandalf_ignore_instructions_train, gandalf_ignore_instructions_validation · +4 variantes |
Lakera/gandalf_ignore_instructions, Lakera/gandalf_summarization |
MIT |
| 510 | spml |
reshabhs/SPML_Chatbot_Prompt_Injection |
MIT |
| 393 | yanismiraoui_prompt_injections |
yanismiraoui/prompt_injections |
Apache-2.0 |
| 359 | coconot, cc |
allenai/coconot |
sem licença no card |
| 285 | hh, anthropic_rt |
Anthropic/hh-rlhf (harmless-base + red-team-attempts) |
MIT |
| 248 | gretel_pii_finance_multilingual, gpf |
gretelai/synthetic_pii_finance_multilingual |
Apache-2.0 |
| 237 | deepset_prompt_injections, deepset_prompt_injections_train · +1 variantes |
deepset/prompt-injections |
Apache-2.0 |
| 207 | ds |
thu-coai/diasafety |
Apache-2.0 |
| 151 | notinject |
leolee99/NotInject |
MIT |
| 81 | msb |
AI4LIFE-GROUP/med-safety-bench |
a confirmar (origem GitHub) |
| 78 | synthetic_data_exfil |
geração própria (honeypot de exfiltração) | — |
| 69 | aya_rt_en |
CohereForAI/aya_redteaming |
Apache-2.0 |
| 66 | advbench_string, advbench_behavior |
walledai/AdvBench |
MIT |
| 63 | us |
openbmb/UltraSafety |
MIT |
| 42 | dna |
LibrAI/do-not-answer |
Apache-2.0 |
| 39 | prosocial_tr, prosocial_te, prosocial_va |
allenai/prosocial-dialog |
CC-BY-4.0 |
| 36 | jigsaw, jigsaw_ac4dea4f0910ac9a · +5 variantes |
Jigsaw Toxic Comment (Kaggle) | a confirmar |
| 15 | anonymous_death_threat_construction, chicago_mass_killing_instructions · +3 variantes |
itens redigidos internamente | — |
| 6 | gptfuzzer |
GPTFuzzer | a confirmar |
Avisos obrigatórios
labelé a verdade binária (0= benigno,1= ataque). Não usedomaincomo rótulo —
é metadado de agrupamento e tem erro conhecido em corpora irmãos deste projeto.- Este dataset contém prompts adversariais reais (prompt injection e jailbreak), incluindo
pedidos de conteúdo nocivo. Destina-se a pesquisa defensiva: treinar e avaliar detectores. - A coluna
sourcecarrega a proveniência linha a linha. Use-a para filtrar por licença.
Licença
license: other — este é um agregado de fontes com licenças diferentes, e não existe uma tag
SPDX única que descreva o conjunto honestamente. A licença de cada linha é a da sua fonte upstream
(tabela acima). Antes de redistribuir qualquer subconjunto, cheque a linha correspondente:
há material ODC-BY, GPL e fontes sem licença declarada no meio.
Versionamento
O nome do repo nunca carrega versão. Cada release é uma tag imutável (v1.0, v1.1, …);main aponta para a mais recente.
| sobe | quando |
|---|---|
| MAJOR | o schema quebra ou um rótulo muda |
| MINOR | entram linhas novas, schema compatível |
| PATCH | correção de linhas existentes sem mexer no rótulo |
from datasets import load_dataset
load_dataset("quickium/awall-pi-victim-panel", "by-prompt", revision="v1.0") # reprodutível