首页 > 编程语言 >AI课堂笔记:AI编程

AI课堂笔记:AI编程

时间:2024-04-14 12:01:01浏览次数:32  
标签:补全 AI 代码 编程 开发者 Copilot 课堂

1、什么是 AI 编程?

在软件开发过程中,通过AI辅助,减少重复性工作,提高编程效率的行为,我们叫AI编程。

 

2、AI 编程的适用场景

  • 技术我懂,不想自己写
    • 帮我完成重复性工作
    • 帮我完成也要费费脑子才能写出来代码
  • 技术不大懂,让 AI 先做,自己边用边学
    • 当心 ta 犯错
    • 当心给的不是最佳方案
  • 如果完全不懂技术,AI编程的帮助不大。

 

3、AI 编程的应用场景

软件开发过程中,已验证能明确提效的场景:

  • 市场调研
  • 需求分析
  • PRD 撰写
  • 图形元素绘制
  • 技术选型
  • 从需求文本生成代码
  • 从设计图生成代码
  • 代码审查
  • 编写测试用例
  • 运维
  • API 文档调用:根据API文档,编写对接程序。
  • 协议解析
  • 跨语言迁移:两周的时间,2 个同事将一个 40 个 API 接口的 go 工程迁移成一个 java 工程

除了软件开发编程的过程,还能显著提效的场景:撰写标书、营销文案、宣传图片、LOGO、商标等等周边场景

 

4、为什么 AI 编程能成为大模型最强垂直领域?

编程能力是大模型各项能力的天花板。「编程」是目前大模型能力最强的垂直领域,甚至超越了对「自然语言」本身的处理能力。因为:

  • 训练数据质量高
  • 结果可衡量
  • 编程语言无二义性

 

5、最佳的 AI 编程工具 — Github Copilot

  • 2021 年 6 月上线,比 ChatGPT 早近一年半。
  • Github 发布研究:使用 AI 编程,提升效率 55%,增加代码量 46%,开发者满意度提升 75%
  • 个人版 10 美元/月,企业版 19 美元/月。
  • 参与开源项目,可免费使用。在校生,免费使用。

 

6、使用 GitHub Copilot 辅助编程的技巧

  • 它根据上下文,自动生成建议代码。如果觉得合适,按下 tab键就行了。
  • 测试用例的命名称技巧:“test_ + 被测试函数名”。
  • 如果想从需求生成代码,在辅助对话模式「Copilot chat」中直接问,或者干脆直接用ChatGPT。
  • 如果有旧代码希望被参考,就把代码文件在新tab页里打开。
  • 改写当前代码,可另起一块新写,AI 补全得更准,完成后再删旧代码。
  • 代码有了,再写注释,更省力。
  • Cmd/Ctrl + → 只接受一个 token。
  • 敲「/」可以看到特殊指令。
  • 选中要操作的代码,或者光标停留在想插入代码的地方,按 Cmd/Ctrl + i,可以内嵌呼出 Copilot chat。
  • 命令行里也能使用 Copilot,需要先要安装 GitHub CLI:https://cli.github.com/

 

7、GitHub Copilot 工作原理

  • 模型层:最初使用 OpenAI Codex 模型,它也是 GPT-3.5、GPT-4 的「一部分」。现在已经完全升级,模型细节未知。
  • 应用层:Prompt 中包含:
    • 光标上下文:光标前和光标后的代码片段。
    • 相关代码:当前文件和其它打开的 tab 里的代码被切成每个 60 行的片段,用 Jaccard 相似度评分,取高分的。有效Tab数 20 个。
    • 相关代码所在文件名:被取用的代码片段的路径,用注释的方式插入。例如:# filepath: foo/bar.py
    • 优先级:根据一些代码常识判断补全输入内容的优先级
  • 补全格式:在函数定义、类定义、if-else 等之后,会补全整段代码,其它时候只补全当前行。

 

8、使用 ChatGPT 辅助编程的技巧

  • 所有 prompt engineering 的技巧都有效,可以把代码、错误信息直接粘贴进去
  • 任何技术相关的问题都可以问,比自己搜索效率高很多。
  • 其实,太多轮次对话并不会带来性能提升,可能反倒引入不相关的东西。开新对话,效果更好。

 

