ai-system-testing

Test AI features (LLM/prompt/agent/RAG): risk modeling, rubric design, tolerant assertions, judge calibration, prompt regression, injection testing. Not for: deterministic features, prompt writing. 测

SKILL.md

GitHub

AI 系统测试(ai-system-testing)

被测对象是 AI 功能(LLM 特性、prompt 行为、agent/工具调用、RAG 检索面)时的测试方法论。与传统测试的根本差异只有一个:输出不确定——同输入不同输出是常态,传统"期望值精确断言"大面积失效。本 skill 把不确定性本身作为被测对象:风险建模 → 可判定评测设计 → 容错断言 → judge 校准 → 回归与安全边界。

诚实条款:LLM 评测存在采样方差。任何评测结论(通过率、得分)必须带样本量与方差说明;n=1 的结论只能表述为观察,不得表述为达标。设计红线沿用 ../core/executability.md——评测任务同样要"可判定",判分点不可判定 = 评测无效。

定位:本 skill 是被测域(SUT 是 AI 系统)的承接方,不是流水线的固定阶段——功能域十轴决策(../core/test-type-matrix.md)照常执行;AI 特有风险(不确定性 / 幻觉 / 注入 / 成本与延迟)由本 skill 补上。触发判据是被测对象含 AI 行为,不是任务里出现"测试"二字。

  • 输入:AI 功能的需求/PRD、prompt(或系统提示词配置)、样本输出(真实或预录)、agent 工具调用记录(如适用)、检索语料边界(RAG,如适用)
  • 输出(落盘):{项目}/测试报告_AI评测_{日期}.md(功能名写入报告头 §1;用户/任务指定文件名时以其为准)——评测集 + rubric + 判分结果 + 方差披露节(样本量/通过率区间/已知盲区);prompt 回归分析(工作流三);注入面移交包(工作流五,交安全责任方)。报告格式与字段口径按 ../core/report-template.md(此时加载)。验收/回归结论一律以"证据 + 选项"呈现,通过/上线/定级的判定权在产品与安全责任方,不在测试
  • 边界:传统确定性功能 → 各既有 skill(十轴决策);prompt 的编写与优化本身 → 开发职责,本 skill 只测其行为;模型训练/微调 → 训练方;生产环境事故 → 运维/专项

When to Use

  • 被测功能含 LLM 调用(生成、摘要、分类、抽取、翻译、代码生成等)或 prompt 驱动行为
  • agent/工作流产品的工具调用正确性、循环与卡死面需要测试
  • prompt(或模型版本、温度参数、检索语料)发生变更,需要回归测试
  • 需要为 AI 功能设计评测集、判分 rubric 或验收标准
  • 怀疑 AI 功能存在注入、越权、提示泄露等安全面风险

When NOT to Use

  • 被测对象是传统确定性功能(同输入必同输出)→ 按 ../core/test-type-matrix.md 十轴走既有 skill
  • 帮用户写 prompt / 优化 prompt 效果 → 开发职责(本 skill 只定义"怎么测",不定义"怎么写")
  • 模型训练、微调、数据标注 → 训练方职责
  • 已确认缺陷的根因定位(AI 功能输出的错误样例定性后)→ bug-analysis
  • 纯性能/压测(吞吐、延迟分布)→ 移交包走 ../core/test-type-matrix.md 性能轴

工作流零:AI 特性风险建模(前置必做)

对被测 AI 功能按五面建风险清单(每条挂证据与优先级,接 ../core/risk-model.md 两因子):

  1. 非确定性面:同输入漂移(温度/模型版本/检索变化);后果 = 断言脆断与验收波动
  2. 正确性面(幻觉):编造事实、引用不存在来源、参数幻觉——按"可验证锚点"测试(输出中的事实必须能在输入/语料中定位)
  3. 安全面:注入(用户输入劫持指令)、越权(工具调用超出授权)、提示泄露——见工作流五
  4. 成本与延迟面:token 成本、延迟分布——纳入验收口径(如实声明阈值来源);调用量与下游直驱程度是影响放大因子(日均调用越高、越直接驱动生产决策,回归标准越严)
  5. 数据回流面:用户数据进入 prompt/语料的路径——隐私与回归影响(变更语料 = 变更行为)

工作流一:评测集与 rubric 设计

  1. 黄金标准:每条评测样本先定义"可判定判分点"——判分点必须满足:第三方依此能独立判定通过/失败(同 ../core/executability.md 可执行性标准)。"摘要写得不错"不是判分点;"摘要包含全部 3 个关键金额且无编造条目"是。
  2. 样本来源:真实历史 case 优先(脱敏);边界样本(最长输入、多语言、注入尝试)显式列入——评测集不含边界样本 = 验收盲区。
  3. rubric 模式库:此时加载 references/eval-design-patterns.md(判分点模板、断言模式库、样本设计清单)。
  4. 评测集自身要测:对判分点做锚点对照(预埋已知好/坏样本,judge 或人工评分必须能分辨——分不开 = rubric 无效,回炉)。

工作流二:容错断言(非确定性输出的断言策略)

