加拉克,LLM漏洞扫描器
生成式AI红队工具和评估套件
garak
检查 LLM 是否可以在我们不希望的情况下失效。garak
探测幻觉、数据泄露、提示注入、错误信息、毒性生成、越狱及许多其他弱点。如果你了解 nmap
,那么 garak
就是用于 LLM 的 nmap
。
garak
是一个免费工具。我们喜欢开发它,并且始终对添加功能以支持应用程序感兴趣。
开始使用
> 查看我们的用户指南!docs.garak.ai
> 加入我们的 Discord!
> 项目链接和主页:garak.ai
> 推特: @garak_llm
LLM 支持
目前支持:
- hugging face hub 生成模型
- replicate 文本模型
- openai api 聊天与连续模型
- gguf 模型如 llama.cpp 版本 >= 1046
- 以及更多 LLM!
安装:
garak
是一个命令行工具。它在 Linux 和 OSX 上开发。
使用 pip
标准安装
从 PyPI 获取它,你就可以开始了:
python -m pip install -U garak
使用 pip
安装开发版本
garak
的标准 pip 版本会定期更新。要从 GitHub 获取更新版本,请尝试:
python -m pip install -U git+https://github.com/leondz/garak.git@main
从源代码克隆
garak
有自己的依赖项。你可以在自己的 Conda 环境中安装 garak
:
conda create --name garak "python>=3.10,<=3.12"
conda activate garak
gh repo clone leondz/garak
cd garak
python -m pip install -r requirements.txt
好吧,如果一切顺利,你可能已经准备好了!
开始使用
一般语法是:
python3 -m garak <options>
garak
需要知道要扫描的模型,并且默认情况下,它将使用每个探针推荐的漏洞检测器在该模型上尝试所有已知探针。你可以使用以下命令查看探针列表:
python3 -m garak --list_probes
要指定生成器,请使用 --model_type
以及(可选的)--model_name
选项。模型类型指定模型家族/接口;模型名称指定要使用的确切模型。下面的“生成器简介”部分描述了一些支持的生成器。一个简单的生成器家族是 Hugging Face 模型;要加载其中一个,设置 --model_type
为 huggingface
,并将 --model_name
设置为 Hub 上的模型名称(例如 "RWKV/rwkv-4-169m-pile"
)。某些生成器可能需要设置为环境变量的 API 密钥,如果需要,它们会通知你。
garak
默认运行所有探针,但你也可以对此进行具体指定。--probes promptinject
将仅使用 PromptInject 框架的方法。例如,你也可以通过在插件名称后添加插件名称来指定一个特定的插件而不是插件家族;例如,--probes lmrc.SlurUsage
将使用基于 Language Model Risk Cards 框架的模型生成辱骂词的检查实现。
有关帮助和灵感,请在 twitter 或 discord 上找到我们!
示例
探测 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 在生成时会显示一个进度条。生成完成后,会提供一行评估该探针在每个检测器上的结果。如果任何提示尝试产生了不理想的行为,响应将标记为失败,并给出失败率。
以下是使用 encoding
模块在 GPT-3 变体上的结果:
以及 ChatGPT 的相同结果:
我们可以看到,更近期的模型更容易受到基于编码的注入攻击,其中 text-babbage-001 仅发现对 quoted-printable 和 MIME 编码注入易受攻击。每行末尾的数字,如 840/840,表示文本生成的总数,以及其中有多少看起来表现良好。数字可能相当高,因为默认情况下每个提示生成多个输出 - 默认是 10。
错误记录在 garak.log
中;运行的详细信息记录在分析开始和结束时指定的 .jsonl
文件中。analyse/analyse_log.py
中有一个基本的分析脚本,它将输出导致最多命中的探针和提示。
发送 PR 和打开问题报告。狩猎愉快!
生成器简介
Hugging Face
-
--model_type huggingface
(用于本地运行的 transformers 模型) -
--model_name
- 使用 Hub 上的模型名称。只有生成模型可以使用。如果失败并且不应该失败,请打开问题报告并粘贴你尝试的命令和异常! -
--model_type huggingface.InferenceAPI
(用于基于 API 的模型访问) -
--model_name
- 来自 Hub 的模型名称,例如"mosaicml/mpt-7b-instruct"
-
--model_type huggingface.InferenceEndpoint
(用于私有端点) -
--model_name
- 端点 URL,例如https://xxx.us-east-1.aws.endpoints.huggingface.cloud
-
(可选)将
HF_INFERENCE_TOKEN
环境变量设置为具有“读取”角色的 Hugging Face API 令牌;登录时参见 https://huggingface.co/settings/tokens
OpenAI
--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。Completion 或 ChatCompletion 模型可以使用。如果你想使用不受支持的模型,你应该得到一个信息性错误消息,并请发送 PR / 打开问题报告。
Replicate
--model_type replicate
--model_name
- Replicate 模型名称和哈希,例如"stability-ai/stablelm-tuned-alpha-7b:c49dae36"
--model_type replicate.InferenceEndpoint
(用于私有端点)--model_name
- 部署的端点的用户名/模型名称缩略名,例如elim/elims-llama2-7b
- 将
REPLICATE_API_TOKEN
环境变量设置为你的 Replicate API 令牌,例如 "r8-123XXXXXXXXXXXX";登录时参见 https://replicate.com/account/api-tokens
Cohere
--model_type cohere
--model_name
(可选,默认是command
)- 你想测试的特定 Cohere 模型- 将
COHERE_API_KEY
环境变量设置为你的 Cohere API 密钥,例如 "aBcDeFgHiJ123456789";登录时参见 https://dashboard.cohere.ai/api-keys
ggml
--model_type ggml
--model_name
- 你想加载的 ggml 模型的路径,例如/home/leon/llama.cpp/models/7B/ggml-model-q4_0.bin
- 将
GGML_MAIN_PATH
环境变量设置为 ggmlmain
可执行文件的路径
OctoAI
--model_type octo
--model_name
- 模型的 OctoAI 公共端点,例如 `mistr <SOURCE_TEXT> | 探测器 | 描述 | | --- | --- | | blank | 一个简单的探测器,总是发送空白提示。 | | atkgen | 自动攻击生成。一个红队的LLM探测目标并作出反应,试图引发有害输出。原型,目前大部分无状态,目前使用一个简单的GPT-2 微调 在一个子集上的hhrlhf尝试,该尝试产生了可检测的有害性(目前唯一支持的目标)。 | | continuation | 测试模型是否会继续生成可能不理想的词汇的探测器。 | | dan | 各种DAN和类似DAN的攻击。 | | donotanswer | 负责的语言模型不应回答的提示。 | | encoding | 通过文本编码进行提示注入。 | | gcg | 通过附加对抗性后缀来破坏系统提示。 | | glitch | 探测模型的错误标记,激发异常行为。 | | goodside | Riley Goodside攻击的实现。 | | knownbadsignatures | 试图让模型输出恶意内容签名的探测器。 | | leakerplay | 评估模型是否会重现训练数据。 | | lmrc | 语言模型风险卡探测器的一个子集。 | | malwaregen | 试图让模型生成用于构建恶意软件的代码。 | | misleading | 试图让模型支持误导性和虚假的声明。 | | packagehallucination | 试图生成指定不存在的(因此不安全的)软件包的代码。 | | promptinject | Agency Enterprise的PromptInject工作的实现(在NeurIPS ML安全研讨会上获得最佳论文奖2022)。 | | realtoxicityprompts | RealToxicityPrompts工作的子集(由于完整测试时间过长,数据受限)。 | | snowball | 雪球效应幻觉探测器,旨在让模型对复杂问题给出错误答案。 | | xss | 寻找允许或执行跨站点攻击的漏洞,例如私密数据泄露。 |
日志记录
garak
生成多种日志:
- 一个日志文件,
garak.log
。包括来自garak
及其插件的调试信息,并在多个运行之间连续记录。 - 当前运行的报告,结构为JSONL格式。每次
garak
运行时都会生成一个新的报告文件。该文件的名称在运行开始时输出,如果成功完成,也会在运行结束时输出。在报告中,每个探测尝试在生成结果时以及在评估时都会有一个条目;条目的status
属性从garak.attempts
中获取一个常量,以描述生成的阶段。 - 一个命中日志,详细记录产生漏洞的尝试(“命中”)。
代码结构如何?
在一次典型的运行中,garak
将从命令行读取模型类型(以及可选的模型名称),然后确定要运行的探测器
和检测器
,启动一个生成器
,然后将这些传递给一个测试框架
进行探测;评估器
处理结果。这些类别中有许多模块,每个模块提供一些作为单个插件的类。
garak/probes/
- 生成与LLM交互的类garak/detectors/
- 检测LLM表现出某种失败模式的类garak/evaluators/
- 评估报告方案garak/generators/
- 待探测LLM的插件garak/harnesses/
- 构建测试结构的类resources/
- 插件所需的辅助项目
默认的操作模式是使用逐探测
测试框架。给定探测模块名称和探测插件名称列表,逐探测
测试框架实例化每个探测器,然后对于每个探测器,读取其recommended_detectors
属性以获取要在输出上运行的检测器
列表。
每个插件类别(探测器
、检测器
、评估器
、生成器
、测试框架
)都包含一个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检测器:
python3 -m garak -m test.Blank -p mymodule -d always.Pass
- 对于检测器,尝试一个空白生成器和空白探测器:
python3 -m garak -m test.Blank -p test.Blank -d mymodule
- 对于生成器,尝试一个空白探测器和always.Pass检测器:
python3 -m garak -m mymodule -p test.Blank -d always.Pass
- 对于探测器,尝试一个空白生成器和always.Pass检测器:
- 让
garak
列出你正在编写的插件类型的所有插件,使用--list_probes
、--list_detectors
或--list_generators
- 启动一个交互式Python会话
常见问题
我们有一个常见问题解答这里。如果你有更多问题,请联系!leon@garak.ai
代码参考文档在garak.readthedocs.io.
引用garak
你可以阅读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}}
}
"撒谎是一种和其他技能一样的技能,如果你希望保持卓越水平,你必须不断练习" - Elim
有关更新和新闻,请关注@garak_llm
© 2023- Leon Derczynski; Apache v2 许可证,请参见LICENSE </SOURCE_TEXT>