LLM 应用于编程辅助调研
前言
AI辅助编程出现之前需要简单重复技艺的修炼,也就是拔刀速度影响了发挥,今后拔刀速度可以忽略了。
往后的开发可以思考道为主,反正简单重复技艺的部分都可以交给AI,甚至一部分求道的过程是跟AI共同完成。
一、能做什么
-
解析代码:陈年代码一时难以理解,快速解析用途、优缺点等;
-
语言转换
-
代码刷子:可以增强代码可读性,添加类型,智能修复可能的bug,比code Runner更优秀的即时代码调试,优化冗余代码.....
-
测试用例生成
以下引用于(PS:调查数据本身可能存在偏向性,仅做参考):https://github.blog/2022-09-07-research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/
开发者们报告称,Copilot 能帮助他们稳步推进开发流程(73%),并在处理重复性任务期间降低精力消耗(87%)
有近 90% 的开发者们表示,在使用 Copilot 时,他们完成任务,特别是重复性任务的速度更快了。这也符合 GitHub 在产品设计时做出的基本预期。
为了在实践中观察并量化这种提升效果,GitHub 组织了一场对照实验。两个受试小组(其中一组使用 Copilot)需要接受计时,核算用 JavaScript 编写 HTTP 服务器的平均用时。
- 实验发现:
- 使用 Copilot 的小组完成任务的比例更高,为 78%,未使用 Copilot 的小组完成任务比例为 70%。
- 更显著的区别在于,使用 Copilot 的开发者完成任务的速度明显更快,要比未使用 Copilot 的开发者快 55%。具体来看,使用 Copilot 的开发者完成此项任务的平均用时为 1 小时 11 分钟,而未使用 Copilot 的开发者平均用时达 2 小时 41 分钟。
综上,该项调查和实验最终得出的结论是,“Copilot 有助于加快工作完成速度,帮助开发者减少精神内耗,以更加饱满的精神状态专注于工作内容,最终在自己的编码过程中找到更多乐趣。”
二、局限性
辅助编程并不是万能的,也存在局限性。
-
缺乏上下文理解:尽管Copilot使用了先进的自然语言处理技术,但它仍然可能无法完全理解程序员试图实现的上下文或业务逻辑,从而生成的代码可能不完全符合预期。
-
缺乏安全性保障:Copilot生成的代码可能存在安全漏洞,这是因为它只是根据输入的提示和上下文生成代码,并没有考虑到潜在的安全风险。
-
受限于语言和库:Copilot只支持特定的编程语言和库,因此在不支持的领域或者语言中使用它可能会受到限制。
-
代码风格不统一:Copilot生成的代码可能不符合团队或者组织的编码规范和风格指南,这可能导致代码质量和可维护性下降。
-
需要云服务支持:Copilot只能在与GitHub相关的云服务中使用,这可能会对一些开发者造成限制。
-
代码敏感安全性:Copilot 在使用过程中,会通过向 GitHub 提交代码进行学习,因此需要注意提交的代码内容是否包含敏感信息。
根据 OpenAI 的论文,Codex 只有 29% 的时间会给出正确答案。而且它编写的代码往往重构得很差,无法充分利用现有的解决方案。
Copilot 之所以比那些水平一般的程序员更糟糕,一个关键问题在于,它甚至没有尝试编译代码或检查代码是否有效,也没有考虑过自己是否真的遵循了文档的指示。
此外,Codex 没有接受过去一两年内创建代码的训练,因此它完全没学过最新版本、库和语言特性。例如,提示它创建 fastai 代码后,它只会给出使用 v1 API 的建议,而不是大约一年前发布的 v2 版本。
三、效果展示
https://d16xvuom8mr9m8.cloudfront.net/videos/completions/main.mp4
以下代码均通过编写注释,按tab自动生成
package com.example.demo.service;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Service;
/**
* 该服务用于提供数学计算支持,包括但不限于加、减、乘、除、取平均、取余等
*/
@Service
public class MathService {
//提供精确到小数点后5位的数值加法
public BigDecimal plus(BigDecimal a, BigDecimal b){
return a.add(b);
}
public BigDecimal plus(String a, String b){
return plus(new BigDecimal(a), new BigDecimal(b));
}
public BigDecimal plus(Integer a, Integer b){
return plus(new BigDecimal(a), new BigDecimal(b));
}
public BigDecimal plus(Long a, Long b){
return plus(new BigDecimal(a), new BigDecimal(b));
}
public BigDecimal plus(Double a, Double b){
return plus(new BigDecimal(a), new BigDecimal(b));
}
//提供精确到小数点后2位的数值减法
public BigDecimal minus(BigDecimal a, BigDecimal b){
return a.subtract(b);
}
public BigDecimal minus(String a, String b){
return minus(new BigDecimal(a), new BigDecimal(b));
}
//统计分析list中元素最多的10个
public Integer max10(List<Integer> list){
return list.stream().max(Integer::compareTo).get();
}
//求list中所有数值的平均值
public BigDecimal avg(List<BigDecimal> list){
return list.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
}
//求list中所有数值的中位数
//####################此处明显可以看到,中位数求值明显错误
public BigDecimal mid(List<BigDecimal> list){
return list.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
}
//####################此处明显可以看到,中位数求值明显错误
//求list中所有数值的最大值
public BigDecimal max(List<BigDecimal> list){
return list.stream().max(BigDecimal::compareTo).get();
}
//求list中所有数值的最小值
public BigDecimal min(List<BigDecimal> list){
return list.stream().min(BigDecimal::compareTo).get();
}
//求list中最大值
public Integer max(Integer[] list){
return list.stream().max(Integer::compareTo).get();
}
}
四、业界应用
WPS珠海金山,应用chatgpt开发自动化测试vbscript脚本,据说有一倍的开发效率提升,不过仍然需要花时间调试代码处理正确性
五、多产品对比
工具 | 收费 | 链接 | 模型 | 备注 |
---|---|---|---|---|
copilot | 个人:10$每月 100$每年 企业级:19$每人每月 |
https://github.com/features/copilot | gpt4 | 按tab键自动填充代码 企业级受限于github账户以及与github账户关联的组织 |
chatgpt-genie ai | 20$每月 | https://github.com/ai-genie/chatgpt-vscode https://www.loom.com/share/1a57be874e5d4ec099493cc68ed31e04 |
gpt4 | 用于vscode集成与chatgpt对话 需开启chatgpt会员,获取 secret key https://platform.openai.com/account/api-keys |
Tabnine AI Autocomplete for Javascript, Python, Typescript, PHP, Go, Java, Ruby & more |
免费14天 pro:12$每人每月 企业版:待深入沟通 |
https://www.tabnine.com/pricing | gpt4 | 按tab键自动填充代码 vscode插件 试用过程中发现提示实现代码有逻辑错误 |
StarChat | 免费 需要采购硬件训练 | https://huggingface.co/blog/starchat-alpha https://huggingface.co/bigcode/starcoder https://huggingface.co/HuggingFaceH4/starchat-alpha |
gpt like | 采用GPU : 512 Tesla A100 训练耗时 24天 512 Tesla A100 * 8训练耗时 45分钟 |
Copilot
3月23日消息,当地时间3月22日,微软旗下代码托管平台GitHub发布了编程辅助工具Copilot的全新版本Copilot X,新版本接入GPT-4,并新增了聊天和语音功能,允许开发人员用自然语言询问如何完成特定的编码功能。
六、总结
1.多产品成熟度
copilot > chatgpt-genie ai > Tabnine AI Autocomplete > StarChat
2.编程辅助
综合来看AI应用于编程辅助,越是枯燥乏味的代码补全越是准确,的确可以提高写代码效率。
但是真正在写代码而不是模仿时,缺乏基于业务上下文的灵巧联想能力;同时也不能保证提示代码完全正确,需要测试验证;有时也会提示一些并不满足需求的实现。
**使用Copilot前**
这个功能不会写
1. google / stack overflow
2. ctrl C
3. ctrl V
4. 改改输入,改改输出
done!
**使用Copilot后**
这个功能不会写
1. 管他呢!先写个方法名,再来点注释
2. 猜一个库函数名,然后在IDE智能提示里选一个看起来差不多的,回车
3. 让copilot跳出来自动补全,一路tab
4. 改改输入,改改输出
done!
备注:步骤3,4 ctrl c + v可以省略
3.业务场景
围绕着开发测试脚本、单元测试等场景,不如效仿WPS直接采用ChatGPT。
浮生潦草闲愁广,一听啤酒一口尽