将传统软件的metamorphic testing方法应用于LLM测试,通过验证输出间的数学/逻辑关系而非绝对正确性来解决oracle问题。
你无法断言一个模型的答案是正确的,因为你根本没有标准答案。但你可以断言两个答案之间的关系必然成立。这个替换思路已经有三十年了,它有自己的名字和文献体系,而且它是整个领域中最具普适性的想法。
测试神谕(test oracle)是用来判断结果是否正确的机制。对于排序,神谕很容易获取;对于编译器、数值求解器、搜索引擎或语言模型,神谕往往不可用:计算期望输出意味着重新实现这个系统,而你调用它的原因恰恰是你无法做到这一点。软件测试称之为神谕问题(oracle problem),这并非 AI 时代特有的现象。
变形测试(Metamorphic testing)是标准的解决方案。它由陈志汉、张志光和姚铭于 1998 年在香港科技大学技术报告 HKUST-CS98-01(标题为《变形测试:生成下一批测试用例的新方法》)中首次提出。Segura、Fraser、Sánchez 和 Ruiz-Cortés 于 2016 年在 IEEE Transactions on Software Engineering 上发表了该领域的综述论文,Chen 等人于 2018 年在 ACM Computing Surveys 上发表了《变形测试:挑战与机遇综述》。该方法已被应用于编译器、搜索引擎、机器翻译,以及最近的语言模型直接测试——Hyun、Guo 和 Babar 的 METAL 框架在 ICST 2024 上发表,完全建立在将变形关系定义为评估指标的基础上。
变形关系是一种必要的属性,联系着多个输入及其输出。经典说明是三角函数:你可能不知道 sin(x) 应该是什么值,但你知道 sin(x) == sin(180 - x)(以度为单位),所以你可以运行函数两次并检查关系,而无需知道实际值。测试包含三个部分:源输入、生成后续输入的转换,以及两个输出必须满足的关系。
这种分类的自然语言版本已经存在。Ribeiro、Wu、Guestrin 和 Singh 的 CheckList(ACL 2020 最佳论文)定义了三种测试类型:最小功能测试、不变性测试(改变不应影响预测),以及方向性期望测试(改变应在已知方向上影响预测)。后两种本质上是换了名字的变形关系,这个命名值得借鉴,因为它能帮助你在脑海中清晰区分这两种类型。
不变关系——输出不能改变:
方向关系——输出必须改变,且方向已知(尽管值未知):
关系是否可靠,完全取决于转换是否忠实。如果你的改写器悄悄改变了含义,模型的不同答案就是正确的,你的测试报告了一个并不存在的 bug。在需要人工分类的测试套件中,误报比漏报更昂贵,所以这部分要保守。
强烈偏好机械转换:重排、空格、字段重命名、从固定表进行实体替换、更改 locale 字段。这些是可证明保持语义的,因为你可以通过阅读生成它们的代码来验证,成本为零,而且可以与生成器组合。当你需要真正的改写时,生成一次变体——手动或用模型——让人类检查它们,然后将结果作为固定文件提交。在测试内部实时产生的改写会使转换变得不确定,这意味着失败不再能归因于任何具体原因。
变形测试告诉你两个输出不一致。它不会告诉你哪个是错的,也无法告诉你两者是否以相同方式出错。一个自信拒绝每个请求的模型几乎满足此页上所有不变关系。因此这些测试捕获的是不稳定性和脆弱性,而非系统性错误——后者需要配合标注集来捕获,两种技术覆盖不同的盲点,彼此不能替代。
第二个限制是关系强度。太弱的关系在损坏的系统上也会通过:"在我添加空格后输出仍然是有效 JSON"技术上也是变形关系,但毫无价值。有用的关系是你能阐明违反它对用户意味着什么的那种——如果做不到,那关系就是装饰品。
第三个是成本。每个关系都会使调用量翻倍,因为每个源输入都需要其后续输入。需要三四个变体的方向关系会进一步倍增。按预期收益选择关系,而不是按你能想到的数量选择;要明确变形测试套件是按次计费,而非一次性固定成本。