谷歌首席执行官桑达尔·皮查伊(Sundar Pichai)之前提到,目前谷歌新生成的代码中超过四分之一是由AI完成的。Google Research发表的这篇文章AI in software engineering at Google: Progress and the path ahead,详细描述了Google在软件工程中的AI应用的进展和未来方向,尤其是如何通过AI技术提升开发者的生产力。
2019年,虽然机器学习的概念已经被广泛提及,尤其在图像识别和语言翻译中取得了显著效果,但软件开发中的实际应用却寥寥无几。开发者大多认为这些技术离他们的日常开发工作很远,无法直接产生助益。
到了2024年,AI技术在软件工程领域的应用逐渐普及,尤其是基于大型语言模型(LLMs)的代码补全功能,帮助开发者提高了代码撰写效率。在公司内部的工具或商用工具中,AI代码自动补全的普及度越来越高,说明这些技术已经在开发者社区中得到了广泛认可。
虽然很多AI技术在实验室中的原型展示出较高的技术可行性,但实现大规模的产品化应用却并非易事。AI技术的快速变化和不断演进,给产品化带来了很大的不确定性。Google开发团队采用三条主要的指导原则来引导AI技术的部署:
1). 技术可行性和高影响力的优先级:首先选择那些已经证明技术上可行并且预期能够对开发者的工作流程产生显著影响的想法。
2). 快速学习迭代:通过快速的迭代来不断改进用户体验和模型质量,同时注重保护开发者的生产力和工作满意度。
3). 有效性监控:为了提升开发者的生产力和满意度,需要对这些指标进行持续、广泛的监控。
1. AI在软件工程中的具体应用与改进
1.1 LLM在代码补全中的应用
- 代码补全的自然应用:基于大型语言模型的代码补全是最自然的AI应用之一,利用代码本身作为训练数据。开发者在使用IDE(集成开发环境)时,类似于文本编辑器中的单词级自动完成功能,代码补全成为了一种自然延续。这种应用的影响可以通过简单的统计度量,如AI生成的新字符占总字符的百分比,来进行初步衡量。
- 用户体验的改进:为了提升AI代码补全的效果,团队进行了持续改进,包括:
- 模型改进:采用更大规模、能力更强的语言模型,并通过对使用日志的训练来提高模型的表现力。这些日志包括了开发者对补全建议的接受、拒绝和修改情况,从而帮助模型更好地理解开发者的需求。
- 上下文构建的优化:改进提供给模型的上下文信息的构建方式,使得模型能够更加准确地理解当前代码的位置和需求,从而生成更为相关的代码建议。
1.2 其他AI功能在开发工具中的应用
- 上下文感知的代码粘贴:自动化工具可以根据粘贴位置的上下文,对代码片段进行调整和适应,以减少开发者手动调整的时间。比如在粘贴代码时,系统会自动调整代码格式或者变量命名,使其符合当前代码块的风格和需求。
- 自然语言指令的代码编辑:开发者可以通过自然语言命令来指挥IDE进行代码编辑,例如要求系统“优化这段代码”或“替换某个变量名”,从而减少对具体代码修改的精细操作。
- 代码错误修复与可读性优化:AI技术可以帮助开发者自动检测代码中的错误,并提出相应的修复建议。同时,它也能给出提升代码可读性的改进建议,如调整注释、变量命名等,以符合团队的编码规范。
1.3 使用数据和模型改进
- 高质量的历史数据:Google使用了大量的内部软件工程活动日志,这些日志涵盖了开发者的各种操作,如代码修改、构建、代码复制粘贴、代码审查等。这些数据使得AI模型能够更好地理解开发者行为,从而对模型进行更有效的训练。
- 模型训练与数据标注:训练数据包括经过特定任务标注的代码语料,输入和输出都经过精心设计。这些数据的收集过程、数据形状以及最终的模型构建过程,都被精细设计和持续改进,以确保AI在真实世界中的高效应用。
2. 实践经验总结
- 用户体验的重要性:AI功能成功与否,很大程度上取决于它是否能自然地融入开发者的工作流中。那些不需要额外触发、只需一键操作即可接受的功能最受欢迎,而需要开发者主动触发的功能往往难以推广。
- 开发者角色的转变:随着AI代码建议的使用,开发者的角色更多地变成了代码审查者,而不是代码撰写者。找到建议的审查成本与其带来的价值之间的平衡点,是团队在设计这些功能时的重要考量。
- 快速迭代与用户反馈:团队强调,通过A/B测试和用户反馈能够迅速识别问题并进行改进,而高质量的数据则是确保模型和用户体验持续优化的基础。
3. 未来发展方向
3.1 基础模型的进一步应用
- Gemini系列模型:团队计划使用Google最新推出的Gemini系列基础模型,并结合已有的开发数据,来推动AI在软件工程领域的进一步应用。这些基础模型具有更强的代码生成能力,并且能够理解更复杂的开发任务和上下文。
- 扩展应用领域:目前的AI应用集中在代码生成和补全上,未来AI还将应用于更广泛的软件开发活动中,如单元测试、代码理解、代码维护等,特别是在企业环境中,这些应用的潜力巨大。
3.2 行业趋势和共同基准的建议
- 自然语言作为通用交互方式:随着自然语言处理技术的进步,越来越多的软件开发任务通过自然语言进行交互,例如通过语言指令进行代码修改、问题诊断等,这也为开发者提供了更加便捷的开发体验。
- 自动化大型任务:AI不仅可以帮助开发者编写代码,还可以自动完成从问题诊断到修复的任务。通过多种LLM的组合和工具使用,开发者可以实现更为复杂的自动化任务处理。
- 基准测试的呼吁:目前,行业中对AI代码生成的评估大多集中在生成代码的质量上,而对于代码迁移、生产调试等任务的基准测试则较为欠缺。有必要通过社区,共同制定更广泛的基准,以评估AI在更复杂和多样化的软件工程任务中的表现。