谷歌公开自家「AI+软件工程」框架DIDACT:数千名开发者内部测试,用了都说生产力高
摘要
- 谷歌近日公布了自家的DIDACT(Dynamic Integrated Developer ACTivity,动态集成开发人员活动)框架,用AI技术增强软件工程,将软件开发的中间状态作为训练数据,辅助开发人员编写、修改代码,并实时了解软件开发的动态。
- DIDACT是一个多任务模型,训练了编辑、调试、修复和代码审查等软件开发活动。谷歌内部已经部署了三个基于DIDACT的工具,分别是Comment Resolution(用于解决代码审查中的评论问题)、Build Repair(用于修复编译错误)和Tip Prediction(用于预测代码修改的建议)。这些工具都受到了数千名内部开发者的热烈反馈。
- DIDACT不仅可以提高开发者的生产力,还可以作为一个通用的开发人员辅助代理。通过给模型输入一些开发活动的前缀,或者将多个预测串联起来,模型可以以一种令人惊讶的方式生成代码或建议。DIDACT为开发一种能够跨越软件开发过程的辅助代理铺平了一条有前途的道路。
正文
DIDACT框架的背景和目标
软件并不是一次性创造出来的。它是一点一点地改进,一步一步地完成——编辑、运行单元测试、修复编译错误、处理代码审查、再次编辑、满足语法检查器、再次修复错误——直到最终达到可以合并到代码库的水平。软件工程不是一个孤立的过程,而是一个涉及人类开发者、代码审查者、错误报告者、软件架构师和工具(如编译器、单元测试、语法检查器和静态分析器)之间交互的过程。
谷歌的软件工程工具链将与代码相关的每个操作都存储为工具和开发者之间交互的日志,并且已经这样做了几十年。原则上,可以使用这些记录来详细回放谷歌代码库如何一步步形成的关键过程——每次代码编辑、编译、评论、变量重命名等。这些日志是一个关于软件工程过程的宝贵数据源,但是很少被利用来训练机器学习模型。
谷歌近日公布了自家的DIDACT(Dynamic Integrated Developer ACTivity,动态集成开发人员活动)框架,旨在利用这些数据来训练大型机器学习模型来增强软件工程。DIDACT框架的创新之处在于,它使用软件开发过程作为模型的训练数据,而不仅仅是这个过程的最终结果——完成的代码。通过将模型暴露于开发者在工作时看到的上下文,以及他们作出的相应操作,模型可以学习软件开发的动态,并且更符合开发者如何花费他们的时间。
DIDACT是一个多任务模型,训练了编辑、调试、修复和代码审查等软件开发活动。模型的输入是一个开发者的工作空间,包括代码、错误信息、评论等,模型的输出是一个开发者的操作,如插入、删除、替换代码等。模型可以根据不同的任务和目标,生成不同的输出。
DIDACT框架的内部工具和效果
谷歌内部已经部署了三个基于DIDACT的工具,分别是Comment Resolution(用于解决代码审查中的评论问题)、Build Repair(用于修复编译错误)和Tip Prediction(用于预测代码修改的建议)。这些工具都集成在开发者的工作流程中,并且受到了数千名内部开发者的热烈反馈。
Comment Resolution是一个用于解决代码审查中的评论问题的工具,它可以根据评论者的意图,生成一些可能的代码修改建议。例如,如果评论者说“这里应该用const”,那么工具就会生成一个将变量声明为const的修改建议。开发者可以直接接受或拒绝这些建议,或者进行一些微调。这样可以节省开发者在代码审查中修改代码的时间和精力。
Build Repair是一个用于修复编译错误的工具,它可以根据编译器的错误信息,生成一些可能的代码修复建议。例如,如果编译器说“找不到符号foo”,那么工具就会生成一个导入foo所在模块或包的修复建议。开发者可以直接接受或拒绝这些建议,或者进行一些微调。这样可以节省开发者在调试中查找和修复错误的时间和精力。
Tip Prediction是一个用于预测代码修改的建议的工具,它可以根据开发者当前正在编辑的代码,生成一些可能有用或有趣的代码修改建议。例如,如果开发者正在写一个循环语句,那么工具就会生成一个使用列表推导式或函数式编程风格的修改建议。开发者可以直接接受或拒绝这些建议,或者进行一些微调。这样可以帮助开发者学习新的编程技巧或提高代码质量。
这三个工具都使用了相同的DIDACT模型,只是根据不同的任务和目标,给模型输入了不同的前缀或后缀。例如,Comment Resolution给模型输入了评论内容作为前缀,Build Repair给模型输入了错误信息作为后缀,Tip Prediction给模型输入了当前编辑位置作为前缀。这说明DIDACT模型具有很强的灵活性和可扩展性,可以适应不同的软件开发场景和需求。
DIDACT框架的未来展望
DIDACT不仅可以提高开发者的生产力,还可以作为一个通用的开发人员辅助代理。通过给模型输入一些开发活动的前缀,或者将多个预测串联起来,模型可以以一种令人惊讶的方式生成代码或建议。例如,给模型输入“写一个函数来计算两个数的最大公约数”作为前缀,模型就会生成一个实现该功能的函数;将多个预测串联起来,模型就可以完成一个完整的软件项目。
我们相信DIDACT为开发一种能够跨越软件开发过程的辅助代理铺平了一条有前途的道路。我们希望未来能够训练出一个能够理解、沟通、协作、创造和学习的能力。我们期待未来能够与更多的开发者和研究者分享我们的工作,共同推动AI+软件工程的发展。
举例说明
为了让读者更好地理解DIDACT框架的工作原理和效果,我们在这里给出一些基于DIDACT的内部工具的使用示例。
Comment Resolution
假设你是一个谷歌内部的开发者,你正在进行一个代码审查,你收到了一个评论,说你应该使用一个更简洁的语法来实现一个功能。评论如下:
# Reviewer comment: You can use a list comprehension here instead of a for loop.
result = []
for x in range(10):
if x % 2 == 0:
result.append(x * x)
你可以使用Comment Resolution工具来生成一些可能的代码修改建议,如下:
# Suggested change 1: Use a list comprehension with a condition
result = [x * x for x in range(10) if x % 2 == 0]
# Suggested change 2: Use a filter and a map function with a lambda expression
result = list(map(lambda x: x * x, filter(lambda x: x % 2 == 0, range(10))))
你可以根据你的喜好和代码风格,选择其中一个建议,或者进行一些微调。这样可以节省你在代码审查中修改代码的时间和精力。
Build Repair
假设你是一个谷歌内部的开发者,你正在编写一个Java程序,你遇到了一个编译错误,说找不到符号Math。错误信息如下:
// Error message: cannot find symbol
// symbol: variable Math
// location: class Example
public class Example {
public static void main(String[] args) {
int x = Math.abs(-10); // Use the absolute value function from the Math class
System.out.println(x);
}
}
你可以使用Build Repair工具来生成一些可能的代码修复建议,如下:
# Suggested fix 1: Import the java.lang.Math class
import java.lang.Math; // Add this line at the top of the file
public class Example {
public static void main(String[] args) {
int x = Math.abs(-10); // Use the absolute value function from the Math class
System.out.println(x);
}
}
# Suggested fix 2: Use the fully qualified name of the Math class
public class Example {
public static void main(String[] args) {
int x = java.lang.Math.abs(-10); // Use the absolute value function from the Math class
System.out.println(x);
}
}
你可以根据你的喜好和代码风格,选择其中一个建议,或者进行一些微调。这样可以节省你在调试中查找和修复错误的时间和精力。
Tip Prediction
假设你是一个谷歌内部的开发者,你正在编写一个Python程序,你想要实现一个功能,但是不确定如何写。你可以使用Tip Prediction工具来生成一些可能有用或有趣的代码修改建议。例如,假设你正在写一个函数来计算两个数的最大公约数,你已经写了一部分代码,如下:
# Write a function to compute the greatest common divisor of two numbers
def gcd(a, b):
# TODO: complete this function
你可以使用Tip Prediction工具来生成一些可能的代码修改建议,如下:
# Suggested tip 1: Use recursion and Euclid's algorithm
def gcd(a, b):
# Base case: if b is zero, a is the gcd
if b == 0:
return a
# Recursive case: return the gcd of b and the remainder of a/b
return gcd(b, a % b)
# Suggested tip 2: Use a while loop and Euclid's algorithm
def gcd(a, b):
# Loop until b is zero
while b != 0:
# Update a and b using the remainder of a/b
a, b = b, a % b
# Return a as the gcd
return a
# Suggested tip 3: Use the math.gcd function from the standard library
import math # Add this line at the top of the file
def gcd(a, b):
# Return the gcd of a and b using the math.gcd function
return math.gcd(a, b)
你可以根据你的喜好和代码风格,选择其中一个建议,或者进行一些微调。这样可以帮助你学习新的编程技巧或提高代码质量。
结论
DIDACT是一个用AI技术增强软件工程的框架,它使用软件开发过程作为训练数据,训练了一个多任务模型,可以辅助开发人员编写、修改代码,并实时了解软件开发的动态。DIDACT已经在谷歌内部部署了三个工具,分别是Comment Resolution、Build Repair和Tip Prediction,这些工具都受到了数千名开发者的热烈反馈。DIDACT不仅可以提高开发者的生产力,还可以作为一个通用的开发人员辅助代理,通过给模型输入一些开发活动的前缀,或者将多个预测串联起来,模型可以以一种令人惊讶的方式生成代码或建议。DIDACT为开发一种能够跨越软件开发过程的辅助代理铺平了一条有前途的道路。我们期待未来能够与更多的开发者和研究者分享我们的工作,共同推动AI+软件工程的发展。
大语言模型能力提高,各种AI应用体验和质量会提高,工具也更简单实用。最重要的是学习运用各种AI工具,大幅释放生产力。 想上手使用new bing,了解更多AI技术、应用和ChatGPT进展,欢迎点击如下链接加入 GPT4体验
标签:gcd,AI,代码,内部测试,开发者,工具,DIDACT,模型 From: https://blog.51cto.com/u_13279124/6446906