关注公众号“知之洲”可以查看其他优质干货。
前言
人工智能正在席卷全球,在许多领域已经展现出强大的潜力,包括医疗、教育、交通、金融等等。在提高效率与生产力的同时,我们最担心的问题自然就是自己会不会被人工智能替代。
国外有一个叫Cognition的团队,他们是一个专注于推理的应用人工智能实验室,并在不久之前创造出了全球第一个软件工程师AI,名为Devin。这在圈子里掀起轩然大波,并引起广泛的讨论。很多程序员看到他们官网发出的那些视频之后也在担心是不是自己的职业生涯已经到头了?
SWE-bench评估
Cognition官网放出了如下的一张对比图,称在SWE-bench上对Devin进行了评估,得出的结果是Devin可以端到端正确地解决13.86%的问题,远远超过了之前其他模型4.80%的最高水平。
对评估的推敲
SWE-bench的评估方式是从12个流行的python库中收集了2294个问题PR对,然后让各种模型去解决这些issue,最后看提交的PR是否能够通过单元测试。我们打开SWE-bench提供的这些流行库,可以看到他们的Issue、PR文档都写得相当规范详细。
这张图下面还提到了一个信息翻译过来是:“Devin是在数据集的随机的25%子集上进行的评测。Devin是在无辅助的情况下进行的,而所有其他模型都是在有辅助的情况下评测的结果(这意味着模型被准确地告知哪些文件需要编辑)”。
不得不说确实强悍哈,但也产生了另外一个问题,既然它是使用了随机的25%的数据子集进行的测试,那么这13.86%是一次测试的结果还是多次测试结果?是均值还是最高值,这一点不是很明确。并且现在没有对外提供这个软件,暂时没有办法进行测试。不仅如此,我还会有一些其它的思考,后面会说。
SWE-bench的初衷是要通过一种方式评估出各个模型解决现实世界软件工程问题的能力,但是并不代表这些模型可以脱离人。很简单,要解决issu就得提出issue,提出让这些模型理解的issue本身就是不是一件轻松的活。并且目前来看,Devin确实已经很强了,但是仍然还是有86%的issue没有解决。就算这86%的问题也被解决了,还是会产生很多新的工作,比如编写能让AI读懂的Issue、文档,编写相应的单元测试来验证AI提交的PR是否有效,仔细review每一行AI写的代码。说来说去,人终究还是最后一道堡垒,至少在很长一段时间内还会是这样的。
《Generate Hidden Text Images》
此视频的背景是小美想要Devin帮她创建一些类似下面这样的隐藏了文字的图片,你能不能看出来这张图里面隐藏着"FOREST"这个单词呢。
翻译一下他们的对话——
小美:
嗨,Devin!我在这篇文章中(https://www.factsmachine.ai/p/hidden-in-plain-sight)看到可以生成带有隐藏文字的图像。里面提到了一个脚本,你能把它设置好,为我生成一些图像吗?
Devin:
当然,我这就帮你安排。确认一下,你是想让我生成有隐藏文字的图像对吗?
小美:
是的!我希望这些图像是1080的分辨率,所以请确保您创建的图像是这个大小。文字应该是"SARA",也需要有一些"DEVIN"和"COGNITION"的。
Devin:
知道了!我将创建1080的图像与隐藏了文字"SARA"、"DEVIN" 和"COGNITION"。我将会先设置必要的脚本,然后生成图像。我会随时向你汇报进展的!
结果Devin帮助小美写好了脚本并且成功生成了她需要的图片。
视频推敲
在小美在求助Devin的时候特别提到了一篇博客(https://www.factsmachine.ai/p/hidden-in-plain-sight)。
这篇博客里有一块红色的文字附带生成小美所需要图片的python库的地址。如果你进去,会看到这个库的作用很明确,它的README写得十分详细,并提供了完整的例子,可以说Devin并不需要编写太多自定义的代码。
可以认为Devin有一定的自主学习的能力了,它可以在这篇博文里面通过链接地址找到他需要的那个python库,并且根据其给出的信息完成小美的工作,这点让我惊叹不已。
惊叹归惊叹,但是Devin在这个例子里面,Sara告诉它在哪里可以找到解决问题的答案了。这也导致了一个悖论:既然都已经知道解决问题的方法了,为什么还会去向AI求助呢?真正解决了这个问题的是小美这个人还是AI Devin呢?
《Making Game of Life》
这个视频演示了小帅如何引导Devin帮他制作一个Game of Life的个人网站。
翻译一下他们的对话——
小帅:
做一个运行“Game of Life”的个人网站,这个网站是要为Devin量身定做的。
Devin:
当然可以,为Devin创建一个Game of Life的个人网站,听起来是一个有趣的项目!我会先建立网站的基本架构然后把Game of Life融入其中。我会确保在整个网站中添加Devin个人元素。你有什么具体的细节或元素想要自定义的吗?
小帅:
"Devin"应该在主页加载的时候显现,并且要有创造性一点。
Devin:
明白了,一旦加载,主页上就会运行Game of Life,这是一个很酷的功能,而且绝对可行。我会确保它的互动性和视觉吸引力。我正在网站的设计和功能,接下来我会开始建立网站的框架。我会随时向你汇报我的进展!如果你对Devin的网站还有什么想法,请告诉我。
-
创建了一个新的React应用程序并安装Chakra UI以及必要的依赖。
-
使用React和Chakra UI设置前端环境。
-
启动开发服务器,并验证该网站正在运行的私有IP地址。
-
通过CDN将p5.js库添加到index.html文件中,以实现Game of Life。
-
在React应用程序中实现并验证了Game of Life的功能和响应能力。
网站的制作构建已经准备好了,我现在正在着手将其部署到Netlify上。部署完成后我将向您提供Netlify站点token和URL。以Game of Life为特色的个人网站已经成功部署到Netlify上,您可以通过http://delicate-ganache-2182a6.netlify.app访问。请确保Netlify站点令牌的安全,因为未来的站点更新将需要用到它,如果你需要在未来更新网站,你可以提供这个令牌给我,我将使用下面的命令来部署更新`deploy_netlify build_dir [token]`。如果您有任何进一步的要求或需要协助,随时让我知道!
-
将网站部署到Netlify,并将部署URL和Netlify网站令牌传递给用户。
小帅:
我需要它在屏幕中间用很酷的文字显示出“Devin”。
Devin:
明白了,在屏幕中央添加"Devin"这个很酷的文字,会给它一个很好的个人风格。我会处理的,完成后我会通知你的!
小帅:
开头单词“Devin”使用像素化的风格。
Devin:
使用像素化的风格“Devin”开始听起来是个不错的主意!它会给人一种复古的感觉,很好地与Game of Life主题相结合。我准备好了就通知你。
-
更新了GameOfLife.js文件,以使用Google字体中的新像素字体,并将字体文件移动到公共目录中。
Devin:
我已经对代码进行了必要的修改,以确保文本“Devin”将在页面加载时以像素显示。现在,我将重新启动开发服务器,以应用这些更改,并验证一切是否按预期工作。我会尽快向你汇报结果。
Devin:
带有Game of Life功能的Devin个人网站已经成功更新和部署。当网站加载时,像素化文本“Devin”将显示在主页上。你可以通过https://curious-choux-109a4b.netlify.app访问。请保持所提供的Netlify令牌(***)的安全性,因为它将需要为任何未来更新的网站。如果您有任何进一步的要求或需要额外的变化,随时让我知道!
-
修正了GameOfLife.is组件中的文本渲染问题,以像素为单位在主页上显示“Devin”。
小帅:
让字体变大,因为它还不够易读,而且帧速率看起来很慢/东西没有移动。
Devin:
我可以使字体更大,并搞清楚是什么原因导致速率变慢的,完成后通知你。
-
增加了GameofLife.js文件的字体大小,并调整了帧速率,以获得更好的易读性和更流畅的动画。
-
重新部署更新的网站,增加字体大小和改进的帧速率到Netlify。
网站的更新版本已经成功部署,“Devin”的字体更大,“Game Of Life”的帧速率更高。您可以通过https://curious-choux-109a4b.netlify.app访问。
小帅:
现在,初始屏幕被卡在那里,然后在3秒钟后,它执行了一个步骤就没有其他的了。
Devin:
我这就去解决它,以确保Game Of Life连续和顺利地运行。
-
修改了GameOfLife.js绘图函数,以连续运行模拟。
-
重新部署了更新的网站,不断的模拟变化到Netlify。
已成功重新部署了具有连续模拟生命游戏的更新版网站。您可以通过https://curious-choux-109a4b.netlify.app访问。
小帅:
为我们创建一个不包括node_modules的zip包。
Devin:
好的,我会把项目的zip文件放在一起,不包括node_modules目录,一旦可以下载了我就通知你。
-
创建了项目的zip存档(不包括node_modules)。
这里是Devin网站项目的zip存档。'node_moules目录和其他不必要的文件已经被排除,以减少文件大小。
devin-website.zip
小帅:
在头10秒内保持当前的帧速率,在此之后开始慢慢加速。
Devin:
好的,在最初的10秒内保持初始帧速率,然后逐渐加快,这会给Game of Life增加一个动态的元素。我将对代码进行调整并部署更改。
-
调整GameofLife.is中的帧速率逻辑,在10秒后开始加帧。
-
重新部署更新的网站与新的帧速率逻辑到Netlify。
更新后的项目文件已经打包成一个zip文件,排除了不必要的目录和文件。devin-website-updated.zip
小帅:
你能让它变成响应式的吗,现在当改变窗口大小的时候它就崩溃了。
Devin:
是的,响应式设计是良好用户体验的关键。我会更新代码来更好地处理不同大小的窗口。我重新部署好了就通知你。
-
为更新后的React应用程序创建了优化的生产构建。
该网站已成功更新和重新部署。游戏的生命模拟现在应该响应窗口大小调整。您可以通过https://curious-choux-109a4b.netlify.app访问。
-
将网站调至响应性Netlify
小帅:
能否添加一个功能,让鼠标点击的时候产生新的Game of Life块。
Devin:
当然可以。
小帅:
当我按住并拖动鼠标时,它也能正常工作。
Devin:
我将确保允许您单击并按住鼠标左右拖动时候也能创建新的块。这将是一个很酷的互动,我这就处理。
小帅:
你能让帧速率增加得更快,然后在相当快的帧速率下达到稳定状态吗?
Devin:
我正在为创建新的块添加点击和拖动功能。对于帧速率,我可以更快地增加它,然后稳定在更快的速率。我将实现这些更改,好了就通知你。
-
重新启动开发服务器以应用新功能。
Devin:(凌晨2点49分)
更新后的《Game of Life》网站已成功部署。您可以通过以下URL查看https://curious-choux-109a4b.netlify.app
小帅: (凌晨3点58分)
让Devin Text更大。
视频推敲
这里面让Devin制作了一个Game of Life的网站,如果你不了解什么是Game of Life,可以去维基百科看看https://en.m.wikipedia.org/wiki/Conway%27s_Game_of_Life
Devin使用React搭建了一个网站,它搭建网站的方式和我们差不多,并且端对端的将网站部署到netlify上面。并且可以看到Devin可以不断的接收小帅的新的指令,即使它当时正在处理小帅的上一条指令,这块体验做得很到位。
就替代性而言,这个视频所演示的网站功能还是过于简单(对于人类前端程序员来说),简单的交互加上简单的动画,没有什么业务性的功能。使用前端框架搭建网站、端对端部署,目前市面上已经有很多成熟的方案了。仍然脱离不了人,仍然需要小帅不断地去给出新的指令,这其实和我们现在做软件的方式异曲同工,只是编写代码的时候由Devin代劳了,但是其实目前我们真实社会写软件,90%的时间其实是在思考上,真正编写代码的时间占比其实很少。
这里还存在两个疑点:
- 在Devin第一次生成的网址是http://delicate-ganache-2182a6.netlify.app,经过修改后在第二次生成的网址变成了https://curious-choux-109a4b.netlify.app。这里网址是发生了变化的。但在第三、四、五次修改的时候生成的网址却没有发生变化,这里有一点点可疑。
- 在视频里面小帅和Devin最后的聊天和上一次发送消息时间之间相差1个多小时,这一个小时小帅有没有亲自手动处理过代码无从得知。
《AI finds and fixes a bug that I didn't catch》
背景:小帅维护了一个大型开源存储库cp-book,有一天他的朋友发消息告诉他cp-book存在一个bug。小帅按照自己的想法修复了但是没有时间编写测试用例,所以让Devin帮忙。他告诉了Devin存储库的地址,要求Devin协助自己检查并处理。
这里也翻译一下他们的对话——
小帅:
我想让你帮忙写一个输出mod_constraint的回归测试。将测试放到modnum.test.cp文件中,确保读取现有的测试文件以查看正确的模式。编写一个测试用例,初始化两个mod_constraints`a(1,5)`和`b(1,10)`,然后计算`mod_constraints r= a & b`。然后,检查:`r.mod`是`a.mod`和`b.mod`的最小公倍数,`r.v % a.mod == a.v`(对于`b`也是如此),并且`r.v`是在`e`和`r.mod`之间。
Devin:
理解,我将为`mod_constraint`编写回归测试并将其包含在`modnum.test.cpp`中,我将确保遵循测试文件中的现有模式,并验证是否满足你为`a`、`b`和`r`指定要满足的条件。我这就着手开始了。
小帅:
我还想多做些检查,不要只使用a和b的固定值,而是编写一些循环来迭代所有可能的`a.mod`从1到10,`a.v`从0到`a.mod-1`,对于`b`也是如此。跳过所有`a.v%gcd(a.mod, b.mod)!= b.v % gcd(a.mod, b.mod)`,并且检查其余情况下r上的约束。
Devin:
当然,我可以增加那些额外的测试。如你所描述的,我将编写循环来遍历`a.mod`和`b.mod`,同时跳过了`a.v%gcd(a.mod, b.mod)!= b.v % gcd(a.mod, b.mod)`的情况。然后,确保对的约束条件进行了检查,以确定剩余的情况。我做完了就告诉你。
(这里Devin编写了测试用例,发现了存在`r.v`为负值的情况,也就是说测试没有通过,然后Devin调试了一下代码,并且添加了一行代码,接着测试全部通过了。)
-
为`mod_constraint`编写了增强的测试,并对`a`和`b`的所有可能值进行循环。
-
识别并更正了`mod_constraint`操作中`r.v`值为负的原因
-
在bug修复后运行测试,所有测试都顺利通过
Devin:
cp-book项目中的`Mod约束回归测试`在解决了`r.v`为负值的问题后,现在已成功通过。
结果Dovin成功帮助小帅找到了问题,并成功修复了。
视频推敲
这个视频里Devin给我带来了震撼。它不仅按照提示生成了回归测试用例,并且在测试用例没有通过的时候主动去调试、然后增加了那一行代码,使得测试用例通过了,这点超出了我的预期,真的有被震撼到了。
关于替代性,我们可以看出我这里小帅给出的提示语非常的专业,看起来几句话,其实是需要有一定的经验和思考之后才给得出来的。整个工作的顺利完成仍然需要小帅描述出详细的测试方案。
结论
我们不得不承认Devin带来的突破让人震撼,如官方视频所演示的那般,它绝对改变了一部分游戏规则,Cognition毋庸置疑是一个非常厉害的团队。
Devin强不强?强。它做的事情快要超出我的认知边界了。
Devin能不能替换掉程序员?非常肯定的说,不能。Devin所做的每件事情都需要专业的程序员去引导,某些情况下它可以提升程序员的生产效率,实际上说是一个非常好用的工具更加合适,可以在某些情况下作为一种调试甚至是部署手段。Devin只是改变了一部分我们之前处理需求的方式,比如我们在开发过程中可以利用它处理一些pivot,代价就是我们需要不断地向他描述清楚我们的思路,这个没办法。
以前程序员做事情的步骤是这样的:
理解需求→思考解决方案→编写代码→调试→出问题→调试
现在变成了现在这样:
程序员理解需求→程序员思考解决方案→描述出让AI能理解的prompt→AI理解需求→AI写出代码→出问题→程序员描述出让AI能理解的prompt→程序员调试+AI调试→出问题→程序员描述出让AI能理解的prompt→程序员调试+AI调试
与当前的人工智能迭代相同,Devin它非常擅长处理目的性很强、描述清楚的任务,但是实际我们接到的项目需求其实是异常复杂的,指望脱离程序员让Devin去实现一个项目,目前来说过于困难。
有经验的程序员都知道,即使是顾客也“不知道”他们到底想要什么,需求在开发的过程中是会不断变化的。程序员做的工作并不只是写代码这么简单,他们干的活充满变数并且辛苦。即使如视频里面演示的那样,也能看得出一二。退一万步,Devin强大到没谱,可以脱离人去单独做事情了,那么此时那句话就会很应景——If everyone's super, no one will be。
这两年全球的打工人在裁员、通货膨胀和人工智能的威胁之间被折腾得精疲力尽,希望此文能减少一些大家的心理负担。
关注公众号“知之洲”可以查看其他优质干货。