通过这种技术,我们发现模型预测中的一些问题并不总是源于模型架构,而是可能源自训练数据集本身。例如,在开源数据集上运行模型时,我们可能会发现模型的某些错误预测实际上可以归因于训练数据的标注问题。例如,在服装分类任务中,开源数据集可能会将非常相似的服装款式标注为不同的类别,而人类观察者可能会认为这些款式是相近的。这种令人困惑的标注会影响模型预测的性能。为此我们设计了新的影响函数在很多开源数据集上找到了很多标注 bug, 并发表在了 NeurIPS’22 的会议论文《Debugging and Explaining Metric Learning Approaches: An Influence Function Based Perspective》上。
通过这种方式,我们可以对整篇代码进行理解。如果我们使用像 CodeBERT 这样的模型来训练代码,使用表征距离或高维空间的语义表征来对齐两篇代码。但是,在训练的初期,代码可以被正确对齐,但在训练的后期,模型可能会将 version download 这个词与 if 的表征关联得最近,而将 data 的表征与 return 的表征关联得更近。
这个就是我们的 SE for (AI for SE)框架,旨在探索和改进人工智能在软件工程中的应用。在这个框架中,我们预见到未来业界将越来越多地采用这种模式。程序员的工作方式正在发生变化,他们不再只是调用和开发 API 或修改第三方库,而是可能会需要收集训练数据来微调模型,就像调整第三方库一样。模型本质上是一种特殊的第三方库,程序员在未来可能需要学习如何编写更有效的提示(prompt)来与这些模型交互。这可能会形成新的工作模式。随着这些新工作流程的出现,我们面临着如何进一步提升和赋权这些模式的问题。目前的模型是概率模型,每次输出可能并不稳定,同时还需要解决模型输出的幻觉问题。
随着人工智能时代的到来,软件工程的实践将发生根本性变化。过去,编程主要是为了交付软件产品。但在 AI 时代,编程不仅仅是为了交付,它还具有数据标注的意义。我们编写的每一行代码、提交的每一个 commit、撰写的每一个需求,都可能被用来训练模型。这意味着代码编辑和整个编辑过程实际上在无形中完成了数据的标注工作。
由于模型训练对数据质量有很高的要求,我们预见未来将出现一种 AI 原生的软件工程实践。我们将利用现有的数据来训练模型,然后评估这些模型是否符合我们的预期。有了新模型后,我们可以反向工作,利用模型预测的好坏来评估过去的编程实践是否合适。这个过程类似于梯度下降,从模型预测到生产过程或代码标注的反向优化。我们可以通过模型的性能和对数据质量的分析,反过来指导整个开发实践,告诉我们何时应该如何编写代码、如何记录代码历史,或者如何提出问题。
以前,我们通常依据一些软性指标来推荐最佳实践,未来我们将有更硬性的理由来证明为何要这样编写代码。因为这样做可以使模型训练得更好。通过这种方式,我们可以不断调整实践,形成一个 AI 原生的软件工程范式,最终推动整个过程的自动化。