Avaliando nos seus traces
Antes de colocar o guardrail na frente das suas ferramentas, passe por ele as chamadas antigas do seu agente: quantas ele teria barrado, por qual regra, com que frequência teria perguntado e, onde você rotula as chamadas, com que frequência errou. Tudo é lido na sua máquina, e os relatórios trazem nomes de ferramentas, nomes de regras, contagens e ids de decisão, nunca o valor de um argumento ou uma palavra que uma pessoa disse.
Formatos de trace
| Formato | O que é |
|---|---|
jsonl |
uma chamada por linha: {"conversation", "tool", "arguments", "turns"?, "result"?, "label"?}; ou um turno por linha: {"conversation", "turn"}, que as chamadas depois dele leem |
openai |
logs de chat: uma conversa por linha (ou uma lista JSON), cada uma com as suas messages com tool_calls e respostas tool |
anthropic |
o mesmo com blocos tool_use e tool_result |
langsmith |
uma exportação de runs: os runs de ferramenta (run_type: tool) de cada trace, em ordem de tempo |
tau2 |
um arquivo de resultados do tau2-bench: cada simulação uma conversa |
auto distingue os formatos pelo primeiro registro. Cada chamada é verificada com os turnos da pessoa ditos antes dela
e o que as ferramentas devolveram antes dela, e cada conversa é uma sessão própria.
Repetindo: o que ele teria feito?
replay(trace) no stalwart mcp, ou evaluation.replay em Python:
- a resposta de cada chamada, e as contagens permitidas, perguntadas e recusadas, por regra;
- as chamadas que teriam sido barradas (conversa, posição, ferramenta, regra e id de decisão);
- confirmações por 100 chamadas: com que frequência as suas pessoas seriam perguntadas;
- o tempo de decisão p50 e p95;
deterministic: uma segunda execução a partir de um guardrail novo deu ids de decisão idênticos.
Avaliando: ele acertou?
Rotule cada chamada should_allow, should_confirm ou should_refuse (um label em cada linha), e
evaluate(labelled):
| respondeu permitir | respondeu confirmar | respondeu recusar | |
|---|---|---|---|
| deveria permitir | certo | alarme falso | alarme falso |
| deveria confirmar | falha | certo | alarme falso |
| deveria recusar | falha | falha | certo |
- Um alarme falso é uma chamada que deveria rodar, barrada ou perguntada: custa tempo às suas pessoas.
- Uma falha é uma chamada que deveria ser barrada, deixada passar (ou só perguntada onde deveria ser recusada): é o dano que o guardrail existe para impedir. Uma falha geralmente quer dizer uma regra que você ainda não escreveu.
O relatório dá a matriz, as contagens e as chamadas por trás de cada alarme falso e falha, no total e por regra.
Contrafactual: o que ele teria mudado?
counterfactual(trace, "check.py:outcome") pontua cada conversa com a sua própria verificação de resultado, como
rodou e sem as chamadas que o guardrail barrou. A sua função recebe o id de uma conversa e as chamadas que rodaram, e
devolve um número ou um valor verdadeiro/falso (por exemplo, se o banco de dados que ela deixa é o que a tarefa
esperava).
É um contrafactual offline: o resto da conversa é mantido como foi gravado. Um agente ao vivo que encontrasse a recusa poderia ter seguido de outro jeito.
O seu guard do Guardrails AI, com e sem o nosso
compare_with_gai(trace, "guard.py:guard") passa cada chamada pelo seu guard do Guardrails AI sozinho, e por ele com o
nosso validador acrescentado: quantas cada um deixa passar, e as chamadas que só o nosso barra. Precisa de
stalwart-agents[guardrails] onde o servidor roda.
Brechas nas suas regras
hunt("rules.yaml") roda o caçador de falhas na sua planilha de regras: cada achado é um caminho que as suas regras
permitem, com uma testemunha para repetir. redteam(server) prova as ferramentas de um servidor MCP atrás do gateway
para qualquer chamada que um modelo possa fazer. Os dois rodam no serviço, com a sua chave. São uma verificação de
qualidade das suas próprias regras, não um certificado.
O benchmark tau2-bench
benchmark("tau2-airline") e benchmark("tau2-retail") buscam os dados de terceiros do tau2-bench nos seus commits
fixados, para benchmarks/, sob demanda; nada vem embutido. Os números publicados (companhia aérea: 114 de 1.161
escritas barradas; varejo: 290 de 3.450) vêm da própria repetição desses dados pela Stalwart, que o pacote ainda não
carrega: o relatório os dá como publicados, diz que não foram reproduzidos aqui e nomeia as fontes que buscou.