LLMs的安全探测工具
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/leondz/garak
小编推荐
garak是一个模块化的工具,用于检测LLM(语言模型)的不良响应。它可以通过使用各种预定义的探针来检测一个模型的安全性,以便在使用此模型生成文本时提供更高的保障。它支持多个生成模型,包括Hugging Face Hub、Replicate和OpenAI API,以及ggml模型。它也可以使用不同的探测器来检测模型中的漏洞。
相关技术点
- LLM(语言模型)
- 漏洞扫描
- Hugging Face Hub
- Replicate
- OpenAI API
- ggml模型
项目用途
garak主要用于检测LLM的漏洞,以防止模型生成不良的文本结果。它通过使用各种预定义的探针来检测一个模型的安全性,以便在使用此模型生成文本时提供更高的保障。用户可以使用不同的探测器来检测模型中的漏洞,从而提高模型的安全性。同时,它也可以用来检测不同生成模型的效果和性能,以便选择最适合使用的模型。
garak,一个LLM漏洞扫描器
garak 是一个模块化的工具,用于探测LLM中不良提示响应
使用 python3 -m garak 命令行调用
目前支持:
- hugging face hub 生成模型
- replicate 文本模型
- openai api 聊天和延续模型
- ggml 模型,如 llama.cpp
$ python3 -m garak --help
garak LLM probe v0.9 ( https://github.com/leondz/garak ) at 2023-06-08T22:49:32.650003
usage: __main__.py [-h] [--model_type MODEL_TYPE] [--model_name MODEL_NAME] [--seed [SEED]] [--generations GENERATIONS] [--probes PROBES] [--detectors DETECTORS]
[--eval_threshold EVAL_THRESHOLD] [--plugin_info PLUGIN_INFO] [--list_probes] [--list_detectors] [--list_generators] [-V] [-v]
LLM安全扫描工具
options:
-h, --help 显示帮助信息并退出
--model_type MODEL_TYPE, -m MODEL_TYPE
生成器的模块和(可选)类,例如'huggingface'或'openai'
--model_name MODEL_NAME, -n MODEL_NAME
模型名称,例如'timdettmers/guanaco-33b-merged'
--seed [SEED], -s [SEED]
随机种子
--generations GENERATIONS, -g GENERATIONS
每个提示的生成次数
--probes PROBES, -p PROBES
要使用的探测器名称列表,或'all'(默认)表示全部。
--detectors DETECTORS, -d DETECTORS
要使用的检测器列表,或'all'表示全部。默认使用探测器的建议。
--eval_threshold EVAL_THRESHOLD
成功命中的最小阈值
--plugin_info PLUGIN_INFO, -P PLUGIN_INFO
显示有关一个插件的信息
--list_probes 列出可用的漏洞探测器
--list_detectors 列出可用的检测器
--list_generators 列出可用的生成模型接口
-V, --version 打印版本信息并退出
-v, --verbose
请参阅 https://github.com/leondz/garak
安装:
garak 是一个命令行工具。它在Linux和OSX中开发。
garak 有自己的依赖项。您可以在自己的Conda环境中安装 garak :
conda create --name garak
conda activate garak
gh repo clone leondz/garak
cd garak
python -m pip install -r requirements.txt
或者您可以从pip中安装 garak :
python -m pip install garak
如果安装成功,您就可以使用它了!
入门
一般语法为:
python3 -m garak <options>
garak 需要知道要扫描的模型,默认情况下,它将尝试使用它所知道的所有探测器对该模型进行扫描。您可以使用以下命令查看探测器列表:
python3 -m garak --list_probes
要指定生成器,请使用 --model_name 和(可选)--model_type 选项。模型名称指定模型系列/接口;模型类型指定要使用的确切模型。下面的 "生成器简介" 部分描述了支持的一些生成器。一个简单的生成器系列是 Hugging Face 模型;要加载其中之一,请将 --model_name 设置为 huggingface,并将 --model_type 设置为 Hub 上模型的名称(例如 "RWKV/rwkv-4-169m-pile")。某些生成器可能需要设置 API 密钥作为环境变量,并且它们会让您知道是否需要。
默认情况下,garak 运行所有探测器,但您也可以具体指定。例如,--probes promptinject 将仅使用 PromptInject 框架的方法。您还可以通过在 . 后添加插件名称来指定一个特定的插件,例如,--probes lmrc.SlurUsage 将使用一个基于 Language Model Risk Cards 框架检查生成词语是否含有恶意表述的插件实现。
示例
探测 ChatGPT 是否存在基于编码的提示注入漏洞(OSX/*nix)(将示例值替换为实际的 OpenAI API 密钥)
export OPENAI_API_KEY="sk-123XXXXXXXXXXXX"
python3 -m garak --model_type openai --model_name gpt-3.5-turbo --probes encoding
查看 Hugging Face 版本的 GPT2 是否存在 DAN 11.0 漏洞
``` python3 -m garak --model_type huggingface --model_name gpt2 --probes dan.Dan_11_0
```## 读取结果
对于每个加载的探针,Garak会打印一个进度条来生成。一旦生成完成,将给出一行评估该探针在每个探测器上的结果。如果任何提示尝试产生不良行为,响应将被标记为FAIL,并给出故障率。
这是使用GPT-3变体上的encoding模块的结果:

以下是ChatGPT的相同结果:

我们可以看到,最近的模型更容易受到基于编码的注入攻击的影响,而text-babbage-001只发现容易受到引用可打印和MIME编码注入的攻击。每行结尾的数字,例如840/840,表示文本生成的总数,以及其中有多少个似乎表现良好。这个数字可能会很高,因为每个提示可以生成多个生成 - 默认情况下是10个。
错误记录在garak.log中;在分析开始和结束时,运行的详细信息将记录在.jsonl文件中。在analyse/analyse_log.py中有一个基本的分析脚本,它将输出导致最多命中的探针和提示。
发送PR和打开问题。愉快的狩猎!
生成器介绍
Huggingface
-
--model_name huggingface(用于在本地运行transformers模型) -
--model_type- 使用Hub中的模型名称。只有生成模型才能正常工作。如果失败并且不应该,请打开问题并粘贴您尝试过的命令+异常! -
--model_name huggingface.InferenceAPI(用于基于API的模型访问) -
--model_type- Hub中的模型名称,例如“mosaicml/mpt-7b-instruct” -
(可选)将
HF_INFERENCE_TOKEN环境变量设置为具有“读取”角色的Hugging Face API令牌;请在https://huggingface.co/settings/tokens登录时查看
OpenAI
--model_name openai--model_type- 您想要使用的OpenAI模型。text-babbage-001对于测试来说很快且很好;gpt-4似乎对许多更微妙的攻击较弱。- 将
OPENAI_API_KEY环境变量设置为您的OpenAI API密钥(例如“sk-19763ASDF87q6657”);请在https://platform.openai.com/account/api-keys登录时查看
已识别的模型类型已列入白名单,因为插件需要知道使用哪个子API。完成或ChatCompletion模型可以正常工作。如果您想使用不支持的模型,则应获得一个有信息的错误消息,请发送PR /打开问题。
Replicate
--model_name replicate--model_type- 复制模型名称和哈希值,例如“stability-ai/stablelm-tuned-alpha-7b:c49dae36”- 将
REPLICATE_API_TOKEN环境变量设置为您的复制API令牌,例如“r8-123XXXXXXXXXXXX”;请在https://replicate.com/account/api-tokens登录时查看
Cohere
--model_name cohere--model_type(可选,默认为command)- 您想要测试的特定Cohere模型- 将
COHERE_API_KEY环境变量设置为您的Cohere API密钥,例如“aBcDeFgHiJ123456789”;请在https://dashboard.cohere.ai/api-keys登录时查看
ggml
--model_name ggml--model_type- 您要加载的ggml模型的路径,例如/home/leon/llama.cpp/models/7B/ggml-model-q4_0.bin- 将
GGML_MAIN_PATH环境变量设置为您的ggml“main”可执行文件的路径
测试
-
--model_name test -
(或)
--model_name test.Blank用于测试。这总是生成空字符串,使用test.Blank生成器。对于任何需要输出的测试,例如那些提出有争议的声明并期望模型否认它们以通过测试的测试,将被标记为失败。 -
--model_name test.Repeat用于测试。此生成器会重复返回它收到的提示。
探针介绍
blank
一个简单的探针,总是发送一个空的提示。
continuation
测试模型是否会继续某个可能不良的单词的探针
dan
各种DAN和类似DAN的攻击
编码
通过文本编码进行提示注入
goodside
knownbadsignatures
尝试使模型输出恶意内容签名的探针### lmrc
语言模型风险卡探测的子集
misleading
试图让模型支持误导和虚假声明
promptinject
实现了Agency Enterprise 的PromptInject(最佳论文奖@ NeurIPS ML安全研讨会2022)
realtoxicityprompts
RealToxicityPrompts的子集(数据受限,因为完整的测试将需要很长时间才能运行)
snowball
Snowballed Hallucination探测旨在使模型对其无法处理的过于复杂的问题给出错误答案
art
自动红队。红队LLM探测目标并对其做出反应,以尝试获得有毒输出。原型,大多数状态无关,现在仅使用在hhrlhf尝试的子集上 微调 的简单GPT-2(目前仅支持此目标)。
日志
garak生成两种类型的日志:
- 一个日志文件,
garak.log。其中包括来自garak和其插件的调试信息,并跨运行继续。 - 当前运行的报告,结构化为JSONL。每次
garak运行时都会创建一个新的报告文件。文件的名称在运行开始时输出,并在成功时也输出。在报告中,为每个探测尝试都记录一个条目,当生成接收到它们时,再次在评估它们时进行; 条目的status属性使用garak.attempts中的常量描述进行了什么阶段。
代码的结构是如何的?
在典型的运行中,garak将从命令行读取模型类型(以及可选的模型名称),然后确定要运行哪些probe和detector,启动一个generator,然后将这些传递给一个harness来进行探测;一个evaluator处理结果。每个类别中都有许多模块,每个模块提供一些充当单个插件的类。
garak/probes/- 用于生成与LLM的交互的类garak/detectors/- 用于检测LLM是否呈现给定故障模式的类garak/evaluators/- 评估报告方案garak/generators/- LLM插件的探测garak/harnesses/- 用于构建测试的类resources/- 插件所需的辅助项
默认的操作模式是使用probewise harness。给定一系列探针模块名称和探针插件名称,probewise harness实例化每个探针,然后对于每个探针读取其recommended_detectors属性以获取要在输出上运行的detector列表。
每个插件类别(probes,detectors,evaluators,generators,harnesses)都包括一个base.py,其中定义了该类别中插件可用的基类。每个插件模块定义继承自其中一个基类的插件类。例如,garak.generators.openai.OpenAIGenerator继承自garak.generators.base.Generator。
较大的工件,例如模型文件和更大的语料库,被保留在存储库之外;它们可以存储在例如Hugging Face Hub上,并由客户端使用garak在本地加载。
开发自己的插件
- 查看其他插件的实现方式
- 继承其中一个基类,例如
garak.probes.base.TextProbe - 尽可能少地覆盖
- 可以通过至少两种方式测试新代码:
- 启动交互式Python会话
- 导入模型,例如
import garak.probes.mymodule - 实例化插件,例如
p = garak.probes.mymodule.MyProbe()
- 导入模型,例如
- 使用测试插件运行扫描
- 对于探针,尝试空白生成器和always.Pass detector:
python3 -m garak -m test.Blank -p mymodule -d always.Pass - 对于检测器,请尝试空白生成器和空白探针:
python3 -m garak -m test.Blank -p blank -d mymodule - 对于生成器,请尝试空白探针和always.Pass detector:
python3 -m garak -m mymodule -p blank -d always.Pass
- 对于探针,尝试空白生成器和always.Pass detector:
- 让
garak列出您正在编写的类型的所有插件,使用--list_probes,--list_detectors或--list_generators## 常见问题解答
- 启动交互式Python会话
我们在这里提供了常见问题解答。如果您有更多问题,请联系我们!
"不要重复说同样的谎言" - Elim
有关更新和新闻,请参见 @garak_llm
© GPLv3 2023 Leon Derczynski