您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

谷歌公开自家「AI+软件工程」框架DIDACT:数千名开发者内部测试,用了都说生产力高

时间:2023-06-07 10:15:48  来源:  作者:新智元

新智元报道

编辑:LRS

【新智元导读】AI时代的软件开发流程是什么样的?

任何一个大型软件都不是一开始就构思完善的,而是通过开发人员的一次次改进、编辑、单元测试、修复构建错误、解决代码审查,再循环解决问题,直到满足上线需求后才能把代码合并到仓库中。

控制整个过程的学问就叫做软件工程。

软件工程并非一个独立的过程,而是由开发人员、代码审查员、错误报告员、软件架构师和各种开发工具(如编译器、单元测试、连接器、静态分析器)之间的交流组成。

最近,google公布了自家的DIDACT(Dynamic Integrated Developer ACTivity,动态集成开发人员活动)框架,用AI技术增强软件工程,将软件开发的中间状态作为训练数据,辅助开发人员编写、修改代码,并实时了解软件开发的动态。

DIDACT是一个多任务模型,在编辑、调试、修复和代码审查在内的开发活动上进行训练

研究人员在内部构建并部署了三个DIDACT工具,注释解析、构建修复和提示预测,每个工具都集成在开发工作流程的不同阶段。

软件工程=交互日志

几十年以来,Google的软件工程工具链都是将与代码相关的每个操作都存储为工具和开发人员之间的交互日志。

原则上,用户可以使用这些记录来详细重放软件开发过程中的关键变更过程,即Google的代码库是如何形成的,包括每一次的代码编辑、编译、注释、变量重命名等。

Google的开发团队会将代码存放于monorepo(单仓库,mono repository)中,即包含所有工具和系统的代码存储库。

软件开发人员通常在云中客户端(Clients in the Cloud, CitC)系统管理的本地写时复制(copy-on-write)工作空间中对代码修改进行实验。

当开发者准备好将一组代码变更打包在一起实现某个任务时(比如修复某个bug),需要在Google的代码审查系统Critique中创建了一个变更列表(changelist, CL)。

与常用的代码评审系统一样,开发人员与同行评审者会就功能和风格进行交流,然后编辑CL以解决评审注释时提出的问题。

最后,评审员宣布代码「LGTM!(looks good to me)」,并把CL合并到代码存储库中。

当然,除了与代码评审员的对话之外,开发人员还需要维护大量与其他软件工程工具的「对话」,包括编译器、测试框架、链接器、静态分析器、模糊测试工具等。

软件开发中涉及的复杂活动网络的说明:开发人员的活动、与代码评审员的交互以及对编译器等工具的调用。

软件工程中的多任务模型

DIDACT利用工程师和工具之间的交互对机器学习模型赋能,通过建议或优化开发人员在执行软件工程任务时的行动,来辅助Google开发人员参与软件工程过程。

为此,研究人员定义了一些关于单个开发人员活动的任务:修复损坏的构建、预测代码审查注释、处理代码审查注释、重命名变量、编辑文件等。

然后为每个活动定义一个通用的形式:获取某个State(代码文件)、某个Intent(特定于某个活动的注释,例如代码评审注释或编译器错误),并生成一个Action(用于处理任务的操作)。

其中Action就像一个迷你编程语言,可以扩展为新添加的活动,涵盖了编辑、添加注释、重命名变量、标记代码错误等内容,也可以称这种语言为DevScript。

DIDACT模型的输入提示为任务、代码片段和与该任务相关的注释,输出为开发动作,如编辑或评论

状态-意图-行动(State-Intent-Action)的定义形式能够以通用的方式捕捉不同的任务,更重要的是,DevScript可以简洁地表达复杂动作,不需要像动作发生后那样输出整个状态(原始代码),使得模型更有效且更可解释。

比如重命名可能会修改代码文件中的多处地方,但模型只需要预测一个重命名操作即可。

给AI模型配个程序员

DIDACT在个人辅助任务上运行得非常好,比如下面的例子中演示了DIDACT在功能完成后的代码清理工作,先输入代码审查员的最终注释(图片中标记为human),然后预测解决注释中提出问题所需要的操作(用diff展现)。

给定代码的初始片段和代码审查员附加到代码片段的注释,DIDACT的Pre-Submit Cleanup任务生成处理这些注释的编辑操作(文本的插入和删除)

DIDACT的多模态性质也产生了一些随规模增大而涌现出的全新行为,其中一种能力是历史增强(history augmentation),可以经由提示来启用这种能力,了解开发人员最近做了什么可以让模型更好地预测开发人员下一步应该做什么。

历史增强代码补全的演示

历史增强代码补全任务可以展现这种能力,上图的例子中,开发人员添加了一个新的函数参数(1),并将光标移动到文档中(2)。以开发人员编辑的历史和光标位置为条件,模型通过正确预测新参数的文档字符串条目来完成行(3)。

在难度更大的历史增强编辑预测任务中,模型能够以历史一致的方式选择下一步编辑的位置。

在多个链式迭代上的编辑预测的演示

如果开发人员删除了函数参数(1),则模型可以根据历史正确地预测对删除参数的文档字符串(2)的更新(而无需人类开发人员手动地将光标放置在那里),并且在语法上(也可以说是语义上)正确地更新函数(3)中的语句。

有了历史后,模型可以明确地决定如何正确地继续「编辑代码过程」,而如果没有历史记录,模型就无法知道丢失的函数参数是故意的(因为开发人员正在进行更长的编辑操作以删除参数)还是意外情况(模型应该重新添加参数以修复问题)。

除此之外,模型还可以完成更多的任务,比如从一个空白文件开始,要求模型连续预测接下来的编辑操作,直到编写出一个完整的代码文件。

最重要的是,该模型能够以一种对开发人员来说很自然的、循序渐进的方式辅助编写代码:

首先创建了一个具有导入、标志和基本main函数的完整工作框架;然后再逐步添加新功能,例如从文件中阅读和写入结果,并添加基于用户提供的正则表达式来过滤某些行的功能。

结论

DIDACT将Google的软件开发过程转变为机器学习开发人员助理的训练演示,并使用这些演示数据来训练模型,以循序渐进的方式构建代码,与工具和代码审查人员交互。

DIDACT方法补充了Google和其他公司的大型语言模型所取得的巨大成就,可以减少工作量,提高生产力,并提高软件工程师的工作质量。

参考资料:

https://ai.googleblog.com/2023/05/large-sequence-models-for-software.html



Tags:DIDACT   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
谷歌公开自家「AI+软件工程」框架DIDACT:数千名开发者内部测试,用了都说生产力高
新智元报道编辑:LRS【新智元导读】AI时代的软件开发流程是什么样的?任何一个大型软件都不是一开始就构思完善的,而是通过开发人员的一次次改进、编辑、单元测试、修复构建错误...【详细内容】
2023-06-07  Search: DIDACT  点击:(306)  评论:(0)  加入收藏
▌简易百科推荐
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(8)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(12)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(54)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(47)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(39)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(50)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(68)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(86)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(86)  评论:(0)  加入收藏
花 15 分钟把 Express.js 搞明白,全栈没有那么难
Express 是老牌的 Node.js 框架,以简单和轻量著称,几行代码就可以启动一个 HTTP 服务器。市面上主流的 Node.js 框架,如 Egg.js、Nest.js 等都与 Express 息息相关。Express 框...【详细内容】
2024-01-16  程序员成功  微信公众号  Tags:Express.js   点击:(88)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条