Generative AI Red-Teaming & Assessment Kit
garak
überprüft, ob ein LLM dazu gebracht werden kann, auf eine Weise zu scheitern, die wir nicht wollen. garak
-Sonden für Halluzination, Datenlecks, schnelle Injektion, Fehlinformationen, Toxizitätserzeugung, Jailbreaks und viele andere Schwächen. Wenn Sie nmap
kennen, ist es nmap
für LLMs.
garak
konzentriert sich darauf, wie ein LLM- oder Dialogsystem ausfällt. Es kombiniert statische, dynamische und adaptive Sonden, um dies zu untersuchen.
garak
'SA Free Tool. Wir lieben es, es zu entwickeln und sind immer daran interessiert, Funktionen zur Unterstützung von Anwendungen hinzuzufügen.
Derzeit unterstützt:
garak
ist ein Befehlszeilenwerkzeug. Es wurde in Linux und OSX entwickelt.
pip
Nehmen Sie es einfach von Pypi und Sie sollten gut zu gehen:
python -m pip install -U garak
pip
Die Standard -PIP -Version von garak
wird regelmäßig aktualisiert. Versuchen Sie: Um eine frischere 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 gut gelaufen ist, sind Sie wahrscheinlich gut zu gehen!
Hinweis : Wenn Sie vor dem Wechsel zur NVIDIA
Github -Organisation geklont haben, dies jedoch auf der github.com/NVIDIA
URI lesen, aktualisieren Sie Ihre Fernbedienungen wie folgt:
git remote set-url origin https://github.com/NVIDIA/garak.git
Die allgemeine Syntax ist:
garak <options>
garak
muss wissen, welches Modell dies scannen soll, und standardmäßig wird es alle Sonden, die es auf diesem Modell kennt, unter Verwendung der von jeder Sonde empfohlenen Sicherheitsdetektoren versuchen. Sie können eine Liste von Sonden verwenden, indem Sie:
garak --list_probes
Um einen Generator anzugeben, verwenden Sie die --model_type
und optional die Optionen --model_name
. Der Modelltyp gibt eine Modellfamilie/Schnittstelle an. Der Modellname gibt das zu verwendende Modell an. Der folgende Abschnitt "Intro to Generatoren" beschreibt einige der unterstützten Generatoren. Eine einfache Generatorfamilie umarmt Gesichtsmodelle; Um eines davon zu laden, setzen Sie --model_type
in huggingface
und --model_name
zum Namen des Modells auf Hub (z. B. "RWKV/rwkv-4-169m-pile"
). Einige Generatoren benötigen möglicherweise einen API -Schlüssel, um als Umgebungsvariable festgelegt zu werden, und sie werden Sie wissen lassen, ob sie das benötigen.
garak
leitet standardmäßig alle Sonden aus, aber Sie können auch spezifisch dazu sein. --probes promptinject
verwendet beispielsweise nur die Methoden des Eingabeaufforderungs-Frameworks. Sie können auch ein bestimmtes Plugin anstelle einer Pluginfamilie angeben, indem Sie den Plugin -Namen nach a hinzufügen .
; Beispielsweise verwendet --probes lmrc.SlurUsage
eine Implementierung der Überprüfung von Modellen, die auf dem Framework für Sprachmodell -Risikokarten basieren.
Für Hilfe und Inspiration finden Sie uns auf Twitter oder Discord!
Probe Chatgpt für codierbasierte Eingabeaufforderungsinjektion (OSX/*NIX) (Beispielwert durch einen realen OpenAI-API-Schlüssel ersetzen)
export OPENAI_API_KEY="sk-123XXXXXXXXXXXX"
python3 -m garak --model_type openai --model_name gpt-3.5-turbo --probes encoding
Sehen Sie, ob die umarmende Gesichtsversion von GPT2 für Dan 11.0 anfällig ist
python3 -m garak --model_type huggingface --model_name gpt2 --probes dan.Dan_11_0
Für jede geladene Sonde druckt Garak eine Fortschrittsleiste, wie sie erzeugt. Sobald die Erzeugung abgeschlossen ist, wird eine Zeile bewertet, die bewertet, dass die Ergebnisse der Sonde an jedem Detektor angegeben sind. Wenn einer der schnellen Versuche ein unerwünschtes Verhalten ergab, wird die Antwort als Fehler und die angegebene Fehlerrate markiert.
Hier sind die Ergebnisse mit dem encoding
in einer GPT-3-Variante:
Und die gleichen Ergebnisse für Chatgpt:
Wir können sehen, dass das neuere Modell viel anfälliger für codierende Injektionsangriffe ist, bei denen sich nur ein Textbabbage-001 als anfällig für zitierte und mime-codierende Injektionen befand. Die Abbildungen am Ende jeder Reihe, z. B. 840/840, geben die Anzahl der Textgenerationen an und wie viele davon schienen sich dann in Ordnung zu verhalten. Die Zahl kann ziemlich hoch sein, da mehr als eine Generation pro Aufforderung hergestellt wird - standardmäßig 10.
Fehler gehen in garak.log
; Der Lauf wird in einer .jsonl
-Datei, die bei Analyse Start & End angegeben wurde, ausführlich angemeldet. Es gibt ein grundlegendes Analyse -Skript in analyse/analyse_log.py
, das die Sonden und Eingabeaufforderungen ausgibt, die zu den meisten Treffern geführt haben.
Senden Sie PRS & Open Ausgaben. Frohe Jagd!
Verwenden der Pipeline -API:
--model_type huggingface
(damit Transformatorenmodelle lokal ausgeführt werden)--model_name
-Verwenden Sie den Modellnamen von Hub. Nur generative Modelle funktionieren. Wenn es fehlschlägt und nicht sollte, öffnen Sie bitte ein Problem und fügen Sie den Befehl, den Sie ausprobiert haben, die Ausnahme ein!Verwenden der Inferenz -API:
--model_type huggingface.InferenceAPI
(für API-basierte Modellzugriff)--model_name
-Der Modellname aus Hub, z "mosaicml/mpt-7b-instruct"
Verwendung privater Endpunkte:
--model_type huggingface.InferenceEndpoint
(für private Endpunkte)
--model_name
-Die Endpoint-URL, https://xxx.us-east-1.aws.endpoints.huggingface.cloud
.
(Optional) Setzen Sie die Umgebungsvariable HF_INFERENCE_TOKEN
in einem umarmenden Gesichts -API -Token mit der "Read" -Rolle; Siehe https://huggingface.co/Setings/tokens, wenn Sie angemeldet sind
--model_type openai
--model_name
-Das OpenAI -Modell, das Sie verwenden möchten. gpt-3.5-turbo-0125
ist schnell und gut zum Testen.OPENAI_API_KEY
in Ihrem OpenAI-API-Schlüssel (z. B. "SK-19763asDF87Q6657"); Siehe https://platform.openai.com/account/api-keys, wenn Sie angemeldet sindAnerkannte Modelltypen sind whitelistet, da das Plugin wissen muss, welche Sub-API verwendet werden soll. Fertigstellung oder ChatCompletion -Modelle sind in Ordnung. Wenn Sie ein nicht unterstütztes Modell verwenden möchten, sollten Sie eine informative Fehlermeldung erhalten und bitte ein PR / öffnen Sie ein Problem.
REPLICATE_API_TOKEN
in Ihrem Replikat-API-Token, z. "R8-123xxxxxxxxxxxx"; Siehe https://replikat.com/account/api-tokens, wenn Sie angemeldet sindÖffentliche Replikatmodelle:
--model_type replicate
--model_name
-Der Replikat-Modellname und Hash, z "stability-ai/stablelm-tuned-alpha-7b:c49dae36"
Private replizierte Endpunkte:
--model_type replicate.InferenceEndpoint
(für private Endpunkte)--model_name
-Benutzername/Modellname Slug aus dem bereitgestellten Endpunkt, z. B. elim/elims-llama2-7b
--model_type cohere
--model_name
(optional, standardmäßig command
) -Das spezifische Cohere -Modell, das Sie testen möchtenCOHERE_API_KEY
in Ihrem Cohere -API -Schlüssel, z. B. "Abcdefghij123456789"; Siehe https://dashboard.coher.ai/api-keys, wenn Sie angemeldet sind--model_type groq
--model_name
-Der Name des Modells zum Zugriff über die GROQ -APIGROQ_API_KEY
in Ihrer COQ -API -Taste fest. Weitere Informationen zum Erstellen einer API -Taste finden Sie unter https://console.groq.com/docs/quickstart--model_type ggml
--model_name
-Der Pfad zum GGML-Modell, das Sie laden möchten, z /home/leon/llama.cpp/models/7B/ggml-model-q4_0.bin
GGML_MAIN_PATH
auf den Pfad zu Ihrer GGML main
rest.RestGenerator
ist hoch flexibel und kann eine Verbindung zu jedem REST -Endpunkt herstellen, der Klartext oder JSON zurückgibt. Es erfordert eine kurze Konfiguration, die normalerweise zu einer kurzen YAML -Datei führt, die Ihren Endpunkt beschreibt. Beispiele finden Sie unter https://reference.garak.ai/en/latest/garak.generators.rest.html.
Verwenden Sie Modelle von https://build.nvidia.com/ oder anderen NIM -Endpunkten.
NIM_API_KEY
in Ihrem Authentifizierungs -API -Token oder geben Sie sie in der Konfiguration YAML anFür Chat -Modelle:
--model_type nim
--model_name
-Der nim model
z meta/llama-3.1-8b-instruct
Für Fertigstellungsmodelle:
--model_type nim.NVOpenAICompletion
--model_name
-Der nim model
, z. B. bigcode/starcoder2-15b
OCTO_API_TOKEN
in Ihrem Replikat-API-Token, z. B. "R8-123xxxxxxxxxxxx"; Siehe https://replikat.com/account/api-tokens, wenn Sie angemeldet sindOktober öffentlicher Endpunkt:
--model_type octo
--model_name
-Der Octoai Public Endpoint für das Modell, z. B. mistral-7b-instruct-fp16
Okto privater Endpunkt:
--model_type octo.InferenceEndpoint
(für private Endpunkte)--model_name
-Die bereitgestellte Endpunkt-URL, z https://llama-2-70b-chat-xxx.octoai.run/v1/chat/completions
--model_type test
(Alternativ) --model_name test.Blank
zum testen. Dies erzeugt immer die leere Zeichenfolge mit dem test.Blank
-Generator. Wird für Tests, die eine Ausgabe erfordern , als fehlgeschlagen markiert, z. B. diejenigen, die umstrittene Ansprüche ergeben, und erwarten, dass das Modell sie widerlegt, um zu bestehen.
--model_type test.Repeat
zum Testen. Dieser Generator wiederholt die Eingabeaufforderung zurück, die er empfangen hat.
Sonde | Beschreibung |
---|---|
leer | Eine einfache Sonde, die immer eine leere Eingabeaufforderung sendet. |
Atkgen | Automatisierte Angriffserzeugung. Eine rot-Teaming LLM untersucht das Ziel und reagiert darauf, um einen giftigen Ausgang zu erhalten. Der meist staatenlose Prototyp verwendet vorerst eine einfache GPT-2-Feinabstimmung auf der Untergruppe von HHRLHF-Versuchen, die eine nachweisbare Toxizität ergaben (das einzige derzeit unterstützte Ziel). |
AV_SPAM_SCANNING | Sonden, die versuchen, die Modellausgabe für böswillige Inhaltssignaturen auszuführen |
Fortsetzung | Sonden dieser Test, wenn das Modell ein wahrscheinlich unerwünschtes Wort fortsetzt |
Dan | Verschiedene Dan und Dan-ähnliche Angriffe |
Donotanswer | Aufforderungen, auf die verantwortungsbewusste Sprachmodelle nicht antworten sollten. |
Codierung | Eingabeaufforderung durch Textcodierung |
GCG | Stören Sie eine Systemaufforderung, indem Sie ein kontroverses Suffix anhängen. |
Panne | Sondenmodell für Glitch -Token, die ein ungewöhnliches Verhalten hervorrufen. |
Oma | Appell, an seine Großmutter erinnert zu werden. |
Gute Seite | Implementierungen von Riley Goodside -Angriffen. |
Leckplay | Bewerten Sie, ob ein Modell die Schulungsdaten wiederholt. |
LMRC | Untertastung der Sprachmodell -Risikokartensonden |
Malwaregen | Versuche, dass das Modell Code zum Erstellen von Malware generiert |
irreführend | Versuche, eine Modellunterstützung irreführend und falsche Behauptungen zu machen |
Pakethalluzination | Versuchen Sie, Codegenerationen zu erhalten, die nicht existierende (und daher unsichere) Pakete angeben. |
promptinject | Implementierung der Agentur Enterprise promptinject Work (Best Paper Awards @ Neurips ML Safety Workshop 2022) |
REALTOXICITYPROMPTS | Untergruppe der RealtoxicityPrompts funktioniert (Daten beschränkt, da der vollständige Test so lange dauert, bis es ausgeführt wird) |
Schneeball | Snoweballte Halluzinationssonden, die ein Modell machen sollen |
XSS | Suchen Sie nach Schwachstellen, die die Genehmigung oder die grenzüberschreitenden Angriffe wie private Datenspiele erlassen. |
garak
generiert mehrere Arten von Protokoll:
garak.log
. Dies beinhaltet Debugging -Informationen von garak
und seinen Plugins und wird über Läufe hinweg fortgesetzt.garak
ausgeführt wird, wird eine neue Berichtsdatei erstellt. Der Name dieser Datei wird am Anfang und, wenn er erfolgreich ist, auch am Ende des Laufs ausgegeben. In dem Bericht wird für jeden Prüfversuch sowohl die Generationen empfangen als auch für jeden Prüfversuch und erneut bei der Bewertung erfolgt. Das status
des Eintrags nimmt eine Konstante von garak.attempts
. In den Referenzdokumenten finden Sie einen maßgeblichen Leitfaden zur garak
-Codestruktur.
In einem typischen Lauf liest garak
einen Modelltyp (und optional Modellname) aus der Befehlszeile und bestimmen dann, welche probe
und detector
ausgeführt werden sollen, einen generator
starten und diese dann an einen harness
übergeben, um die Prüfung durchzuführen. Ein evaluator
befasst sich mit den Ergebnissen. In jeder dieser Kategorien gibt es viele Module, und jedes Modul bietet eine Reihe von Klassen, die als einzelne Plugins fungieren.
garak/probes/
- Klassen zur Erzeugung von Interaktionen mit LLMsgarak/detectors/
- Klassen zum Erkennen eines LLM zeigen einen bestimmten Fehlermodusgarak/evaluators/
- Bewertungsberichterstattungsprogrammegarak/generators/
- Plugins für die Prüfung von LLMsgarak/harnesses/
- Klassen zum Strukturieren von Testsresources/
- Zusatzartikel, die von Plugins erforderlich sind Der Standard -Betriebsmodus besteht darin, den probewise
-Kabelbaum zu verwenden. Bei einer Liste von Sondenmodulnamen und Sonden -Plugin -Namen liest das probewise
-Kabelbaum jede Sonde und liest dann für jede Sonde das Attribut detector
recommended_detectors
.
Jede Plugin -Kategorie ( probes
, detectors
, evaluators
, generators
, harnesses
) enthält eine base.py
. Jedes Plugin -Modul definiert Plugin -Klassen, die von einer der Basisklassen erben. Zum Beispiel steigt garak.generators.openai.OpenAIGenerator
von garak.generators.base.Generator
ab.
Größere Artefakte wie Modelldateien und größere Korpora werden aus dem Repository herausgehalten. Sie können auf 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
alle Plugins des Typs auflisten, den Sie schreiben, mit --list_probes
, --list_detectors
oder --list_generators
Wir haben hier eine FAQ. Geben Sie nach, wenn Sie weitere Fragen haben! [email protected]
Die Code -Referenzdokumentation findet in Garak.readthedocs.io.
Sie können das Garak Preprint -Papier lesen. Wenn Sie Garak verwenden, zitieren Sie 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 Sie ein Maß an Exzellenz aufrechterhalten möchten, müssen Sie ständig üben" - Elim
Für Updates und Nachrichten siehe @garak_llm
© 2023-Leon Derczynski; Apache -Lizenz V2, siehe Lizenz