用合成数据提升软件工程能力
测试的质量取决于可用的测试数据。我们都知道获取测试数据(包括特殊情况)时面临的挑战,尤其是在隐私法规日益严格的背景下。

如果AI生成你的测试数据会怎样?
测试的质量取决于可用的测试数据。我们都知道获取测试数据(包括特殊情况)时面临的挑战,尤其是在隐私法规日益严格的背景下。我们将讨论在ING,我们是如何利用AI作为解决方案之一来应对这一问题的。
1、证据
在这篇博客文章中,我们将讨论使用AI自动生成测试数据。关于使用生成式AI创建合成数据有许多泛泛而谈的内容,让我们先从更实际的角度来看待它。下图显示了两个子屏幕,每个屏幕上都有付款信息,这些信息可以是真实数据或由AI生成的合成数据。

在最近的一次大会上,我请观众指出哪一个是真实的付款记录。投票结果是五五开。然而,这两个屏幕都是由AI生成的合成数据。当我们第一次将10,000个自动产生的合成付款注入到测试环境中时,测试人员提出了一些反对意见,因为他们无法轻易区分这些与他们用付款屏幕创建的真实付款之间的区别。这就是为什么我们决定在合成付款标识上添加“TEST”字样(屏幕上为黄色)。这个例子展示了这项技术已经变得多么成熟。
2、案例开始
我的合成数据之旅始于四年前。其中一个项目被取消了,于是我得到了一个“多余的”数据科学家。与其让这位数据科学家离开,我们列出了我们可以尝试用AI解决的测试自动化主题。列表上的第一个项目是使用人工智能生成测试用例。四年前这是一个难以解决的问题。今天,我们正在重新审视这个问题,因为语言模型的最新进展带来了更接近的解决方案。然后我们转向了列表上的第二个主题——使用AI生成测试数据。在我们的初步市场研究中,我们遇到了一篇来自MIT的研究论文(附带开源代码)。这就是我们开始的地方。如今,我们已经有超过20个应用程序使用了我们生成的合成测试数据。我们正在构建一个平台,并成功完成了一个生成合成数据以构建AI模型的项目。
3、 动机
为什么要在一种新兴技术上投资,这种技术可以自动地生成测试数据?

我们都知道,当我们将软件交付给生产环境时,事情会发生变化,而且并不总是我们希望看到的变化。这就是为什么我们需要测试并需要测试数据的原因。通常情况下,测试数据会从生产环境中复制过来,但这伴随着许多问题。
成本高昂
从生产环境中复制数据是有代价的。你必须对数据进行屏蔽处理。根据数据量的不同,实际的复制过程也会带来时间和磁盘空间的成本。如果你复制的是核心系统,你可能需要处理所有那些数据才能到达你想要测试的报表层。
速度缓慢
测试团队可能没有权限直接从生产环境中复制数据,可能需要向另一个(运维)团队请求。我们做的一项调查显示,在平均情况下,人们从请求数据到将其加载到测试环境之间需要等待三周的时间。
隐私敏感
有时即使应用了屏蔽处理,数据也无法从生产环境中复制。屏蔽处理也可能比预期的更加复杂。例如,在数据模型中的连接字段需要在连接的两端以一致的方式进行屏蔽,以保持引用完整性。如果你屏蔽了出生日期,你可能仍然需要确保这些日期符合未成年人的年龄。如果你想测试客户名称中的特殊字符,那么作为屏蔽的一部分将名字空白化并不能真正帮助你。
不完整
最后一个问题就是数据可能不完整。例如,在新冠疫情开始时,政府向小型和中型企业提供了担保,以便他们能够继续获得贷款。这类新的担保在生产环境中还不存在,因此也不会出现在从生产环境中复制的测试集中。这限制了从生产环境中复制数据的能力,因为特殊的或新的案例可能不存在。
4、解决方案
合成测试数据可以帮助解决这些问题。
基本上,这是一种自动化手段,一旦设置好,它可以非常快速并且节省时间和精力。
你可以强制AI按照你的指示生成特定的数据,这样比从生产环境中复制数百万条数据并希望其中包含你需要的数据要有效得多。
合成数据是非常隐私安全的,并且在GDPR下它不被视为个人数据。而在屏蔽处理中,只有一些敏感字段被屏蔽,留下数百个未屏蔽字段供攻击者利用,而在合成数据中,每一列都是合成的,使得身份攻击变得不可能。
由于大多数工程师在开发过程中都会使用测试数据,或者参与测试数据的提供,所以我们有很大的杠杆作用,成千上万的工程师可以在ING中受益于这一点。
5、史前历史
生成式AI能为图像做的事情,它同样也能为表格数据做到。

我们已经熟悉了“深度伪造”,即由生成式AI生成的看起来真实但实际上虚构的图像。我们可以使用机器学习从真实的图像中学习并构建模型来生成逼真的合成图像。同样的技术也可以应用于生成测试数据。

近年来,这种方法也被应用于医疗领域。检测X光片中肿瘤的软件必须用真实的图片进行训练。幸运的是,他们并不总是有足够的真实图片,所以他们会补充一些合成图片。甚至有研究表明,在很多情况下,增强数据(真实图片和合成图片的混合)的表现优于仅使用真实数据。

