Jean's Blog

一个专注软件测试开发技术的个人博客

0%

AI应用功能测试

所有AI应用最终都基于大模型提供的服务接口,用户通过AI应用间接与大模型交互。自然语言交互以prompt为载体,这是与传统功能测试最本质的区别。需要建立系统性思维应对prompt交互带来的新测试场景。

prompt作为”接口”的特殊性体现在其自然语言交互形式和动态响应特征:

  • 基础测试:截断策略、空输入/异常输入处理、超长文本输入
  • 参数测试:temperature边界、top_p/max_tokens组合、参数组合爆炸
  • 对话测试:多轮状态一致性、角色错乱、上下文长度限制
  • 风险测试:上下文溢出风险、功能失败模式分析

相比传统接口测试,更关注语言理解、上下文关联和动态响应质量。

AI 应用功能测试范围定义

AI 应用功能测试,核心不是测 UI 按钮,而是校验模型能否读懂并完成用户意图。

主要覆盖 4 大块:Prompt 理解、生成参数控制、多轮上下文记忆、输出质量与异常输入处理。传统功能测试校验 “功能有没有执行”,AI 功能测试校验“模型有没有读懂用户想干什么”。

flowchart LR
    Z[🎯核心目标:正确理解并执行用户意图]
    Z --> A[Prompt理解能力
不同清晰度、格式、语言提示词的理解] Z --> B[参数控制能力
temperature、top_p等参数响应是否符合预期] Z --> C[上下文处理能力
多轮对话,保持上下文记忆与一致性] Z --> D[输出质量与异常处理
准确性、相关性,异常输入鲁棒性]

传统软件输入固定,输出就固定;AI 同样输入,输出会有波动。AI 功能测试不能只看单次输出结果,要看整体行为、意图匹配度。

1. Prompt 理解能力

对不同清晰度、格式、语言的 Prompt 的理解。

  • 测试场景:清晰提问、模糊歧义提问、残缺输入、多语言、特殊格式(表格、代码、乱序文本)。
  • 校验点:能不能读懂用户真实意图,不会把模糊问题理解跑偏。
  • 示例:用户输入简短、表述混乱,模型是否还能抓住核心诉求。

2. 参数控制能力

对 temperature、top_p 等参数的响应是否符合预期。

  • temperature:控制输出随机性;top_p:控制采样多样性。
  • 测试场景:调大 temperature,输出应该更多样、发散;调小后输出要收敛、稳定。
  • 校验:修改参数后,模型输出风格、随机性是否跟着变化,参数是否真正生效。

3. 上下文处理能力

在多轮对话中保持状态和上下文的一致性。

  • 测试场景:多轮连续对话,前面聊过的信息、身份、约束条件,后面轮次要记住。
  • 校验点:不能 “失忆”,不能遗忘上文信息,不能前后回答自相矛盾。
  • 示例:第一轮告诉模型 “我是小学生”,后面多轮对话要保持面向小学生的回答风格。

4. 输出质量与异常处理

结果的准确性、相关性及对异常输入的处理。

  • 正向:输出是否准确、和问题相关,减少幻觉、答非所问。
  • 异常输入:乱码、恶意提问、无意义输入、超长文本,看模型是否合理拒绝、稳健应答,不输出违规内容。

Prompt = 新型 “接口”

在传统软件中,系统之间依靠 API 接口完成交互,契约明确。而大模型时代,Prompt 提示词就是新型接口。

用户输入的自然语言,等价于传给模型的入参。但这个接口的协议是人类自然语言,没有严格语法约束,表达方式千变万化。传统接口测试校验参数格式;AI 测试重点校验:不管用户怎么说,模型能不能读懂背后真实意图,这是 AI 测试最大的挑战。

1. 传统软件交互

通过定义清晰的 API 接口与后端服务交互。

  • API 是强契约:参数名、参数类型、入参格式全部严格定义。
  • 输入输出是结构化数据(JSON),协议固定。
  • 测试:传参符合契约,就可以预判返回结果;错参数直接报错。

2. AI 应用交互

Prompt 成为用户与 AI 模型交互的主要 “接口”。

  • 用户不再传 JSON,而是输入自然语言(Prompt)。
  • 用户的问句、指令、聊天内容,全部相当于发给大模型的 “接口入参”。
  • 右侧示意图:传统 API 调用 → 转化为自然语言提示词,完成范式转变。

3. 挑战与核心

协议是自然语言,测试其 “契约” 成为关键挑战。

  • 传统 API 契约写死在文档;Prompt 的契约是模糊的自然语言,没有严格语法。
  • 同样意图,可以写成千百种不同句子;同样 Prompt,模型输出还会波动。
  • 测试难点:没有固定入参格式,很难像传统接口一样,靠固定用例完全覆盖,要校验“意图契约”,而不是字符串完全匹配

