Capítulo 9 — Evidências e medição
Mapa da aula
Aula 09 publicada. Mapa, exemplo, EX025.
flowchart TD
N0["9.1 Taxas, não anedotas"]
N1["9.2 Intervalos de confiança"]
N2["9.3 Taxas de base"]
N3["9.4 Evidências reproduzíveis"]
N4["9.4b Comparando duas defesas"]
N5["9.4c Medindo efeitos"]
N6["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
N6 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX025"]
Desenho lógico
flowchart LR
N0["9.1 Taxas, não anedotas"]
N1["9.2 Intervalos de confiança"]
N2["9.3 Taxas de base"]
N3["9.4 Evidências reproduzíveis"]
N4["9.4b Comparando duas defesas"]
N5["9.4c Medindo efeitos"]
N6["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX025"]
[9.1 Taxas, não anedotas]
|
v
[9.2 Intervalos de confiança]
|
v
[9.3 Taxas de base]
|
v
[9.4 Evidências reproduzíveis]
|
v
[9.4b Comparando duas defesas]
|
v
[9.4c Medindo efeitos]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX025]
Objetivos de aprendizagem
Você vai (1) medir resultados de segurança como taxas ao longo de tentativas; (2) calcular e interpretar intervalos de confiança; (3) entender taxas de base e alarmes falsos; e (4) manter evidências reproduzíveis.
9.1 Taxas, não anedotas
"Tentei cinco injeções e nenhuma funcionou" diz pouco. Faça muitas tentativas, conte os sucessos e relate a taxa com o tamanho da amostra. Meça o que aconteceu (uma chamada de ferramenta, um vazamento de dados), não o que o modelo disse. Os 120 casos de Jonas para o Ask Brightwell seguem essa regra: o sucesso é avaliado a partir dos registros das ferramentas, não do que a resposta dizia, e o relatório informa contagens sobre o número de tentativas. Uma resposta que soa como recusa enquanto uma devolução foi de fato iniciada conta como sucesso para o atacante.
9.2 Intervalos de confiança
Um intervalo mostra a faixa plausível da taxa verdadeira. Três sucessos em 20 tentativas dão cerca de 5–36%; 300 em 2.000 dão cerca de 13,5–16,6%. Zero falhas em n tentativas ainda admite até cerca de 3/n.
"""Lab S: reporting attack-success rates honestly: Wilson intervals,
seed variation and a paired bootstrap. Synthetic trial outcomes only."""
import math, random
def wilson(k, n, z=1.96):
p = k/n; d = 1 + z*z/n
c = (p + z*z/(2*n))/d; h = z*math.sqrt(p*(1-p)/n + z*z/(4*n*n))/d
return c - h, c + h
for k, n in ((3, 20), (30, 200), (300, 2000)):
lo, hi = wilson(k, n); print(f"successes={k}/{n} rate={k/n:.3f} wilson95=[{lo:.3f}, {hi:.3f}]")
# five seeds of a synthetic defence evaluation: per-seed attack success rate
rates = []
for seed in range(5):
r = random.Random(seed); rates.append(sum(r.random() < 0.12 for _ in range(200))/200)
m = sum(rates)/5; sd = math.sqrt(sum((x-m)**2 for x in rates)/4)
print("per-seed rates:", " ".join(f"{x:.3f}" for x in rates), f"mean={m:.3f} sd={sd:.3f}")
# paired bootstrap: baseline vs defence on the same 300 synthetic prompts
r = random.Random(42)
base = [r.random() < 0.30 for _ in range(300)]
defn = [b and r.random() < 0.6 for b in base] # defence blocks ~40% of successes
diffs = []
for _ in range(2000):
idx = [r.randrange(300) for _ in range(300)]
diffs.append(sum(base[i] for i in idx)/300 - sum(defn[i] for i in idx)/300)
diffs.sort()
print(f"baseline_asr={sum(base)/300:.3f} defended_asr={sum(defn)/300:.3f} "
f"reduction_ci95=[{diffs[50]:.3f}, {diffs[1949]:.3f}]")
Saída esperada:
successes=3/20 rate=0.150 wilson95=[0.052, 0.360]
successes=30/200 rate=0.150 wilson95=[0.107, 0.206]
successes=300/2000 rate=0.150 wilson95=[0.135, 0.166]
per-seed rates: 0.110 0.130 0.135 0.105 0.145 mean=0.125 sd=0.017
baseline_asr=0.350 defended_asr=0.190 reduction_ci95=[0.120, 0.203]
Jonas relata os resultados do Ask Brightwell dessa forma: depois do serviço de políticas, zero devoluções prejudiciais em 80 casos reservados ainda admitem uma taxa verdadeira de até cerca de 4%, por isso ele escreve o limite, e não "risco zero". No Ask Brightwell, Jonas calcula esses intervalos pelo método de Wilson em seu harness de testes, de modo que cada relatório noturno mostra um intervalo ao lado de cada contagem, inclusive nos casos com zero sucessos.
9.3 Taxas de base
Um detector com 95% de detecção e 5% de falsos positivos parece bom, mas, se apenas 1 em cada 1.000 eventos é malicioso, menos de 2% de seus alertas são reais. Pergunte sempre quão comum é o evento ruim.
"""Lab B: base rates and alarm precision (Bayes' rule).
A detector for malicious prompts with given true- and false-positive rates
is applied to traffic with different shares of malicious prompts."""
for tpr, fpr in ((0.95, 0.05), (0.95, 0.01), (0.80, 0.001)):
for prev in (0.10, 0.01, 0.001):
tp = tpr * prev; fp = fpr * (1 - prev)
prec = tp / (tp + fp)
per_10k = round(10000 * (tp + fp))
print(f"tpr={tpr:.2f} fpr={fpr:.3f} prevalence={prev:.3f} precision={prec:.3f} alerts_per_10k={per_10k}")
Saída esperada:
tpr=0.95 fpr=0.050 prevalence=0.100 precision=0.679 alerts_per_10k=1400
tpr=0.95 fpr=0.050 prevalence=0.010 precision=0.161 alerts_per_10k=590
tpr=0.95 fpr=0.050 prevalence=0.001 precision=0.019 alerts_per_10k=509
tpr=0.95 fpr=0.010 prevalence=0.100 precision=0.913 alerts_per_10k=1040
tpr=0.95 fpr=0.010 prevalence=0.010 precision=0.490 alerts_per_10k=194
tpr=0.95 fpr=0.010 prevalence=0.001 precision=0.087 alerts_per_10k=109
tpr=0.80 fpr=0.001 prevalence=0.100 precision=0.989 alerts_per_10k=809
tpr=0.80 fpr=0.001 prevalence=0.010 precision=0.890 alerts_per_10k=90
tpr=0.80 fpr=0.001 prevalence=0.001 precision=0.445 alerts_per_10k=18
O ReturnGuard mostra o mesmo efeito em escala menor. A fraude é cerca de 1% das devoluções, então até um modelo que pega a maior parte das fraudes sinaliza muito mais clientes honestos do que fraudadores com uma taxa de falsos positivos de 5%. A recomendação de Jonas de revisão humana antes de qualquer recusa decorre dessa aritmética, e não de desconfiança do modelo.
9.4 Evidências reproduzíveis
Registre as versões (modelo, prompt, código, dados), as sementes, os conjuntos de testes e as datas. Guarde os scripts junto com os resultados para que outras pessoas possam executá-los de novo. O relatório noturno do harness do Ask Brightwell registra no topo de cada execução a versão do modelo do fornecedor, a versão e o hash do prompt, a compilação do índice, a versão do conjunto de testes e a data. Quando uma mudança posterior no prompt fez as propostas prejudiciais aumentarem, esses campos mostraram exatamente qual mudança desfazer, e qualquer pessoa podia repetir a comparação a partir dos scripts guardados. Sem esses campos, a regressão teria sido rastreada por adivinhação.
9.4b Comparando duas defesas
Para comparar defesas de forma justa, rode as duas no mesmo conjunto de testes, com as mesmas versões de modelo e de prompt, e relate cada taxa com seu intervalo. Se os intervalos se sobrepõem muito, a diferença pode ser ruído; acrescente mais tentativas antes de afirmar que uma é melhor. Meça também o custo para os usuários normais, como requisições bloqueadas por engano, porque uma defesa que bloqueia tudo tira nota máxima contra ataques. Jonas aplicou isso quando um fornecedor ofereceu um firewall de prompts: ele o rodou no seu conjunto reservado e mediu tanto o que ele bloqueava quanto as perguntas normais que ele barrava por engano.
9.4c Medindo efeitos
Decida com antecedência o que conta como sucesso para o atacante. Para um agente, isso costuma ser uma ação — uma chamada de ferramenta com parâmetros prejudiciais —, e não palavras numa resposta. Escreva o avaliador como código que inspeciona os registros das ferramentas, para que os resultados não dependam do julgamento de uma pessoa sobre um texto. No Ask Brightwell, o sucesso do atacante é uma chamada start_return para um pedido sobre o qual o usuário conectado não perguntou. O avaliador lê o registro das ferramentas em busca dessas chamadas; ele não olha o texto da resposta, de modo que uma resposta que soa inofensiva enquanto inicia uma devolução ainda conta como sucesso.
9.5 Exemplo resolvido (caso sintético da Brightwell)
O ReturnGuard sinaliza devoluções fraudulentas. Jonas encontra fraude em cerca de 1% das devoluções; a taxa de falsos positivos do modelo é de 5%. Usando o laboratório, a precisão fica em cerca de 16%: cinco de cada seis clientes sinalizados são honestos. Ele recomenda um limiar de 1% de falsos positivos (precisão de 0,490 no laboratório, de modo que os revisores veem aproximadamente um cliente honesto para cada fraudador sinalizado) e revisão humana antes de qualquer recusa. A recomendação não afirma que o modelo é ruim; mostra que um evento raro faz a maioria dos alertas estar errada nesse limiar. A revisão humana também protege os clientes honestos dos erros que restam no limiar mais rigoroso.
9.6 Erros e limites
Três erros são comuns: taxas sem tamanho de amostra; ignorar as taxas de base; e execuções de teste não reproduzíveis. Os relatórios de Jonas evitam os três: toda taxa do Ask Brightwell é dada como uma contagem sobre as tentativas, os alertas do ReturnGuard são discutidos tendo em vista a taxa de fraude de 1%, e cada execução registra versões e sementes para que os números possam ser produzidos de novo. Um número sem isso não é uma evidência que alguém possa conferir ou usar para agir. O harness impõe os três automaticamente, de modo que nenhuma etapa manual pode pulá-los. Sem sementes registradas, uma nova execução poderia dar outro resultado, e ninguém saberia dizer por quê.
Exercícios
- EX025 — Intervalo. O que você pode afirmar a partir de 0 falhas em 600 tentativas? Rubrica: 3 = limite superior ≈0,5%, com as premissas; 2 = só o número; 1 = "é seguro"; 0 = nenhum.
- EX026 — Taxa de base. Use o laboratório para explicar a precisão do ReturnGuard com 5% e 1% de falsos positivos. Rubrica: 3 = 0,161 e 0,490, com o significado; 2 = os números; 1 = um; 0 = errado.
- EX027 — Registro de evidências. Liste o que registrar para uma avaliação reproduzível. Rubrica: 3 = versões, sementes, conjuntos, datas, scripts; 2 = quatro; 1 = dois; 0 = nenhum.
Síntese
Boas evidências contam resultados ao longo de muitas tentativas, mostram a incerteza, respeitam as taxas de base e podem ser reproduzidas.
Continue estudando — capítulo 09 de 30
← Capítulo 08 (rascunho) · Índice de capítulos do curso · Capítulo 10 (rascunho) →