9、从 AI 编程可以学到什么?

  • 使用 AI 编程,解决编程问题。
  • 通过 AI 编程。形成对 AI 的正确认知,知道怎么用好 AI 编程,了解它的能力边界、使用场景,学习它的产品理论,就能类比出在其他领域 AI 怎么落地。
    • 组织高质量的数据。
    • 数据的增加能让原来单一数据源的训练效果提升(多种语言训练)
    • 让程序代码和自然语言一起参与预训练,可以有效提升大模型的推理能力。
    • 对工作场景针对性的设计交互方式:不需要改变用户的习惯,只是在用户需要的时候给以提醒。

 

10、市面上的 AI 编程工具

  • Bito - 比 Copilot 还多些创新
  • Amazon CodeWhisperer - 代码补全,免费。AWS 相关的编程能力卓越。其它凑合
  • Cursor - AI first 的 IDE。
  • Tabnine - 代码补全,个人基础版免费
  • Tongyi Lingma -- 代码补全,免费。阿里云相关。

 

11、GitHub Copilot 的平替:国产开源 CodeGeeX

CodeGeeX:https://codegeex.cn/

  • 纯国产,智谱 AI 制造
  • IDE 插件免费使用
  • 模型开源,个人使用免费,商用需授权
  • 补全和对话插件都有

 

12、本机部署的 Tabby

Tabby:https://tabby.tabbyml.com/

  • 全开源
  • 可以本机部署,也可以独立本地部署
  • 支持所有开源编程模型

 

13、更多开源编程大模型

注:这些只是编程大模型,非AI编程工具。

 

14、Agent:自动编写代码的机器人

Copilot是帮你编程,而 Agent 是完全代替你编程。甚至能做更多……

警告:以下介绍的现在都只能玩玩,做技术探讨,还远没到实用的程度。
  • MetaGPT:多智能体协作,让 agent 模拟岗位。它不只写代码,而且写文档、画图。未来的公司就是人和 agent 混合的,这样的系统架构更匹配公司治理。所以 MetaGPT 其实是个多 Agent 开发框架,而不是单纯的编程工具。Github链接
  • GPT Engineer:指定您想要它构建的内容,AI 会要求澄清,然后构建它。一句话评价:什么都能干,所以还什么都干不好。Github链接。有个专门开发 Web App 的,可用性好一些:GPT Engineer - Build interactive web apps using AI
  • MAGE :用 Wasp, React, Node.js 和 Prisma 生成全栈 Web 应用程序。一句话评价:限定了技术栈,用参数做配置,提供框架代码,成品率更高。各种框架都该效仿。主页查看

 

15、Agent 的落地难

Agent 落地需要两个条件:

  1. LLM 能力足够强
  2. 使用场景足够窄

 

16、未来编程的发展

 

17、AI 编程认知

AI 编程不是神,AI 编程是一个结对编程的小伙伴。

结对编程(英语:Pair programming)是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。 在结对编程中,观察员同时考虑工作的战略性方向,提出改进的意见,或将来可能出现的问题以便处理。这样使得驾驶者可以集中全部注意力在完成当前任务的“战术”方面。观察员当作安全网和指南。结对编程对开发程序有很多好处。比如增加纪律性,写出更好的代码等。

AI 编程,你是导航员,负责审核输入的代码,同时你也是代码输入员,可以让 AI 来审校你的代码。

 

18、AI 幻觉的必然性

AI 祖师爷阿兰·图灵 1947 年在伦敦数学学会的演讲上说过:

...if a machine is expected to be infallible, it cannot also be intelligent.

翻译成中文是:

如果期望一台机器不会犯错,那么它就不可能同时具有智能。

所以,AI 的幻觉不可完全消除,只能尽可能压制。

 

19、AI 能力定律

AI能力 = Min( AI能力,使用者的判断力 )
因为 AI 幻觉的存在,需要使用者有判断力。
同时,使用者的判断力,决定了 AI 能力的上限。 就像团队领导,是团队的上限一样。
所以,提升判断力,比提升实操能力更重要。
广阔的视野是判断力的养料。

 