测 Prompt 接口,不能只拿一两条固定句子,要构造同义不同表达、模糊表达、残缺表达的大批 Prompt,验证意图识别是否稳定。

Prompt 参数全景图

传统软件依靠 API 接口交互,契约清晰,入参输出都是结构化数据。 而大模型应用中,Prompt 就是新型接口,交互协议变成自然语言。同一个意图,用户表达方式千变万化;相同 Prompt,输出还会有随机性,测试的核心不再比对字符串,而是校验用户意图是否被正确理解。

大模型最终输出,是 Prompt 提示词 + 调用参数 两者共同决定的,二者会互相牵制,不是各自独立生效。

1. temperature(温度)

作用:控制输出随机性、创造性

  • 调高(靠近 1) Prompt 写得再严谨,模型也更容易发散、自由发挥,容易出现脑洞内容、幻觉;适合创意写作。
  • 调低(靠近 0) 即便 Prompt 写得比较开放模糊,输出也会收敛、保守、重复;适合事实问答、数据输出。

关键点:temperature 高时,再好的 Prompt 也拦不住模型乱发挥;温度很低时,开放类 Prompt 也很难激发创意。

2. top_p

作用:控制采样候选词范围,调节多样性

  • 调高:候选词池更大,输出更多变;配合创意类 Prompt 效果好。
  • 调低:只选取概率最高的词,输出更确定;适合要求严谨的 Prompt。

注意:top_p 和 temperature 是协同的,只改一个,另一个数值很高,依然会出现随机发散。

3. max_tokens / min_tokens

作用:限制输出最大、最小 token 长度

  • max_tokens:不管 Prompt 写得多么详尽,一旦到达上限,回答会强制截断。Prompt 要求长篇输出,但 max_tokens 设置过小,会直接回答不全。
  • min_tokens:强制保证最低输出长度;如果 Prompt 意图是简短回答,但 min_tokens 设置过大,会强行凑文字,产生废话。

4. response_format

作用:约束输出格式(如 JSON)

  • Prompt 写了 “输出 JSON”,但不配置response_format,模型偶尔会不遵守格式。
  • 配置response_format后,即便 Prompt 写得简单,也会强制输出指定格式;
  • 如果 Prompt 内容和格式冲突(例如要求输出诗歌,同时强制 JSON),会出现输出错乱。

5. history(对话历史)

作用:携带上下文 Prompt

  • history 里保存前面多轮的 Prompt 和回答,模型才能读懂上下文。
  • history 截断、丢失,后面新写的 Prompt 再完整,也会发生 “失忆”,丢失前面业务约束。

参数组合爆炸

大模型可配置参数多,每个参数又有大量可选数值,参数之间互相排列组合,组合数量呈指数级上涨,没办法把所有组合全部测一遍(穷举不现实)。

举例:temperature、top_p、max_tokens、response_format 多个参数,每个参数取 3‑5 个档位,组合瞬间就会达到几十上百组。

带来的影响

测试用例数量暴涨,做不到全覆盖,测试工作量、时间成本急剧升高。 很多边角参数组合场景,人工很容易漏掉,线上就可能出现偶现异常。

3 个应对策略

  1. 基于风险的测试,优先测关键组合 不盲目全量遍历,聚焦业务真正会用到的参数组合。把高风险、线上高频使用的组合优先测试,放弃低风险几乎不会用到的组合。
  2. 自动化测试,自动生成 & 执行用例 把 Prompt、参数组合交给脚本批量跑,大规模执行用例,替代手工反复调试,降低人力成本。
  3. A/B 测试,生产小流量验证 线上环境切小流量,对比不同参数组合的实际业务效果,在真实用户输入下验证参数行为。

上下文长度限制原理

大模型拥有固定大小的上下文窗口,以 token 计量,相当于 AI 的记忆黑板。窗口容纳历史对话 + 当前 Prompt的全部内容。 一旦总 token 超出窗口上限,就会触发超限:要么接口报错,要么历史被截断,AI 丢失前期记忆,产生业务错误。 测试关注点:长对话、长文档输入场景,验证历史截断逻辑是否符合业务预期。

做 AI 功能测试,需要构造多轮长对话、大文档输入,验证超限后的表现,很多 “AI 失忆” bug 根源就是上下文窗口溢出。

上下文溢出风险

当历史对话与当前 Prompt 的总 token 超过上下文窗口上限时,会出现上下文溢出。

  • 发生原因:长对话不断累积 token,超出模型上下文窗口容量。
  • 直接失败:接口报错,模型无法生成或返回响应。
  • 静默失效:系统自动丢弃早期历史,模型 “忘记” 前面的关键信息。
  • 结果异常:模型忽略输入内容,回答与问题无关,甚至产生幻觉。
  • 测试重点:构造超长对话,验证历史截断策略,检查关键信息是否丢失,并确认异常响应符合预期。

