潦草白纸

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 服务器的平均用时。

  • 实验发现:
  1. 使用 Copilot 的小组完成任务的比例更高,为 78%,未使用 Copilot 的小组完成任务比例为 70%。
  2. 更显著的区别在于,使用 Copilot 的开发者完成任务的速度明显更快,要比未使用 Copilot 的开发者快 55%。具体来看,使用 Copilot 的开发者完成此项任务的平均用时为 1 小时 11 分钟,而未使用 Copilot 的开发者平均用时达 2 小时 41 分钟。
    综上,该项调查和实验最终得出的结论是,“Copilot 有助于加快工作完成速度,帮助开发者减少精神内耗,以更加饱满的精神状态专注于工作内容,最终在自己的编码过程中找到更多乐趣。”

二、局限性

辅助编程并不是万能的,也存在局限性。

  1. 缺乏上下文理解:尽管Copilot使用了先进的自然语言处理技术,但它仍然可能无法完全理解程序员试图实现的上下文或业务逻辑,从而生成的代码可能不完全符合预期。

  2. 缺乏安全性保障:Copilot生成的代码可能存在安全漏洞,这是因为它只是根据输入的提示和上下文生成代码,并没有考虑到潜在的安全风险。

  3. 受限于语言和库:Copilot只支持特定的编程语言和库,因此在不支持的领域或者语言中使用它可能会受到限制。

  4. 代码风格不统一:Copilot生成的代码可能不符合团队或者组织的编码规范和风格指南,这可能导致代码质量和可维护性下降。

  5. 需要云服务支持:Copilot只能在与GitHub相关的云服务中使用,这可能会对一些开发者造成限制。

  6. 代码敏感安全性:Copilot 在使用过程中,会通过向 GitHub 提交代码进行学习,因此需要注意提交的代码内容是否包含敏感信息。

以下引用于:https://github.blog/2022-09-07-research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/

根据 OpenAI 的论文,Codex 只有 29% 的时间会给出正确答案。而且它编写的代码往往重构得很差,无法充分利用现有的解决方案。

Copilot 之所以比那些水平一般的程序员更糟糕,一个关键问题在于,它甚至没有尝试编译代码或检查代码是否有效,也没有考虑过自己是否真的遵循了文档的指示。

此外,Codex 没有接受过去一两年内创建代码的训练,因此它完全没学过最新版本、库和语言特性。例如,提示它创建 fastai 代码后,它只会给出使用 v1 API 的建议,而不是大约一年前发布的 v2 版本。

三、效果展示

https://youtu.be/4RfD5JiXt3A

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。

posted on 2023-05-23 09:13  潦草白纸  阅读(253)  评论(0编辑  收藏  举报

导航