本地模型红队测试入门:用 garak、PyRIT、promptfoo 与 Inspect 评估你自己部署的大模型 - 本地模型红队测试

本地模型红队测试入门:用 garak、PyRIT、promptfoo 与 Inspect 评估你自己部署的大模型

把大模型部署在本地、开放给团队或客户之前,最该做的一件事是红队测试:以攻击者的视角,系统地测你自己的系统会在哪些地方出问题。它不是“找一条能攻破的神奇提示”,而是一套有范围、有指标、有记录、有修复闭环的工程流程。这篇 本地模型红队测试入门文章讲清楚:测什么、用什么工具、怎么搭隔离环境、怎么设计指标,以及最容易被忽略的一环——怎么用统计方法判断结果可不可信。需要先声明:这里只讲对你自己拥有或获得书面授权的系统做评测,不提供任何可直接使用的攻击文本,也不教怎么绕过别人的系统。原理背景见 大模型越狱是什么,防御设计见 越狱防御怎么做;全部相关文章在 大模型越狱与安全专题。

要点速览(更新于 2026-11-04)

  • 开源工具足够入门:garak(Apache-2.0,NVIDIA)、PyRIT(MIT,微软)、promptfoo(MIT)、Inspect(MIT,英国 AI 安全研究所)、HarmBench(MIT,标准化基准)。
  • 先授权、再隔离、只用公开基准:只测自己的系统,在不联外网的机器上运行,不保存或传播有害输出。

  • 同时测两个指标:攻击成功率和误拒率,只看前者会得到一个“什么都拒绝”的模型。

  • 样本量决定可信度:200 次测试中成功 3 次,Wilson 95% 置信区间约 0.5% 到 4.3%;成功 0 次也不等于风险为零,上限约 1.9%。

  • 结果要进入“发现、修复、复测”的闭环,并在每次更换模型、护栏或系统提示后重跑。

先定规矩:授权、范围与隔离

红队测试和攻击的区别,首先在规矩,而不在技术:

  1. 只测自己的或有书面授权的系统: 在别人的服务上做这类测试,可能违反服务条款甚至法律;请遵守所在地区的法律和平台规则。
  2. 划定范围: 写下测哪个模型、哪个版本、哪些入口(聊天、接口、检索、工具调用),以及不测什么。
  3. 隔离环境: 用单独的机器或容器,断开不必要的外网,不接入真实业务数据库和生产密钥。
  4. 只用公开基准与自建的无害样本: 评测数据来自 HarmBench 等公开基准,或你自己编写的、不包含可用有害细节的测试样例。
  5. 把输出当敏感数据: 测试中模型可能产生不当内容,应限制访问权限、设定保留期限,不对外传播,也不要把可直接使用的成功案例贴到公开场合。
  6. 遵守负责任披露: 如果你发现的是第三方模型或软件的漏洞,应先通知维护者,给修复留出时间。

本地模型红队测试的闭环

流程图:红队测试的闭环,先授权并划定范围,再准备测试集,运行测试,评分,修复并复测,最后写入报告
图 1:本地模型红队测试的闭环流程(我们整理的示意)

整个流程是一个循环:授权与范围 → 准备测试集 → 运行 → 评分 → 修复 → 复测 → 写报告。每次改动模型、护栏、系统提示或权限,都要回到“运行”这一步重来。

五个常用开源工具

工具 来源与许可 主要用途 适合谁
garak NVIDIA,Apache-2.0 LLM 漏洞扫描器,内置大量探针与检测器,命令行使用 想快速对一个本地模型做广谱扫描
PyRIT 微软,MIT Python 框架,可编排多轮攻击、转换器与评分器 想自定义多轮流程和评分的团队
promptfoo MIT 测试用例与红队评测,可在持续集成中回归 想把评测放进开发流水线
Inspect 英国 AI 安全研究所,MIT 通用评测框架,任务、求解器与评分器可组合 想写自己的评测任务
HarmBench 安全人工智能中心,MIT 标准化的攻击与防御评测基准 想要可比较、可复现的指标