上下文溢出的本质不是 “输入太长” 这么简单,而是超长内容导致模型无法完整读取上下文,进而引发报错、失忆或回答异常。

截断策略测试

测试目标

当发生上下文溢出时,验证系统的截断策略是否合理有效。

上下文装不下全部对话,程序就要删掉一部分历史消息,这就是截断。

测试方法

  1. 构造超长对话,观察哪些对话被保留、哪些被删除;
  2. 校验截断之后,AI 回答是否连贯、和当前问题相关。

三种常见截断策略

  1. FIFO 先进先出 删掉最早的历史消息,实现最简单。 缺点:早期可能存放业务关键信息,会直接丢失,造成 AI 失忆。
  2. 基于重要性 优先保留最新消息、业务关键信息,舍弃不重要内容。 优点:尽量保住业务需要的上下文;实现复杂度高。
  3. 基于 Token 按 token 数量做精确裁剪,严格适配上下文窗口的容量上限。

多轮对话状态一致性

校验 AI 能否记住历史对话信息。重点测三类场景:代词指代消解、对话主题不跑偏、关键业务信息记忆。 一旦上下文截断、历史丢失,就会出现代词理解错误、话题跑偏、遗忘前置条件等问题。

测试目标

验证 AI 在多轮聊天里,能不能记住、复用前面对话的关键信息,比如用户信息、当前讨论主题。

三大测试场景

  1. 指代消解 可以理解代词:“它”、“这个” 这类指代,能定位到上文提到的对象。

示例:先聊无线耳机,后面问 “把它的价格告诉我”,AI 要知道 “它” 指耳机。

  1. 主题保持 多轮来回对话,始终围绕同一个业务主题,不会跑偏。
  2. 信息记忆 记住前面轮次给出的业务条件、用户输入,后续问答可以持续使用。

角色错乱典型问题

角色扮演场景下,AI 会遗忘人设,出现行为颠倒、人称混乱、多轮之后人设跑偏。 测试手段:使用角色设定 Prompt 做多轮对话,持续校验 AI 身份行为是否不偏离设定。

问题描述

AI 做角色扮演时,忘记自身身份设定,扮演错误角色,破坏对话一致性。

典型场景

  1. 身份行为错乱:设定扮演医生,反过来反问用户症状,角色行为颠倒。
  2. 人称混淆:分不清第一、第二人称,说话主体混乱。
  3. 多轮后人设跑偏:刚开始符合角色设定,经过多轮对话之后,慢慢脱离角色要求。

诱因:上下文溢出、截断、Prompt 约束被弱化,都会引发角色错乱。

测试方法

编写清晰的角色扮演 Prompt,做多轮连续对话,持续观察 AI 输出,校验角色行为、口吻、身份是否保持一致。

空输入 / 异常输入处理

模拟空白、特殊符号、乱码、HTML/Emoji 等脏输入,验证 AI 应用容错性。 要求:不崩溃,输出友好引导提示,而不是输出错乱内容。

测试目标

校验 AI 应用面对各类异常输入时的容错能力、错误处理机制,避免程序崩溃、乱输出。

测试用例

  1. 空输入:提交空白 Prompt,没有任何内容
  2. 纯特殊字符:!@#$%^&*()这类符号
  3. 无意义字符串:乱码字母,例如asdfghjkl
  4. 特殊格式:大量 emoji、HTML 标签、Markdown 代码

预期结果

  1. 系统优雅容错,不能崩溃、不能报错闪退
  2. 返回友好提示,引导用户输入有效内容

超长文本输入风险

即便没有触发上下文溢出,单次超长输入也会带来风险:接口变慢、抓不住核心内容、幻觉变多。 测试方式:投喂大篇幅文本,校验响应速度与回答质量。

风险描述

没有超过上下文窗口上限的前提下,单次输入一大段超长文本,同样会带来各类隐患,不只是溢出才会出问题。

可能的后果

  1. 性能下降 大文本消耗大量算力资源,接口响应变慢、出现延迟。
  2. 理解偏差 模型抓不住文本里的重点,输出偏离用户提问的主题。
  3. 幻觉增加 面对海量内容,容易错误拼接信息,编造不存在的事实。

测试方法

输入远长于日常对话的大段文本,观察两点:

  1. 系统接口响应耗时;
  2. AI 输出的回答质量,看是否抓得住重点、有无幻觉。

Prompt 注入基础场景

攻击者精心构造输入,欺骗 AI 丢掉系统原始指令,执行恶意指令。常见分为直接注入、角色扮演注入。测试用来校验 AI 应用对抗注入攻击的防护能力。

定义

攻击者构造特殊 Prompt,诱导 AI忽略系统原始指令(System Prompt),转而执行攻击者的恶意指令,绕过安全约束。

