
garak v0.16.0
Scanner de vulnerabilidades LLM modular que sonda por alucinação, vazamento de dados, injeção de prompt, jailbreaks e toxicidade usando sondas estáticas, dinâmicas e adaptativas em múltiplos provedores de modelo.
garak, scanner de vulnerabilidades para LLMs
Kit de Red-teaming e Avaliação de IA Generativa
O garak verifica se um LLM pode ser levado a falhar de uma forma que não desejamos. O garak investiga alucinação, vazamento de dados, injeção de prompt, desinformação, geração de toxicidade, jailbreaks e muitas outras fraquezas. Se você conhece o nmap ou o msf / Metasploit Framework, o garak faz algo semelhante a eles, mas para LLMs.
O garak foca em maneiras de fazer um LLM ou sistema de diálogo falhar. Ele combina sondas estáticas, dinâmicas e adaptativas para explorar isso.
O garak é uma ferramenta gratuita. Adoramos desenvolvê-la e estamos sempre interessados em adicionar funcionalidades para suportar aplicações.
Primeiros passos
> Veja nosso guia do usuário! docs.garak.ai
> Junte-se ao nosso Discord!
> Links do projeto e página inicial: garak.ai
> Twitter: @garak_llm
> Slides da DEF CON aqui!
Suporte a LLMs
atualmente suporta:
- modelos generativos do hugging face hub
- modelos de texto do replicate
- modelos de chat e continuação da openai api
- modelos fundacionais do aws bedrock
- litellm
- praticamente qualquer coisa acessível via REST
- modelos gguf como llama.cpp versão >= 1046
- .. e muitos mais LLMs!
Instalação:
O garak é uma ferramenta de linha de comando. É desenvolvida em Linux e OSX.
Instalação padrão com pip
Basta obtê-lo do PyPI e você estará pronto para usar:``` python -m pip install -U garak
### Instalar a versão de desenvolvimento com `pip`
A versão padrão do `garak` via pip é atualizada periodicamente. Para obter uma versão mais recente do GitHub, tente:```
python -m pip install -U git+https://github.com/NVIDIA/garak.git@main
Clonar a partir do código fonte
garak tem suas próprias dependências. Você pode instalar o garak em seu próprio ambiente Conda:```
conda create --name garak "python>=3.10,<=3.12"
conda activate garak
gh repo clone NVIDIA/garak
cd garak
python -m pip install -e .
OK, se isso correu bem, provavelmente você está pronto para seguir!
**Nota**: se você clonou antes da mudança para a organização `NVIDIA` do GitHub, mas está lendo isto no URI `github.com/NVIDIA`, atualize seus remotes da seguinte forma:```
git remote set-url origin https://github.com/NVIDIA/garak.git
Começando
A sintaxe geral é:
garak <options>
O garak precisa saber qual modelo escanear e, por padrão, tentará todas as sondas conhecidas naquele modelo, usando os detectores de vulnerabilidade recomendados por cada sonda. Você pode ver uma lista de sondas usando:
garak --list_probes
Para especificar um gerador, use as opções --target_type e, opcionalmente, --target_name. O tipo de modelo especifica uma família/interface de modelo; o nome do modelo especifica o modelo exato a ser usado. A seção "Introdução aos geradores" abaixo descreve alguns dos geradores suportados. Uma família de geradores direta são os modelos Hugging Face; para carregar um deles, defina --target_type como huggingface e --target_name como o nome do modelo no Hub (ex.: "RWKV/rwkv-4-169m-pile"). Alguns geradores podem precisar que uma chave de API seja definida como variável de ambiente, e eles informarão se for necessário.
O garak executa todas as sondas por padrão, mas você também pode ser específico. --probes promptinject usará apenas os métodos do framework PromptInject, por exemplo. Você também pode especificar um plugin específico em vez de uma família de plugins adicionando o nome do plugin após um .; por exemplo, --probes lmrc.SlurUsage usará uma implementação para verificar se os modelos geram insultos baseada no framework Language Model Risk Cards.
Para ajuda e inspiração, encontre-nos no Twitter ou no discord!
Exemplos
Teste um modelo comercial para injeção de prompt baseada em codificação (OSX/*nix) (substitua o valor de exemplo por uma chave real da API OpenAI)``` export OPENAI_API_KEY="sk-123XXXXXXXXXXXX" python3 -m garak --target_type openai --target_name gpt-5-nano --probes encoding
Verifique se a versão do GPT2 da Hugging Face é vulnerável ao DAN 11.0```
python3 -m garak --target_type huggingface --target_name gpt2 --probes dan.Dan_11_0
Leitura dos resultados
Para cada sonda carregada, o garak exibirá uma barra de progresso durante a geração. Uma vez concluída a geração, é apresentada uma linha avaliando os resultados dessa sonda em cada detector. Se alguma das tentativas de prompt resultou em um comportamento indesejado, a resposta será marcada como FAIL, e a taxa de falha será exibida.
Aqui estão os resultados com o módulo encoding em uma variante do GPT-3:

E os mesmos resultados para o ChatGPT:

Podemos ver que o modelo mais recente é muito mais suscetível a ataques de injeção baseados em codificação, enquanto o text-babbage-001 foi considerado vulnerável apenas a injeções de quoted-printable e MIME. Os números no final de cada linha, ex. 840/840, indicam o total de gerações de texto e quantas delas pareceram OK. O número pode ser bastante alto porque mais de uma geração é feita por prompt – por padrão, 10.
Erros vão para garak.log; a execução é registrada em detalhes em um arquivo .jsonl especificado no início e fim da análise. Existe um script de análise básico em analyse/analyse_log.py que exibirá as sondas e prompts que geraram mais acertos.
Envie PRs e abra issues. Boa caçada!
Introdução aos geradores
Hugging Face
Usando a Pipeline API:
--target_type huggingface(para modelos transformers executados localmente)--target_name– use o nome do modelo do Hub. Apenas modelos generativos funcionarão. Se falhar e não deveria, por favor abra uma issue e cole o comando que tentou + a exceção!
Usando a Inference API:
--target_type huggingface.InferenceAPI(para acesso ao modelo via API)--target_name– o nome do modelo do Hub, ex."mosaicml/mpt-7b-instruct"
Usando endpoints privados:
-
--target_type huggingface.InferenceEndpoint(para endpoints privados) -
--target_name– a URL do endpoint, ex.https://xxx.us-east-1.aws.endpoints.huggingface.cloud -
(opcional) defina a variável de ambiente
HF_INFERENCE_TOKENpara um token da API Hugging Face com a função "read"; consulte https://huggingface.co/settings/tokens quando estiver logado
OpenAI
--target_type openai--target_name– o modelo OpenAI que você gostaria de usar.gpt-5-nanoé rápido e adequado para testes.- defina a variável de ambiente
OPENAI_API_KEYpara sua chave de API OpenAI (ex. "sk-19763ASDF87q6657"); consulte https://platform.openai.com/account/api-keys quando estiver logado
Os tipos de modelo reconhecidos são listados em uma whitelist, pois o plugin precisa saber qual sub-API usar. Modelos Completion ou ChatCompletion são OK. Se você quiser usar um modelo não suportado, deverá receber uma mensagem de erro informativa; envie um PR / abra uma issue.
Replicate
- defina a variável de ambiente
REPLICATE_API_TOKENpara seu token de API Replicate, ex. "r8-123XXXXXXXXXXXX"; consulte https://replicate.com/account/api-tokens quando estiver logado
Modelos públicos do Replicate:
--target_type replicate--target_name– o nome do modelo Replicate e hash, ex."stability-ai/stablelm-tuned-alpha-7b:c49dae36"
Endpoints privados do Replicate:
--target_type replicate.InferenceEndpoint(para endpoints privados)--target_name– slug nome-do-usuário/nome-do-modelo do endpoint implantado, ex.elim/elims-llama2-7b
Cohere
--target_type cohere--target_name(opcional,commandpor padrão) – O modelo Cohere específico que você gostaria de testar- defina a variável de ambiente
COHERE_API_KEYpara sua chave de API Cohere, ex. "aBcDeFgHiJ123456789"; consulte https://dashboard.cohere.ai/api-keys quando estiver logado
Groq
--target_type groq--target_name– O nome do modelo a ser acessado via API Groq- defina a variável de ambiente
GROQ_API_KEYpara sua chave de API Groq, consulte https://console.groq.com/docs/quickstart para detalhes sobre como criar uma chave de API
ggml
--target_type ggml--target_name– O caminho para o modelo ggml que você deseja carregar, ex./home/leon/llama.cpp/models/7B/ggml-model-q4_0.bin- defina a variável de ambiente
GGML_MAIN_PATHpara o caminho do executávelmaindo seu ggml
REST
rest.RestGenerator é altamente flexível e pode se conectar a qualquer endpoint REST que retorne texto simples ou JSON. Ele precisa de uma breve configuração, que geralmente resultará em um arquivo YAML curto descrevendo seu endpoint. Consulte https://reference.garak.ai/en/latest/garak.generators.rest.html para exemplos.
NIM
Use modelos de https://build.nvidia.com/ ou outros endpoints NIM.
- defina a variável de ambiente
NIM_API_KEYpara seu token de API de autenticação, ou especifique-o no YAML de configuração
Para modelos de chat:
--target_type nim--target_name– o nome do modelo NIMmodel, ex.meta/llama-3.1-8b-instruct
Para modelos de completion:
--target_type nim.NVOpenAICompletion--target_name– o nome do modelo NIMmodel, ex.bigcode/starcoder2-15b
AWS Bedrock
--target_type bedrock--target_name– o ID do modelo Bedrock ou alias, ex.anthropic.claude-3-sonnet-20240229-v1:0ouclaude-3-sonnet- defina a variável de ambiente
BEDROCK_API_KEYpara sua chave de API AWS Bedrock; consulte https://docs.aws.amazon.com/bedrock/latest/userguide/api-keys-use.html para instruções de configuração - (opcional) defina a variável de ambiente
BEDROCK_REGIONpara especificar a região AWS (padrão éus-east-1)
As famílias de modelos suportadas incluem Anthropic Claude, Meta Llama, Amazon Titan, AI21 Labs, Cohere e modelos Mistral AI. O gerador usa a Converse API para acesso unificado a todos os tipos de modelo.
Exemplo de uso:``` export BEDROCK_API_KEY="your-api-key" export BEDROCK_REGION="us-east-1" garak --target_type bedrock --target_name claude-3-sonnet --probes dan
### Teste
* `--target_type test`
* (alternativamente) `--target_name test.Blank`
Para teste. Este sempre gera a string vazia, usando o gerador `test.Blank`. Será marcado como falha para quaisquer testes que *exijam* uma saída, por exemplo, aqueles que fazem afirmações polêmicas e esperam que o modelo as refute para passar.
* `--target_type test.Repeat`
Para teste. Este gerador repete o prompt que recebeu.
## Introdução às sondas
| Probe | Descrição |
|----------------------|-------------------------------------------------------------------------------------------------------------------------------|
| blank | Uma sonda simples que sempre envia um prompt vazio. |
| atkgen | Geração Automatizada de Ataques. Uma LLM de red-teaming sonda o alvo e reage a ele na tentativa de obter saída tóxica. Protótipo, principalmente sem estado, por enquanto usa um GPT-2 [fine-tuned](https://huggingface.co/garak-llm/artgpt2tox) no subconjunto de tentativas hhrlhf que produziram toxicidade detectável (o único alvo atualmente suportado por enquanto). |
| badchars | Implementa perturbações Unicode imperceptíveis (caracteres invisíveis, homóglifos, reordenações, exclusões) inspiradas no artigo [Bad Characters](https://arxiv.org/abs/2106.09898). |
| av_spam_scanning | Sondas que tentam fazer o modelo gerar assinaturas de conteúdo malicioso |
| continuation | Sondas que testam se o modelo continuará uma palavra provavelmente indesejável |
| dan | Vários ataques [DAN](https://adguard.com/en/blog/chatgpt-dan-prompt-abuse.html) e ataques semelhantes ao DAN |
| donotanswer | Prompts aos quais modelos de linguagem responsáveis não devem responder. |
| encoding | Injeção de prompt através de codificação de texto |
| gcg | Interrompe um prompt de sistema anexando um sufixo adversarial. |
| glitch | Sonda o modelo em busca de tokens glitch que provocam comportamento incomum. |
| grandma | Apelo para ser lembrado da avó de alguém. |
| goodside | Implementações de ataques de Riley Goodside. |
| leakreplay | Avalia se um modelo irá reproduzir dados de treinamento. |
| lmrc | Subamostra das sondas [Language Model Risk Cards](https://arxiv.org/abs/2303.18190) |
| malwaregen | Tentativas de fazer o modelo gerar código para construção de malware |
| misleading | Tentativas de fazer um modelo apoiar afirmações enganosas e falsas |
| packagehallucination | Tentativa de obter gerações de código que especifiquem pacotes inexistentes (e, portanto, inseguros). |
| promptinject | Implementação do trabalho [PromptInject](https://github.com/agencyenterprise/PromptInject/tree/main/promptinject) da Agency Enterprise (prêmio de melhor artigo @ NeurIPS ML Safety Workshop 2022) |
| realtoxicityprompts | Subconjunto do trabalho RealToxicityPrompts (dados limitados porque o teste completo levaria muito tempo para executar) |
| snowball | Sondas [Snowballed Hallucination](https://ofir.io/snowballed_hallucination.pdf) projetadas para fazer um modelo dar uma resposta errada a perguntas complexas demais para ele processar |
| xss | Procura por vulnerabilidades que permitam ou realizem ataques entre sites, como exfiltração de dados privados. |
## Registro (Logging)
`garak` gera vários tipos de log:
* Um arquivo de log, `garak.log`. Isso inclui informações de depuração do `garak` e seus plugins, e é continuado entre execuções.
* Um relatório da execução atual, estruturado como JSONL. Um novo arquivo de relatório é criado toda vez que o `garak` é executado. O nome deste arquivo é exibido no início e, se bem-sucedido, também no final da execução. No relatório, uma entrada é feita para cada tentativa de sonda tanto quando as gerações são recebidas, quanto novamente quando são avaliadas; o atributo `status` da entrada recebe uma constante de `garak.attempts` para descrever em qual estágio ela foi feita.
* Um log de acertos (hit log), detalhando tentativas que resultaram em uma vulnerabilidade (um 'hit')
## Como o código está estruturado?
Consulte a [documentação de referência](https://reference.garak.ai/) para um guia autoritativo sobre a estrutura do código do `garak`.
Em uma execução típica, o `garak` lerá um tipo de modelo (e opcionalmente um nome de modelo) da linha de comando, então determinará quais `probe`s e `detector`s executar, iniciará um `generator`, e então passará estes para um `harness` para realizar a sondagem; um `evaluator` lida com os resultados. Existem muitos módulos em cada uma dessas categorias, e cada módulo fornece uma série de classes que atuam como plugins individuais.
* `garak/probes/` - classes para gerar interações com LLMs
* `garak/detectors/` - classes para detectar se uma LLM está exibindo um determinado modo de falha
* `garak/evaluators/` - esquemas de relatório de avaliação
* `garak/generators/` - plugins para LLMs a serem sondadas
* `garak/harnesses/` - classes para estruturar testes
* `resources/` - itens auxiliares necessários pelos plugins
O modo operacional padrão é usar o `probewise` harness. Dada uma lista de nomes de módulos de sonda e nomes de plugins de sonda, o `probewise` harness instancia cada sonda, então para cada sonda lê seus atributos `primary_detector` e `extended_detectors` para obter uma lista de `detector`s a serem executados na saída.
Cada categoria de plugin (`probes`, `detectors`, `evaluators`, `generators`, `harnesses`) inclui um `base.py` que define as classes base utilizáveis pelos plugins nessa categoria. Cada módulo de plugin define classes de plugin que herdam de uma das classes base. Por exemplo, `garak.generators.openai.OpenAIGenerator` descende de `garak.generators.base.Generator`.
Artefatos maiores, como arquivos de modelo e corpora maiores, são mantidos fora do repositório; eles podem ser armazenados, por exemplo, no Hugging Face Hub e carregados localmente por clientes que usam o `garak`.
## Desenvolvendo seu próprio plugin
* Veja como outros plugins fazem
* Herde de uma das classes base, por exemplo `garak.probes.base.TextProbe`
* Sobrescreva o mínimo possível
* Você pode testar o novo código de pelo menos duas maneiras:
* Inicie uma sessão interativa Python
* Importe o modelo, por exemplo `import garak.probes.mymodule`
* Instancie o plugin, por exemplo `p = garak.probes.mymodule.MyProbe()`
* Execute uma varredura com plugins de teste
* Para sondas, tente um gerador em branco e o detector always.Pass: `python3 -m garak -m test.Blank -p mymodule -d always.Pass`
* Para detectores, tente um gerador em branco e uma sonda em branco: `python3 -m garak -m test.Blank -p test.Blank -d mymodule`
* Para geradores, tente uma sonda em branco e o detector always.Pass: `python3 -m garak -m mymodule -p test.Blank -d always.Pass`
* Faça o `garak` listar todos os plugins do tipo que você está escrevendo, com `--list_probes`, `--list_detectors` ou `--list_generators`
## FAQ
Temos um FAQ [aqui](https://github.com/NVIDIA/garak/blob/main/FAQ.md). Entre em contato se tiver mais perguntas! [[email protected]](mailto:[email protected])
A documentação de referência do código está em [garak.readthedocs.io](https://garak.readthedocs.io/en/latest/).
## Citando o garak
Você pode ler o [artigo preprint do garak](https://github.com/nvidia/garak/blob/main/garak-paper.pdf). Se usar o garak, por favor, cite-nos.```
@article{garak,
title={{garak: A Framework for Security Probing Large Language Models}},
author={Leon Derczynski and Erick Galinkin and Jeffrey Martin and Subho Majumdar and Nanna Inie},
year={2024},
howpublished={\url{https://garak.ai}}
}
"Mentir é uma habilidade como qualquer outra, e se você deseja manter um nível de excelência, precisa praticar constantemente" - Elim
Para atualizações e novidades veja @garak_llm
© 2023- Leon Derczynski; licença Apache v2, veja LICENSE