持续交付2.0

谷歌软件工程中的人工智能:当前进展和未来之路

Image

“ 自然融入到开发者工作流中,而不需要更多额外的学习,是目前AI融入的最好路径。”

1

引言
2019 年,大多数软件工程师可能都听说过AI 在机器学习方面的进展,以及深度学习在计算机视觉或语言翻译等领域的卓越表现。然而,大多数工程师不会想象到机器学习会这么快能够应用来自己的日常工作中,并使自己工作受益。

仅仅五年后,也就是 2024 年,软件工程师们对人工智能如何帮助编写代码产生了广泛的热情。而且,有相当一部分人已经开始使用基于机器学习的自动完成功能,无论是使用大型公司的内部工具(例如Google 的内部代码完成功能),还是商业产品。

本文介绍了在 Google 内部软件开发工具持续转型的背景下,其最新的 AI 驱动改进,并讨论了谷歌预计在未来 5 年内会看到的进一步变化。

同时,还介绍了如何构建可为专业软件开发带来价值的 AI 产品的方法。工程生产力团队负责 Google 工程师花费大部分时间的软件开发环境,包括内循环界面(例如 IDE、代码审查、代码搜索)以及外循环界面(例如错误管理、规划)。

我们的工作结果说明,这些界面的改进可以直接影响开发人员的生产力和满意度,这两个指标都是我们密切监控的。

需要说明的是,有消息表明,在2017年之后,谷歌的传统软件工程领域已取得了很不错的进展,无论是在工程团队技术管理方面,还是在工程技术基础设施方法。这可能是目前国内企业尚不可比拟的软件工程管理水平。

当然,其在该领域为 AI 训练提供的数据质量是否会对 AI 落地有多大的影响,尚未可知。

2

挑战

这一领域的一个持续挑战是,人工智能技术发展迅速,很难预测首先要探索哪些想法。

技术上可行的演示与成功的产品化之间往往存在巨大差距。

我们遵循以下三条准则将我们的想法部署到产品中:

  1. 按技术可行性和影响力确定优先顺序:研究已经建立技术可行性并且预计对工程师的工作流程产生高(可衡量)影响的想法。

  2. 快速学习,提高用户体验和模型质量:专注于快速迭代和吸取经验教训,同时保障开发人员的生产力和幸福感。用户体验与模型质量同样重要。

  3. 衡量有效性:由于我们的目标是提高生产力和满意度指标,因此我们需要广泛监控这些指标。

3

将 LLM 应用于软件开发

随着Transformer架构的出现,我们开始探索如何将 LLM 应用于软件开发。

基于 LLM 的内联代码补全是 AI 应用于软件开发的最流行应用:使用代码本身作为训练数据是 LLM 技术的一个自然应用。


由于单词级自动补全多年来一直是 IDE 的核心功能,因此开发人员对用户体验感觉很自然。此外,还可以使用粗略的影响衡量标准,例如 AI 编写的新字符的百分比。出于这些原因以及其他原因,将 LLM 的这一应用作为第一个部署是有意义的。

现在,通过人工智能辅助完成的代码字符数量与开发人员手动输入的字符数量相同。虽然开发人员仍然需要花时间进行CR,但他们有更多的时间专注于代码设计。

关键改进来自模型(具有编码能力的更大模型、用于构建提供给模型的上下文的启发式方法,以及针对包含接受、拒绝和更正的使用日志调整模型)和用户体验。这个循环对于从实际行为活动而不是某种公式中学习至关重要。

Image

利用跨工具的历史高质量数据以及捕获用户偏好和需求的使用数据来改进编码工具(例如,在 IDE 中)中基于 AI 的功能。

Image

通过代码补全利用人工智能辅助编写的代码比例持续增加,定义为从基于人工智能的建议中接受的字符数除以手动输入的字符数与从基于人工智能的建议中接受的字符数之和。值得注意的是,分母中不包括复制粘贴的字符。

我们使用多年来精心策划的跨多种工具的大量高质量内部软件工程活动日志来学习和训练。


例如,这些数据使我们能够表示细粒度的代码编辑、构建结果、解决构建问题的编辑、代码复制粘贴操作、粘贴代码的修复、代码审查、修复审阅者问题的编辑以及对存储库的更改提交。