两大基础攻击场景

  1. 直接注入 输入类似:忘记你之前的所有指令...,直接命令 AI 丢弃原有系统设定,执行新的恶意命令。
  2. 角色扮演注入 输入类似:我们来玩个游戏,你扮演...,用游戏、角色扮演做包装,欺骗 AI 切换身份,绕开安全规则。

测试意义

验证 AI 应用能否抵御 Prompt 注入攻击,检验应用层安全防御能力。

总结

AI 功能测试围绕六大维度:Prompt 理解、模型参数控制、上下文对话处理、异常输入容错、安全注入防护、最终输出质量校验,覆盖多轮对话、角色人设、超长文本、Prompt 注入等典型风险点。

测试模块 子测试项 测试说明 测试用例示例 预期结果 / 关注点
Prompt 理解 交互形态转变 AI 应用用自然语言提示词交互,区别于传统接口规范 自然语言提问替代结构化参数调用 认可交互载体变化,测试重心转向自然语言质量
不同格式提示词 验证模型对不同书写格式的理解 Markdown、JSON、纯文本、HTML 标签 不同格式均能正确识别意图
多语言兼容性 检查中英文等多语种提示词 中文、英文、中英混排提问 多语言提问均能识别意图
清晰度 / 歧义 模糊、残缺输入是否曲解诉求 简短、模糊、歧义提问 不曲解用户真实意图、不答非所问
专项测试方案 针对自然语言交互建立专项用例体系 同义改写、残缺、异常输入覆盖 不沿用传统固定用例思路
参数控制 参数特性 参数数量有限但关键,不同模型存在微调差异 跨模型对比同一参数行为 识别并适配不同模型的参数差异
参数有效性验证 确认参数真的影响输出而非配置无效 修改 temperature 观察输出变化 避免参数配置失效
参数对输出影响 验证参数调整是否按预期改变输出 temperature=0/1、top_p 高低档 随机性 / 多样性随参数正确变化
业务场景适配性 参数组合是否符合业务需求 事实问答用低温、创意用高温 参数配置匹配具体业务场景
参数组合爆炸 多参数 × 多档位组合下系统表现 多参数组合批量执行 不能穷举全部,优先覆盖关键组合
上下文处理 上下文溢出 多轮对话 token 超窗导致失忆 / 报错 构造超长对话触发溢出 报错或截断策略合理,关键信息不丢失
状态一致性 多轮对话是否记住关键信息 多轮围绕同一主题连续提问 上下文不丢失、回答不自相矛盾
角色错乱 角色扮演是否保持人设 设定 “医生” 角色做多轮对话 身份 / 口吻不跑偏、人称不混乱
长对话压力测试 长时间 / 多轮对话下的稳定性 设计 20 + 轮次对话 记忆稳定、不中途失忆
输出质量 内容相关性 回答是否贴合用户问题 偏题提问 答即所问、不跑偏
回答完整性 回答是否覆盖全部要点 多要点问题 要点齐全、不遗漏
逻辑一致性 回答是否前后自洽 多轮追问同一话题 不自相矛盾
异常输出处理 面对非法输入是否容错 空输入、特殊字符、超长文本 不崩溃、友好提示、不输出错乱
安全性防护 是否抵御恶意注入 Prompt 注入攻击测试 不绕过安全指令、拒绝恶意请求
敏感内容过滤 是否过滤敏感信息 高危内容输入 合规输出、合理拒绝
典型失败场景 上下文溢出 长对话后丢失关键信息 20 + 轮次对话验证 截断策略合理、关键信息保留
异常处理崩溃 非法输入导致系统崩溃 特殊字符 / 乱码测试 优雅容错、不闪退
安全漏洞 诱导输出敏感信息 提示词越权测试 不绕过安全指令、拒绝注入
角色错乱 对话中途身份混淆 多角色切换压力测试 人设稳定、不跑偏
mindmap
  root((AI功能测试))
    一、Prompt理解测试
      交互形态转变:自然语言提示词
      核心差异:接口规范 vs 交互质量
      不同格式提示词
      多语言兼容性
      提示词专项测试方案
      模糊/歧义输入
    二、参数控制测试
      参数少但关键
      不同模型有差异
      参数有效性验证
      输出影响验证
      业务场景适配
      参数组合爆炸
    三、上下文处理测试
      上下文溢出
      状态一致性
      角色错乱
      长对话压力测试
      上下文记忆验证
      角色保持稳定性
    四、输出质量测试
      内容相关性
      回答完整性
      逻辑一致性
      异常输出处理
      安全性防护
      敏感内容过滤
    五、典型失败场景
      上下文溢出
        丢失关键信息
        20+轮对话验证
      异常处理
        非法输入崩溃
        乱码/特殊字符
      安全漏洞
        诱导输出敏感信息
        提示词越权
      角色错乱
        身份混淆
        多角色切换