让我们来看看表格数据(见上图),这是我们通常在Excel或Oracle关系数据库中拥有的数据。顶部是真实数据,是一些表格的一小部分快照。底部是由此衍生出的合成数据。这是我们在一个项目中的成果(向欧洲央行提交的监管报告)。合成数据的基本原理是AI应该从真实数据中学习并生成合成数据,同时保留数据的统计特性。这意味着什么呢?
列的频率和分布应匹配。如果我们看“摊销类型”这一列,我们会注意到有很多一次性支付。我们注意到合成数据中也有同样的情况,因为AI学会了这一点。
列之间的相关性应匹配且有意义。AI还需要学习列之间的相关性。例如,有一个表示到期日的列,即合同的结束日期,还有一个表示起始日的列,称为生效日。到期日应该大于生效日。
仔细观察后我们发现,在第236行贷款起始日是在结束日之后,这显然是不正确的。这种情况是如何发生的,我们是否想要这种情况?这可能是(正如我们在项目中遇到的情况一样)真实数据中也存在数据质量问题,AI从中学习到了这一点。这对测试负面测试用例很有用。如果我们不想在合成数据中出现这些“错误”,我们可以要求AI始终尊重日期顺序。我们还可以故意要求AI包含一些这些“错误”,我们将在用例中回到这一点。
6、实施方法
它是如何工作的?
在ING,我们使用的是Synthetic Data Vault (SDV),这是一款最初由MIT开发并开源的软件。几年前,这项技术被剥离出来成立了一家公司叫做Datacebo。Datacebo是我们的人工智能生成合成数据的合作伙伴。SDV是一个Python软件开发工具包。这给了我们在使用它的灵活性以及将其集成到我们的ING环境中的能力。

SDV的操作方式与生成深度伪造的技术非常相似,只是生成的是表格数据而不是图像。我们总是从一个真实数据集(训练集)开始,然后将其喂给AI算法。该算法将创建一个模型,该模型保存着我们上面解释过的现实数据的统计属性。
一旦模型创建好了,我们就可以反过来要求SDV从模型中生成(采样)合成数据的行。有几种AI技术可以用来创建模型。
一种技术是使用神经网络(通常是某种形式的GAN),另一种技术是使用统计算法如copula。由于GAN方法对于更大的模型来说不容易扩展,并且非常依赖数据,我们主要集中在copula上。Copula可以很好地扩展,不需要太多的数据来训练模型并且性能很好。
训练集可以很小,通常有20K行就足够了,但可以用来生成数百万行的合成数据。训练集需要来自生产环境或较低环境,只要它代表了我们想要创建的数据。我们了解到,当训练集变大到一定程度时,合成数据的质量不再提高,因为我们开始一遍又一遍地向AI展示相同的数据模式。还有研究在探索LLM的使用,但目前这种方法似乎也遇到了GAN面临的问题。
7、实践
ING的例子。
第一个例子是本文开头提到的那个,目标是为SEPA支付系统的测试生成合成测试数据。

由于隐私原因,测试团队无法访问生产数据,转而手动创建自己的XML格式的合成付款。由于这很昂贵,测试集最终主要覆盖了一些正面案例。
我们从生产队列中取了5,000笔真实的付款记录,训练了一个AI模型,并在不到两分钟内生成了10,000笔合成付款。然后测试团队将这些合成付款插入到验收环境的付款队列中,这样支付引擎(OVI)就可以像处理真实付款一样处理它们。
在这个时候我们遇到了后端不识别合成账号的问题。我们有两个选择:要么合成后端系统,要么使用验收环境中的账号。我们选择了后者,用验收环境中的账号替换了合成的IBAN。这种方法表明我们可以将合成数据(付款队列)与验收环境中的屏蔽数据(后端数据)结合起来使用。
进一步的改进是,我们不是生成10,000笔随机付款,而是基于实际测试用例生成只有20笔付款。例如,团队会要求生成小额和大额的付款,以及当天执行和计划在未来某一天执行的付款。我们甚至可以要求模型生成它在真实数据中未曾见过并且不在模型中的值,但仍然可能是有趣的边缘案例。只有20个非常具体的测试数据点意味着测试工作量减少了。
第二个例子来自我们使用这项技术测试API与模拟软件结合的项目。
通常,如果你想测试一个API,你会去击打真实API的端点。你发送请求,得到响应。有时,这样做测试更方便的是使用模拟器,这样就不必连接到真实API。例如,如果那个API在你的测试环境中并不是总是可用的话。你击打模拟器的端点,仍然发送请求,并且仍然收到响应。当然,实际上什么都没有发生。模拟器只是接收你的请求,并根据映射表中告诉它的内容返回响应。


所有这些听起来都很不错,但如果想做100个测试用例,就需要在映射表中告诉模拟器100个请求-响应对,每个对可能都相当复杂。填写100个这样的对将花费大量时间并可能导致错误。下面的图片展示了一个例子。

涉及的API运行在OnePam上,这是ING的全球客户系统。我们发送一个客户ID(UUID),然后得到客户信息的反馈。你必须手动输入这些信息或找到其他方式来实现,并且要给模拟器提供100次。这限制了使用这种模拟器的可能性,并使测试人员对其吸引力降低。
好消息是,我们可以使用SDV自动生成这个映射表。方法与前面的例子类似。因为我们想生成映射表中的对,所以我们需要从真实的API请求响应对的训练集中开始。这些我们从API的Kafka日志中获取。我们使用了2000个这样的示例对来训练模型。然后我们可以从这个模型中生成我们想要提供给模拟器的对。这是一个技术组合(模拟器和合成数据)帮助工程师的好例子。
8、结束语
我们已经展示了获取良好测试数据常常是个问题,而由AI生成的合成数据可以是一个解决方案。通过实例,我们已经展示了ING是如何使用这项技术的。如果你想继续这段旅程,可以通过尝试开源版本来获得更详细的技术信息:SDV
原文链接:How “AI powered” synthetic data boosts software engineering
汇智网翻译整理,转载请标明出处