20、AI 提效定律

效率提升幅度 = 使用者的判断力 / 使用者的生产力
AI 提升的效率,与使用者的判断力成正比(自己知道怎么干,知道方向和对错,让AI辅助干活),与生产力成反比(自己实操能力极强,则AI提效有限)。

 

21、AI 编程提效公式

编程人员的判断力 = 需求的理解准确度 * 代码阅读量
效率提升幅度 = 需求的理解准确度 * 代码阅读量 / 自己手写代码的速度

 

22、行业影响

兴一利必有一弊,AI 编程让开发者不断带来惊喜的同时,也会有一些负面影响,值得我们谨慎对待。面对大量由 LLM 生成的代码,我们不禁要问:这些代码在质量和可维护性上与人工编写的代码相比如何?它们是不是更像经验丰富的高级开发者的精心作品,还是更接近短期合同工的零散拼凑?
参考链接:分析了 1.5 亿行代码发现:AI 编程助手降低代码质量

  • 代码变更率 —— 指代码被推送到仓库后,接着在两周内被撤销、移除或更新的比例 —— 预计在 2024 年将是 2021 年 AI 出现之前的两倍。这意味着,随着 AI 辅助工具的使用增加,代码变动率也在相应增长。随着代码变动率的普遍增加,错误代码被部署到生产环境的风险也随之增大。
  • 频繁收到增加代码的建议,却很少有关于更新、移动或删除代码的建议。“新增代码” 和 “复制 / 粘贴代码” 的比例相比于 “更新的”、“删除的” 和 “移动的” 代码在上升。代码移动越少意味着重构和复用的减少。可以清楚地看到,当前的 AI 助手似乎在一定程度上阻碍了代码的复用。相较于进行重构和遵循 DRY(Donot Repeat Yourself,不要重复自己)原则,这些助手更倾向于提供一种快捷方式,让开发者重复使用现有代码。
  • 复制 / 粘贴的代码会导致未来的维护困难。复制 / 粘贴的代码可能是长期维护代码中最大的难题之一。当开发者重复使用非关键字的代码行时,实际上是在暗示他们没有时间去深入研究之前的实现方式。这种重复添加代码的做法,将整合实现重复功能的任务留给了未来的维护者。
  • 代码溯源——是要看代码从被写出到最终被更新或删除的时间长度。对 “代码溯源” 的数据分析揭示了一个有趣的现象,即在 2022 年到 2023 年间,代码的更新速度加快了。特别是,不到两周就被替换的代码比例增加了 10%。同时,超过一个月的代码更新频率在 2023 年比 2022 年下降了 24%(2023 年为 19.4%,而 2022 年为 25.5%)。
  • 开发者为何保持谨慎?根据我们分析的两项关键数据,2023 年代码质量面临明显下滑,这与大语言模型 (LLMs) 特别是 AI 代码助手的广泛应用密切相关。
  • GitHub 的数据显示,相比经验丰富的开发者,初级开发者使用 Copilot 的频率高出大约 20%。经验丰富的开发者更深刻地理解维护代码的长期成本。如果他们更不愿使用 AI 的代码建议,那么这是否意味着初级开发者现在正以前所未有的速度贡献更多额外的代码呢?
  • 评估代码建议可能耗费大量时间,尤其是在有多个自动建议系统相互竞争的环境中,如流行的 JetBrains IDEs
  • GitHub 的研究发现,使用 Copilot 的开发者的满意度提高了 75%。这表明开发者普遍接受了这款产品。但是,这并不意味着那些负责维护代码的人也会感到同样满意。代码的阅读时间是编写时间的十倍。更快地写出低质量代码,意味着后续阅读代码的人将面临更多困难。代码建议的优化并非基于和代码维护者相同的激励机制。代码建议算法旨在提出最可能被接受的建议,而代码维护者则努力减少需要阅读的代码量(如何调整优化现有系统)
  • AI 助手和 Copilot 如何重塑开发者的角色?无疑,随着 AI 的普及,我们进入了一个代码行数增加速度空前的时代。2024 年更值得关注的问题是:谁将负责整理这一切留下的烂摊子?AI 生成的代码更像是一位频繁更换工作的合同工写的临时代码,容易违反他访问的代码库的 DRY(不重复自己)原则。