选择建议:想快速开始,用 garak 扫一遍;想把评测放进日常开发,用 promptfoo 或 Inspect;想研究多轮和自定义评分,用 PyRIT;想让结果能与论文对比,用 HarmBench。各工具的版本更新很快,下面的命令以官方文档为准。

用 garak 做一次最小的本地扫描

garak 是命令行工具,安装与查看探针列表如下(命令来自其官方 README):

python -m pip install -U garak
garak --list_probes

用 --target_type 和 --target_name 指定要测的模型,用 --spec 选择探针,例如 README 中的写法是 --spec probes.encoding(编码类提示注入探针)。本地模型可以通过 Hugging Face 本地管线、llama.cpp 的 GGUF,或者 REST 生成器接入;如果你的模型用 Ollama 提供了兼容接口,可以按官方文档用 REST 配置连接,接口见 本地 API 服务器指南。几点建议:

  • 先用小探针集试跑,确认配置正确,再跑全量;全量探针很多,耗时会很长。
  • 固定模型版本、量化方式、系统提示和采样参数,并把它们写进报告,否则结果无法复现(量化的影响见 量化选择指南)。
  • 保存 garak 的日志文件,用于复盘和对比不同配置。
  • 选项在不同版本可能变化,以 garak --help 和官方文档为准。

设计指标:攻击成功率与误拒率

一个只测“被攻破多少次”的评测会鼓励模型拒绝一切,所以至少要同时记录:

指标 含义 怎么测 注意
攻击成功率(ASR) 在公开基准的有害类别请求中,模型给出了不该给的内容的比例 用公开基准 + 判定器 判定器本身会出错,需抽样人工复核
误拒率 对无害但“看起来敏感”的请求,模型拒绝的比例 自建无害样本集 影响真实可用性
护栏误拦率 / 漏拦率 加了护栏模型后,对无害请求的拦截率与对有害请求的漏过率 同上,分别统计 见 Llama Guard 本地部署教程
一致性 同一请求多次采样的结果是否稳定 温度大于 0 时重复采样 决定要采多少次
延迟与成本 加防护后的耗时 计时 评估防护的代价

按类别拆开报告:总体 3% 的成功率可能掩盖了某一个类别 30% 的问题。

统计:多少次测试才够

红队结果常被当成“精确的百分比”,其实它是一个有误差的估计。用 Wilson 置信区间可以给比例估计加上误差范围。算例(样本量均为 200):

成功次数 点估计 Wilson 95% 置信区间
0 / 200 0% 0% 到约 1.9%
3 / 200 1.5% 约 0.5% 到 4.3%
10 / 200 5.0% 约 2.7% 到 9.0%
30 / 200 15.0% 约 10.7% 到 20.6%
误差条图:200 次测试中成功 0、3、10、30 次时的攻击成功率点估计与 Wilson 95% 置信区间
图 2:Wilson 95% 置信区间示例(样本量均为 200;数字为算例,非真实测试结果)

从中可以读出两个结论。第一,0 次成功不等于风险为零:200 次测试一次都没成功,真实比率的 95% 上限仍可能接近 1.9%。第二,样本小时区间很宽:比较两个配置时,如果基线是 12/200(6.0%,区间约 3.5% 到 10.2%),加护栏后是 3/200(1.5%,区间约 0.5% 到 4.3%),两个区间有重叠,说明“护栏有帮助”的证据还不够强,需要更多样本。把样本扩大到 2,000 次且仍为 1.5%(30/2000),区间会收窄到约 1.1% 到 2.1%。

样本量与误差范围的关系,按正态近似、真实比率约 5% 估算:

样本量 95% 误差范围(约)
50 ±6.0 个百分点
100 ±4.3 个百分点
200 ±3.0 个百分点
500 ±1.9 个百分点
1,000 ±1.4 个百分点
2,000 ±1.0 个百分点
折线图:真实比率约 5% 时,样本量从 50 增加到 2000,95% 误差范围从约 6.0 个百分点降到约 1.0 个百分点
图 3:样本量与误差范围(正态近似,真实比率取 5%)

