最近,有几位同仁问我如何测试 AI。很高兴分享我的经验,但我倾向于从更广义的视角来解读这个问题,也许可以这样问:在测试包含人工智能组件的系统时,我会考虑哪些方面。
第一次回答这个问题时,我是自由发挥的,但当问题再次出现时,我决定写下一些要点,帮助我记住关键内容。这篇文章就是这个列表的最新版本。
重要声明:我不是专家;以下内容是我在对话中提醒自己注意的事项,因此非常简洁;它也比较杂乱;绝对不是一个指南或最佳实践集合;每一点都应根据具体情况应用;这些分类非常粗略;当然,这并不完整。
另外需要注意的是,我合作的团队在各自领域、技术和医学安全方面等都非常专业,下面列出的一些内容通常是他们的经验。
测试 AI
- 测试 AI 与测试其他任何东西是一样的:寻找相关的不一致性。
- 你可以运用你在常规测试工作中使用的所有技能。
- CODS - 控制、观察、分解、简化
- 你永远无法测试所有内容,尤其是AI,更加如此。
- 需建立对比机制:输入与行为输出的(部分)预期基准。
- 系统行为的实证数据至关重要。
- 你(感知到的)输入和输出空间的覆盖范围是核心指标。
- 切勿被"AI"标签误导系统具备"理解"能力。
- 在这个使用场景和上下文中,这个系统的风险是什么?
- 有哪些极其糟糕的输出?
- 可能出现的坏结果是什么?有多严重?对谁?何时发生?
- 是否有效解决问题?是否存在替代解决方案?
信息空间
- 输入和输出空间在功能上是无限的。
- 受底层模型限制,数据存在不确定性。
- 你无法确定“推理”将产生什么结果。
预期基准构建
- 如何定义优质输出的特征?
- 如何评估输出与这些特征的匹配度?
- 需关注隐含的交叉影响:社会、人际、交互等维度。
- 问题通常具备多维度特性。
- 建议采用多个度量指标。
- 如何平衡多个度量标准来判断系统整体的行为?
数据
- 仔细考虑输入空间的覆盖情况。
- 仔细考虑输出空间的覆盖情况。
- 考虑超大数据集,并为可接受的正确率设定一些指标。
- 是否有特定的情况必须得出特定的结果?
- 是否有特定的结果是我们绝对不希望看到的?
- 尝试语义上相同但语法不同、同义词、空内容、长度变化、改变顺序、隐藏相关内容等数据。
-
你的测试数据来自哪里?
-
你是否有现有的系统,包含用户数据和期望的输出?
- 你是虚构数据的吗?基于什么依据?使用什么工具?你如何判断这些数据与真实用户数据的相似度?
- 无意义数据:哪些数据永远不应该得到响应?(警惕只关注理想情况的误区)
- 允许使用哪些语言?LLM 通常会回应任何你输入的内容。
各种方法
- 在大多数项目中,你会需要规模化。
- 在大规模测试中,你需要自动化来运行你的系统。
- 自动化检测变更。
- 自动化探索。
- 在大规模测试中,你还需要对结果进行统计评估。
-
即使在大规模下,你可能仍然需要一个人工环节。
-
你能从测试和生产环境中采样进行人工审查吗?多少数据?多频繁?哪些数据?
-
属性驱动测试是一种值得考虑的模型。
- 变形测试是一种有价值的方法。
- 考虑输入的组合。
- 对抗性测试(使用其他 AI)。
- 领域专家可以识别你可能错过的细节。
- 如何评估两个版本系统之间的差异?
- 评估某个版本系统中变异的程度。
- 是否存在偏见?针对谁?依据谁?
- 为不同类型的实验设计定制工具。
- 为不同类型的实验设计定制度量标准。
- 你能将系统拆分成多个步骤并逐个检查吗?
- 如果系统是基于对话的,你是评估每次对话、最终结果,还是两者?
开发
- 如何测试变更的影响?(例如,向提示中添加“不要偏见”)
- 这次测试的目标是什么?
- 什么时候运行你的测试?谁来运行你的测试?
- 测试的成本是多少?不测试的潜在成本是什么?
模型/提供商选择
- 这是正确的模型/提供商吗?(你在选择时有什么限制?为什么?)
- 换到另一个模型/提供商会可行性有多少?
- 该提供商的服务级别协议(SLA)是什么?
- 你相信他们会遵守协议吗?
- 如何测试这一点?
可重复性/可解释性
- 普遍存在的非确定性(即使低熵设置)
- 追踪 bug 可能很困难。
- 通常不清楚如何得出某个特定结果。
道德
- 模型训练使用了谁的数据?
- 使用该提供商的系统对环境的影响是什么?(电力消耗等)
- 系统是否接受并输出有争议的语言(敏感内容),例如种族主义、性别歧视等?
长期考量
- 日志记录(但要小心记录敏感数据,如 PHI)。
- 生产环境中的监控(哪些数据能告诉我们可能有问题?我们怎么知道?)
- 本地开发。应该运行哪些测试?冒烟测试、回归测试、行为测试等?
- 构建流水线。应该运行哪些测试?冒烟测试、回归测试、行为测试等?
- 集成测试。是否有来自外部服务的一致性?
- 何时重新测试?例如流水线变更、提示变更、模型变更等。
- 对部分生产流量进行人工审查。哪些数据?为什么?何时?
可靠性
- 提示词就像代码,但不是代码。
- 白盒视角的局限性。
- 非确定性管理。
- 幻觉控制。
- 外部模型变更应对(如果使用外部提供商)。
- 性能指标(例如延迟、错误率)。
- 容灾策略:限流、熔断机制等(如果与 LLM 的连接失败或过慢等)。
安全性
- 越狱攻击防卫。
- 训练数据泄露防护。
- 用户信息保护机制。