按"确定性从高到低"优先选择断言模式(完整模式库见 references/eval-design-patterns.md 第 3 节):

  • 结构断言(最高确定性):JSON schema、字段存在性、格式约束——能硬断言的绝不采样评审
  • 关键字段精确断言:金额、ID、日期等不可漂移字段——逐字相等
  • 内容包含断言:关键事实/关键词在输出中(容忍措辞漂移)
  • 阈值断言:数值型判分(相似度、命中率)设阈值,阈值来源必须注明(业务约定或历史分布分位数,禁止拍脑袋)
  • 多数投票:n 次采样按多数判定(n≥3,采样参数记录在案)——用于"应当稳定"的行为
  • judge 评审(最低确定性,最后手段):长文本语义质量——judge 必须校准(工作流四),judge 结论必须挂逐点证据
  • 禁止:对自然语言长文本做逐字断言(脆断无价值);对"应当稳定"的行为用单次采样定生死

工作流三:prompt 回归

prompt 变更 = 代码变更,纳入回归纪律:

  1. Diff 分析:prompt 改了什么(指令增删/格式约束/少样本示例变更)→ 推导受控行为面
  2. 回归集选取:受控行为面的既有评测样本 + 变更意图的正反样本;判分点期望值按变更意图重算时必须显式留痕(区分"评测集错了"与"被测行为被有意改变");全量回归仅在模型/温度等全局变更时执行
  3. 回归判定:按工作流二选断言模式;回归结论必须带方差披露(样本量、两次运行结果差异),单次跑绿不构成回归通过
  4. 版本锚定:prompt 版本、模型版本、温度、检索语料版本四元组记录进报告——不可复现的评测 = 无效评测

工作流四:judge 选择与校准

  • judge 选择:自动指标(结构/包含)> 专用小模型 > 通用强模型 > 人工——每降一档,校准义务加重
  • 校准意识(κ 降维版):judge 与人工判定的一致性抽检(≥20 条);发现 judge 不可信的信号见 references/judge-calibration.md(锚点失分、宽容偏置、位置依赖、自我偏好——judge 评审自己族生成内容必须披露)
  • judge 不可信的处置:换 judge / 改判分点为可机械判定 / 降级为人工——不得带着未校准 judge 出报告

工作流五:注入与越权面(移交包)

  1. 注入测试:在用户输入中植入指令劫持尝试(忽略前文/泄露系统提示/调用未授权工具),记录输出行为
  2. 越权测试:以受限角色诱导工具调用越权参数,核对实际调用参数与授权边界——缺陷定性对象是授权边界的执行(agent 侧),用户诱导只是触发器
  3. 产出移交包《注入面测试移交_{功能}_{日期}.md》:尝试清单 × 输出行为 × 影响评估——移交安全责任方处置,本 skill 不做安全结论(测试证据分级按 ../core/evidence.md)
  4. 工具调用行为面的计数口径:正确调用 / 越权调用 / 无进展异常 三列分立计数,并核对会话累计次数 vs 声明上限(累计超限而未熔断 = 熔断失效发现,单列上报);逐条判定引用会话轮次与授权条款出处
  5. 循环/卡死面:工具调用次数上限、无进展循环检测——与 agent 编排方约定熔断语义

与既有流水线衔接

  • 编排入口:"帮我完整测这个 AI 功能"是端到端诉求 → qa 编排;阶段 2 策略照常产 type_scope,阶段 3 用例与阶段 5 执行涉及 AI 行为的判分点、断言强度与方差披露按本 skill 执行
  • E2E 断言降级策略:AI 功能嵌在 E2E 流程时,能硬断言的(结构、关键字段、副作用落库)保持硬断言;语义类断言降级为"采样评审 + 阈值",在 ../core/pipeline-integration.md 门禁中注明采样率与阈值来源
  • 测试策略:AI 功能在 ../core/test-type-matrix.md 中的定位 = 被测域(SUT 是 AI 系统),非新增类型轴——十轴决策照常,AI 特有风险由本 skill 承接
  • 沉淀:稳定的评测集、judge 校准结论、注入尝试模式——满足"三个月判据"交 qa-memory(评测资产按项目治理政策管理,勿入公开仓)

速查

场景 动作 禁止
需求方要"验收 AI 摘要功能" 工作流一定义可判定 rubric + 边界样本 用"看起来不错"类不可判定判分点
单次输出不理想就报 Bug 复采样(n≥3)+ 判定是能力缺陷还是采样波动 n=1 定生死
prompt 改了一句话 工作流三回归(带方差披露) "改的是 prompt 不用回归"
judge 打分两极摇摆 校准抽检,判定 judge 不可信 → 回炉 未校准 judge 直接出结论
输出里出现疑似注入响应 工作流五移交包,交安全方 自行定性"无风险"
出具评测/安全/验收结论 以证据+选项呈现,判定权在产品与安全责任方 替用户拍板放行、定级或宣布达标

反模式

反模式 后果 替代
逐字断言自然语言输出 偶发漂移即假失败,测试无人信 结构/包含/阈值断言阶梯
n=1 采样下结论 把采样波动当能力变化,误报漏报 n≥3 + 方差披露
评测集全是顺样本 验收通过但上线即翻车 边界样本显式列入(注入/极值/多语言)
未校准 judge 当裁判 宽容偏置使垃圾输出过审 锚点对照抽检,不可信即回炉
评测结论无方差说明 不可复现、不可审计 样本量 + 通过率区间强制披露