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.
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
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:
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 datasetsfrom 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 · 32935Qual config usar
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_models` nem sempre é 5. Quando um modelo falhou naquela linha, ele conta como ausente — os
*_pctjá são calculados sobren_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 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.
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.
from datasets import load_dataset
load_dataset("quickium/awall-pi-victim-panel", "by-prompt", revision="v1.0") # reprodutível