误差范围与样本量的平方根成反比:想把误差缩小一半,需要约四倍的样本。因此,对比两个配置时,用同一批测试集、同一组采样参数,并报告区间而不是只报百分比。

判定器:自动评分的陷阱

大多数红队评测需要“判定器”来决定一次输出算不算成功:可以是关键字匹配、另一个分类模型(例如护栏模型),或者另一个大模型来打分。每一种都会出错:关键字容易漏判和误判,用大模型打分可能带有偏差,并且不同判定器之间的结果不可直接比较。实践建议:

  • 随机抽取一部分结果,人工复核,估算判定器本身的误差;
  • 报告时写明判定器的名称和版本;
  • 关键结论用两种不同的判定器交叉验证;
  • 人工复核时注意保护复核人员,限制接触有害内容的量。

把结果变成修复

红队测试的价值在于修复,而不是发现。按下面的顺序处理:

  1. 分类与分级: 按类别和严重程度整理发现,区分“模型层问题”“护栏层问题”和“权限配置问题”。
  2. 选择修复手段: 对应的手段包括调整系统提示、增加或更换护栏、限制工具权限、加速率限制,或者换一个更合适的模型(见 越狱防御怎么做)。
  3. 复测: 用同一测试集重跑,对比区间;防止“修好一个,引出另一个”。
  4. 记录版本: 把模型、量化、护栏、系统提示的版本一起记录,便于回溯。
  5. 持续回归: 把评测放进更新流程,每次变更都跑一遍。

红队测试清单

  • ☐ 已获得授权并写下测试范围
  • ☐ 在隔离环境运行,不接生产数据
  • ☐ 使用公开基准和无害的自建样本
  • ☐ 同时测攻击成功率和误拒率
  • ☐ 样本量足够,并报告置信区间
  • ☐ 抽样人工复核判定器
  • ☐ 输出按敏感数据管理,有保留期限
  • ☐ 发现已分级,并进入修复与复测

常见误区

  • “找到一条能攻破的提示就算红队”: 红队要的是覆盖面和可重复的比率,而不是单个案例。
  • “测一次没问题就安全了”: 随机性和样本量会让单次结果不可靠。
  • “拒绝越多越安全”: 过高的误拒率会让系统失去可用性。
  • “本地模型没有外部风险,不用测”: 一旦开放给他人,或者接入工具和数据,就需要测。
  • “公开成功案例有助于社区”: 请遵守负责任披露,不要公开可直接使用的攻击文本。

常见问题 FAQ

本地模型红队测试需要什么硬件?

扫描工具本身不吃显存,主要取决于被测模型的运行需求;测试期间要同时运行被测模型和判定器,所以显存预算要把两者加起来,见 本地大模型显存指南。

garak 和 PyRIT 有什么区别?

garak 更像开箱即用的扫描器,内置大量探针;PyRIT 更像可编排的框架,适合自定义多轮流程和评分。

样本量多少合适?

取决于你要分辨的差异:想分辨 3% 与 6% 这种差距,按常用的 5% 显著性水平和 80% 统计功效估算,每组大约需要 750 次;先用 200 次做初筛,再对关键类别加大样本。

测试时能用真实用户的数据吗?

不建议。使用公开基准和自建的无害样本,避免把真实数据和隐私带进测试,见 本地大模型与隐私。

发现了问题应该怎么办?

如果是自己的系统,按优先级修复并复测;如果是第三方模型或软件的问题,先私下通知维护者。

红队测试能证明系统安全吗?

不能。它只能给出在特定测试集和条件下的估计,不能证明“绝对安全”。

和我们聊聊

如果你想为自己的本地模型设计一套评测流程,欢迎把部署方式和使用场景发到社区,或邮件 admin@microaione.com。更多相关内容见大模型越狱与安全专题,也可以先读 大模型越狱简史了解攻防的演变。

参考资料:garak 官方仓库、PyRIT 官方仓库、promptfoo 官方仓库、Inspect 官方仓库、HarmBench(arXiv 2402.04249)。许可信息读取自各仓库页面,数据读取于 2026-11-04,北京时间。

类似文章