一份干净的智能体红队报告,通常意味着扫描器根本够不到攻击真正抵达的那个位置。这四款工具都把对抗性字符串送进"用户打字进去"的那条通道;而智能体真正的注入是入向回来的,藏在一段它被吩咐去信任的工具结果里。按"够得到哪里"来选——工具能把敌意字符串放到哪一条边界上——并把 README 里的探针数量当成营销话术。
速览
四个开源项目,对"被测的究竟是什么"给出了四种不同的答案。
| 工具 | 维护方 | 测试的单元 | 它对准的是 |
|---|---|---|---|
| garak | NVIDIA | 一条针对 generator 的 probe | 一个模型端点。 |
| Promptfoo | OpenAI(2026 年收购) | 一条会被打分的 YAML 用例 | 你应用的入口。 |
| Giskard | Giskard AI | 一次扫描,外加多轮攻击 | 你的应用,并附一个评审界面。 |
| DeepTeam | Confident AI | 一对"漏洞 × 攻击手法" | 你的应用,并映射到某套框架。 |
你的智能体真正被攻击的那条通道
一个智能体至少有四处可以让字符串进入其上下文,而它们的防守程度并不相等。用户提示词是所有人都会测的那一处。系统提示词与工具描述是第二个面——被毒化的工具描述是一类活跃且已被编目的攻击,见工具毒化。第四处是出向的渲染边界。
有意思的是第三处。智能体读到的每一段工具结果——一个检索片段、一次 API 响应里的 JSON 字段、它被要求去总结的那个页面的正文、一条 CI 日志、甚至 WAF 自己那条拦截记录——都是不受信输入,只不过它披着"智能体自己要来的数据"这身行头抵达。这种不对称就是间接提示词注入的全部,也是本站一再回到这里的原因:形态见提示词注入 101,最容易被忘掉的那条通道见遥测与日志作为不受信输入。
现在看扫描器都做了什么。它构造一段敌意字符串,再经由某个接口交给目标。对 garak 来说,那个接口是一个模型 generator——一次补全调用。对 Promptfoo、Giskard 与 DeepTeam 来说,那个接口是你包起来的任意可调用对象:一个 HTTP 端点、一个 Python 函数、一个对话处理器。无论哪一种,字符串都是从边界一进去的。要够到边界三,你得立起一个敌意工具——一个假的检索索引、一个被投毒的文档库、一个在描述字段里返回指令的 API——而这四款都没有把它做成默认模式。
这不是这些项目的缺陷。它们是为测试 LLM 应用而造的,而对一个聊天机器人来说,边界一就是攻击面。它变成一个缺口,恰恰是从你的应用开始调用工具的那一刻起——因为模型从此开始读没人打过的字。
补救办法很便宜,却没人做:写一个工具,其唯一职责就是返回攻击者可控的内容;把它注册进你智能体真实的工具目录;再用完全良性的提示词去驱动智能体。之后这四款里的任何一款都能来驱动这套装置——你只是把它们当成执行器而不是载荷来源。载荷来自它们的语料,投递路径归你。
四款各自的定位
garak——模型扫描器
NVIDIA 的 garak 是四款里唯一一个把模型本身当作分析单元的。它的架构是三类插件——生成攻击的 probe、判定攻击是否命中的 detector、以及与后端对话的 generator——probe 目录在一两百这个量级,后端则有二十余个,覆盖托管 API、Hugging Face 与本地运行时。把它对准一个端点,拿到一份报告。
这让它非常适合回答一个其余三款答得很差的问题:在我做任何提示词工程之前,这个基座模型对这一类失败是否易感?选型、加一个开放权重备选、或者为一次换模提供依据时,它很有用。而要它告诉你你的 RAG 系统会不会泄露另一个租户的文档,则毫无用处——garak 根本不知道你的应用存在。
Promptfoo——CI 里的多面手
Promptfoo 的重心是一个 YAML 文件。你声明 provider、测试用例、断言与红队插件;它生成攻击、跑一遍、给结果打分,并让你的构建失败。它是四款里最适合接进流水线的,而"配置即代码"的形态意味着一条发现只需一次提交就能变成一条回归测试——这正是评测驱动开发在别处一直主张的纪律。
它如今也归 OpenAI 所有。这桩收购在 2026 年 3 月宣布,同时承诺继续开放其开源工具;按公司自己的口径,该项目当时已触达六位数的开发者,以及财富 500 强中四分之一企业的团队。把这份承诺当真,同时仍然注意它在结构上意味着什么——下文再说。
Giskard——带评审界面的扫描
Giskard 是一个 Python 库,一次扫描同时找安全与质量问题:注入与泄露,和幻觉、偏见、鲁棒性并排。它跑的是多轮攻击智能体,而不只是单发探针,这一点很重要——真正有意思的越狱都是对话式的;同时它还配了一个 hub,让非工程角色也能看发现。
混合的分类法是它的取舍。如果你想要一次运行就告诉产品负责人"模型在哪里不可靠、在哪里不安全",Giskard 是最短路径。如果你需要递给审计员一张行与某套具名框架逐一对齐的表,这种混合就是阻力。
DeepTeam——映射到框架的那一款
来自 Confident AI 的 DeepTeam 建立在一个显式的双轴模型上:一份漏洞清单(会出什么错)与一份攻击手法清单(你怎么去让它出错)做交叉,目前各有数十项,而漏洞清单已映射到 OWASP LLM 应用十大风险、NIST AI RMF 与 MITRE ATLAS。按采用度算,它是四款里最年轻也最小的一个,有一个稳定的 v1 和数千星量级的关注。
框架映射正是选它的理由。当你欠别人的交付物是"针对某条具名控制项的证据"时——而按合规体系对比来看,这种情形只会越来越多——一个输出结果已经按控制项编好键的工具,替你省掉了一道翻译;否则那道翻译多半是在最后关头由人手工、草率地做完的。
探针数量是错的那根轴
这些项目无一例外都拿一个数字打头阵:probe 数、插件数、漏洞数、攻击手法数。这些数字彼此不可比——garak 的 probe 是一个模板、DeepTeam 的"一对"是交叉积里的一格、Promptfoo 的插件是一个生成器——更要紧的是,这个数字预测不了你真正在意的东西。
有两项属性预测得更好。第一是前文说的"够得到哪里"。第二是新鲜度,而这根轴在 README 上没有徽章:攻击语料是一件会折旧的资产。公开的越狱会被拿去训练。一套十八个月前还算前沿的探针集,如今测的是"厂商有没有读过和你同样的那几篇论文"——这是个真问题,但小得多。静态语料是一套回归护栏——用来抓"修好的东西又坏回去"确有价值——但它不再是一支红队。这与一套私有评测集会走的生命周期完全相同,适用的纪律是维护一套评测集。
正因如此,"谁在维护"不是一条关于项目健康度的脚注,而是选型标准本身。
语料还有谁在维护
2026 年有两件事改变了这片版图,而绝大多数已发表的对比都还没跟上。
微软在 2026 年 3 月 27 日封存了 PyRIT。仓库变为只读:无提交、无发版、无议题处理。PyRIT 曾是多轮自动化红队的参考实现——Crescendo、TAP、skeleton-key 式的逐级升级——而你这周能搜到的"2026 年 LLM 红队指南"里,仍有很大一部分在推荐它。你当初 pip 装下的那一版,就是最后一版了。它编码的那些技法依然成立;围绕这些技法的语料,则已经不再追一个按月变化的领域。
而 Promptfoo 如今属于 OpenAI,收购于 2026 年 3 月宣布,同时承诺继续开放其开源工具。就假定这份承诺成立——结构上的那一点仍然站得住。决定你的智能体是否安全的那份语料,由一家模型厂商策展,而这家厂商自己的智能体产品同样在这些攻击的射程之内。这件事要紧,并不需要任何阴谋:注意力会跟着收购方的路线图走,而能拿到探针的失败类别,往往正是会让收购方那套栈难堪的那些。如果你的部署跑在另一家厂商的模型上,那你如今读的,是一份由你供应商的竞争对手撰写的威胁模型。
实务上的结论是:没有任何单一工具构成一支红队。跑一份不是因为立场而选的语料——garak 打模型,一款应用扫描器进 CI——再自己攒一小份本地语料,取材于你自己的事故与你自己的领域。只有第三份,是被保证与"你"有关的;而它通常是二十条,不是两千条。
什么时候选哪个
| 处境 | 用 | 因为 |
|---|---|---|
| 选型或更换基座模型 | garak | 只有它测的是模型本身,而不是你包在外面的提示词。 |
| 用安全回归卡住构建 | Promptfoo | 仓库里的 YAML 让一条发现一次提交就变成永久测试。 |
| 安全与质量出一份报告 | Giskard | 它的扫描本就把注入、泄露与幻觉、偏见混在一起。 |
| 需要对齐 OWASP、NIST 或 ATLAS 的证据 | DeepTeam | 它的漏洞清单已经映射好了,省掉一道人工翻译。 |
| 一个会调用工具的智能体 | 任意一款,外加你自己写的敌意工具 | 四款里没有一款靠自己够得到工具结果通道。 |
| 多轮升级类研究 | Giskard 或 DeepTeam | 这一格原本的答案是 PyRIT,而它自 2026 年 3 月起只读。 |
有一件事值得直说,因为这些工具鼓励的恰恰是反面:扫描器产出的是发现,不是保证。它没法告诉你,在你智能体对外可见的效果里,它究竟攻击到了多大一部分——而正是这个比例,而非通过率,才是评审者该索要的数字。如果你的智能体能发邮件、能写数据库、能开 PR,而你的红队运行自始至终只跟聊天端点说过话,那这份报告讲的就是另一套系统,不是线上那套。真正的演练在此之上还要加什么,见对智能体做红队;另一半——你部署的那道防御到底会不会触发——见评估护栏与检测器。
常见问题
PyRIT 现在真的不能用了吗?
它仍然跑得起来,它的攻击策略也依然成立。但仓库自 2026 年 3 月 27 日起封存且只读,因此不会再有新探针、修复或议题处理。把它当作一份冻结的参考实现,而不是一款在维护的工具。
OpenAI 拥有 Promptfoo,会让它不可信吗?
不会。开源工具仍然开放,工具本身也好用。需要提防的是更窄的一点:攻击语料反映的是维护方的优先级,所以别让一份厂商策展的语料成为你唯一跑的那一份,尤其当你部署在另一家厂商的模型上时。
我能不能四个全跑?
能,但重叠大到边际新发现掉得很快。同样的预算,更好的用法是:一次模型层扫描、一次进 CI 的应用层扫描,外加一套它们都没给你的敌意工具装置。
为什么工具结果通道比用户提示词更要紧?
因为用户提示词是你本来就不信任的那条通道。工具结果是以"智能体自己要来的数据"的身份抵达的,很少被复核,而且经常带着完全另一个人写的文字——一个网页、一张工单、一行日志、共享盘里的一份文档。
这周最便宜的一件事是什么?
把那个敌意工具写出来。二十行,返回一份看着合理、内含一条指令的文档,注册进你真实的工具目录,再用良性提示词驱动。多数团队一个下午就能弄清:自家智能体到底会不会去执行它"读到的"而非"被交代的"指令。
延伸阅读
本站相关:
- 对智能体做红队——一次有组织的演练在扫描之外还加了什么。
- 红队与安全性评估——运维上的节奏。
- 提示词注入 101——直接与间接两种形态。
- 工具毒化——经由工具描述实施的注入。
- 评估护栏与检测器——量的是防御,不是攻击。
- 护栏的四种形状——本文在运行时防御一侧的对应篇。
项目来源:
- NVIDIA/garak——probe、detector 与 generator。
- Promptfoo is joining OpenAI——收购公告。
- Giskard — AI red teaming field guide。
- confident-ai/deepteam——漏洞与攻击手法。
- Azure/PyRIT——已于 2026 年 3 月 27 日封存。