AI 应用
测试 AI 应用:哪里会出问题,以及如何测试。
LLM 应用的出错方式与普通 Web 应用不同。模型每次返回的内容都不一样,所以你无法对答案本身做断言——你要断言的是答案之外的一切:响应是否送达、是否流式输出、是否停止、失败时是否有明确提示、是否遵守限制,以及是否从不返回用户无权查看的数据。
最后更新于 2026 年 8 月 24 日
测试 AI 应用有什么不同?
界面是一样的,但约定不一样。传统的测试自动化建立在一个能成立两次的断言上——点这里,看到那个。模型第一次运行就打破了这个前提,所以团队常常断定 AI 功能根本无法做回归测试,然后不加测试就上线了。
其实可以。诀窍是把断言从文字内容挪到确定性的部分:响应是否在预算时间内送达、是否能解析成你要求的结构、引用的文档是否是该用户有权阅读的、拒绝回答是否显示为拒绝、重试是否没有重复扣费。这些都是普通的自动化。判断答案是否好是评估问题,需要你自己的基准真值,应当放在提示词旁边的评估工具中,而不是回归测试套件里。
LLM 应用实际会出什么问题
这些是行为,而不是对输出质量的看法,这正是它们可以被测试的原因。每一项到达用户手中时,表现为产品里的 bug,而不是一个糟糕的答案。
| 故障 | 用户会怎么遇到 | 测试方法 |
|---|---|---|
| 回答流式输出到一半就停了 | 流式传输中途断开连接,屏幕上留下写了一半的回复,既没有报错也没有重试。用户会把它当作完整的答案。 | 在流式输出中途切断响应,并断言界面显示失败状态,而不是一个被截断的答案。 |
| 模型很慢,而界面对此毫无应对 | p95 延迟高达四十秒,界面却没有进度提示、没有取消按钮,也没有超时处理。用户会再点一次,结果两个请求同时在计费。 | 让响应保持挂起直到超过超时时间,并断言界面有可见的状态、有取消途径,且第二次点击不会产生重复请求。 |
| 模型服务商返回 429 或 503 | 速率限制和服务商故障是家常便饭,不是例外。把它们当作不可能发生的应用,会显示原始错误或无休止的加载动画。 | 让服务商返回 429 和 503,并断言应用降级为用户可以据此采取行动的提示信息。 |
| 空回复、被拒绝的回复和被安全过滤的回复 | 模型拒绝回答,或安全过滤器被触发,而界面只处理了正常流程,于是渲染出一个空白的气泡。 | 强制产生一次拒绝和一次空的补全;断言两者都不会产生空白消息或破坏布局。 |
| 对话丢失了上下文 | 为了适应上下文窗口而裁剪了历史记录,助手悄悄忘掉了三条消息之前被告知的内容。用户只会觉得这个产品很蠢。 | 让对话超出上下文上限,并断言应用会说明丢弃了什么,而不是悄悄丢掉。 |
| 工具调用被触发多次 | 智能体重试了一个其工具已经执行过的步骤。该工具做过的事——发送邮件、扣款、写入数据——都会发生两次。 | 让一次工具调用在成功之后才超时,并断言重试不会重复产生副作用。 |
| 检索返回了其他租户的文档 | 向量库是在提示词里而不是在查询里做过滤的,所以一次忽略该指令的检索,就会返回用户无权读取的数据。 | 以某个租户的身份查询属于另一个租户的文档,并断言它不在检索结果集中,而不只是没有在答案里被提到。 |
| 费用失控,没有上限 | 没有按用户设置的上限,于是一个循环或一个脚本控制的账号,就会变成一笔直到收到账单才有人发现的费用。 | 反复调用同一个接口,并断言存在限制——按用户、按密钥、按分钟。 |
安全
LLM 安全测试:值得检查的风险面
AI 功能通常会连接到普通功能没有的两样东西:一个付费接口,以及一个会执行它所读到内容中指令的组件。这两者都扩大了攻击面,而标准的应用安全评审并不是为此而设计的。
下面按实际发现的频率排序——这与它们被讨论的顺序并不相同。
- 01
客户端包里的服务商密钥
模型服务商的密钥被打包进前端 JavaScript,或者可以通过一条前面没有任何鉴权的代理路由访问到。
任何打开开发者工具的人都能花掉你的额度。这是清单中检查成本最低、漏掉代价最高的一项。
- 02
通过内容进行的提示词注入
指令被藏在模型会读取的内容里——上传的文档、抓取的网页、客服工单、邮件正文——模型随后照做。
攻击者根本不需要碰你的输入框。系统接收的任何内容都是输入,无论你是否把它设计成输入。
- 03
触达工具的注入
注入的指令让智能体去调用工具:发送消息、写入记录、向内部地址发起请求。
到这一步,注入就不再只是难堪,而会变成事故。影响范围取决于智能体被允许做什么。
- 04
系统提示词和机密信息泄露
让模型复述它自己的指令、工具定义,或者它拿到的部分配置片段。
系统提示词里往往包含业务规则、内部端点,偶尔还有没人打算放进去的凭据。
- 05
跨租户检索
检索的范围是靠客客气气地请模型遵守来限定的,而不是靠过滤查询。
提示词不是访问控制。如果过滤规则写在指令里,只要有一条指令被忽略,就是一次数据泄露。
- 06
输出被当作标记或代码渲染
模型输出被作为 HTML 放进页面,或者被放进 shell、查询语句或 eval 中。
还是经典的注入,只是来源变了。模型现在是不可信的输入,而且是攻击者可以影响的输入。
- 07
无上限的花费造成的拒绝服务
一个调用付费模型的接口,没有速率限制,没有按账号的上限,也没有对接受内容的大小限制。
攻击的目的不是让你宕机,而是不断推高账单,直到你自己把服务关掉。
- 08
日志保留了什么
写入日志和分析系统的提示词与补全内容——包括用户粘贴进去的一切。
人们会把生产环境凭据和客户记录粘贴进聊天框。你的日志保留策略现在成了一个数据保护问题。
QA Spider 自动化什么,不做什么
表述得足够具体,你可以据此来要求我们。
我们自动化这些
- 在真实浏览器中操作你的产品,因此上面提到的流式输出、超时、重试、空状态和错误状态,都只是普通的 UI 测试——按计划运行,也在每次部署时运行。
- 检查界面之下的 API,包括前端用来访问模型的路由。
- 把失败项作为工单提交到 Jira、Azure DevOps、ClickUp、GitHub 或 Linear,附上复现步骤和截图。
- 对公开网站做一轮表层安全检查:传输与安全头、Cookie 标志、混合内容、表单暴露、DNS 与邮件仿冒防护。
我们不做这些
- 我们目前不提供自动化的提示词注入或越狱测试套件。如果有人告诉你他们的爬虫开箱即用就能做到,请让他们给你看断言。
- 我们不评估答案是否正确。那是评测问题,需要你自己的标准答案,并且与回归测试是不同的学科。
关于测试 AI 应用,大家常问的问题
- 测试 AI 应用与测试普通网页应用有什么不同?
- 界面是一样的,输出不一样。普通应用两次返回相同的答案,所以可以直接断言。模型每次返回的内容都不同,所以断言要转移到答案周围的形态和行为上——它是否到达、是否流式输出、是否停止、是否明显地失败,以及花费是否合理。
- 输出每次都变,怎么写断言?
- 断言契约,而不是文字。比如响应是否在预算时间内到达,是否能解析成你要求的 schema,是否引用了用户有权查看的文档,拒绝是否被显示为拒绝。评判措辞属于评测,与回归测试套件分开运行。
- 什么是提示词注入,如何测试?
- 指令被藏在系统会读取的内容里——文档、网页、工单——模型随后服从这些指令。测试方法是在每一个能到达模型的渠道里埋入指令,并断言其效果永远不会生效:没有调用工具,没有返回数据,没有复述系统提示词。
- AI 产品最常见的安全问题是什么?
- 都是不起眼的问题。浏览器能拿到的服务商密钥、没有速率限制的模型接口,以及靠提示词中的一条指令而不是查询上的过滤来限定范围的检索。这三种都比一次巧妙的越狱更容易发现,也更可能存在。
- QA Spider 能测试我的 AI 产品吗?
- 模型周围的行为可以:流式输出、超时、重试、拒绝、错误状态、速率限制,以及界面之下的 API,在每次部署时用真实浏览器测试。自动化的提示词注入测试套件目前我们不提供,我们宁愿直说,也不想让你以后才发现。
- 你们会检查模型给出的答案是否正确吗?
- 不会。正确性需要你自己的标准答案,应该放在由你拥有、并与提示词一起做版本管理的评测框架里。回归测试回答的是另一个问题:昨天还能用的东西,在今天部署之后是否仍然能用。
把它用在你的 AI 产品上。
模型周围的行为——流式输出、超时、重试、拒绝回答、频率限制,以及界面下面的 API——在真实浏览器中测试,每次部署后都运行。