所以:使用 AI 编码需谨慎、严谨。

 

23、延伸思考:如何用 AI 提效?

问自己两个问题:

  • 我的时间都消耗在哪里?
  • 怎么让 AI 帮我省时间?

划重点:凡是「输入和输出都是文本」的场景,都值得尝试用大模型提效。

 

标签:补全,AI,代码,编程,开发者,Copilot,课堂
From: https://www.cnblogs.com/rulian/p/18133949

相关文章

  • Moirai:Salesforce的时间序列预测基础模型
    Moirai是Salesforce开发的用于时间序列预测的基础模型。它被设计为一种通用模型,能够预测广泛的时间序列。为了实现这种灵活性,该模型解决了时间序列数据相关的几个挑战,包括:处理各种数据频率(小时、日、周等);适应任何数量和类型的协变量,无论它们在未来是否已知;使用灵活的分布生......
  • Brainpan(VulnHub)
    Brainpan1、nmap2、web渗透随便看看目录爆破使用不同工具,不同字典进行爆破9999端口分析10000端口分析字符串信息中,提示这个程序不能运行在DOS模式下,然后有32个A,还有一行关于复制字节到缓冲区的信息,还有一行比较奇怪的字符shitstorm,有可能会是密码,接下来就是之......
  • 实验2 C语言分支与循环基础应用编程
    task1#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5intmain(){ intnumber; inti; srand(time(0)); for(i=0;i<N;++i) { number=rand()%65+1; printf("20238331%04d\n",number); } ......
  • Heirloom Painting
    先考虑无解的情况,来看样例三,很容易发现是因为\(k\)太大了,所以每次都会修改之前已经改好的。于是我们猜想,如果任意一段连续的数的长度都小于\(k\),那么就无解,证明比较容易,反证就好了,如果存在一个解,那么这个解的最后一步操作,一定是连续的\(k\)个格子,而且这\(k\)个格子的颜色一定要一......
  • 05_QT网络编程之TCP通信
    QT网络编程之TCP通信QT的网络编程:​ 网络编程有TCP和UDP。TCP编程需要用到俩个类:QTcpServer和QTcpSocket本节课目标:​ 完成一个TCP服务器和一个客户端。TcpServerwidget.ui<?xmlversion="1.0"encoding="UTF-8"?><uiversion="4.0"><class>Widget</class>......
  • 实验2_C语言分支与循环基础应用编程
    task1#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5intmain(){intnumber;inti;srand(time(0));for(i=0;i<N;++i){ number=rand()%65+1; printf("20238331%04d\n",number);}......
  • 读论文《基于 GA - BP 的汽车行李箱盖内板冲压成形工艺优化》 —— 如何使用AI技术优化
    最近到了模具公司工作,本来以为身边同事对模具生产和工件生产的流程(大致流程)会比较了解,结果一问才知道基本都是一问三不知,大家都在模具公司工作但是貌似很多人干的和模具生产和工件制造的工作关联性并不强,有的人即使确实在模具生产环节工作结果也是只知道某一环节下的某个操作是......
  • 实验2 C语言分支与循环基础应用编程
    task1.c1#include<stdio.h>2#include<stdlib.h>3#include<time.h>4#defineN55intmain(){6intnumber;7inti;8srand(time(0));9for(i=0;i<N;++i){10number=rand()%65+1;11printf(&q......
  • SEHH2042计算机编程集团项目
    SEHH204223-24第二学期-小组项目1SEHH2042计算机编程集团项目-礼品兑换系统(截止时间:2024年4月28日星期日23:59)预期学习成果在一个或多个高级语言编程环境中开发计算机程序;设计和开发结构化和文档化的计算机程序;解释面向对象编程的基本原理并将其应用于计算机程序发展结合计算机编......
  • 实验2 C语言分支与循环基础应用编程
    1.实验任务11#include<stdio.h>2#include<stdlib.h>3#include<time.h>4#defineN556intmain()7{8intnumber;9inti;10srand(time(0));//以当前系统时间作为随机种子11for(i=0;i<N;++i)12{number=rand()%......