生成的AI红色团队和评估套件
garak
检查是否可以以我们不想要的方式使LLM失败。 garak
探测幻觉,数据泄漏,及时注射,错误信息,毒性产生,越狱和许多其他弱点。如果您知道nmap
,则是LLM的nmap
。
garak
专注于制作LLM或对话系统失败的方式。它结合了静态,动态和自适应探针来探索这一点。
garak
免费工具。我们喜欢开发它,并且总是有兴趣添加功能以支持应用程序。
目前支持:
garak
是一个命令行工具。它是在Linux和OSX中开发的。
pip
的标准安装只需从PYPI中抓住它,您应该很好地去:
python -m pip install -U garak
pip
安装开发版本garak
的标准PIP版本定期更新。要从Github获取新版本,请尝试:
python -m pip install -U git+https://github.com/NVIDIA/garak.git@main
garak
有自己的依赖性。您可以在自己的Conda环境中安装garak
:
conda create --name garak "python>=3.10,<=3.12"
conda activate garak
gh repo clone NVIDIA/garak
cd garak
python -m pip install -e .
好的,如果那很好,您可能会很好!
注意:如果您在搬到NVIDIA
GITHUB组织之前先克隆,但是您正在github.com/NVIDIA
uri上阅读此内容,请按照以下方式更新您的遥控器:
git remote set-url origin https://github.com/NVIDIA/garak.git
一般语法是:
garak <options>
garak
需要知道要扫描的模型,并且默认情况下,它将使用每个探针推荐的漏洞检测器,尝试在该模型上知道的所有探针。您可以使用以下方式查看探针列表
garak --list_probes
要指定发电机,请使用--model_type
,并且可以选择--model_name
选项。模型类型指定模型族/接口;模型名称指定要使用的确切型号。下面的“发电机介绍”部分描述了支持的一些发电机。一个直接的发电机家庭正在拥抱面部模型。要加载其中之一,将--model_type
设置为huggingface
和--model_name
到Hub上的模型名称(例如"RWKV/rwkv-4-169m-pile"
)。某些发电机可能需要设置为环境变量的API密钥,他们会让您知道是否需要。
garak
默认情况下运行所有探针,但您也可以对此进行具体说明。 - 例如, --probes promptinject
将仅使用Pystinject Framework的方法。您还可以通过在a之后添加插件名称来指定一个特定的插件,而不是插件家族.
;例如, --probes lmrc.SlurUsage
将使用基于语言模型风险卡框架生成诽谤的模型的检查实现。
为了获得帮助和灵感,请在Twitter或Discord上找到我们!
用于基于编码的提示注入(OSX/*NIX)的探针CHATGPT(用真实的OpenAI API键替换示例值)
export OPENAI_API_KEY="sk-123XXXXXXXXXXXX"
python3 -m garak --model_type openai --model_name gpt-3.5-turbo --probes encoding
查看GPT2的拥抱面部版本是否容易受到DAN 11.0的影响
python3 -m garak --model_type huggingface --model_name gpt2 --probes dan.Dan_11_0
对于每个加载的探针,Garak将在生成的过程中打印一个进度条。一旦生成完成,就会对每个检测器的探针结果进行评估。如果任何提示尝试产生了不良行为,则该响应将被标记为失败,并且给出了故障率。
这是GPT-3变体上encoding
模块的结果:
chatgpt的结果相同:
我们可以看到,最近的模型更容易受到编码的注射攻击,在这种攻击中,只发现文本支持者001很容易受到引用的印刷和MIME编码注射的影响。每行末尾的数字,例如840/840,表明文本世代的数量总数,然后其中有多少个表现可以。该图可能很高,因为每提示会产生以上的一代 - 默认情况下,10。
错误在garak.log
中出现;该运行在分析开始和结束时指定的.jsonl
文件中详细记录。 analyse/analyse_log.py
中有一个基本分析脚本,该脚本将输出导致命中最多的探针和提示。
发送公关和开放问题。狩猎快乐!
使用管道API:
--model_type huggingface
(用于在本地运行的变压器模型)--model_name
使用HUB中的型号名称。只有生成模型才能起作用。如果失败并且不应该,请打开一个问题并粘贴在您尝试的命令中 +例外!使用推理API:
--model_type huggingface.InferenceAPI
(用于基于API的模型访问)--model_name
枢纽的型号名称,例如"mosaicml/mpt-7b-instruct"
使用私人端点:
--model_type huggingface.InferenceEndpoint
(用于私人端点)
--model_name
端点URL,例如https://xxx.us-east-1.aws.endpoints.huggingface.cloud
(可选)将HF_INFERENCE_TOKEN
环境变量设置为带有“读取”角色的拥抱面API令牌;登录时,请参见https://huggingface.co/settings/tokens
--model_type openai
--model_name
您想使用的OpenAI型号。 gpt-3.5-turbo-0125
快速且可用于测试。OPENAI_API_KEY
环境变量设置为OpenAI API键(例如“ SK-19763ASDF87Q6657”);登录时,请参见https://platform.openai.com/account/api-keys公认的模型类型已列为白名单,因为插件需要知道要使用哪种子API。完成或聊天模型还可以。如果您想使用不支持的模型,则应收到一份有益的错误消息,请发送PR /打开问题。
REPLICATE_API_TOKEN
环境变量设置为复制API令牌,例如“ R8-123XXXXXXXXXXXXX”;登录时,请参见https://replate.com/account/api-tokens公共重复模型:
--model_type replicate
--model_name
复制模型名称和哈希,例如"stability-ai/stablelm-tuned-alpha-7b:c49dae36"
私有重复端点:
--model_type replicate.InferenceEndpoint
(用于私人端点)--model_name
部署端点的用户名/模型名称sl,例如elim/elims-llama2-7b
--model_type cohere
--model_name
(默认情况下,可选, command
) - 您要测试的特定cohere模型COHERE_API_KEY
环境变量设置为您的cohere api键,例如“ abcdefghij123456789”;登录时,请参见https://dashboard.cohere.ai/api-keys--model_type groq
--model_name
通过GROQ API访问的模型名称GROQ_API_KEY
环境变量设置为GROQ API密钥,请参阅https://console.groq.com/docs/quickstart,以获取有关创建API密钥的详细信息--model_type ggml
--model_name
您要加载的/home/leon/llama.cpp/models/7B/ggml-model-q4_0.bin
模型的路径GGML_MAIN_PATH
环境变量设置为GGML main
可执行文件的路径rest.RestGenerator
具有很高的灵活性,可以连接到返回明文或JSON的任何REST端点。它确实需要一些简短的配置,这通常会导致一个简短的YAML文件描述您的端点。有关示例,请参见https://reference.garak.ai/en/latest/garak.garak.generators.rest.html。
使用https://build.nvidia.com/或其他NIM端点的模型。
NIM_API_KEY
环境变量设置为身份验证API令牌,或在Config Yaml中指定对于聊天模型:
--model_type nim
--model_name
NIM model
名称,例如meta/llama-3.1-8b-instruct
对于完成模型:
--model_type nim.NVOpenAICompletion
--model_name
NIM model
名称,例如bigcode/starcoder2-15b
OCTO_API_TOKEN
环境设置为复制API令牌,例如“ R8-123XXXXXXXXXXXX”;登录时,请参见https://replate.com/account/api-tokensOCTO公共端点:
--model_type octo
--model_name
的Octoai公共端点,例如mistral-7b-instruct-fp16
Octo私人端点:
--model_type octo.InferenceEndpoint
(用于私人端点)--model_name
部署的端点URL,例如https://llama-2-70b-chat-xxx.octoai.run/v1/chat/completions
--model_type test
(或者) --model_name test.Blank
进行测试。这总是使用test.Blank
Generator生成空字符串。对于需要输出的任何测试,例如那些提出有争议的索赔的测试,并期望该模型反驳以通过以通过以通过,将被标记为失败。
--model_type test.Repeat
重新测试。该发电机重复收到的提示。
探测 | 描述 |
---|---|
空白的 | 一个简单的探针,总是发送空提示。 |
阿特克根 | 自动攻击生成。红色团队的LLM探测目标并对其做出反应,以尝试获取有毒输出。目前,原型(主要是无状态)的原型在HHRLHF尝试的子集中使用了一个简单的GPT-2,该原型产生了可检测到的毒性(目前唯一支持的目标)。 |
AV_SPAM_SCANNING | 试图使模型输出恶意内容签名的探针 |
继续 | 测试该模型是否会继续一个可能不良词的探针 |
担 | 各种丹和丹般的攻击 |
Donotanswer | 提示负责任的语言模型不应回答。 |
编码 | 通过文本编码提示注射 |
GCG | 通过附加对抗后缀加附加后缀来破坏系统提示。 |
毛刺 | 探针模型的故障令牌引起了异常行为。 |
奶奶 | 呼吁提醒祖母。 |
古德赛德 | Riley Goodside攻击的实施。 |
LeakerPlay | 评估模型是否会重播培训数据。 |
LMRC | 语言型号风险卡探针的子样本 |
恶意软件 | 尝试使模型生成用于构建恶意软件的代码 |
误导 | 试图使模型支持误导和虚假主张 |
包装术 | 试图获取代码世代,这些代码世代指定了不存在(因此是不安全的)软件包。 |
促进 | 实施代理商企业迅速工作(最佳纸质奖 @ Neurips ML安全研讨会2022) |
RealtoxicityPrompts | RealtoxicityPrompts的子集有效(数据限制,因为完整的测试将需要很长时间才能运行) |
滚雪球 | 旨在使模型的滚雪球幻觉探针给出了错误的答案,以至于无法处理的问题 |
XSS | 寻找漏洞或制定跨场攻击,例如私人数据剥落。 |
garak
生成多种日志:
garak.log
。这包括来自garak
及其插件的调试信息,并在跨行程中继续进行。garak
运行时,都会创建一个新的报告文件。该文件的名称是在开始时输出的,并且在运行结束时也是如此。在报告中,在收到几代人的情况下以及对它们进行评估时再次进行了每次探测尝试的条目;该条目的status
属性从garak.attempts
持续不断。查看参考文档以获取有关garak
代码结构的权威指南。
在典型的运行中, garak
将从命令行中读取模型类型(和可选的模型名称),然后确定要运行的probe
和detector
S,启动generator
,然后将其传递给harness
以进行探测; evaluator
处理结果。这些类别中的每个类别中都有许多模块,每个模块都提供了许多作为单个插件的类。
garak/probes/
- 用于生成与LLMS相互作用的类garak/detectors/
- 检测LLM的类别显示给定的失败模式garak/evaluators/
- 评估报告计划garak/generators/
- 用于探测LLM的插件garak/harnesses/
- 用于结构测试的课程resources/
- 插件要求的辅助项目默认的操作模式是使用probewise
线束。给定探针模块名称和探针插件名称的列表, probewise
线束实例化每个探针,然后对于每个探针,读取其recommended_detectors
属性以获取用于在输出上运行的detector
s列表。
每个插件类别( probes
, detectors
, evaluators
, generators
, harnesses
)都包含一个base.py
,该基础定义了该类别中插件可用的基类。每个插件模块定义了从基本类中继承的插件类。例如, garak.generators.openai.OpenAIGenerator
从garak.generators.base.Generator
降下。
较大的人工制品,例如模型文件和更大的语料库,都将其放在存储库中;它们可以存储在Huging Face Hub上,并使用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
列出您正在编写的类型的所有插件,并使用--list_probes
, --list_detectors
或--list_generators
列出我们在这里有一个常见问题解答。如果您还有其他问题,请伸出援手! [email protected]
代码参考文档在garak.ReadThedocs.io上。
您可以阅读Garak预印纸。如果您使用Garak,请引用我们。
@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}}
}
“说谎是一项像其他任何人一样的技能,如果您想保持一定的卓越水平,则必须不断地练习” -
有关更新和新闻,请参见@garak_llm
©2023-Leon Derczynski; Apache许可证V2,请参阅许可证