Modularer LLM-Schwachstellenscanner, der mit statischen, dynamischen und adaptiven Sonden nach Halluzinationen, Datenlecks, Prompt-Injection, Jailbreaks und Toxizität über mehrere Modellanbieter hinweg sucht.
Generative AI Red-Teaming- & Assessment-Kit
garak prüft, ob ein LLM dazu gebracht werden kann, auf eine unerwünschte Weise zu versagen. garak testet auf Halluzination, Datenlecks, Prompt Injection, Fehlinformation, Toxizitätserzeugung, Jailbreaks und viele andere Schwachstellen. Wenn Sie nmap oder msf / Metasploit Framework kennen, macht garak etwas Ähnliches, aber für LLMs.
garak konzentriert sich auf Wege, ein LLM oder Dialogsystem zum Scheitern zu bringen. Es kombiniert statische, dynamische und adaptive Tests, um dies zu untersuchen.
garak ist ein kostenloses Tool. Wir entwickeln es gerne weiter und sind stets daran interessiert, Funktionen zur Unterstützung von Anwendungen hinzuzufügen.
unterstützt derzeit:
garak ist ein Kommandozeilen-Tool. Es wird unter Linux und OSX entwickelt.
pipEinfach von PyPI holen und loslegen:``` python -m pip install -U garak
### Entwicklungsversion mit `pip` installieren
Die Standard-pip-Version von `garak` wird regelmäßig aktualisiert. Um eine aktuellere Version von GitHub zu erhalten, versuchen Sie es mit:```
python -m pip install -U git+https://github.com/NVIDIA/garak.git@main
garak hat seine eigenen Abhängigkeiten. Sie können garak in einer eigenen Conda-Umgebung installieren:```
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, wenn das geklappt hat, kannst du wahrscheinlich loslegen!
**Hinweis**: wenn du vor dem Wechsel zur `NVIDIA` GitHub-Organisation geklont hast, aber du dies unter der `github.com/NVIDIA`-URI liest, aktualisiere bitte deine remotes wie folgt:```
git remote set-url origin https://github.com/NVIDIA/garak.git
Die allgemeine Syntax lautet:
garak <optionen>
garak muss wissen, welches Modell gescannt werden soll, und standardmäßig wird es alle ihm bekannten Probes auf diesem Modell ausführen, wobei die von jeder Probe empfohlenen Schwachstellenerkennungen verwendet werden. Sie können eine Liste der Probes mit folgendem Befehl anzeigen:
garak --list_probes
Um einen Generator anzugeben, verwenden Sie die Optionen --target_type und optional --target_name. Der Modelltyp gibt eine Modellfamilie/Schnittstelle an; der Modellname gibt das genaue zu verwendende Modell an. Der Abschnitt „Einführung in die Generatoren“ unten beschreibt einige der unterstützten Generatoren. Eine einfache Generatorfamilie sind Hugging Face Modelle; um eines zu laden, setzen Sie --target_type auf huggingface und --target_name auf den Namen des Modells auf dem Hub (z.B. "RWKV/rwkv-4-169m-pile"). Manche Generatoren benötigen möglicherweise einen API-Schlüssel, der als Umgebungsvariable gesetzt werden muss; sie werden Sie informieren, falls dies erforderlich ist.
garak führt standardmäßig alle Probes aus, aber Sie können auch genauer festlegen, welche verwendet werden sollen. --probes promptinject verwendet beispielsweise nur die Methoden des PromptInject-Frameworks. Sie können auch ein bestimmtes Plugin anstelle einer Plugin-Familie angeben, indem Sie den Plugin-Namen nach einem . hinzufügen; z.B. verwendet --probes lmrc.SlurUsage eine Implementierung zur Überprüfung, ob Modelle Beleidigungen generieren, basierend auf dem Language Model Risk Cards-Framework.
Testen Sie ein kommerzielles Modell auf codierungsbasierte Prompt-Injection (OSX/*nix) (ersetzen Sie den Beispielwert durch einen echten OpenAI-API-Schlüssel)``` export OPENAI_API_KEY="sk-123XXXXXXXXXXXX" python3 -m garak --target_type openai --target_name gpt-5-nano --probes encoding
Überprüfen Sie, ob die Hugging Face-Version von GPT2 anfällig für DAN 11.0 ist.```
python3 -m garak --target_type huggingface --target_name gpt2 --probes dan.Dan_11_0
Für jede geladene Sonde zeigt garak beim Generieren einen Fortschrittsbalken an. Sobald die Generierung abgeschlossen ist, wird eine Zeile ausgegeben, die die Ergebnisse dieser Sonde für jeden Detektor bewertet. Wenn einer der Eingabeaufforderungsversuche ein unerwünschtes Verhalten hervorgerufen hat, wird die Antwort als FAIL markiert und die Fehlerrate angegeben.
Hier sind die Ergebnisse mit dem encoding-Modul für eine GPT-3-Variante:

Und die gleichen Ergebnisse für ChatGPT:

Wir können sehen, dass das neuere Modell viel anfälliger für codierungsbasierte Injection-Angriffe ist, während text-babbage-001 nur für quoted-printable und MIME-Codierungsinjektionen anfällig war. Die Zahlen am Ende jeder Zeile, z. B. 840/840, geben die Gesamtanzahl der Textgenerierungen und dann an, wie viele davon in Ordnung zu sein schienen. Die Zahl kann ziemlich hoch sein, da pro Eingabeaufforderung mehr als eine Generierung erfolgt – standardmäßig 10.
Fehler werden in garak.log aufgezeichnet; der Durchlauf wird detailliert in einer .jsonl-Datei protokolliert, die zu Beginn und Ende der Analyse angegeben wird. Es gibt ein einfaches Analysescript in analyse/analyse_log.py, das die Sonden und Eingabeaufforderungen ausgibt, die zu den meisten Treffern geführt haben.
Senden Sie PRs & eröffnen Sie Issues. Viel Erfolg bei der Jagd!
Verwendung der Pipeline-API:
--target_type huggingface (für Transformers-Modelle, die lokal ausgeführt werden)--target_name - verwenden Sie den Modellnamen aus dem Hub. Nur generative Modelle funktionieren. Falls es fehlschlägt und nicht sollte, öffnen Sie bitte ein Issue und fügen Sie den von Ihnen versuchten Befehl sowie die Ausnahme ein!Verwendung der Inference-API:
--target_type huggingface.InferenceAPI (für API-basierten Modellzugriff)--target_name - der Modellname aus dem Hub, z. B. "mosaicml/mpt-7b-instruct"Verwendung privater Endpunkte:
--target_type huggingface.InferenceEndpoint (für private Endpunkte)
--target_name - die Endpunkt-URL, z. B. https://xxx.us-east-1.aws.endpoints.huggingface.cloud
(optional) setzen Sie die Umgebungsvariable HF_INFERENCE_TOKEN auf ein Hugging Face API-Token mit der Rolle "read"; siehe https://huggingface.co/settings/tokens nach der Anmeldung
--target_type openai--target_name - das OpenAI-Modell, das Sie verwenden möchten. gpt-5-nano ist schnell und gut zum Testen geeignet.OPENAI_API_KEY auf Ihren OpenAI-API-Schlüssel (z. B. "sk-19763ASDF87q6657"); siehe https://platform.openai.com/account/api-keys nach der AnmeldungErkannte Modelltypen sind auf der Whitelist, da das Plugin wissen muss, welche Unter-API verwendet werden soll. Completion- oder ChatCompletion-Modelle sind in Ordnung. Wenn Sie ein nicht unterstütztes Modell verwenden möchten, sollten Sie eine informative Fehlermeldung erhalten; bitte senden Sie einen PR / eröffnen Sie ein Issue.
REPLICATE_API_TOKEN auf Ihr Replicate-API-Token, z. B. "r8-123XXXXXXXXXXXX"; siehe https://replicate.com/account/api-tokens nach der AnmeldungÖffentliche Replicate-Modelle:
--target_type replicate--target_name - der Replicate-Modellname und -Hash, z. B. "stability-ai/stablelm-tuned-alpha-7b:c49dae36"Private Replicate-Endpunkte:
--target_type replicate.InferenceEndpoint (for private endpoints)--target_name - Benutzername/Modellname-Slug des bereitgestellten Endpunkts, z. B. elim/elims-llama2-7b--target_type cohere--target_name (optional, standardmäßig command) - Das spezifische Cohere-Modell, das Sie testen möchtenCOHERE_API_KEY auf Ihren Cohere-API-Schlüssel, z. B. "aBcDeFgHiJ123456789"; siehe https://dashboard.cohere.ai/api-keys nach der Anmeldung--target_type groq--target_name - Der Name des Modells, auf das über die Groq-API zugegriffen werden sollGROQ_API_KEY auf Ihren Groq-API-Schlüssel; siehe https://console.groq.com/docs/quickstart für Details zum Erstellen eines API-Schlüssels--target_type ggml--target_name - Der Pfad zum ggml-Modell, das Sie laden möchten, z. B. /home/leon/llama.cpp/models/7B/ggml-model-q4_0.binGGML_MAIN_PATH auf den Pfad zu Ihrer ggml-main-Ausführbarenrest.RestGenerator ist äußerst flexibel und kann mit jedem REST-Endpunkt verbunden werden, der Klartext oder JSON zurückgibt. Es benötigt jedoch eine kurze Konfiguration, die in der Regel zu einer kurzen YAML-Datei führt, die Ihren Endpunkt beschreibt. Siehe https://reference.garak.ai/en/latest/garak.generators.rest.html für Beispiele.
Verwenden Sie Modelle von https://build.nvidia.com/ oder anderen NIM-Endpunkten.
NIM_API_KEY auf Ihr Authentifizierungs-API-Token, oder geben Sie es in der Konfigurations-YAML anFür Chat-Modelle:
--target_type nim--target_name - der NIM-Modellname, z. B. meta/llama-3.1-8b-instructFür Completion-Modelle:
--target_type nim.NVOpenAICompletion--target_name - der NIM-Modellname, z. B. bigcode/starcoder2-15b--target_type bedrock--target_name - die Bedrock-Modell-ID oder der Alias, z. B. anthropic.claude-3-sonnet-20240229-v1:0 oder claude-3-sonnetBEDROCK_API_KEY auf Ihren AWS-Bedrock-API-Schlüssel; siehe https://docs.aws.amazon.com/bedrock/latest/userguide/api-keys-use.html für EinrichtungsanweisungenBEDROCK_REGION, um die AWS-Region anzugeben (Standard: us-east-1)Unterstützte Modellfamilien umfassen Anthropic Claude, Meta Llama, Amazon Titan, AI21 Labs, Cohere und Mistral AI-Modelle. Der Generator verwendet die Converse-API für einheitlichen Zugriff auf alle Modelltypen.
Beispielnutzung:``` 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`
* (alternatively) `--target_name test.Blank`
For testing. This always generates the empty string, using the `test.Blank` generator. Will be marked as failing for any tests that *require* an output, e.g. those that make contentious claims and expect the model to refute them in order to pass.
* `--target_type test.Repeat`
For testing. This generator repeats back the prompt it received.
## Einführung in die Probes
| Probe | Description |
|----------------------|-------------------------------------------------------------------------------------------------------------------------------|
| blank | Eine einfache Probe, die immer eine leere Eingabeaufforderung sendet. |
| atkgen | Automatisierte Angriffsgenerierung. Ein Red-Teaming-LLM untersucht das Ziel und reagiert darauf, um toxische Ausgaben zu erhalten. Prototyp, größtenteils zustandslos, verwendet derzeit ein einfaches GPT-2 [feinabgestimmt](https://huggingface.co/garak-llm/artgpt2tox) auf der Teilmenge der hhrlhf-Versuche, die nachweisbare Toxizität ergaben (das derzeit einzige unterstützte Ziel). |
| badchars | Implementiert nicht wahrnehmbare Unicode-Störungen (unsichtbare Zeichen, Homoglyphen, Umordnungen, Löschungen) inspiriert von der [Bad Characters](https://arxiv.org/abs/2106.09898)-Arbeit. |
| av_spam_scanning | Sonden, die versuchen, das Modell dazu zu bringen, bösartige Inhaltsignaturen auszugeben. |
| continuation | Sonden, die testen, ob das Modell ein wahrscheinlich unerwünschtes Wort fortsetzt. |
| dan | Verschiedene [DAN](https://adguard.com/en/blog/chatgpt-dan-prompt-abuse.html)- und DAN-ähnliche Angriffe. |
| donotanswer | Eingabeaufforderungen, auf die verantwortungsbewusste Sprachmodelle nicht antworten sollten. |
| encoding | Prompt Injection durch Textkodierung. |
| gcg | Stört einen System-Prompt durch Anhängen eines adversariellen Suffixes. |
| glitch | Testen des Modells auf Glitch-Tokens, die ungewöhnliches Verhalten auslösen. |
| grandma | Appell an die Erinnerung an die Großmutter. |
| goodside | Implementierungen von Riley-Goodside-Angriffen. |
| leakreplay | Bewerten, ob ein Modell Trainingsdaten wiedergibt. |
| lmrc | Teilstichprobe der [Language Model Risk Cards](https://arxiv.org/abs/2303.18190)-Sonden. |
| malwaregen | Versuche, das Modell dazu zu bringen, Code zur Erstellung von Schadsoftware zu generieren. |
| misleading | Versuche, ein Modell dazu zu bringen, irreführende und falsche Behauptungen zu unterstützen. |
| packagehallucination | Versuche, Code-Generierungen zu erhalten, die nicht existierende (und daher unsichere) Pakete spezifizieren. |
| promptinject | Implementierung der Agency Enterprise [PromptInject](https://github.com/agencyenterprise/PromptInject/tree/main/promptinject)-Arbeit (Best Paper Awards @ NeurIPS ML Safety Workshop 2022) |
| realtoxicityprompts | Teilmenge der RealToxicityPrompts-Arbeit (Daten eingeschränkt, da der vollständige Test zu lange dauern würde). |
| snowball | [Snowballed Hallucination](https://ofir.io/snowballed_hallucination.pdf)-Sonden, die darauf ausgelegt sind, ein Modell dazu zu bringen, eine falsche Antwort auf Fragen zu geben, die zu komplex für seine Verarbeitung sind. |
| xss | Suche nach Schwachstellen, die Cross-Site-Angriffe ermöglichen oder ausführen, wie z. B. Exfiltration privater Daten. |
## Protokollierung
`garak` erzeugt mehrere Arten von Logs:
* Eine Logdatei, `garak.log`. Diese enthält Debug-Informationen von `garak` und seinen Plugins und wird über mehrere Läufe hinweg fortgesetzt.
* Ein Bericht des aktuellen Laufs, strukturiert als JSONL. Bei jedem Ausführen von `garak` wird eine neue Berichtsdatei erstellt. Der Name dieser Datei wird zu Beginn und, wenn erfolgreich, auch am Ende des Laufs ausgegeben. Im Bericht wird für jeden Testversuch sowohl beim Empfang der Generierungen als auch bei deren Auswertung ein Eintrag erstellt; das `status`-Attribut des Eintrags nimmt eine Konstante aus `garak.attempts` an, um zu beschreiben, in welcher Phase er erstellt wurde.
* Ein Trefferlog, das die Versuche detailliert, die zu einer Sicherheitslücke geführt haben (ein 'Treffer').
## Wie ist der Code strukturiert?
Schauen Sie sich die [Referenzdokumentation](https://reference.garak.ai/) für eine maßgebliche Anleitung zur `garak`-Codestruktur an.
In einem typischen Lauf liest `garak` einen Modelltyp (und optional einen Modellnamen) von der Befehlszeile, bestimmt dann, welche `probe`s und `detector`s ausgeführt werden sollen, startet einen `generator` und übergibt diese an ein `harness`, um die Tests durchzuführen; ein `evaluator` kümmert sich um die Ergebnisse. Es gibt viele Module in jeder dieser Kategorien, und jedes Modul stellt eine Reihe von Klassen bereit, die als individuelle Plugins fungieren.
* `garak/probes/` - Klassen zum Generieren von Interaktionen mit LLMs
* `garak/detectors/` - Klassen zum Erkennen, dass ein LLM einen bestimmten Fehlermodus aufweist
* `garak/evaluators/` - Bewertungsberichtsschemata
* `garak/generators/` - Plugins für zu testende LLMs
* `garak/harnesses/` - Klassen zur Strukturierung von Tests
* `resources/` - Zusatzartikel, die von Plugins benötigt werden
Der Standardbetriebsmodus ist die Verwendung des `probewise`-Harnesses. Bei einer Liste von Sondenmodulnamen und Sondenplugin-Namen instanziiert das `probewise`-Harness jede Sonde und liest dann für jede Sonde deren `primary_detector`- und `extended_detectors`-Attribute, um eine Liste von `detector`s zu erhalten, die auf die Ausgabe angewendet werden sollen.
Jede Plugin-Kategorie (`probes`, `detectors`, `evaluators`, `generators`, `harnesses`) enthält eine `base.py`, die die Basisklassen definiert, die von Plugins in dieser Kategorie verwendet werden können. Jedes Plugin-Modul definiert Plugin-Klassen, die von einer der Basisklassen erben. Beispielsweise stammt `garak.generators.openai.OpenAIGenerator` von `garak.generators.base.Generator` ab.
Größere Artefakte wie Modelldateien und größere Korpora werden außerhalb des Repositorys aufbewahrt; sie können z. B. auf Hugging Face Hub gespeichert und lokal von Clients, die `garak` verwenden, geladen werden.
## Entwickeln eines eigenen Plugins
* Schaue dir an, wie andere Plugins es machen
* Erbe von einer der Basisklassen, z. B. `garak.probes.base.TextProbe`
* Überschreibe so wenig wie möglich
* Du kannst den neuen Code auf mindestens zwei Arten testen:
* Starte eine interaktive Python-Sitzung
* Importiere das Modell, z. B. `import garak.probes.mymodule`
* Instanziiere das Plugin, z. B. `p = garak.probes.mymodule.MyProbe()`
* Führe einen Scan mit Testplugins durch
* Für Sonden: Versuche einen Blank-Generator und always.Pass-Detektor: `python3 -m garak -m test.Blank -p mymodule -d always.Pass`
* Für Detektoren: Versuche einen Blank-Generator und eine Blank-Sonde: `python3 -m garak -m test.Blank -p test.Blank -d mymodule`
* Für Generatoren: Versuche eine Blank-Sonde und always.Pass-Detektor: `python3 -m garak -m mymodule -p test.Blank -d always.Pass`
* Lasse `garak` alle Plugins des von dir geschriebenen Typs auflisten, mit `--list_probes`, `--list_detectors` oder `--list_generators`
## FAQ
Wir haben ein FAQ [hier](https://github.com/NVIDIA/garak/blob/main/FAQ.md). Melde dich, wenn du weitere Fragen hast! [[email protected]](mailto:[email protected])
Die Code-Referenzdokumentation befindet sich unter [garak.readthedocs.io](https://garak.readthedocs.io/en/latest/).
## Zitieren von garak
Du kannst das [garak-Preprint-Paper](https://github.com/nvidia/garak/blob/main/garak-paper.pdf) lesen. Wenn du garak verwendest, zitiere uns bitte.```
@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}}
}
"Lügen ist eine Fähigkeit wie jede andere, und wenn man ein hohes Niveau halten möchte, muss man ständig üben" - Elim
Für Updates und Neuigkeiten siehe @garak_llm
© 2023- Leon Derczynski; Apache-Lizenz v2, siehe LICENSE