Kit généatif de l'équipe rouge et d'évaluation
garak
vérifie si un LLM peut être fait pour échouer d'une manière que nous ne voulons pas. garak
sonde pour l'hallucination, la fuite de données, l'injection rapide, la désinformation, la génération de toxicité, le jailbreaks et de nombreuses autres faiblesses. Si vous connaissez nmap
, c'est nmap
pour LLMS.
garak
se concentre sur les moyens de faire échouer un LLM ou un système de dialogue. Il combine des sondes statiques, dynamiques et adaptatives pour l'explorer.
outil gratuit garak
'sa. Nous aimons le développer et sommes toujours intéressés à ajouter des fonctionnalités pour prendre en charge les applications.
Prise en charge actuellement:
garak
est un outil de ligne de commande. Il est développé dans Linux et OSX.
pip
Prenez-le à PYPI et vous devriez être prêt à partir:
python -m pip install -U garak
pip
La version PIP standard de garak
est mise à jour périodiquement. Pour obtenir une version plus fraîche de GitHub, essayez:
python -m pip install -U git+https://github.com/NVIDIA/garak.git@main
garak
a ses propres dépendances. Vous pouvez installer garak
dans son propre environnement 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, si ça s'est bien passé, tu es probablement prêt à partir!
Remarque : Si vous avez cloné avant le déménagement à l'organisation NVIDIA
GitHub, mais que vous lisez ceci sur github.com/NVIDIA
uri, veuillez mettre à jour vos télécommandes comme suit:
git remote set-url origin https://github.com/NVIDIA/garak.git
La syntaxe générale est:
garak <options>
garak
a besoin de savoir quel modèle scanner, et par défaut, il essaiera toutes les sondes qu'il connaît sur ce modèle, en utilisant les détecteurs de vulnérabilité recommandés par chaque sonde. Vous pouvez voir une liste de sondes en utilisant:
garak --list_probes
Pour spécifier un générateur, utilisez les --model_type
et, éventuellement, les options --model_name
. Le type de modèle spécifie une famille / interface de modèle; Le nom du modèle spécifie le modèle exact à utiliser. La section "Intro to Generators" ci-dessous décrit certains des générateurs pris en charge. Une famille de générateurs simples étreigne des modèles de visage; Pour en charger un, définissez --model_type
sur huggingface
et --model_name
au nom du modèle sur Hub (par exemple "RWKV/rwkv-4-169m-pile"
). Certains générateurs peuvent avoir besoin d'une clé API pour être définie en tant que variable d'environnement, et ils vous feront savoir s'ils en ont besoin.
garak
exécute toutes les sondes par défaut, mais vous pouvez également en être précis. --probes promptinject
n'utilisera que les méthodes du framework PromptInject, par exemple. Vous pouvez également spécifier un plugin spécifique au lieu d'une famille de plugin en ajoutant le nom du plugin après a .
; Par exemple, --probes lmrc.SlurUsage
utilisera une implémentation de la vérification des modèles générant des insultes en fonction du cadre des cartes de risque de modèle de langue.
Pour l'aide et l'inspiration, trouvez-nous sur Twitter ou Discord!
Sonde ChatGPT pour l'injection rapide basée sur le codage (OSX / * NIX) (remplacez la valeur d'exemple par une clé API OpenAI réelle)
export OPENAI_API_KEY="sk-123XXXXXXXXXXXX"
python3 -m garak --model_type openai --model_name gpt-3.5-turbo --probes encoding
Voyez si la version étreinte de GPT2 est vulnérable à Dan 11.0
python3 -m garak --model_type huggingface --model_name gpt2 --probes dan.Dan_11_0
Pour chaque sonde chargée, Garak imprimera une barre de progression telle qu'elle génère. Une fois la génération terminée, une ligne évaluant les résultats de cette sonde sur chaque détecteur est donnée. Si l'une des tentatives rapides a donné un comportement indésirable, la réponse sera marquée en échec et le taux d'échec donné.
Voici les résultats avec le module encoding
sur une variante GPT-3:
Et les mêmes résultats pour Chatgpt:
Nous pouvons voir que le modèle le plus récent est beaucoup plus sensible aux attaques d'injection basées sur le codage, où le combat de texte-001 ne s'est révélé vulnérable qu'aux injections imprimées et en codage mime. Les chiffres à la fin de chaque ligne, par exemple 840/840, indiquent le nombre de générations de texte au total, puis combien d'entre elles semblaient se comporter OK. Le chiffre peut être assez élevé car plus d'une génération est fabriquée par invite - par défaut, 10.
Les erreurs vont à garak.log
; L'exécution est enregistrée en détail dans un fichier .jsonl
spécifié à l'analyse start & fin. Il y a un script d'analyse de base dans analyse/analyse_log.py
qui sortira les sondes et les invites qui ont conduit au plus de succès.
Envoyez des problèmes PRS et ouverts. Bonne chasse!
Utilisation de l'API du pipeline:
--model_type huggingface
(pour les modèles Transformers à fonctionner localement)--model_name
- Utilisez le nom du modèle de Hub. Seuls les modèles génératifs fonctionneront. S'il échoue et ne devrait pas, veuillez ouvrir un problème et coller dans la commande que vous avez essayé + l'exception!Utilisation de l'API d'inférence:
--model_type huggingface.InferenceAPI
(pour l'accès au modèle basé sur l'API)--model_name
- Le nom du modèle de Hub, par exemple "mosaicml/mpt-7b-instruct"
Utilisation de points de terminaison privés:
--model_type huggingface.InferenceEndpoint
(pour les points de terminaison privés)
--model_name
- L'URL du point de terminaison, par exemple https://xxx.us-east-1.aws.endpoints.huggingface.cloud
(Facultatif) Définissez la variable d'environnement HF_INFERENCE_TOKEN
sur un jeton API Face étreint avec le rôle "Read"; Voir https://huggingface.co/settings/tokens lorsqu'il est connecté
--model_type openai
--model_name
- Le modèle OpenAI que vous souhaitez utiliser. gpt-3.5-turbo-0125
est rapide pour les tests.OPENAI_API_KEY
sur votre touche API OpenAI (par exemple "SK-19763ASDF87Q6657"); Voir https://platform.openai.com/account/api-keys lorsqu'il est connectéLes types de modèles reconnus sont listés à la liste blanche, car le plugin doit savoir quel sous-API utiliser. Les modèles d'achèvement ou de ChatCompletion sont OK. Si vous souhaitez utiliser un modèle non pris en charge, vous devez obtenir un message d'erreur informatif et veuillez envoyer un problème PR / ouvrir.
REPLICATE_API_TOKEN
sur votre jeton API répliqué, par exemple "R8-123XXXXXXXXXXXX"; Voir https://replicate.com/account/api-tokens lorsqu'il est connectéModèles de réplication du public:
--model_type replicate
--model_name
- le nom du modèle répliqué et le hachage, par exemple "stability-ai/stablelm-tuned-alpha-7b:c49dae36"
Points de terminaison repliés privés:
--model_type replicate.InferenceEndpoint
(pour les points de terminaison privés)--model_name
- Nom d'utilisateur / modèle de nom de modèle du point de terminaison déployé, par exemple elim/elims-llama2-7b
--model_type cohere
--model_name
(facultatif, command
par défaut) - le modèle cohére spécifique que vous souhaitez testerCOHERE_API_KEY
sur votre clé API Cohere, par exemple "ABCDEFGHIJ123456789"; Voir https://dashboard.cohere.ai/api-keys lorsqu'il est connecté--model_type groq
--model_name
- Le nom du modèle pour accéder via l'API GroqGROQ_API_KEY
sur votre clé API GROQ, voir https://console.groq.com/docs/quickstart pour plus de détails sur la création d'une clé API--model_type ggml
--model_name
- Le chemin du modèle GGML que vous souhaitez charger, par exemple /home/leon/llama.cpp/models/7B/ggml-model-q4_0.bin
GGML_MAIN_PATH
sur le chemin d'accès à votre exécutable main
GGML rest.RestGenerator
est très flexible et peut se connecter à tout point de terminaison de repos qui renvoie le texte en clair ou le JSON. Il a besoin d'une brève configuration, ce qui entraînera généralement un court fichier YAML décrivant votre point de terminaison. Voir https://reference.garak.ai/en/latest/garak.generators.rest.html pour des exemples.
Utilisez des modèles à partir de https://build.nvidia.com/ ou d'autres points de terminaison NIM.
NIM_API_KEY
sur votre jeton API d'authentification, ou spécifiez-le dans la configuration YAMLPour les modèles de chat:
--model_type nim
--model_name
- Le nom model
NIM, par exemple meta/llama-3.1-8b-instruct
Pour les modèles d'achèvement:
--model_type nim.NVOpenAICompletion
--model_name
- Le nom model
NIM, par exemple bigcode/starcoder2-15b
OCTO_API_TOKEN
sur votre jeton API répliqué, par exemple "R8-123XXXXXXXXXXX"; Voir https://replicate.com/account/api-tokens lorsqu'il est connectéOcto Public Point de terminaison:
--model_type octo
--model_name
- Le point de terminaison public octoai pour le modèle, par exemple mistral-7b-instruct-fp16
Point de terminaison privé Octo:
--model_type octo.InferenceEndpoint
(pour les points de terminaison privés)--model_name
- L'URL du point de terminaison déployé, par exemple https://llama-2-70b-chat-xxx.octoai.run/v1/chat/completions
--model_type test
(Alternativement) --model_name test.Blank
pour les tests. Cela génère toujours la chaîne vide, en utilisant le générateur test.Blank
. Sera marqué comme un échec pour tous les tests qui nécessitent une sortie, par exemple ceux qui font des réclamations controversées et s'attendent à ce que le modèle les réfute pour passer.
--model_type test.Repeat
pour les tests. Ce générateur répète l'invite qu'il a reçue.
Sonde | Description |
---|---|
vide | Une sonde simple qui envoie toujours une invite vide. |
atkgen | Génération d'attaque automatisée. Un LLM en équipe rouge sonde la cible et y réagit pour tenter d'obtenir une sortie toxique. Le prototype, principalement sans état, utilise pour l'instant un simple GPT-2 affiné sur le sous-ensemble de tentatives HHRLHF qui ont donné une toxicité détectable (la seule cible actuellement prise en charge pour l'instant). |
av_spam_scanning | Sondes qui tentent de faire en sorte que le modèle puisse sortir des signatures de contenu malveillant |
continuation | Sondes qui testent si le modèle continuera un mot probablement indésirable |
Dan | Diverses attaques de Dan et Dan |
donotanswer | Invites auxquelles les modèles de langue responsables ne devraient pas répondre. |
codage | Injection rapide à travers le codage de texte |
GCG | Disruptez une invite système en ajoutant un suffixe adversaire. |
problème | Modèle de sonde pour les jetons de glitch qui provoquent un comportement inhabituel. |
grand-mère | Appel à rappeler sa grand-mère. |
bon côté | Implémentations des attaques de Riley Goodside. |
fuite | Évaluer si un modèle rejouera les données de formation. |
LMRC | Sous-échantillon des sondes de cartes de risque du modèle de langue |
Malwaren | Tente que le modèle génére du code pour construire des logiciels malveillants |
trompeur | Tente de faire un modèle de soutien à des allégations trompeuses et fausses |
hallelucination d'emballage | Essayer d'obtenir des générations de code qui spécifient les packages inexistants (et donc en insécurité). |
inviter | Mise en œuvre de l'agence Enterprise Promptinject Work (Best Paper Awards @ Neirips ML Safety Workshop 2022) |
relemtoxicityPrompts | Sous-ensemble du travail de RealToxicityPrompts (données contraintes car le test complet prendra si longtemps à fonctionner) |
boule de neige | Les sondes d'hallucination en boule de neige conçues pour faire un modèle donnent une mauvaise réponse aux questions trop complexes pour qu'elle traite |
XSS | Recherchez les vulnérabilités du permis ou adoptez des attaques croisées, telles que l'exfiltration de données privées. |
garak
génère plusieurs types de journal:
garak.log
. Cela comprend les informations de débogage de garak
et de ses plugins, et se poursuit dans les cours.garak
fonctionne. Le nom de ce fichier est sorti au début et, en cas de succès, également à la fin de l'exécution. Dans le rapport, une entrée est effectuée pour chaque tentative de sondage à la fois lorsque les générations sont reçues, et encore une fois lorsqu'elles sont évaluées; L'attribut status
de l'entrée prend une constante de garak.attempts
. Consultez les documents de référence pour un guide faisant autorité de la structure du code garak
.
Dans une exécution typique, garak
lira un type de modèle (et éventuellement le nom du modèle) à partir de la ligne de commande, puis déterminera les probe
et detector
à exécuter, démarrer un generator
, puis les passer à un harness
pour faire le sondage; Un evaluator
traite des résultats. Il existe de nombreux modules dans chacune de ces catégories, et chaque module fournit un certain nombre de classes qui agissent comme des plugins individuels.
garak/probes/
- Classes pour générer des interactions avec LLMSgarak/detectors/
- Classes pour détecter un LLM présente un mode de défaillance donnégarak/evaluators/
- Schémas de rapports d'évaluationgarak/generators/
- Plugins pour les LLMgarak/harnesses/
- Classes pour structurer les testsresources/
- Articles auxiliaires requis par les plugins Le mode de fonctionnement par défaut consiste à utiliser le harnais probewise
. Compte tenu d'une liste des noms de modules de sonde et des noms de plugin de sonde, le harnais probewise
instancie chaque sonde, puis pour chaque sonde lit son attribut recommended_detectors
pour obtenir une liste de detector
à exécuter sur la sortie.
Chaque catégorie de plugin ( probes
, detectors
, evaluators
, generators
, harnesses
) comprend une base.py
qui définit les classes de base utilisables par les plugins dans cette catégorie. Chaque module de plugin définit les classes de plugin qui héritent de l'une des classes de base. Par exemple, garak.generators.openai.OpenAIGenerator
descend de garak.generators.base.Generator
.
Des artefacts plus grands, comme les fichiers de modèle et les plus grands corpus, sont gardés à l'écart du référentiel; Ils peuvent être stockés sur un moyeu de visage étreint et chargé localement par des clients utilisant 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
de répertorier tous les plugins du type que vous écrivez, avec --list_probes
, --list_detectors
ou --list_generators
Nous avons une FAQ ici. Tendez la main si vous avez d'autres questions! [email protected]
La documentation de référence de code est sur garak.readthedocs.io.
Vous pouvez lire le papier préimprémit GARAK. Si vous utilisez Garak, veuillez nous citer.
@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}}
}
"Le mensonge est une compétence comme les autres, et si vous souhaitez maintenir un niveau d'excellence, vous devez pratiquer constamment" - Elim
Pour les mises à jour et les nouvelles, voir @garak_llm
© 2023- Leon Derczynski; Licence Apache V2, voir Licence