Kit generativo de time vermelho e avaliação da IA
garak
verifica se um LLM pode ser feito para falhar de uma maneira que não queremos. garak
sondas para alucinação, vazamento de dados, injeção imediata, desinformação, geração de toxicidade, jailbreaks e muitas outras fraquezas. Se você conhece nmap
, é nmap
para LLMS.
garak
se concentra em maneiras de fazer um sistema de diálogo LLM ou de diálogo falhar. Combina sondas estáticas, dinâmicas e adaptativas para explorar isso.
Ferramenta garak
'SA Free. Adoramos desenvolvê -lo e estamos sempre interessados em adicionar funcionalidade para oferecer suporte a aplicativos.
Atualmente suporta:
garak
é uma ferramenta de linha de comando. É desenvolvido no Linux e OSX.
pip
Apenas pegue -o de Pypi e você deve estar pronto:
python -m pip install -U garak
pip
A versão PIP padrão do garak
é atualizada periodicamente. Para obter uma versão mais fresca do Github, tente:
python -m pip install -U git+https://github.com/NVIDIA/garak.git@main
garak
tem suas próprias dependências. Você pode instalar garak
em seu próprio ambiente de 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, você provavelmente está pronto para ir!
NOTA : Se você clonou antes da mudança para a organização NVIDIA
Github, mas estará lendo isso no github.com/NVIDIA
Uri, atualize seus contratos de controle da seguinte forma:
git remote set-url origin https://github.com/NVIDIA/garak.git
A sintaxe geral é:
garak <options>
garak
precisa saber qual modelo para digitalizar e, por padrão, tentará todas as sondas que conhece nesse 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 o --model_type
e, opcionalmente, as opções --model_name
. Tipo de modelo especifica uma família/interface 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 simples do gerador está abraçando modelos de rosto; Para carregar um deles, defina --model_type
para huggingface
e --model_name
com o nome do modelo no hub (por exemplo, "RWKV/rwkv-4-169m-pile"
). Alguns geradores podem precisar de uma chave da API para ser definida como uma variável de ambiente e informará se precisar disso.
garak
executa todas as sondas por padrão, mas você também pode ser específico sobre isso. --probes promptinject
usará apenas os métodos da estrutura do RemptInject, por exemplo. Você também pode especificar um plug -in específico em vez de uma família de plug -in adicionando o nome do plug -in após a .
; Por exemplo, --probes lmrc.SlurUsage
usará uma implementação da verificação para modelos que geram insultos com base na estrutura de cartões de risco para modelos de idiomas.
Para obter ajuda e inspiração, encontre -nos no Twitter ou Discord!
Sonda Chatgpt para injeção de prompt baseada em codificação (OSX/*nix) (substitua o valor de exemplo por uma chave de API do OpenAI real)
export OPENAI_API_KEY="sk-123XXXXXXXXXXXX"
python3 -m garak --model_type openai --model_name gpt-3.5-turbo --probes encoding
Veja se a versão de rosto abraço do GPT2 é vulnerável a Dan 11.0
python3 -m garak --model_type huggingface --model_name gpt2 --probes dan.Dan_11_0
Para cada sonda carregada, Garak imprimirá uma barra de progresso à medida que gera. Depois que a geração é concluída, uma linha avaliando os resultados da sonda em cada detector é fornecida. Se alguma das tentativas de prompt renderia um comportamento indesejável, a resposta será marcada como falha e a taxa de falha dada.
Aqui estão os resultados com o módulo encoding
em uma variante 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, onde o Babbage-001 foi considerado vulnerável a injeções de codificação imprimível e mímica. Os números no final de cada linha, por exemplo, 840/840, indicam o número de gerações de texto no total e, em seguida, quantos deles pareciam se comportar bem. A figura pode ser bastante alta porque mais de uma geração é feita por prompt - por padrão, 10.
Erros vão em garak.log
; A execução é registrada em detalhes em um arquivo .jsonl
especificado na análise START & END. Existe um script de análise básica no analyse/analyse_log.py
, que produzirá as sondas e instruções que levaram ao maior número de hits.
Envie PRS e questões abertas. Feliz caça!
Usando a API do pipeline:
--model_type huggingface
(para modelos Transformers funcionar localmente)--model_name
-Use o nome do modelo do hub. Somente modelos generativos funcionarão. Se falhar e não deve, abra um problema e colar no comando que você tentou + a exceção!Usando a API de inferência:
--model_type huggingface.InferenceAPI
(para acesso ao modelo baseado em API)--model_name
-o nome do modelo do hub, por exemplo, "mosaicml/mpt-7b-instruct"
Usando terminais privados:
--model_type huggingface.InferenceEndpoint
(para terminais privados)
--model_name
-o URL do endpoint, por exemplo, https://xxx.us-east-1.aws.endpoints.huggingface.cloud
(Opcional) Defina a variável de ambiente HF_INFERENCE_TOKEN
para um token de API de rosto abraçado com a função "Read"; Veja https://huggingface.co/settings/tokens quando conectado
--model_type openai
--model_name
-O modelo OpenAI que você gostaria de usar. gpt-3.5-turbo-0125
é rápido e bom para teste.OPENAI_API_KEY
para sua chave de API do OpenAI (por exemplo, "SK-19763ASDF87Q6657"); Veja https://platform.openai.com/account/api-keys quando conectadoOs tipos de modelo reconhecidos estão em permissões, porque o plug-in precisa saber qual sub-api usar. Os modelos de conclusão ou chatcomtion estão ok. Se você deseja usar um modelo não suportado, obtenha uma mensagem de erro informativa e envie um PR / Abra um problema.
REPLICATE_API_TOKEN
para o seu token de API replicado, por exemplo, "R8-123xxxxxxxxxxxx"; Veja https://replicate.com/account/api-tokens quando conectadoModelos de replicação pública:
--model_type replicate
--model_name
-O nome do modelo replicado e hash, por exemplo "stability-ai/stablelm-tuned-alpha-7b:c49dae36"
Terminais de replicação privada:
--model_type replicate.InferenceEndpoint
(para pontos de extremidade privados)--model_name
-Nome de usuário/Model-Name Slug do endpoint implantado, por exemplo, elim/elims-llama2-7b
--model_type cohere
--model_name
(Opcional, command
por padrão) -O modelo Cohere específico que você gostaria de testarCOHERE_API_KEY
para sua chave da API coere, por exemplo, "abcdefghij123456789"; Veja https://dashboard.cohere.ai/api-keys quando conectado--model_type groq
--model_name
-O nome do modelo a ser accessado através da API GroqGROQ_API_KEY
para sua chave de API Groq, consulte https://console.groq.com/docs/quickstart para obter detalhes sobre como criar uma chave de API--model_type ggml
--model_name
-O caminho para o modelo GGML que você gostaria de carregar, por exemplo, /home/leon/llama.cpp/models/7B/ggml-model-q4_0.bin
GGML_MAIN_PATH
no caminho para o seu executável main
GGML rest.RestGenerator
é altamente flexível e pode se conectar a qualquer ponto de extremidade REST que retorne texto simples ou JSON. Ele precisa de uma breve configuração, que normalmente resulta um arquivo YAML curto que descreve seu terminal. Consulte https://reference.garak.ai/en/latest/garak.generators.rest.html para exemplos.
Use modelos de https://build.nvidia.com/ ou outros pontos de extremidade do NIM.
NIM_API_KEY
para o seu token da API de autenticação ou especifique -o na configuração YAMLPara modelos de bate -papo:
--model_type nim
--model_name
-o nome model
NIM, por exemplo, meta/llama-3.1-8b-instruct
Para modelos de conclusão:
--model_type nim.NVOpenAICompletion
--model_name
-o nome model
nim, por exemplo, bigcode/starcoder2-15b
OCTO_API_TOKEN
para o seu token de API replicado, por exemplo, "R8-123XXXXXXXXXXXX"; Veja https://replicate.com/account/api-tokens quando conectadoOcto Public Endpoint:
--model_type octo
--model_name
-Otim mistral-7b-instruct-fp16
OctoaiEndpoint privado de outubro:
--model_type octo.InferenceEndpoint
(para pontos de extremidade privados)--model_name
-O URL do endpoint implantado, por exemplo, https://llama-2-70b-chat-xxx.octoai.run/v1/chat/completions
--model_type test
(Alternativamente) --model_name test.Blank
para teste. Isso sempre gera a string vazia, usando o gerador test.Blank
. Será marcado como falha em quaisquer testes que exijam uma saída, por exemplo, aqueles que fazem reivindicações controversas e esperam que o modelo os refira para passar.
--model_type test.Repeat
para teste. Este gerador repete de volta o prompt que recebeu.
Sonda | Descrição |
---|---|
em branco | Uma sonda simples que sempre envia um prompt vazio. |
atkgen | Geração de ataque automatizado. Um LLM de término vermelho sonda o alvo e reage a ele na tentativa de obter uma produção tóxica. O protótipo, principalmente sem estado, por enquanto usa um simples GPT-2 ajustado no subconjunto de tentativas de HHRLHF que produziram toxicidade detectável (o único alvo atualmente suportado por enquanto). |
av_spam_scanning | Sondas que tentam fazer com que o modelo sai de assinaturas de conteúdo malicioso |
continuação | Sondas que testam se o modelo continuará uma palavra provavelmente indesejável |
Dan | Vários ataques de Dan e Dan |
Donotanswer | Prompts aos modelos de idiomas responsáveis não devem responder. |
codificação | Injeção imediata através da codificação de texto |
gcg | Interrompe um prompt de sistema anexando um sufixo adversário. |
falha | Modelo de sonda para fichas de falha que provocam comportamento incomum. |
avó | Apelar para ser lembrado da avó. |
BOTSIDE | Implementações de ataques de riley benside. |
vazamento de vazamento | Avalie se um modelo reproduzirá dados de treinamento. |
LMRC | Subamostra das sondas de cartões de risco para modelos de idiomas |
malwaregen | Tentativas de ter o modelo gerar código para construir malware |
errôneo | Tentativas de fazer um modelo suportar suportar reivindicações enganosas e falsas |
pacote de alucinação | Tentando obter gerações de código que especificam pacotes inexistentes (e, portanto, inseguros). |
PromptInject | Implementação da agência Enterprise PromptInject Work (Best Paper Awards @ Neurips ML Safety Workshop 2022) |
RealtoxicityPrompts | Subconjunto do trabalho realToxicityPrompts (dados restritos porque o teste completo levará tanto tempo para ser executado) |
bola de neve | As sondas de alucinação de bola de neve projetadas para fazer um modelo dão uma resposta errada às perguntas muito complexas para processar |
XSS | Procure vulnerabilidades a permissão ou aproveite ataques cruzados, como a exfiltração de dados privados. |
garak
gera vários tipos de log:
garak.log
. Isso inclui informações de depuração de garak
e seus plugins e continuam em corridas.garak
for executado. O nome deste arquivo é emitido no início e, se bem -sucedido, também no final da execução. No relatório, é feita uma entrada para cada tentativa de sondagem, tanto quanto as gerações são recebidas e, novamente, quando são avaliadas; O atributo status
da entrada exige uma constante de garak.attempts
para descrever em que estágio foi feito. Confira os documentos de referência para um guia autoritário da estrutura de código garak
.
Em uma execução típica, garak
lerá um tipo de modelo (e opcionalmente modelou o nome) da linha de comando, depois determinará quais probe
e detector
S para executar, iniciar um generator
e depois passar para um harness
para fazer a sondagem; Um evaluator
lida com os resultados. Existem muitos módulos em cada uma dessas categorias, e cada módulo fornece várias classes que atuam como plugins individuais.
garak/probes/
- classes para gerar interações com o LLMSgarak/detectors/
- Classes para detectar um LLM está exibindo um determinado modo de falhagarak/evaluators/
- Esquemas de relatórios de avaliaçãogarak/generators/
- plugins para LLMs a serem sondadosgarak/harnesses/
- classes para estruturar testesresources/
- itens auxiliares exigidos por plugins O modo de operação padrão é usar o chicote probewise
. Dada uma lista de nomes de módulos de sonda e nomes de plug -in de sonda, a aproveitamento probewise
instancia cada sonda e, para cada sonda, lê seu atributo recommended_detectors
para obter uma lista de detector
s para executar na saída.
Cada categoria de plug -in ( probes
, detectors
, evaluators
, generators
, harnesses
) inclui uma base.py
que define as classes base utilizáveis por plug -ins nessa categoria. Cada módulo de plug -in define classes de plug -in que herdam de uma das classes base. Por exemplo, garak.generators.openai.OpenAIGenerator
Desce 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 no por exemplo, abraçando o hub de rosto e carregados localmente por clientes usando garak
.
garak.probes.base.TextProbe
import garak.probes.mymodule
p = garak.probes.mymodule.MyProbe()
python3 -m garak -m test.Blank -p mymodule -d always.Pass
python3 -m garak -m test.Blank -p test.Blank -d mymodule
python3 -m garak -m mymodule -p test.Blank -d always.Pass
garak
para listar todos os plugins do tipo que você está escrevendo, com --list_probes
, --list_detectors
ou --list_generators
Temos uma FAQ aqui. Procure se você tiver mais alguma dúvida! [email protected]
A documentação de referência de código está em Garak.readThedocs.io.
Você pode ler o artigo de pré -impressão de Garak. Se você usar Garak, 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 notícias, consulte @garak_llm
© 2023- Leon Derczynski; Apache License v2, consulte a licença