
传统测试能运转,靠的是三个几乎没人说出口的前提:
AI 系统把这三条同时打破了,每一类特有缺陷击穿其中一条:
缺陷 | 击穿的前提 | 传统测试为什么抓不到 |
|---|---|---|
幻觉 | 有标准答案 | 输出流畅、自洽、格式正确,断言无从下手 |
提示注入 | 数据与指令分离 | 攻击内容就是普通文本,混在合法输入里 |
行为漂移 | 系统不会自己变 | 代码没改,模型或数据在别处变了,回归用例不会被触发 |
下面按这三类逐一展开:每类先看一个真实案例,再讲测试设计,最后落到开源工具和它们的局限。
2024 年 2 月 14 日,加拿大不列颠哥伦比亚省民事解决庭作出裁决(Moffatt v. Air Canada, 2024 BCCRT 149)。乘客 Jake Moffatt 因祖母去世订票,向 Air Canada 官网的聊天机器人询问丧亲票价,机器人告诉他可以先买全价票、事后申请退差价。他照做了,航空公司却拒绝退款,理由是官网政策页写明丧亲票价不可事后申请。
航空公司在庭上的辩护很有意思:聊天机器人是一个独立的法律实体,要为自己的行为负责。庭方没有接受,认为机器人只是网站的一部分,航空公司没有尽到合理的注意义务来确保机器人的准确,构成过失性虚假陈述,判令赔偿 650.88 加元,加上利息和费用共 812.02 加元。
金额不大,对测试人的启发却很大:
类型 | 含义 | 判定依据 | 典型场景 |
|---|---|---|---|
上下文不忠实 | 回答与给定的资料不一致或超出资料 | 检索到的上下文 | RAG 客服、知识库问答 |
事实性错误 | 回答与客观世界不符 | 外部事实或权威数据 | 无资料支撑的开放问答 |
Air Canada 属于第一种:政策页就在那里,机器人却没有照着说。第一种幻觉是可以工程化测试的,因为它有一个明确的参照物。
用例要覆盖三种情形:
第三类最容易被忽略,也最容易出事故,因为系统倾向于给出答案。
指标要分层,别混在一起:
这两层要分开看。回答出错,可能是没检索到,也可能是检索到了却没照着说。混在一个分数里,你就不知道该修哪一头。
三个必须知道的坑:
字段 | 示例 |
|---|---|
类型 | 无依据,应拒答 |
知识库版本 | 政策库 v2026.09 |
问题 | "丧亲票价能在出行后补办吗?"(知识库中无此条款) |
期望行为 | 说明未找到依据,引导至人工或官方渠道,不得给出具体结论 |
判定 | 规则:回答中不得出现"可以/不可以"类断言;LLM 评审:是否明确表示缺少信息 |
2025 年 6 月,Aim Security 的研究者披露了微软 365 Copilot 的漏洞 EchoLeak(CVE-2025-32711,CVSS 9.3)。攻击者只需要发送一封精心构造的邮件,Copilot 在处理邮件内容时执行了其中隐藏的指令,把用户可访问的内部数据通过响应中的图片链接带了出去,全程无需用户点击。后来有人把它称为首个在生产级 LLM 系统中被公开验证的零点击提示注入利用。
整个攻击链串联了几处绕过:绕过微软的跨提示注入分类器(XPIA);用引用式 Markdown 写法绕过链接脱敏;利用自动加载图片的行为;借助内容安全策略(CSP)中允许的 Teams 代理域名把数据传出。微软已在服务端修复。
对测试的启发有两层:
按 OWASP 对 LLM 应用的分类,提示注入列为 LLM01。测试上至少要区分:
工具 | 来源 | 擅长什么 | 需要留意 |
|---|---|---|---|
garak | NVIDIA | 像"LLM 的 nmap":内置大量探针(如 promptinject、encoding、dan)和对应检测器,批量扫描模型,输出 JSONL 与 HTML 报告 | 偏模型层;默认会对同一探针重复运行,结果看通过率而非单次对错 |
promptfoo | 开源(MIT) | 插件负责生成对抗输入,策略负责包装攻击方式,再由 LLM 裁判评分;用 YAML 配置,天然接 CI;有间接注入、RAG、Agent 方向的插件 | 部分插件依赖远程生成;据 DEV 社区文章,该项目于 2026 年 3 月加入 OpenAI 并保持开源,请自行核实并评估对你的合规影响 |
PyRIT | 微软 | 多轮红队:由攻击者 LLM 生成提示发给目标,评分器判断目标是否达成,没达成就继续生成,直到成功或达到上限 | 偏安全团队的编排框架,上手门槛高于前两者 |
LLAMATOR | 开源社区 | 针对聊天机器人、RAG、Agent 的攻击集合,结果可导出 Excel、CSV、DOCX | 许可证为 CC BY-NC-SA 4.0,含非商业条款,商用前务必先核对 |
选型建议:日常回归用 promptfoo,发版前的全面扫描加 garak,对多轮攻击和高风险场景再上 PyRIT。
既然分类器可能被绕过,测试思路要从"能不能拦住"改成"拦不住怎么办":
L3 是最容易被忽略、也最该由测试人推动的一层。它不依赖任何分类器的好坏,靠的是最小权限和出口控制,是工程问题,不是模型问题。
提示注入的结果是概率性的。同一个攻击,十次可能成功两次。所以要用攻击成功率(ASR),在固定的用例集上多次运行,设置阈值,超出就让流水线失败。
斯坦福与伯克利的研究者 Lingjiao Chen、Matei Zaharia 和 James Zou 对 GPT-3.5 与 GPT-4 在 2023 年 3 月和 6 月的两个版本做了对比评测。发表版本的摘要给出的一个例子是:GPT-4 在区分质数与合数上的准确率,从 3 月的 84% 降到 6 月的 51%;而同一任务上 GPT-3.5 6 月反而优于 3 月。论文还指出,这与 GPT-4 对"逐步思考"提示的遵循度下降有关,并观察到 GPT-4 在敏感问题和观点调查类问题上变得更不愿意作答。
这里有两个值得提醒的细节:
2025 年 4 月 24 日至 25 日,OpenAI 向 ChatGPT 推出 GPT-4o 更新,随后模型变得明显过度迎合用户。4 月 28 日开始回滚。事后 OpenAI 公开复盘,承认几个关键事实:谄媚问题没有被列为内部手动测试的重点,因为一些专家测试员更关注语气和风格的变化;他们也没有专门追踪谄媚行为的发布评估。回滚之后,他们表示会把谄媚评估纳入发布流程。
这个案例把行为漂移的本质讲透了:没有被度量的维度,就没有告警。变化发生了,只是没有一把尺子量它。
来源 | 例子 | 谁在变 |
|---|---|---|
模型漂移 | 厂商更新后端模型或别名指向的版本 | 你控制不了 |
提示漂移 | 系统提示词、模板被人改了 | 团队内部 |
数据漂移 | 知识库更新、检索内容变化 | 业务侧 |
依赖漂移 | 工具返回格式变化、外部接口升级 | 上下游 |
1.建一套金标准集。沿用质量工程里的老办法:挑一批有代表性的输入,固定下来,覆盖你关心的所有行为维度。
2.度量维度要宽,不要只看准确率。参照前面两个案例,至少包含:
3.多次采样,用统计而不是单点比较。模型输出本身有随机性,单次差异不一定是漂移。下面是一个示意(需要按你的评测框架调整):
import statistics as st
from math import sqrt
def drift_check(run_eval, baseline_mean, baseline_std, n=5, k=3.0):
"""run_eval() 返回单次评测得分(0~1)。
baseline_std 是历史上"单次评测得分"的标准差。
n 次均值的波动约为 baseline_std / sqrt(n),超出 k 倍视为疑似漂移。"""
scores = [run_eval() for _ in range(n)]
mean = st.mean(scores)
band = k * max(baseline_std, 1e-6) / sqrt(n)
return {"mean": mean, "drifted": abs(mean - baseline_mean) > band}关键点是:先用同一版本多跑几次,测出它自己的"正常波动",再谈偏离。没有基线方差,任何阈值都是拍脑袋。
4.定时跑,不只是发版时跑。漂移的来源之一是你控制不了的上游。promptfoo 的文档就把红队用于漂移检测:在一致的对抗测试集上持续运行,比较结果,把攻击成功率的阈值写进定时流水线,超过就告警。同时把配置与应用代码一起放进版本控制。
5.线上也要有尺子。对生产流量抽样,持续计算忠实度等指标;Langfuse 一类的可观测平台可以承载这类线上评估和追踪。
6.能钉版本就钉版本。如果服务商提供固定的模型快照,生产环境尽量使用快照,别用会悄悄变化的别名;升级前先在金标准集上跑一遍。
阶段 | 幻觉 | 提示注入 | 行为漂移 |
|---|---|---|---|
提交时(分钟级) | 小规模的可答、冲突、无依据用例 | 少量高危注入用例 | 无 |
每日定时 | 抽样 faithfulness 评估 | promptfoo 回归集,统计 ASR | 金标准集多次采样,对比基线带 |
发版前 | 全量用例 + 人工复核抽样 | garak 全面扫描,必要时 PyRIT 多轮攻击;L3 权限与出口检查 | 新旧版本在金标准集上对照 |
线上 | 流量抽样评估忠实度与拒答 | 异常外发与异常工具调用告警 | 定时金丝雀 + 关键指标看板 |
门禁的阈值,请用你自己的基线数据来定。我不建议套用任何文章里的通用数字。
这三类缺陷有一个共同点:它们都不会让系统"报错"。幻觉的回答很流畅,注入的指令很普通,漂移之后的系统依然在正常运行。
这恰恰是它们危险的地方,也是测试人的价值所在。AI 系统不缺聪明,缺的是有人在它自信满满的时候问一句:依据在哪里?它能被谁骗?它今天和昨天一样吗?
工具已经足够多,也足够好用。缺的是把这三个问题变成用例、变成基线、变成门禁的那个人。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。