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 命令行调用

目前支持:

$ 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模块的结果:

ad1a1b7183003505

以下是ChatGPT的相同结果:

ad1a1b7183003520

我们可以看到,最近的模型更容易受到基于编码的注入攻击的影响,而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将从命令行读取模型类型(以及可选的模型名称),然后确定要运行哪些probedetector,启动一个generator,然后将这些传递给一个harness来进行探测;一个evaluator处理结果。每个类别中都有许多模块,每个模块提供一些充当单个插件的类。

  • garak/probes/ - 用于生成与LLM的交互的类
  • garak/detectors/ - 用于检测LLM是否呈现给定故障模式的类
  • garak/evaluators/ - 评估报告方案
  • garak/generators/ - LLM插件的探测
  • garak/harnesses/ - 用于构建测试的类
  • resources/ - 插件所需的辅助项

默认的操作模式是使用probewise harness。给定一系列探针模块名称和探针插件名称,probewise harness实例化每个探针,然后对于每个探针读取其recommended_detectors属性以获取要在输出上运行的detector列表。

每个插件类别(probesdetectorsevaluatorsgeneratorsharnesses)都包括一个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
    • garak列出您正在编写的类型的所有插件,使用--list_probes--list_detectors--list_generators## 常见问题解答

我们在这里提供了常见问题解答。如果您有更多问题,请联系我们!


"不要重复说同样的谎言" - Elim

有关更新和新闻,请参见 @garak_llm

© GPLv3 2023 Leon Derczynski

标签:工具分享, ChatGPT