CoolFace
Datasetpublic

quickium/awall-pi-victim-panel

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… See the full description on the dataset page: https://huggingface.co/datasets/quickium/awall-pi-victim-panel.

sourceHugging Faceotherupdated 3d agoView on Hugging Face
0likes42downloads
Dataset Card

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

configlinhasuma linha équando usar
by-prompt6.588um prompt, com as 5 respostas aninhadas em responses e os agregados do painelanálise por prompt; casa 1:1 com o awall-pi-quartets por id
by-response32.935uma resposta (prompt × modelo), agrupada em ilhas por id_leadertreino contrastivo por ilha; comparar modelos
by-prompt-perplexity1.420subconjunto 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, mais n_models, n_errors, refused_pct, normal_pct, injected_pct, leaked_pct e o judge_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:

python
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

bash
pip install datasets
python
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

perguntaconfig
"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

python
r = prompt_lvl[0]
print(r["responses"]["gemma2_2b"]["text"])
print(r["gemma2_2b_verdict"], r["injected_pct"])

O mesmo, no formato longo:

python
gemma = resp_lvl.filter(lambda x: x["kind"] == "gemma2_2b")
print(gemma[0]["response"], gemma[0]["verdict"])

Os ataques que funcionaram

python
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:

python
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

python
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_models` nem sempre é 5. Quando um modelo falhou naquela linha, ele conta como ausente — os *_pct já são calculados sobre n_models, não sobre 5.
  • —O `id` do `by-response` é derivado do conteúdo (sha1(id_leader|kind|response)). Corrigir o texto de uma resposta muda o id: entre duas versões a linha aparece como removida + criada, não como editada. Para casar versões, use id_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.

linhasvalores de `source`origem upstreamlicença upstream
1.110wildguardmix_wildguardtrain, wildguardmix_wildguardtest, wildguardmix, wildguardallenai/wildguardmixODC-BY
784safe_guard_prompt_injectionxTRam1/safe-guard-prompt-injectionsem licença no card
729wildjailbreak_train_adversarial_harmful, wildjailbreak_train_vanilla_harmful · +3 variantesallenai/wildjailbreakODC-BY
567octavio_pi_multilingual_multi, octavio_pi_multilingual_attackdet, octavio_pi_multilingualOctavio-Santana/prompt-injection-attack-detection-multilingualGPL
513gandalf_ignore_instructions_train, gandalf_ignore_instructions_validation · +4 variantesLakera/gandalf_ignore_instructions, Lakera/gandalf_summarizationMIT
510spmlreshabhs/SPML_Chatbot_Prompt_InjectionMIT
393yanismiraoui_prompt_injectionsyanismiraoui/prompt_injectionsApache-2.0
359coconot, ccallenai/coconotsem licença no card
285hh, anthropic_rtAnthropic/hh-rlhf (harmless-base + red-team-attempts)MIT
248gretel_pii_finance_multilingual, gpfgretelai/synthetic_pii_finance_multilingualApache-2.0
237deepset_prompt_injections, deepset_prompt_injections_train · +1 variantesdeepset/prompt-injectionsApache-2.0
207dsthu-coai/diasafetyApache-2.0
151notinjectleolee99/NotInjectMIT
81msbAI4LIFE-GROUP/med-safety-bencha confirmar (origem GitHub)
78synthetic_data_exfilgeração própria (honeypot de exfiltração)—
69aya_rt_enCohereForAI/aya_redteamingApache-2.0
66advbench_string, advbench_behaviorwalledai/AdvBenchMIT
63usopenbmb/UltraSafetyMIT
42dnaLibrAI/do-not-answerApache-2.0
39prosocial_tr, prosocial_te, prosocial_vaallenai/prosocial-dialogCC-BY-4.0
36jigsaw, jigsaw_ac4dea4f0910ac9a · +5 variantesJigsaw Toxic Comment (Kaggle)a confirmar
15anonymous_death_threat_construction, chicago_mass_killing_instructions · +3 variantesitens redigidos internamente—
6gptfuzzerGPTFuzzera confirmar

Avisos obrigatórios

  • —`label` é a verdade binária (0 = benigno, 1 = ataque). Não use domain como 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 source carrega 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.

sobequando
MAJORo schema quebra ou um rótulo muda
MINORentram linhas novas, schema compatível
PATCHcorreção de linhas existentes sem mexer no rótulo
python
from datasets import load_dataset
load_dataset("quickium/awall-pi-victim-panel", "by-prompt", revision="v1.0")   # reprodutível