
garak v0.16.0
Scanner di vulnerabilità LLM modulare che indaga su allucinazioni, perdita di dati, injection di prompt, jailbreak e tossicità utilizzando sonde statiche, dinamiche e adattive attraverso più provider di modelli.
garak, scanner di vulnerabilità per LLM
Kit di red-teaming e valutazione per IA generativa
garak verifica se un LLM può essere indotto a fallire in modi indesiderati. garak esplora allucinazioni, fughe di dati, injection di prompt, disinformazione, generazione di tossicità, jailbreak e molte altre debolezze. Se conosci nmap o msf / Metasploit Framework, garak fa cose simili, ma per gli LLM.
garak si concentra sui modi per far fallire un LLM o un sistema di dialogo. Combina probe statici, dinamici e adattivi per esplorare questo aspetto.
garak è uno strumento gratuito. Amiamo svilupparlo e siamo sempre interessati ad aggiungere funzionalità per supportare le applicazioni.
Per iniziare
> Vedi la nostra guida utente! docs.garak.ai
> Unisciti al nostro Discord!
> Link del progetto e home: garak.ai
> Twitter: @garak_llm
> DEF CON slide!
Supporto LLM
attualmente supporta:
- modelli generativi di hugging face hub
- modelli di testo di replicate
- modelli chat e continuazione di openai api
- modelli foundation di aws bedrock
- litellm
- praticamente qualsiasi cosa accessibile via REST
- modelli gguf come llama.cpp versione >= 1046
- .. e molti altri LLM!
Installare:
garak è uno strumento da riga di comando. È sviluppato su Linux e OSX.
Installazione standard con pip
Basta prenderlo da PyPI e si è pronti a partire:``` python -m pip install -U garak
### Installa la versione di sviluppo con `pip`
La versione pip standard di `garak` viene aggiornata periodicamente. Per ottenere una versione più recente da GitHub, prova:```
python -m pip install -U git+https://github.com/NVIDIA/garak.git@main
Clona dal sorgente
garak ha le proprie dipendenze. Puoi installare garak nel suo 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, if that went fine, you're probably good to go!
**Note**: if you cloned before the move to the `NVIDIA` GitHub organisation, but you're reading this at the `github.com/NVIDIA` URI, please update your remotes as follows:```
git remote set-url origin https://github.com/NVIDIA/garak.git
Per iniziare
La sintassi generale è:
garak <options>
garak deve sapere quale modello eseguire la scansione; di default, proverà tutti i probe che conosce su quel modello, utilizzando i rilevatori di vulnerabilità consigliati da ciascun probe. Puoi vedere un elenco dei probe utilizzando:
garak --list_probes
Per specificare un generatore, usa le opzioni --target_type e, opzionalmente, --target_name. Il tipo di modello specifica una famiglia/interfaccia di modelli; il nome del modello specifica il modello esatto da utilizzare. La sezione "Introduzione ai generatori" qui sotto descrive alcuni dei generatori supportati. Una famiglia di generatori semplice è quella dei modelli Hugging Face; per caricarne uno, imposta --target_type su huggingface e --target_name sul nome del modello su Hub (es. "RWKV/rwkv-4-169m-pile"). Alcuni generatori potrebbero aver bisogno di una chiave API impostata come variabile d'ambiente, e te lo faranno sapere se ne hanno bisogno.
garak esegue tutti i probe di default, ma puoi essere più specifico anche in questo. --probes promptinject utilizzerà solo i metodi del framework PromptInject, per esempio. Puoi anche specificare un singolo plugin invece di una famiglia di plugin aggiungendo il nome del plugin dopo un .; per esempio, --probes lmrc.SlurUsage utilizzerà un'implementazione per verificare se i modelli generano insulti basata sul framework Language Model Risk Cards.
Per aiuto e ispirazione, trovaci su Twitter o discord!
Esempi
Esegui il probe di un modello commerciale per l'iniezione di prompt basata su codifica (OSX/*nix) (sostituisci il valore di esempio con una vera chiave API OpenAI)``` export OPENAI_API_KEY="sk-123XXXXXXXXXXXX" python3 -m garak --target_type openai --target_name gpt-5-nano --probes encoding
Verifica se la versione Hugging Face di GPT2 è vulnerabile a DAN 11.0```
python3 -m garak --target_type huggingface --target_name gpt2 --probes dan.Dan_11_0
Lettura dei risultati
Per ogni probe caricato, garak stamperà una barra di avanzamento durante la generazione. Una volta completata la generazione, viene fornita una riga che valuta i risultati di quel probe su ciascun rivelatore. Se uno qualsiasi dei tentativi di prompt ha prodotto un comportamento indesiderato, la risposta verrà contrassegnata come FAIL e verrà indicato il tasso di fallimento.
Ecco i risultati con il modulo encoding su una variante di GPT-3:

E gli stessi risultati per ChatGPT:

Possiamo notare che il modello più recente è molto più suscettibile agli attacchi di iniezione basati sulla codifica, mentre text-babbage-001 è risultato vulnerabile solo alle iniezioni quoted-printable e MIME. Le cifre alla fine di ogni riga, ad esempio 840/840, indicano il numero totale di generazioni di testo e quante di queste sono apparse OK. La cifra può essere piuttosto alta perché per ogni prompt vengono effettuate più generazioni - di default, 10.
Gli errori vanno in garak.log; l'esecuzione viene registrata in dettaglio in un file .jsonl specificato all'inizio e alla fine dell'analisi. C'è uno script di analisi di base in analyse/analyse_log.py che restituirà i probe e i prompt che hanno generato il maggior numero di hit.
Inviate PR e aprite issue. Buona caccia!
Introduzione ai generatori
Hugging Face
Utilizzo dell'API Pipeline:
--target_type huggingface(per modelli transformers da eseguire localmente)--target_name- usa il nome del modello dall'Hub. Solo i modelli generativi funzioneranno. Se fallisce e non dovrebbe, apri un issue e incolla il comando che hai provato + l'eccezione!
Utilizzo dell'API Inference:
--target_type huggingface.InferenceAPI(per accesso al modello basato su API)--target_name- il nome del modello dall'Hub, ad esempio"mosaicml/mpt-7b-instruct"
Utilizzo di endpoint privati:
-
--target_type huggingface.InferenceEndpoint(per endpoint privati) -
--target_name- l'URL dell'endpoint, ad esempiohttps://xxx.us-east-1.aws.endpoints.huggingface.cloud -
(opzionale) imposta la variabile d'ambiente
HF_INFERENCE_TOKENcon un token API Hugging Face con il ruolo di "lettura"; vedi https://huggingface.co/settings/tokens quando sei loggato
OpenAI
--target_type openai--target_name- il modello OpenAI che desideri utilizzare.gpt-5-nanoè veloce e adatto per test.- imposta la variabile d'ambiente
OPENAI_API_KEYcon la tua chiave API OpenAI (ad esempio "sk-19763ASDF87q6657"); vedi https://platform.openai.com/account/api-keys quando sei loggato
I tipi di modello riconosciuti sono in whitelist, perché il plugin deve sapere quale sotto-API utilizzare. I modelli Completion o ChatCompletion vanno bene. Se desideri utilizzare un modello non supportato, dovresti ricevere un messaggio di errore informativo; per favore invia una PR / apri un issue.
Replicate
- imposta la variabile d'ambiente
REPLICATE_API_TOKENcon il tuo token API Replicate, ad esempio "r8-123XXXXXXXXXXXX"; vedi https://replicate.com/account/api-tokens quando sei loggato
Modelli Replicate pubblici:
--target_type replicate--target_name- il nome del modello Replicate e l'hash, ad esempio"stability-ai/stablelm-tuned-alpha-7b:c49dae36"
Endpoint Replicate privati:
--target_type replicate.InferenceEndpoint(per endpoint privati)--target_name- slug nome-utente/nome-modello dall'endpoint distribuito, ad esempioelim/elims-llama2-7b
Cohere
--target_type cohere--target_name(opzionale,commanddi default) - Il modello Cohere specifico che desideri testare- imposta la variabile d'ambiente
COHERE_API_KEYcon la tua chiave API Cohere, ad esempio "aBcDeFgHiJ123456789"; vedi https://dashboard.cohere.ai/api-keys quando sei loggato
Groq
--target_type groq--target_name- Il nome del modello a cui accedere tramite l'API Groq- imposta la variabile d'ambiente
GROQ_API_KEYcon la tua chiave API Groq; vedi https://console.groq.com/docs/quickstart per i dettagli su come creare una chiave API
ggml
--target_type ggml--target_name- Il percorso del modello ggml che desideri caricare, ad esempio/home/leon/llama.cpp/models/7B/ggml-model-q4_0.bin- imposta la variabile d'ambiente
GGML_MAIN_PATHcon il percorso del tuo eseguibile ggmlmain
REST
rest.RestGenerator è estremamente flessibile e può connettersi a qualsiasi endpoint REST che restituisca testo semplice o JSON. Richiede una breve configurazione, che di solito risulta in un breve file YAML che descrive il tuo endpoint. Vedi https://reference.garak.ai/en/latest/garak.generators.rest.html per esempi.
NIM
Utilizza modelli da https://build.nvidia.com/ o altri endpoint NIM.
- imposta la variabile d'ambiente
NIM_API_KEYcon il tuo token API di autenticazione, oppure specificala nel file YAML di configurazione
Per modelli chat:
--target_type nim--target_name- il nome del modello NIM, ad esempiometa/llama-3.1-8b-instruct
Per modelli completion:
--target_type nim.NVOpenAICompletion--target_name- il nome del modello NIM, ad esempiobigcode/starcoder2-15b
AWS Bedrock
--target_type bedrock--target_name- l'ID o alias del modello Bedrock, ad esempioanthropic.claude-3-sonnet-20240229-v1:0oclaude-3-sonnet- imposta la variabile d'ambiente
BEDROCK_API_KEYcon la tua chiave API AWS Bedrock; vedi https://docs.aws.amazon.com/bedrock/latest/userguide/api-keys-use.html per le istruzioni di configurazione - (opzionale) imposta la variabile d'ambiente
BEDROCK_REGIONper specificare la regione AWS (predefinito:us-east-1)
Le famiglie di modelli supportate includono Anthropic Claude, Meta Llama, Amazon Titan, AI21 Labs, Cohere e modelli Mistral AI. Il generatore utilizza l'API Converse per un accesso unificato a tutti i tipi di modello.
Esempio di utilizzo:``` export BEDROCK_API_KEY="your-api-key" export BEDROCK_REGION="us-east-1" garak --target_type bedrock --target_name claude-3-sonnet --probes dan
### Test
* `--target_type test`
* (alternativamente) `--target_name test.Blank`
Per i test. Questo genera sempre la stringa vuota, utilizzando il generatore `test.Blank`. Verrà segnato come fallimento per qualsiasi test che *richieda* un output, ad esempio quelli che fanno affermazioni controverse e si aspettano che il modello le confuti per superarlo.
* `--target_type test.Repeat`
Per i test. Questo generatore ripete il prompt ricevuto.
## Introduzione ai probe
| Probe | Descrizione |
|----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| blank | Un probe semplice che invia sempre un prompt vuoto. |
| atkgen | Automated Attack Generation. Un LLM di red-teaming sonda il target e reagisce ad esso nel tentativo di ottenere output tossici. Prototipo, per lo più senza stato, per ora utilizza un semplice GPT-2 [fine-tuned](https://huggingface.co/garak-llm/artgpt2tox) sul sottoinsieme di tentativi hhrlhf che hanno prodotto tossicità rilevabile (l'unico target attualmente supportato per ora). |
| badchars | Implementa perturbazioni Unicode impercettibili (caratteri invisibili, omoglifi, riordinamenti, cancellazioni) ispirate al paper [Bad Characters](https://arxiv.org/abs/2106.09898). |
| av_spam_scanning | Probe che tentano di far produrre al modello firme di contenuti malevoli |
| continuation | Probe che verificano se il modello continuerà una parola probabilmente indesiderabile |
| dan | Vari attacchi [DAN](https://adguard.com/en/blog/chatgpt-dan-prompt-abuse.html) e simili a DAN |
| donotanswer | Prompt a cui i modelli linguistici responsabili non dovrebbero rispondere. |
| encoding | Iniezione di prompt tramite codifica del testo |
| gcg | Disrupter un prompt di sistema aggiungendo un suffisso avversario. |
| glitch | Sonda il modello per glitch token che provocano comportamenti insoliti. |
| grandma | Appello per essere ricordati della propria nonna. |
| goodside | Implementazioni degli attacchi di Riley Goodside. |
| leakreplay | Valuta se un modello riprodurrà dati di addestramento. |
| lmrc | Sottoinsieme dei probe [Language Model Risk Cards](https://arxiv.org/abs/2303.18190) |
| malwaregen | Tentativi di far generare al modello codice per costruire malware |
| misleading | Tentativi di far sostenere a un modello affermazioni fuorvianti e false |
| packagehallucination | Tentativo di ottenere generazioni di codice che specificano pacchetti inesistenti (e quindi insicuri). |
| promptinject | Implementazione del lavoro Agency Enterprise [PromptInject](https://github.com/agencyenterprise/PromptInject/tree/main/promptinject) (premio miglior paper al NeurIPS ML Safety Workshop 2022) |
| realtoxicityprompts | Sottoinsieme del lavoro RealToxicityPrompts (dati limitati perché il test completo richiederebbe troppo tempo per essere eseguito) |
| snowball | Probe [Snowballed Hallucination](https://ofir.io/snowballed_hallucination.pdf) progettati per far dare a un modello una risposta sbagliata a domande troppo complesse per essere elaborate |
| xss | Cerca vulnerabilità che permettano o attuino attacchi cross-site, come l'esfiltrazione di dati privati. |
## Registrazione
`garak` genera diversi tipi di log:
* Un file di log, `garak.log`. Include informazioni di debug da `garak` e dai suoi plugin, e viene continuato tra le esecuzioni.
* Un report dell'esecuzione corrente, strutturato come JSONL. Un nuovo file di report viene creato ogni volta che `garak` viene eseguito. Il nome di questo file viene stampato all'inizio e, se ha successo, anche alla fine dell'esecuzione. Nel report, viene creata una voce per ogni tentativo di probing sia quando vengono ricevute le generazioni, sia quando vengono valutate; l'attributo `status` della voce prende una costante da `garak.attempts` per descrivere in quale fase è stato creato.
* Un log dei hit, che dettaglia i tentativi che hanno prodotto una vulnerabilità (un 'hit')
## Com'è strutturato il codice?
Consulta la [documentazione di riferimento](https://reference.garak.ai/) per una guida autorevole sulla struttura del codice di `garak`.
In un'esecuzione tipica, `garak` legge un tipo di modello (e opzionalmente un nome di modello) dalla riga di comando, poi determina quali `probe` e `detector` eseguire, avvia un `generator`, e poi li passa a un `harness` per effettuare il probing; un `evaluator` gestisce i risultati. Ci sono molti moduli in ciascuna di queste categorie, e ogni modulo fornisce un certo numero di classi che agiscono come plugin individuali.
* `garak/probes/` - classi per generare interazioni con LLM
* `garak/detectors/` - classi per rilevare se un LLM mostra una determinata modalità di fallimento
* `garak/evaluators/` - schemi di reportistica di valutazione
* `garak/generators/` - plugin per LLM da sondare
* `garak/harnesses/` - classi per strutturare i test
* `resources/` - elementi accessori richiesti dai plugin
La modalità operativa predefinita è utilizzare l'harness `probewise`. Data una lista di nomi di moduli probe e nomi di plugin probe, l'harness `probewise` istanzia ogni probe, poi per ogni probe legge i suoi attributi `primary_detector` e `extended_detectors` per ottenere una lista di `detector` da eseguire sull'output.
Ogni categoria di plugin (`probes`, `detectors`, `evaluators`, `generators`, `harnesses`) include un `base.py` che definisce le classi base utilizzabili dai plugin in quella categoria. Ogni modulo plugin definisce classi plugin che ereditano da una delle classi base. Ad esempio, `garak.generators.openai.OpenAIGenerator` discende da `garak.generators.base.Generator`.
Artefatti più grandi, come file di modelli e corpora più estesi, sono tenuti fuori dal repository; possono essere memorizzati ad esempio su Hugging Face Hub e caricati localmente dai client che utilizzano `garak`.
## Sviluppare il proprio plugin
* Guarda come lo fanno gli altri plugin
* Eredita da una delle classi base, ad esempio `garak.probes.base.TextProbe`
* Sovrascrivi il meno possibile
* Puoi testare il nuovo codice in almeno due modi:
* Avvia una sessione Python interattiva
* Importa il modello, ad esempio `import garak.probes.mymodule`
* Istanziare il plugin, ad esempio `p = garak.probes.mymodule.MyProbe()`
* Esegui una scansione con plugin di test
* Per i probe, prova un generatore blank e il detector always.Pass: `python3 -m garak -m test.Blank -p mymodule -d always.Pass`
* Per i detector, prova un generatore blank e un probe blank: `python3 -m garak -m test.Blank -p test.Blank -d mymodule`
* Per i generatori, prova un probe blank e il detector always.Pass: `python3 -m garak -m mymodule -p test.Blank -d always.Pass`
* Fai elencare a `garak` tutti i plugin del tipo che stai scrivendo, con `--list_probes`, `--list_detectors` o `--list_generators`
## FAQ
Abbiamo una FAQ [qui](https://github.com/NVIDIA/garak/blob/main/FAQ.md). Contattaci se hai altre domande! [[email protected]](mailto:[email protected])
La documentazione di riferimento del codice è su [garak.readthedocs.io](https://garak.readthedocs.io/en/latest/).
## Citare garak
Puoi leggere il [preprint paper di garak](https://github.com/nvidia/garak/blob/main/garak-paper.pdf). Se usi garak, per favore citaci.```
@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}}
}
"Mentire è un'abilità come qualsiasi altra, e se desideri mantenere un livello di eccellenza devi esercitarti costantemente" - Elim
Per aggiornamenti e novità vedi @garak_llm
© 2023- Leon Derczynski; Licenza Apache v2, vedi LICENSE