Zurück zu den Updates
New releaseAug 5, 2026

garak v0.16.0

Modularer LLM-Schwachstellenscanner, der mit statischen, dynamischen und adaptiven Sonden nach Halluzinationen, Datenlecks, Prompt-Injection, Jailbreaks und Toxizität über mehrere Modellanbieter hinweg sucht.

Teilen

garak, LLM-Schwachstellenscanner

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.

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

Erste Schritte

> Siehe unsere Benutzeranleitung! docs.garak.ai

> Tritt unserem Discord bei!

> Twitter: @garak_llm

> DEF CON Folien!


LLM-Unterstützung

unterstützt derzeit:

Installation:

garak ist ein Kommandozeilen-Tool. Es wird unter Linux und OSX entwickelt.

Standardinstallation mit pip

Einfach 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

Von der Quelle klonen

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

Erste Schritte

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.

Für Hilfe und Inspiration finden Sie uns auf Twitter oder Discord!

Beispiele

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

Auswertung der Ergebnisse

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

Und die gleichen Ergebnisse für ChatGPT: alt text

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!

Einführung in die Generatoren

Hugging Face

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

OpenAI

  • --target_type openai
  • --target_name - das OpenAI-Modell, das Sie verwenden möchten. gpt-5-nano ist schnell und gut zum Testen geeignet.
  • setzen Sie die Umgebungsvariable OPENAI_API_KEY auf Ihren OpenAI-API-Schlüssel (z. B. "sk-19763ASDF87q6657"); siehe https://platform.openai.com/account/api-keys nach der Anmeldung

Erkannte 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

Ö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

Cohere

  • --target_type cohere
  • --target_name (optional, standardmäßig command) - Das spezifische Cohere-Modell, das Sie testen möchten
  • setzen Sie die Umgebungsvariable COHERE_API_KEY auf Ihren Cohere-API-Schlüssel, z. B. "aBcDeFgHiJ123456789"; siehe https://dashboard.cohere.ai/api-keys nach der Anmeldung

Groq

  • --target_type groq
  • --target_name - Der Name des Modells, auf das über die Groq-API zugegriffen werden soll
  • setzen Sie die Umgebungsvariable GROQ_API_KEY auf Ihren Groq-API-Schlüssel; siehe https://console.groq.com/docs/quickstart für Details zum Erstellen eines API-Schlüssels

ggml

  • --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.bin
  • setzen Sie die Umgebungsvariable GGML_MAIN_PATH auf den Pfad zu Ihrer ggml-main-Ausführbaren

REST

rest.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.

NIM

Verwenden Sie Modelle von https://build.nvidia.com/ oder anderen NIM-Endpunkten.

  • setzen Sie die Umgebungsvariable NIM_API_KEY auf Ihr Authentifizierungs-API-Token, oder geben Sie es in der Konfigurations-YAML an

Für Chat-Modelle:

  • --target_type nim
  • --target_name - der NIM-Modellname, z. B. meta/llama-3.1-8b-instruct

Für Completion-Modelle:

  • --target_type nim.NVOpenAICompletion
  • --target_name - der NIM-Modellname, z. B. bigcode/starcoder2-15b

AWS Bedrock

  • --target_type bedrock
  • --target_name - die Bedrock-Modell-ID oder der Alias, z. B. anthropic.claude-3-sonnet-20240229-v1:0 oder claude-3-sonnet
  • setzen Sie die Umgebungsvariable BEDROCK_API_KEY auf Ihren AWS-Bedrock-API-Schlüssel; siehe https://docs.aws.amazon.com/bedrock/latest/userguide/api-keys-use.html für Einrichtungsanweisungen
  • (optional) setzen Sie die Umgebungsvariable BEDROCK_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

Kategorien