训练数据是一个对齐的代码语料库,在输入和输出中都有特定于任务的注释。我们的 DIDACT 模型描述了数据收集过程的设计、训练数据的形状以及基于这些数据进行训练的模型。我们将继续使用可用的新一代基础模型(下面将详细讨论)探索这些强大的数据集。

我们的下一个重要部署是解决代码审查注释(其中 8% 以上现在通过基于 AI 的帮助解决)并自动将粘贴的代码调整到周围环境中(现在负责 IDE2 中约 2% 的代码)。


进一步的部署包括指示 IDE 使用自然语言执行代码编辑并预测构建失败的修复方法。

其他应用,例如,按照类似模式预测代码可读性的提示也是可能的。

总的来说,这些已部署的AI 应用在 Google 内部都是成功的、使用率很高的应用程序,对真实的工业环境中的生产力产生了可衡量的影响。

演示各种基于 AI 的功能如何协同工作以协助 IDE 中的编码。

4

我们从中学到了什么

迄今为止的工作过程,教会了我们几件事:

  1. 我们通过自然融入用户工作流程的用户体验取得了最大的效果。在所有上述示例中,都会向用户显示建议,只需一个选项卡或点击即可将他们带到工作流程的下一步。需要用户记住触发该功能的实验未能扩展。

  2. 我们观察到,通过基于人工智能的建议,代码作者越来越多地成为审阅者,在审阅成本和附加值之间找到平衡非常重要。我们通常通过接受率目标来解决这一权衡问题。

  3. 通过在线 A/B 实验进行快速迭代是关键,因为离线指标通常只是用户价值的粗略代表。通过在内部工具上展示基于 AI 的功能,我们能够轻松启动和迭代、测量使用数据并通过 UX 研究直接询问用户的体验,从而受益匪浅。

  4. 来自 Google 工程师在软件工具中的活动(包括与我们的功能的交互)的高质量数据对于我们的模型质量至关重要。

我们通过观察发现,优化从机会(主要是用户活动,显示在下方漏斗顶部)到影响(应用人工智能辅助,在漏斗底部)的转化非常重要,同时通过利用用户体验和模型改进来消除漏斗中间步骤的瓶颈。

Image

从 SWE 操作到实际应用基于 ML 的建议,这是一个机会漏斗


如果模型预测不够准确、模型没有响应或响应太晚、预测不理想、用户没有注意到预测等,机会就会丢失。我们使用 UX 和模型改进来收获尽可能多的机会。

5

下一步是什么

受迄今为止所取得的成功的鼓舞,我们正在加倍努力,将最新的基础模型(Gemini 系列)与开发人员数据(作为DIDACT的一部分)融合,为 Google 软件工程中现有和新的 ML 应用提供支持。

在整个行业中,基于 ML 的代码补全为软件开发人员提供了巨大的推动力。虽然仍有机会改进代码生成,但我们预计下一波好处将来自 ML 在更广泛的软件工程活动中的帮助,例如测试、代码理解和代码维护;后者在企业环境中尤其令人感兴趣。

这些机会为我们正在进行的工作提供了参考。我们还强调了我们在行业中看到的两个趋势:

  1. 人机交互已经转向以自然语言作为通用方式,我们看到人们正在转向使用语言作为软件工程任务的界面以及软件开发人员信息需求的门户,所有这些都集成在 IDE 中。

  2. 基于机器学习的大型任务自动化(从问题诊断到解决问题)已开始显示出初步可行性。这些可能性是由代理和工具使用的创新推动的,这些创新允许构建使用一个或多个 LLM 作为组件来完成大型任务的系统。

为了将上述成功扩展到下一代功能,从事此主题的从业者和研究人员社区将受益于通用基准,以帮助将该领域推向实际工程任务。

到目前为止,基准主要集中在代码生成(例如HumanEval)。然而,在企业环境中,针对更广泛任务的基准可能特别有价值,例如代码迁移和生产调试。一些基准,例如用于错误解决的基准(例如SWEBench),以及针对这些基准的原型(例如来自Cognition AI)已经发布。我们鼓励社区团结起来,建议更多的基准,以涵盖更广泛的软件工程任务。

原文链接:

https://research.google/blog/ai-in-software-engineering-at-google-progress-and-the-path-ahead/