原创 Flint/Aquawer 2026-07-23 17:00 上海
合成数据新范式:CTGAN负责“量”,LLM负责“质” 作者简介
Flint Liu,携程测试开发总监,对于测试用例生成、基于模型的测试、质量领域体系建设以及AI Test有一定的理论和实践积累。
Aquawer,携程高级测试开发工程师,专注于软件测试与质量保障领域,持续探索大模型在测试领域的应用。
团队热招岗位:测试开发工程师
导读:测试人员44%的时间耗在数据构造上——合成数据本是“解药”,但市面方案总缺一角:CTGAN丰富度高却学不会字段逻辑,LLM语义强但输出不可控且低效。本文提出CTGAN+LLM的工程化方案,让二者各司其职,实验证明字段间关系大幅提升,覆盖率接近100%。如果你正苦于测试数据质量与效率,这篇实战复盘值得一读。
一、背景
二、合成数据模型调研
三、LLM-CTGAN数据生成方案
四、总结与展望
一、背景
在软件测试过程中,构造测试数据是一项基础而关键的工作,其目的在于确保软件产品在多种条件下的功能正确性、性能稳定性和兼容性。随着软件系统发展,业务系统的复杂度大幅提升,测试数据的构造也面临高效性、安全性和充分性的挑战。Capgemini与Sogeti的一项联合研究表明,测试人员通常需要耗费44%的测试时间用于测试数据的生成与管理,这是制约企业将产品快速推向市场以保持竞争力的一个关键因素。
常见的测试数据构造方式主要有两种方式,即手动创建测试数据或从线上数据库中同步可用数据。但前者通常成本较高,且受限于测试人员对于业务的理解程度;后者将会带来一定的隐私合规风险,且数据形态受限于现有业务场景,可能无法覆盖极端测试用例。
为了弥补上述两种方式在特定场景下的劣势,一些公司和研究机构提出一种新的概念,合成数据(Synthetic Data)。合成数据是指通过统计、深度学习、大语言模型等方式,将模型拟合到真实数据集,然后使用该模型生成不包含任何敏感信息的高度逼真的模拟数据,使得测试数据管理变得更快、更轻松。这种生成过程是随机的,也就意味着模型每次都会产生不同的合成数据集,从而充分模拟生产环境中不同的数据分布、模式和异常,生成涵盖广泛用例的样本数据。这种方式能够高效地降低测试人员数据构造的成本,验证系统是否稳健,并确保更全面的测试覆盖范围。
> 注:合成数据可能是多模态的,比如数据、音频以及视频等,本文只对表格数据(Tabular Data)进行讨论。
在合成数据构造中,模型的选取非常重要。只有生成的测试数据与真实数据非常相似,且能保持足够的多样性,才能有效地模拟各种测试场景并挖掘潜在问题。但当前的常用数据合成模型通常只能满足上述需求的一部分。本文评估了当前业界常用的几种模型,包括高斯分布、时序变分自编码器(Time-series Variational Autoencoder-based,TVAE)、条件式生成对抗模型(Conditional Tabular Generative Adversaial Network,CTGAN),以及大语言模型(Large Language Model,LLM)。
通过实践案例,比较了不同方案间的优缺点,并最终提出了一种 CTGAN与LLM相结合的数据生成方案。这种方式结合了CTGAN与LLM在生成数据时的优势,能够生成既与真实数据相似,又具有较高丰富度的合成数据。本文通过真实案例论证了方法的有效性,并设计了一套完整的工程方案以实现测试数据的生成、修复、监控与管理,使其能够有效地应用于工程化的测试场景中。
二、合成数据模型调研
合成数据通常需要为模型提供一个由真实数据组成的训练集。模型通过对训练集的字段特征进行建模,学习其字段的生成规律,包括字段类型、字段格式、字段取值等,最终使用该模型生成与原始数据相似的合成数据集,因此选择合适的模型决定了最终数据生成的质量和成本。
在工程化的场景中,我们优先追求合成数据有效性、真实性与丰富度三个维度的质量。前两者保障数据的可用性,后者保障合成数据的丰富性。
* 数据的有效性:即合成数据中是否生成训练集范围之外的无效的取值。如果生成真实场景之外的无效取值,可能导致测试系统异常崩溃、测试人员消耗大量精力在排查无效的测试数据导致的问题中,产生大量的"脏数据",影响数据的可用性。
* 数据的真实性:合成数据的真实性指其模拟真实数据关键特性的能力,包括统计分布、字段间关系及数据内在逻辑的一致性。在测试数据生成的场景中,并不要求数据与真实数据保持一致的统计分布,相反,希望数据能够均匀地取值,以保证各类单据测试数据数量。而字段间关系与数据内在逻辑一致性可能会直接影响系统处理数据的结果,错误的字段分布和组合可能引起系统判断错误,导致在测试环境验证成功的场景,在真实环境中暴露错误,同样影响数据的可用性。因此,下文从字段间关系以及数据内在逻辑讨论数据的真实性。
* 数据的丰富度:数据丰富度可以从数据的取值覆盖率、字段间组合、场景覆盖等多方面评估。高丰富度的测试数据能够避免系统反复处理相同的数据,使测试人员能够小成本地覆盖足够的测试场景。从目前业务的高优诉求、数据生成本身的特性以及实现成本考虑,本文将数据的丰富度简化为数据中枚举字段对真实数据覆盖率的问题,即单据的类型、状态取值是否足够丰富,下文所述的数据丰富度均为此定义。
生成效率同样也是衡量合成数据模型表现的一个关键指标。但由于实际场景中,我们倾向于在每周以定时任务的形式提前准备数据以供测试人员使用,对于实时性的诉求不高,因此对于生成效率指标可适当放宽,生成速度在10s每条以内即可接受。基于上述目标,对现有的模型调研如下。
2.1 高斯模型
基于高斯模型的数据生成使用统计学对原始数据的分布进行建模,能够快速地学习数据的分布特征并生成数据。
模型假设被学习的数据服从正态分布,利用均值向量和协方差矩阵描述数据分布特征,使得生成的数据能与真实数据保持相似的字段取值分布。其优势在于计算高效、有坚实的数据理论基础且参数可解释性强,尤其适合低维、近似正态分布的场景。但受限于严格的正态性假设,模型存在以下缺点:
* 复杂关系识别能力差:仅能捕捉变量间的线性相关性,无法建模复杂的非线性关系;
* 长尾分布建模能力弱:由于模型严格按照原始数据的取值分布进行建模,在原始数据中出现概率较低的取值在数据生成时将会丢失,影响生成数据的丰富度。
2.2 TVAE模型
基于TVAE的数据生成利用变分自编码器(Variational Autoencoder,VAE)的生成能力,增加了对时序依赖的建模,将表格的每一行视为一个序列,能够在训练过程中学习字段的时序关系。
模型首先通过编码器,根据字段的数值、类别、文本等特征,将每一行输入数据压缩为一个固定长度的特征向量,再通过一个解码器将特征向量解码为全新的模拟数据。这种方式能够有效学习连续类型变量的数据特征,在一定程度上捕捉字段间的非线性关系,但其数据生成存在以下局限:
* 模型规则可解释性差:TVAE模型虽然能够在一定程度上捕捉字段间的非线性关系,但其潜在变量缺少明确的语义解释;
* 高维混合型数据学习效果差:TVAE对于分类变量的拟合效果较差,当变量列数多、或分类基数大时,甚至可能产生训练集中未出现过的异常取值;
* 长尾分布建模能力弱:TVAE对于低频类别数据的生成质量下降,会损失较多分类字段的取值,丰富度较差。
2.3 CTGAN
基于CTGAN的数据生成是一种针对结构化表格数据设计的生成对抗网络。其核心原理是通过条件生成机制解决混合数据类型(连续型、分类型)的生成难题。
CTGAN模型由一个生成器和一个判别器组成。模型首先根据表格字段的取值类型,将各行数据归一化编码为机器可识别的特征向量。生成器(Generator)接收随机噪声和条件向量作为输入,生成合成的数据向量;判别器(Discriminator)对Generator的输出与真实数据向量进行真伪判别,通过对抗训练的机制优化判别准确率。Generator在对抗过程中学习生成更逼真的数据以“欺骗”判别器,Discriminator则持续提升其判别能力。
CTGAN的条件生成模式能够有效地处理类别不平衡问题,使原始数据的取值在合成数据中完整且均匀地出现,生成数据的质量较高。但受限于模型的架构设计和参数量,基于CTGAN的本质是通过深度学习隐式捕捉变量间统计关联性生成数据,无法有效且显式地捕捉数据间多字段的联合约束(如城市code、机场code间的级联关系),且无法学习到字段间的隐含逻辑(如订单人数等于各类人员总和等),模型生成结果的可解释性差、字段间关系捕捉不足。
2.4 LLM
随着ChatGPT、DeepSeek等LLM在自然语言处理领域的突破,越来越多的研究者尝试利用LLM的语义理解能力构造某些特定领域的数据集,对真实数据进行扩容,这和我们的测试数据合成场景异曲同工。LLM的语义理解能力和模型推理能力使其能够从数据训练集中获取神经网络学习不到的额外信息——即通过字段名称和建表信息推测字段间的语义联接。因此对于诸如多字段联合约束、字段间隐含的计算逻辑,LLM可以轻易地根据字段名称推断字段间的关联,并在字段中隐式验证规则正确性,进而通过链式推理自动计算字段结果,保证生成数据的逻辑一致性。下表是两个LLM对于关联关系学习的示例:
| 关系类型 | 场景示例 | LLM生成结果 | | --- | --- | --- | | 语义关联关系识别 | 以机票大系统政策为例,出发/到达城市code和出发/到达机场code通常具备关联关系,一个airportcode只对应一个citycode。 | LLM生成的数据能够保持与原数据完全一致的关联关系。但是生成的数据只覆盖了部分取值,丢失了一些取值信息。 机器学习效果: !Image 2 大模型效果: !Image 3 | | 逻辑关联关系识别 | 以机票订单为例,订单表的人数、成人人数、儿童人数、婴儿人数字段间具备逻辑上的计算关系,即人数=成人人数+儿童人数+婴儿人数。 | LLM在数据生成时能够维持字段间的计算关系,生成的数据符合数学计算的结果。 机器学习效果 !Image 4 大模型效果 !Image 5 |
从上述示例可得,LLM能够在数据生成时获取字段间存在的隐式关联关系,使得生成的数据更具备可用性。但同时也存在其局限性:
数据丰富度损失:LLM的注意力机制使其仅能关注到最重要的信息,因此在输入数据token较多的情况下,LLM在数据生成时会损失一定的数据丰富度;
输出可控性差:与传统的统计模型不同,LLM的内部决策过程复杂,微小的输入区别都会导致其输出的多样性,输出的可控性较差,因此对于prompt的要求较高;
复杂场景稳定性不足:在输入表格字段多、模式复杂的情况下,LLM无法将注意力集中在存在关联关系的字段间,生成的数据往往会:
* 缺少部分列
* 不满足输出格式
* 产生异常取值
* 数据生成异常终止
因此,如何合理地应用LLM,使其稳定可控地生成有效、具有真实关联关系且尽可能丰富的数据是使用LLM生成数据面临的挑战。
2.5 综合分析
我们分别在三个库表中,用一个小样本的训练集,简单且直观地验证了各个模型对于字段取值覆盖率、字段间关系以及数据有效性的生成效果。字段取值覆盖率、字段间关系以及数据有效性指标的计算方式如下:
训练集从真实的库表中获取,共200条,分别使用每个模型生成20条合成数据。其中:
* 高斯模型、TVAE模型、CTGAN各训练300个Epoch,模型均达到收敛;
* LLM每轮训练30条数据,生成10条数据,并将生成的数据追加到下一批中,最终生成20条数据。
各模型生成效果如下:
由上表可得:
* 对于数据有效性指标,四种模型均能达到较高的有效性水平(>0.95),确保生成的数据具备基本的可用性;
* 对于字段间关系指标,LLM凭借强大的语义理解能力,显著优于高斯、TVAE及CTGAN模型,合成数据的字段间关联性最接近真实分布;
* 对于枚举字段覆盖率,高斯、TVAE以及LLM表现相似,均损失约30%的枚举字段取值,而CTGAN模型凭借条件生成对抗的训练机制,枚举字段覆盖率显著优于其他实验模型,在训练集上达到了100%的字段覆盖率;
* 对于模型生成速度,高斯、TVAE模型的生成速度较快(<1s/条),CTGAN生成速度有所降低,但在可接受范围内(<10s/条),而LLM的生成速度达到了43s/条,数据生成的成本显著上升,在大批量生成数据时可能存在性能局限。
综上,LLM与CTGAN能够分别满足我们对于合成数据真实性与丰富度的诉求,LLM能够学习到更多其他模型无法学习到的字段间关联,而CTGAN能够生成与真实数据具有几乎一致丰富度的合成数据。但二者均存在一定的局限性。
对于CTGAN,其受限于模型架构,难以学习显式的逻辑规则(如数学公式、字段映射),且模型学习特征的可解释性较差;对于LLM,其生成数据的字段丰富度较低,且其数据生成的效率较其他模型显著降低。
基于上述特性,本文提出将CTGAN模型与LLM结合,使其各自生成各自擅长的字段数据,从而生成既能保证丰富度,又更接近真实数据特征的合成数据。该方案既可集成CTGAN的高丰富度能力,又能通过LLM学习复杂逻辑规则,最终输出兼具丰富度与业务逻辑的合成数据。此外,通过一些工程化的技巧提升使用CTGAN与LLM生成数据的效率,降低成本消耗。
三、LLM-CTGAN数据生成方案
在本章节中,将详细论述基于LLM-CTGAN的数据生成方案。方案包括关联关系识别、数据生成、指标监控以及数据修复四个模块。在这个整体的方案中,我们利用LLM的语义识别能力指导数据生成的模型选型,使得CTGAN和LLM能够充分地在其擅长的数据类型中发挥优势。
在关联关系识别模块,我们为LLM提供少量数据样本和库表建表信息,使其能够根据语义信息将库表字段分类为存在相关性的字段和关系独立的字段两部分,用于指导各字段在生成时使用的模型。
在数据生成模块,我们使用CTGAN进行无关联关系字段的数据生成,使用LLM分别对每个存在关联关系的组进行数据生成。对于CTGAN,我们选择直接从线上获取10000条真实数据作为训练集,并保存训练得到的模型参数,以减少后续模型训练的时间。对于LLM,考虑到其上下文限制,我们使用一个压缩算法对上述训练集进行了精简,使其能够在缩小规模的同时尽可能地保持丰富度。
在指标监控模块,我们从字段列和数据行两个维度对数据生成的效果进行监控。对于合成数据每一列质量,我们采用字段间关系、数据有效性以及覆盖率三个指标进行衡量。对于合成数据每一行的指标,我们复用了CTGAN模型在判别器参数,对每一行进行打分,以确定每一行数据的置信度。此外,我们还形式化LLM在数据生成过程中学习到的规则,在真实数据上验证这些规则的真实性。这一操作不仅能够验证LLM对语义的理解能力,还使得数据生成这一过程具备可解释性。最后将指标整合为报告推送给使用者,使其能够对数据生成质量有清晰的认知。
在数据修复模块,后置对模型生成的数据进行检查,检查其与原始数据集丰富度的差异及有效性,对于丰富度缺失的列,额外补充丰富度;对于异常数据,将其剔除。
3.1 关联关系识别
在数据生成中,我们对于表格中各字段的生成诉求通常是不同的。例如,对于一些单据标识字段,我们通常不关心它的取值;对于一些枚举类型字段,我们希望它在生成中保持与输入同样丰富的取值;而对于一些业务字段,我们希望它们能维持字段间的逻辑关系。库表字段根据其合成数据时的特征可以分为如下几类:
根据上述分析,需要生成的字段可以分为两部分:
* 无需保证字段间的关联关系,但需要保持丰富度的字段,适用于CTGAN生成;
* 需要保证字段间的关联关系,可以接受牺牲一些字段的丰富度的字段,适用于LLM生成。
因此,如果可以识别字段类型,即可使用CTGAN用于前者的生成,LLM用于后者的生成,满足两种字段的数据生成诉求。对CTGAN而言,这种方式最大化了其取值丰富度的优势;对于LLM而言,该方式避免了无关字段占用模型输入,从而避免了不必要的计算和存储开销。
人工完成这一识别任务需要分类人员具备深入的业务知识且实施成本较高,而LLM凭借丰富的语义理解能力,能够比人工更为高效的完成此任务。
为LLM提供库表的少量样本行S,及建表语句T,我们希望LLM能够识别库表中可能存在关联关系的字段,并将其分为若干个具备关联关系且不重叠的组(G₁,G₂,...,Gₙ)。划分字段组的原因是:字段间关系通常存在于特定的字段子集中,与其他字段无关。使LLM分别学习这些分组对应的数据,可以使其最大程度上排除无关的信息的干扰。我们将这个任务拆分为三步:
1)直接使LLM将字段分为若干个取值上有相关关系的组;
2)使LLM对生成的结果进行批评和修复,以[["category1","category2",...],[["category3",...]]格式,结构化地输出识别的结果;
3)根据预设规则修复LLM的输出,如过滤输出中字段名中包含state、type、version的字段、过滤只有一个字段的分组。
通过上述工作,即可获取到库表中存在关联关系的字段组(G₁,G₂,...,Gₙ)用于指导数据的生成。整体的工作流程如下:
1)首先要求LLM对样本及建表语句进行分析,识别出可能存在关系的分组。提示词(Prompt)如下:
接下来我将为你提供一个表格的表头和5条真实数据,表格中字段间可能存在一定的逻辑关联关系。请帮我过滤掉这些字段中,在生成合成数据时通常不需要保持原有的关联关系或取值随机性较高的字段。其余的字段细分为若干个取值上有相关关系的组。注意:每个组之间不要出现重复的字段。
2)随后再次使用LLM对上一步的输出进行评价,评价其分组是否合理,对不合理的部分进行修正后,将结果输出为json列表格式。Prompt如下:
请检查下面的分组中是否存在错误,修正并将修正后的分组以列表的形式输出,例如[["category1","category2",...],["category3",...]],不要使用任何额外解释,直接给出结果即可。
3)为了避免LLM无法很好地过滤不具备关联关系的枚举字段,采用另一个Prompt,提示模型识别与status、state、type、version等内容相关的字段,并在最终结果中过滤这些字段。
接下来我将为你提供一个表格的建表语句,请帮我识别其中字段名中包含status、state、type、version的枚举字段。返回格式为一个列表,格式为|'column1','column2',...|,不要返回其他内容。
3.2 LLM-CTGAN模型实现
在这一模块中,我们首先使用CTGAN模型对原始数据集 _D-original_ 进行建模,得到合成数据 _D-independent_。再由LLM对一个由 _D-original_ 压缩而来的 _D-compressed_ 进行学习,得到合成数据 _D-related_。最终合并两种方式得到的数据,生成最终的测试数据。与单独使用CTGAN或单独使用LLM相比,这种方式存在以下优势:
* 端到端流程整合:将关系识别、模型适配与数据生成整合为一个端到端的自动化管道,显著降低人工配置成本;
* 语义-统计协同建模:该方式融合了LLM的语义理解与CTGAN的统计建模优势,使得生成的数据能够兼顾字段级别的高丰富度与跨字段关联一致性。
* 计算效率与样本规模兼顾:与直接采用LLM生成数据相比,该框架分组学习的方法使LLM能够单次处理更多规模的数据,减少LLM的计算负载。
#### 3.2.1 CTGAN模型实现
我们使用开源的SDV库搭建CTGAN模型。以一个从线上获取的10000条真实数据的表格作为训练集。考虑到CTGAN在单次训练过多数据时会出现内存崩溃,本文采用了一种高效的训练方式实现数据生成,如下图所示。
训练集被拆分为若干个大小相同的批次(batch),每个batch通过CTGAN训练一个Epoch后,生成一个小样本数据,追加到下一个batch中进行下一轮的训练。在最后一轮的训练中,将CTGAN训练的模型参数保存到云端。在后续的每次生成中,只需加载库表对应的生成模型,即可实现高效的数据生成。每一次训练相当于一次蒸馏,提取数据集中最重要的部分,在保障了生成数据丰富度的同时减少了训练成本,解决了CTGAN内存消耗大、训练速度慢的问题。
!Image 10 数据集构建
数据集是模型训练的基础,构造数据集的目标是希望数据集能够覆盖尽可能多的字段真实取值。获取数据集的方式有三种:人工构造数据集、从测试环境中获取数据集、从线上环境中获取数据集。人工构造数据集虽然能够更加针对性地设计数据分布,但需要投入较多人力成本;从测试环境中获取数据集可能由于Mock、异常插入等原因,导致数据失真,带来脏数据;而从线上环境获取数据集具有最真实的用户行为特征和自然数据分布,与人工构造相比数据获取成本低,与测试数据相比数据真实性高。因此,选择直接从线上环境获取库表数据构建数据集。
由于某些线上库表数据量较大(10w+),获取全量数据作为训练集是不现实的。本文比较了在限制获取10000条数据情况下,不同的SQL排序写法对于数据集枚举丰富度的影响,分别为按id倒序获取、按创建时间(create_at)倒序获取以及按修改时间(change_at)倒序获取,实验结果如下表所示。其中,按id倒序获取到的枚举值更完整,取值覆盖率达到了全量数据的85%。且由于几乎所有库表都存在id字段,但不是所有库表都存在create_at/change_at字段,因此,选用按照id倒序的方式获取线上数据,构建训练集。
!Image 11 Metadata生成
Metadata是对要合成的数据集的描述,包括列的名称、每列的数据类型,其核心作用在于指导生成模型进行差异化的特征编码与生成策略选择。当前业界标准将基础数据类型划分为boolean、categorical、datetime、numerical四类。开源的SDV库提供了一种根据DataFrame的sdtype识别的Metadata生成方式。但这种方式在实践中经常出现识别错误导致生成错误的问题,需要通过异常处理机制并错误的列全部覆写为categorical类型,这可能影响数据的生成质量与后续的指标度量。
鉴于字段类型通常与数据库模式定义存在严格映射关系,采用LLM解析数据库建表语句(DDL),可实现更精确的元数据自动化构建。生成Metadata所使用的Prompt如下:
你是一个数据专家。接下来我讲为你提供一个数据库表的若干条数据。请为我生成这个库表可用于sdv生成的metadata。输入:一个数据库表的若干条数据以及这个库表的建表语句。输出:这个表的metadata。metadata对字段的类型进行分类,包括boolean、categorical、datetime、numerical四类。一个示例如下:{ "columns": { "age": { "sdtype": "numerical" }, "tier": { "sdtype": "categorical" }, "active": { "sdtype": "boolean" }, "paid_amt": { "sdtype": "numerical" }, "renew_date": { "sdtype": "datetime" , "datetime_format": "%Y-%m-%d" } } }
数据分批训练
在数据训练时,为了降低训练成本的同时,还能使合成数据具有与真实数据一致的丰富度,本文采用了一种分批训练的方式实现数据生成。
首先将训练集拆分为若干个大小为100条数据的batch,每批数据在训练10个Epoch后生成100条数据,将生成数据追加入下一批数据中。这一步骤的目的是将200条数据的取值浓缩到100条数据中。当某个字段在200条数据中的唯一取值超过100个时,这个过程可能会损失一些取值。但由于我们的目标是保持"分类字段的取值丰富",而分类字段的取值通常不会多于100,因此,这种方式能够成功地将分类字段的取值压缩。
当训练至最后一个batch时,模型训练300个Epoch,并将模型参数上传至云端文件管理系统。在下一次生成数据时,首先查询是否存在对应库表的模型参数,若存在,则直接生成数据,反之,则从线上获取数据后训练模型。
我们分别在6张库表中单独使用CTGAN对10000条数据构成的训练集进行了训练,比对生成1000条数据后,合成数据与真实数据的枚举字段取值。在所实验的库表中,CTGAN均能保持与训练集完全一致的枚举字段覆盖率。当首次训练模型生成数据时,生成速度约1.99s/条;使用预保存的模型参数生成数据时,生成速度进一步提升至0.16s/条,与上文实验中以200条训练集直接训练的9.84s/条相比,生成数据的时间消耗缩短至1/60。
#### 3.2.2 LLM数据生成
对于LLM,我们以一个由上述10000条真实数据的表格压缩而来的1000条数据的表格作为训练集。首先根据关联关系识别模块得到的字段分组,将数据集纵向划分为若干个分组。与CTGAN的训练策略相似,对于每个分组,分批次训练后,将生成的一个小样本数据集追加到下一个批次中形成新的训练集。最终将各分组的结果合并。与直接使LLM训练1000条数据相比,这种分批次的生成方式可以使LLM专注于每批次的数据,避免过大数据量导致的注意力不均衡和信息损失。 模型选用
由于测试数据生成涉及对线上真实数据的学习,因此需要模型支持数据外发,且具有较强的推理能力。综合考量模型特征及成本,我们选用自部署的开源Deepseek-R1-Friday(全参671B)用于LLM数据生成。 数据集压缩
由于LLM天然的Token数量及注意力机制限制,LLM并不能像CTGAN一样学习万级别的训练数据。而事实上,关联关系的识别也并不需要如此庞大的数据量。因此,我们需要对原始数据集进行压缩操作。
一种简单的方式是直接切片获取原始数据集的前1000条数据。但对于某些分布不均匀的字段来说,直接切片操作可能导致损失过多取值信息。如某字段的前1000条数据均为NaN,这显然是不可接受的。
想要对一个库表的几十个字段抽样压缩,并保障其丰富度和分布均匀是一件有挑战性的工作。
我们采用了一种分类+按行评分的方式来实现这一需求,具体抽样流程如下图所示:
1)首先将各字段分为单一值列、极端偏态列、随机值列、可数离散值列、其他共五类;
2)对极端偏态和可数的列按值出现的概率之和进行评分采样;
3)按得分倒序排列,取前900条数据纳入样本数据集,剩余数据均分为4个区间,分别随机抽样25条,最终构成1000条样本数据集。这样抽样得到的数据能够保持各列分布相对均匀,使得出现频率较低的列也能被采样到,避免出现一整列抽样均为单一值的情况。
比较直接顺序切片、随机抽样、以及我们所使用的差异化抽样可得,差异化抽样方式的各列平均相对熵比、枚举字段覆盖率均有所提升,与直接切片相比,平均相对熵比提升约15%,枚举字段覆盖率提升32.3%。
!Image 14 Prompt优化
吴恩达《提示工程》课程中提出,要对每一个子任务构造清晰而具体的提示,可遵循以下策略:
* 少样本提示:将一系列成功执行所需任务的案例与要查询的问题连接在一起,形成带有提示的模型输入,通过少量的标注引导模型预测。
* 要求结构化的输出:即指定模型输出的格式,如JSON格式;
* 使用分隔符:即使用分隔符使模型清晰地确定需要用于分析的文本;
本文借鉴这一思想,为LLM数据生成设计了精心优化的提示词。
首先是样本的提供。在每次训练中,我们将为LLM提供100条真实数据作为样本,并指导模型生成20条数据,并合并入下一批数据,作为下一次训练的训练集。样本的数量不宜过多,过多样本会引发LLM上下文长度溢出,以及削弱模型对每个个体示例的注意力。
在选择结构化的输入输出时,本文选择Markdown格式的表格作为LLM的输入和输出。这是由于Markdown格式的表格数据结构清晰,可读性高。对于LLM来说,清晰的格式可能使其更容易理解数据结构。在训练前,我们将excel表格数据转换为Markdown格式的文本提供给LLM,并从LLM的输出中提取符合Markdown表格格式的输出,转换为excel存储。
此外,我们在提示词中充分使用了诸如序号、换行符等分隔符,采用定义角色、定义输入输出、定义约束的三段式描述方式,使得Prompt能够被LLM清晰地解析。
以下是我们使用的几种提示词的优缺点分析:
版本1:
你是一个对业务非常了解,且精通数据库,推理能力很强的数据分析人员。接下来我将为你提供一张数据表的若干数据,我希望你能在保持数据特征、丰富度以及列间关系的情况下,帮我生成更多这样的数据。你需要遵循以下策略和规则:1. 输入输出1.1 输入格式:输入是一个有若干行的 Markdown 表格格式的表格,包含表头与表单项。1.2 输出格式:输出是一个有 20 条数据的 Markdown 表格格式的表格。2. 约束2.1 输出必须保持与输入完全一致的丰富度,不要出现输入中没有出现过的数值。2.2 对于可能有关联的字段,请保持给他们之间的关联关系。2.3 生成的数据分布需要均匀,不需要和输入保持相似的分布。
分析:Prompt的约束要求LLM需要与输入保持完全一致的丰富度、保持关联关系,且保持数据分布均匀。这使得LLM在处理非分类字段时,由于约束,也会倾向于生成与该字段完全一致的取值,且在生成致据中使这些取值保持均匀,而由于非分类宇段通常具有较多不同的取值,在生成数据中保持取值均匀和维持关联关系变得十分困难,因此LLM的生成效率会大大降低,甚至因为思考长度超长无法生成数据。
版本2:
你是一个对业务非常了解,且精通数据库,推理能力很强的数据分析人员。接下来我将为你提供一张数据表的若干数据,我希望你能在保持数据特征、丰富度以及列间关系的情况下,帮我生成更多这样的数据。你需要遵循以下策略和规则:1. 输入输出1.1 输入格式: 输入是一个有若干行的Markdown表格格式的表格,包含表头与表单项。1.2 输出格式: 输出是一个有20条数据的Markdown表格格式的表格。局62.约束(请重点关注!!!)2.1 除了时间类型,其他所有字段的输出必须保持与输入完全一致的丰富度,不要出现输入中没有出现过的数值。2.2 对于可能有关联关系的字段,生成时请保持它们之间的关系,使其符合常识。
分析:Prompt的约束去掉了对于数据分布均匀的要求,便这项数据生成的任务变得更加简单。此外,与上述Prompt相比,这一版本使LLM不必关注时间类型的丰富度,但其他的非分类字段仍然存在上还问题。
版本3(最终版):
你是一个对业务非常了解,且精通数据库,推理能力很强的数据分析人员。接下来我将为你提供一张数据表的若干数据,我希望你能在保持数据特征、丰富度以及列间关系的情况下,帮我生成更多这样的数据。你需要遵循以下策略和规则:1. 输入输出1.1 输入格式: 输入是一个有若干行的Markdown表格格式的表格,包含表头与表单项。1.2 输出格式: 输出是一个有10条数据的Markdown表格格式的表格。2. 约束2.1 对于枚举类型、分类类型的字段;输出必须保持与输入完全一致的丰富度,不要出现输入中没有出现过的数值。2.2 对于连续致值、时间类型的字段:输出必须保持与输入完全一致的数据范围与格式,在数据范国内可以生成随机的数据。2.3 对于可能有关联关系的字段,请保持它们之间的关系。
分析:这一版本的Prompt强调了LLM对于不同类型的字段可以采取不同的丰富度保持的方式,生成异常数据的几率大大降低,LLM能够较为稳定地生成合成数据。
3.3 实验验证
我们在两个特征不同的场景中试验我们方法的有效性,前者涉及的三张表中,数值类型字段偏多,字段间计算逻辑关系较多。后者涉及的三张表中,分类类型的字段较多,字段间多为映射关联关系。
#### 3.3.1 指标设置
本文采用字段列和数据行两种维度的指标衡量合成数据的质量。 字段列指标指的是上文所述的枚举字段覆盖率、字段间关系、数据有效性指标,这些指标关注字段本身或字段与其他某个字段二元关联关系,能够较为直观地反映合成数据是否与真实数据具有相似的统计学特征。但仅使用这些指标,不足以反映合成数据是否学习到了与真实数据一致的字段间关联——基于相关系数的字段间关系指标只能反映字段间两两间的线性趋势,无法度量复杂的字段间关系。 数据行指标包括判别器得分与规则有效性两种,从整体数据表现入手,反映合成数据是否真正学习到了字段间的隐含关系。其中,判别器得分指标利用CTGAN的模型判别器,使其反过来对合成的新数据进行判别打分。规则有效性指标使LLM将其生成数据时所用的规则形式化,反过来验证规则是否在合成数据中有效,这一过程使数据生成变得可解释。
数据的行列指标结合,使我们能够更全面地评估合成数据的质量。 字段列指标
!Image 15 数据行指标
* Discriminator Score
作用:判定每一行的数据置信度
计算方式:CTGAN的判别器loss能达到比较低的水平,即整体判别正确率较高,因此,使用CTGAN的判别器对最终生成的数据每一行进行评分,整体评判合成数据的整体质量。
由于CTGAN原有判别器采用一个linear层作为输出,并没有进行归一化处理,无法直接用 于衡 量数据置信度。我们首先使用一个sigmoid层,对Discriminator的数据进行归一化,再以判别器对真实数据的评分对合成数据的评分进行放缩,衡量行数据的质量。
1. 对于每一个生成的数据行i,将其向量化为t_i2. Discriminator计算T的预测得分p_i3. 使用sigmoid将pi归一化,得到得分d_14. 使用上述方法计算真实数据的平均得分D_real=(d_1+d_2+...+d_i)/i5. 使用上述方法计算合成数据的平均得分Dsyn=(d_1+d_2+..-+d_i)/i6. 则合成数据的最终得分Q=D_syn/D_real
* Rule Validity
作用:模型规则验证
计算方式:形式化输出LLM生成数据时所依赖的规则,并使用这些规则在真实数据中进行验证,证明其可行性。若在真实数据有效性达到100%,即所有训练集的数据行均条件成立,则证明该规则真实存在。进而使用规则在生成数据中进行验证。
规则有效性=规则成立的行/数据集的所有行
你是一个对业务非常了解,且精通数据库,推理能力很强的数据分析人员。接下来我将为你提供一张数据表的若干数据,我希望你能找出这些数据中存在的关联关系。
你需要遵循以下策略和规则:
1.输入格式:
输入是一个有若干行的Markdown表格格式的表格,包含表头与表单项.
2.输出格式:
输出是一系列你发现的关联关系,以字符串列表格式表示,不需要输出其他信息,也不要生成除了下面提供的三种关系类型以外的关系。
2.1 如果字段间存在一对一的映射关系,则字符串为列表格式,如"
a->b
",表示一个a唯一确定一个b值;
2.2 如果字段间为计算关系,则输出他们的计算关系,如"
a=b+c
";
2.3 如果字段间为大小关系,则输出他们的大小关系,如
"a>b+c"
、
"a<100"
等。
3.示例
["a->b","a=b+c","a<100"]
#### 3.3.2 实验验证
在一个10000条数据的原始训练集上,我们验证了我们所提出的方法的有效性。每次训练生成1000条数据、执行10次后求平均值计算指标得分。
本文重点对比了CTGAN基线方法与LLM_CTGAN增强方案的生成性能。实验设计未纳入直接使用LLM生成的对比组。这是由于随着训练迭代次数增加,直接使用LLM生成数据的多样性严重下降,所有字段取值趋向于某个出现概率较高的固定值,且接口调用生成错误结构的数据概率也增加,导致使用1000条数据训练时,生成流程的失败率已经超过90%,生成数据所需时间超过60s/条,不适用于大数据量的数据生成任务。数据生成结果如下表所示: 行间指标:
!Image 16 列间指标:
3.4 数据整合与修复
在上文中,我们使用LLM_CTGAN实现了数据的生成,生成的结果需进行后置检查修复操作,检查生成的数据中是否保持了数据的丰富度,以及是否存在取值异常的情况,使最终输出的数据更加丰富和可用。 数据丰富度修复旨在解决生成数据中潜在的分布偏差问题。尽管在数据预处理阶段我们通过压缩算法调整了训练集分布,但生成过程中仍可能因模型注意力偏好导致特定字段出现极端分布偏态,导致LLM在训练过程中丢失一些字段的取值,进而导致生成数据的取值过于单一。因此,我们通过后置补充丰富度规避这一情况,即后置检查各列的取值分布。对于生成数据中枚举字段取值与原始数据不一致的列,通过对LLM增加约束条件,使其再补充一些指定取值。
生成指定取值数据的Prompt如下:
你是一个对业务非常了解,且精通数据库,推理能力很强的数据分析人员。接下来我将为你提供一张数据表的若干数据,我希望你能在保持数据特征、丰富度以及列间关系的情况下,帮我生成更多这样的数据。你需要遵循以下策略和规则:1. 输入输出 1.1 输入: 输入是一个有若干行的Markdown表格格式的表格,包含表头与表单项。1.2 输出: 输出是一个有{batch_generate_size}条数据的Markdown表格格式的表格。2.约束2.1 对于枚举类型、分类类型的字段:输出必须保持与输入完全一致的丰富度,不要出现输入中没有出现过的数值。2.2 对于连续数值、时间类型的字段:输出必须保持与输入完全一致的数据范围与格式,在数据范围内可以生成随机的数据。2.3 对于可能有关联关系的字段,请保持它们之间的关系。2.4 生成的致据分布需要均匀,不需要和输入保持相似的分布。2.5 字段{col}的值为{unique val}
取值异常修复旨在在解决字段取值异常及关系异常两种异常的致据情况。检查方式与修复方式如下:
* 异常取值:对于“枚举字段”,即Metadala字段分类为categorical,且训练集中唯一值<20的字段,后置检查判断这类字段与原始数据值域的差异,剔除其中没有在原始数据中出现过的值。
* 异常组合:对于LLM识别出的规则,校验其在真实数据中的有效性,进而使用在真实数据中被验证有效的规则反过来验证其在测试数据中是否成立。对于在测试数据中有效性>90%的规则(即LLM在学习过程中使用了该条规则),过滤不符合规则的数据。
四、总结与展望
我们提出的基于AI增强的自动化数据生成方式能够有效地提升传统的基于统计模型生成数据的效果,使生成的测试数据具有更接近真实业务数据的字段间关系,且能够保持基于统计模型的丰富度优势,这个方法使得LLM和CTGAN能够“各展所长”,生成他们更擅长的字段类型的数据,使成的测试数据更加有意义。
在未来的工作中,我们将在以下方向持续迭代:
* 复杂表间关系识别:探究如何识别库表间的复杂关系,进一步降低数据生成的配置成本;
* 效率提升与成本优化:探究能否通过离线推理等方式提升LLM的数据生成速度;
* 通用平台建设:完善数据生成系统能力,建设通用的测试数据生成平台。 【推荐阅读】
* ## 告别人工测试困局,携程 BDD 驱动的自动化测试落地与效能跃迁
* ## 携程“AI测试员”已上岗:每秒生成一个高质量测试用例
* ## 告别人工写脚本!多模态大模型驱动携程UI自动化测试迈入“描述即生成”阶段
!Image 18 “携程技术”公众号 分享,交流,成长