Voltar às atualizações
New releaseAug 5, 2026

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.

Compartilhar

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.

License Tests/Linux Tests/Windows Tests/OSX Documentation Status arXiv discord-img Code style: black PyPI - Python Version PyPI Downloads Downloads

Primeiros passos

> Veja nosso guia do usuário! docs.garak.ai

> Junte-se ao nosso Discord!

> Twitter: @garak_llm

> Slides da DEF CON aqui!


Suporte a LLMs

atualmente suporta:

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: alt text

E os mesmos resultados para o ChatGPT: alt text

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_TOKEN para 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_KEY para 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

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, command por padrão) – O modelo Cohere específico que você gostaria de testar
  • defina a variável de ambiente COHERE_API_KEY para 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_KEY para 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_PATH para o caminho do executável main do 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_KEY para 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 NIM model, ex. meta/llama-3.1-8b-instruct

Para modelos de completion:

  • --target_type nim.NVOpenAICompletion
  • --target_name – o nome do modelo NIM model, 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:0 ou claude-3-sonnet
  • defina a variável de ambiente BEDROCK_API_KEY para 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_REGION para 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

Categorias