Guide · 使用教程
garak 入门教程:限定测试范围、控制调用预算与解读扫描报告
固定 0.17.1,用内置无模型目标验证八条输入的通过与失败分支,解析 JSONL 报告,并明确真实扫描的范围、预算和证据边界。
这篇教程会完成什么
你会运行一个限定范围的 garak 示例,得到 JSONL 与 HTML 报告,并验证报告的通过与失败分支。这里使用内置 test.Blank 目标,不运行真实语言模型,不需要 API 密钥,也不对第三方接口发起扫描。
这是一篇流程入门:学会固定版本、明确探针、记录生成数量、检查报告和定义下一阶段预算。示例的 PASS 与 FAIL 都是人为设定的对照,不能证明某个模型安全或不安全。只有接入明确授权的目标、合适探针与人工复核后,才进入真实风险评估。
本次核对日期为 2026-10-22,测试使用 Python 3.11 和 garak 0.17.1。代码、CLI 和报告字段均以这个固定版本为准,不把 GitHub 开发分支命令直接混进来。
开始前需要准备
先创建独立环境,标准安装方式如下。完整包包含多种目标和探针的依赖,安装时间、磁盘及平台兼容性需确认。本文本地验证只安装固定官方 wheel 与内置测试路径所需依赖,没有完整安装或验证全部模型供应商,不能据此宣称所有插件可用。
python3.11 -m venv .venv
source .venv/bin/activate
python -m pip install 'garak==0.17.1'
python -m garak --version
mkdir -p reports
若完整安装遇到大型推理依赖不兼容,先按官方环境说明处理。不要把 --no-deps 当成真实目标扫描的通用修复,它会留下未安装依赖。对本次测试路径,能加载内置生成器不代表能加载其他模型或探针。
报告可能包含完整输入、响应和配置,先用合成数据验证存储目录和读写权限。真实测试前明确目标、授权、数据范围、测试窗口、预算与停止条件;若 Agent 连接写入、发信等操作,先用隔离实现避免真实副作用。
第一步:固定目标和探针
本例使用 --target_type test.Blank,它始终返回空文本;--spec probes.test.Test 选择稳定版中的八条基础测试输入。--generations 1 只指定每条输入的一次生成。本例因为没有真实模型,生成动作不产生模型 API 费用。
这条测试探针默认对应 always.Pass。所以即使目标完全不回答,也会得到通过结果。下面显式写出检测器,避免把默认行为误读成有意义的安全判断。
python -m garak \
--target_type test.Blank \
--spec probes.test.Test \
--generations 1 \
--detectors always.Pass \
--report_prefix "$PWD/reports/smoke-pass"
预期是八条输入经测试目标处理,并由始终通过的检测器判为通过。日志里可能还显示其他服务初始化或意图信息,不代表这些类别都已经运行;检查实际选中的探针、报告里的 eval 及样本数量。
第二步:运行必然失败的对照
保持目标、探针和生成数量不变,只将检测器换成 always.Fail,并使用新的报告前缀。这样可以检查失败结果是否会被记录,而不必连接任何真实模型。
python -m garak \
--target_type test.Blank \
--spec probes.test.Test \
--generations 1 \
--detectors always.Fail \
--report_prefix
常见问题
- 示例调用真实模型或收费 API 吗?
- 没有。使用内置 test.Blank 与测试探针,最终对照运行阻断 Python socket 外连。
- 全通过为什么不能证明安全?
- 本例 always.Pass 始终返回通过,目标还只输出空文本,它只是流程对照。
- FAIL 的命令一定返回非零退出码吗?
- 本次固定版本实测失败对照仍返回进程退出码 0,CI 还需读取报告中的真实判定。
- 报告行数就是测试数量吗?
- 不是。存在配置、插件信息、不同 attempt 状态与汇总,应结合稳定标识及 eval 数量判断。
- 七项验证包含哪些内容?
- 两条真实内置目标 CLI 对照,加缺少完成、缺少 eval、版本不符、检测器不符及未评分五种坏报告拒绝检查。
- 本地验证环境能支持全部供应商吗?
- 不能。此次只安装固定 wheel 与测试路径依赖,完整供应商和真实模型环境需另行安装、配置与验证。