用 garak 对本地大模型做一轮安全测试
先明确测什么,再选工具
AI 安全测试不是给模型打个分,而是用一组可重复的输入去验证它在特定风险上的表现。
对刚接触这件事的人来说,最省事的切入方式是:选一个本地可运行的模型,用现成的扫描框架跑一轮基线,看清哪些探测项会命中、哪些是误报,再决定下一步是加提示词防护、加输出过滤,还是换模型。
本文以 garak(NVIDIA 开源的 LLM 漏洞扫描工具)为例,目标是本地 Ollama 上的一个对话模型。
它覆盖提示注入、越狱、训练数据泄露、毒性输出等探测,适合做入门级基线,但不等于完整的安全评估。
适用前提:
- 一台能跑 Ollama 的 Linux 机器,Python 3.10 及以上
- 已经能通过
ollama list看到至少一个模型 - 测试对象是你自己的模型或你有权测试的接口,不要对第三方线上服务未经授权扫描
准备测试环境
先确认 Ollama 服务在监听,默认端口 11434:
ollama list
curl -s http://127.0.0.1:11434/api/tags | head -c 300
建议单独建虚拟环境装 garak,避免和系统 Python 包冲突:
python3 -m venv ~/garak-venv
source ~/garak-venv/bin/activate
pip install -U pip
pip install -U garak
安装后确认命令可用,并查看当前版本支持的探测器和模型接口类型:
garak --version
garak --list_probes | head -40
garak --list_generators | grep -i ollama
如果 --list_generators 里没有 Ollama 相关项,说明当前版本或插件组合不支持该接口,可改用 OpenAI 兼容接口方式接入,下面会讲到。
配置扫描目标并跑第一轮
garak 的调用结构是“探测器 + 目标模型”。
目标模型通过 --model_type 指定接口类型,通过 --model_name 指定模型名。
对 Ollama,常见写法是:
garak --model_type ollama \
--model_name qwen2.5:7b \
--probes encoding,dan,promptinject \
--generations 1 \
--report_prefix baseline
几个参数的含义:
--probes:选择探测器类别,先用少量类别跑通链路,不要一上来全量--generations:每个提示的尝试次数,1 表示最省时,适合首轮验证--report_prefix:报告文件名前缀,结果会输出到当前目录
如果本地模型不方便直接接,也可以先把 Ollama 暴露成 OpenAI 兼容接口,再用对应接口类型扫描:
garak --model_type openai \
--model_name qwen2.5:7b \
--generator_options '{"openai":{"api_key":"ollama","api_base":"http://127.0.0.1:11434/v1"}}' \
--probes promptinject
首轮建议只跑一个探测器类别,确认能看到请求发出、模型返回、报告生成,再扩大范围。
判读报告时先分清命中与误报
garak 跑完会在当前目录生成 .jsonl 和 .html 报告。
JSONL 每行一条探测记录,重点看 status、probe、detector 和 score 几个字段。
HTML 报告更适合快速浏览命中的类别。
判读时注意三点:
- 命中不等于漏洞。探测器用关键词或分类器判断输出是否“像有害内容”,模型正常拒答但措辞里带了敏感词,也会被判命中。
- 先看探测输入再下结论。把命中的 prompt 和模型原始输出一起看,判断是模型真的被绕过,还是检测规则过宽。
- 同一项多跑几次。大模型输出有随机性,单次命中参考价值有限,至少跑 2 到 3 次看是否稳定复现。
如果某项命中稳定复现,且输出确实违反了你的预期,再把它作为需要修复的问题记录下来,附上输入、输出和复现次数。
常见问题与避坑
扫描卡住或超时:本地模型推理慢,长探测器容易超时。
先用 --probes 限定小范围,或调低单次生成长度,确认链路通畅后再加量。
报告全是命中:多半是检测器过于敏感,或模型输出语言与探测器默认语言不匹配。
可以换用更贴合的 detector,或人工抽样复核。
误把扫描当合规证明:一轮 garak 扫描只能说明在所选探测项上的表现,不能证明模型整体安全,也不能替代针对业务场景的人工评估和红队测试。
对线上服务直接扫:未经授权对第三方接口做提示注入扫描可能违反服务条款,测试前确认授权范围。
验证这轮测试是否有效
完成首轮后,用三个问题检验结果是否可复现、可解释:
- 报告里每个命中项,能否找到对应的输入和输出原文?
- 同一探测项重跑一次,命中是否稳定出现?
- 对稳定命中的问题,是否已经有了修复方向(改提示词、加输出过滤、换模型)?
这三个问题都能回答,说明这轮 AI 安全测试产出了可用信息;
回答不了,就缩小探测范围重跑,而不是继续堆探测器数量。
需要补充的是,garak 只是入口之一。
真正落地时,还应结合业务实际输入构造测试用例,并把扫描放进版本迭代流程里,模型或提示词变更后重新跑一轮基线,才能持续看到风险变化。