动机
这个博客很早就部署了,不过之前使用的是一个开源项目Notion-Hugo,这个项目作的很棒,给我提供了一个很好的思路,基于Notion作为CRM,使用Hugo主题进行部署,既满足了我日常使用Notion写作,Hugo漂亮的主题还对我胃口。不过该项目是使用TypeScript写的,在项目运行过程中偶尔会有一些错误出现,我自己调起来又有点麻烦,有时候就索性不管了,一放就好久,到头来还得硬着头皮去调,花了不少时间。后来我就想为什么我不自己开发一个呢,功能也不复杂,完全可以使用Python来开发,应该花不了多少时间,于是就有了这个项目,不过代码基本上都是AI写的,我基本只负责提需求和审查代码。
开发过程
因为本篇文章拖了很久才写,那时候使用的AI Coding还是GitHub Copilot,不像现在的Cursor这样的AI IDE,能够实现全自动的开发。但是相比以前还是有了10x的效率提升。
整个开发过程还是很丝滑的,虽然之前也使用了AI Coding,但是没有这次使用这么彻底,这次我想的是完全不自己动手,全凭AI来完成。
首先是搭建整个项目的框架,我通过chat的方式询问了标准的博客项目的架构是什么样的,然后手动创建了项目目录,接着我让AI开发了与Notion交互的测试代码,测试了下,通过!
然后是仿照Notion-Hugo项目的方式,实现了从Notion获取数据,然后转成Markdown格式,通过hugo进行部署。甚至很多代码我直接copy Notion-Hugo的TS代码,让AI转成Python,比如不同类型Notion数据的转换。
项目开发完,基本没有遇到什么bug,遇到了我就把报错信息提供给AI,让AI自己解决。接着部署到github.io就完成了。非常简单丝滑,开发时间也很短,差不多只用了一个下午。
AI Coing发展过程
接下来我来简单介绍一下AI Coding的发展过程。
最早的时候我们使用的编辑器都会有提示功能,例如VS Code、JetBrains相关的产品,这类产品基本是基于语法、模板进行代码提示,实现了括号匹配、关键词补充等功能。
后来发展到使用一些简单的神经网络算法进行代码提示,例如LSTM,但是一直没有火起来,使用体验也没有太大的提升。
直到LLM发展以后,基于LLM的续写能力,能够实现精准的代码补充,因为你的注释、代码上下文能够为LLM提供充足的信息,让代码预测更加精准,这一时期GitHub Copilot是典型的代表,但是每个月10刀的订阅费,让国内的用户还是望而却步,这时候国内的模型厂商免费提供了大量的插件,例如通义灵码、CodeMars等,我都有使用过。
随着LLM能力的提升,代码补全已经太简单了,我们可以通过chat的形式给LLM模型发送指令,让其完成相应的代码开发,比如使用Python帮我实现快排、帮我给接口添加标准的日志等,之后LLM会完成响应的代码,我们可以通过复制粘贴的形式,或是直接应用的形式使用代码,但是这种形式仅局限在与一个代码文件,并不能根据整个项目进行实现。
简单的chat已经不能满足我们的要求了,能不能有更加方便的方法呢?比如我说帮我实现一个web页面,接入天气api,可以查询不同城市日期的天气,这时候Agent的形式就来了,Agent可以帮你构建整个项目,创建好项目的目录结构,分别实现不同的功能。这一时期的代表就是Cursor,我们通过自然语言的交互,可以实现整个项目的搭建开发。这里插一句,Cursor的爆火跟anthropic的Claude-3.5-Sonnet是有直接关系的,Claude-3.5-Sonnet是当时最好的编程模型,没有之一。可见AI Coding的发展是强烈依赖LLM模型的能力的。
更进一步,除了开发任务,还能进行自动运行、部署、交付,这相当于一个程序员的大部分工作了,Devin做到了,他通过构建一个虚拟环境,赋予LLM足够的权限,实现自动化的工作,Agent的形式我们还需要配合,比如审查代码、点击接受代码、调整需求等。Devin完全是自动化的,我们可以下达指令以后,就去干别的事情了,等着交付就行。Devin一个月500刀的订阅费,你们觉得值不值呢?如果Devin具备高级工程师所具备的能力,我觉得那相当值,但是现在可能还没有达到这种能力,仍然会有出错的可能,所以让子弹再飞一会吧。
一些思考和感想
随着对AI Coding的使用越来越多,现在我对于工作上的需求,和自己的想法越来越open,特别愿意尝试新技术,比如对于一些不太熟悉的技术栈,我都可以去尝试。因为我本身是算法工程师,所以对于后端开发、前端开发,并没有专业的工程师那么熟悉,但是现在我会主动去使用AI进行搭建web demo,以供产品、运营等同学去进行测试我们的模型,针对自己的一些想法,也会使用AI去做一些小工具来进行验证,还能提供自己的工作、学习效率。因为我总感觉之前我是单打独斗,现在有一个“老师傅”站在我的身后,在我有任何问题的时候,都能耐心的、掰开了、揉碎了讲给我听,还能通过各种例子来帮助我理解。这就是AI带给开发者最好的福利吧。
对于有开发基础的工程师来说,AI Coding带来的是远超10倍的效率提升,对于没有基础的人来说,是从无到有的提升。所以未来肯定是一个人人都会编程的时代,对于工程师和没有编程基础的人,我给出的建议是,尽可能的多尝试和使用,但是也不能一点编程知识也不学习,还是要学习一些编程基础的,不然无法判断代码的好坏,甚至代码可能都运行不起来。
当然随着模型能力的提升,对人的要求也是越来越低,比如之前我们需要做详细的Prompt Engineering来让模型遵循我们的指令实现我们的需求,但是现在很少有人特别详细去写Prompt了,因为模型的理解能力变强了,不需要太多的Prompt技巧了,只需要将需求描述清晰,模型就能准确的去实现。
根据我的经验来说,最好不要一下给模型最终的需求,而是将需求进行拆分,根据最终的目标让模型逐步进行实现。这是因为模型本身上下文是有限制的,模型无法做到一步到位,并且如果是一个很大的需求,模型在实现过程中的某一个环节如果出问题的话,根据错误累积原则,错误会越来越严重,最终可能导致实现的代码与需求不符。
如果在编程过程中,一个问题总也无法很好的解决,模型可能会一直通过打补丁的方式进行实现,这可能会导致代码库越来越臃肿,以至于我们无法进行维护,甚至导致整个项目瘫痪,所以这时候可能多尝试其他的模型,比如ChatGPT,可以将当前的问题抽象进行描述,看看其他的模型有没有更好的解法,这相当于简化了模型的上下文,让模型只专注于当前遇到的问题,而不是考虑整个代码库进行回答。这样带来的好处是能精准定位问题和解决,不至于让整个代码库进行修改。找到问题解决的思路以后,可能让IDE帮忙进行解决,也可以手动解决,都是可以的,宗旨就是尽量不要一直打补丁。
还有一些项目可能是使用公司内部的框架,或者是一个多年的老项目,这时候使用AI Coding可能会遇到很多问题,比如AI不了解框架的使用,或是参考代码库内其他的错误的使用方法,导致出错,这种错误很难解决,所以这种情况,最好还是给出清晰的定义,甚至一些好的代码示例,如果框架有文档,也可以交给AI,也就是我们所说的few-shot,让AI去学习正确的使用方法,从而达到比较好的效果。当前目前来看使用AI还是在公开的框架上效果是最好的,因为有充足的训练数据,AI的理解比较到位。
最后
大家都在谈AGI,我认为编程领域的AGI已经到来了,当然如果你定义AGI是帮我做一个淘宝,AI能够从0开始搭建底层的代码,包括整个项目的部署运营,那肯定不是的。编程领域的AGI是通过使用AI实现效率的大幅提升(10倍以上)、代替部分人员的实际工作,这真的已经到来了。
Andrej Karpathy提过Vibe Coding,也就是完全沉浸式编程,只给LLM发出指令,等待其运行完成,直到项目完成。这种感觉只有体验过才会觉得有多美妙,这时候我们就是一个创造者,搭配着无所不能的AI,我们可以做任何事!
我还有一个想法,那就是一定会有一些AI Native Codebase,也就是整个代码库全是由AI来管理的,从代码的编写,bug的修复,代码的上线等各种流程,当这种情况出现的时候,我们就可以宣布AI Coding的AGI彻底到来了!
