现在的科技领域,有关人工智能有没有被吹得太厉害,一直都有争论,没完没了的。不过,像谷歌 DeepMind 的安全研究专家和机器学习科学家 Nicholas Carlini 这样的人可不多,他用自己的经历给咱们展现了不一样的看法。通过他写的东西,咱们能知道大型语言模型在实际用的时候很厉害,花样也多。这可不是光嘴上说说,而是真能改变工作办法、让干活更快、还能冒出新点子的好东西。
最近,Carlini 自己写了一篇特别长的文章,仔细讲了他平常怎么用 AI。这篇文章可厉害啦,不光让咱们看到了 AI 技术到处都能用,还能让咱们猜猜以后科技会怎么改变咱们的生活。
Carlini 在文章里举了 50 个他自己用 AI 的例子,像工作效率提高啦、写东西有创意啦、帮忙编程啦等等好多方面。不过让人吃惊的是,这 50 个例子只是他用 AI 的一小部分,他说还不到 2%呢。这可太让人震惊啦,不光说明 AI 技术厉害,还说明咱们可能还没完全明白 AI 的潜力有多大。
实际上,Carlini 的经历可能是个大趋势的开头:随着 AI 技术越来越好,用的人越来越多,咱们可能正站在一场技术大革命的边上呢。就像以前个人电脑和互联网彻底改变了咱们工作生活的样子,AI 说不定就是下一个能让社会大变样的重要力量。那面对这样的情况,咱们该怎么看 AI 技术的发展呢?是小心点好,还是大胆去拥抱变化?
原文如下:
作者:DeepMind 安全研究专家和机器学习科学家 Nicholas Carlini
我觉得“人工智能”模型(我说的是大型语言模型)没有被吹过头。确实,每出来个新技术,都会招来骗子。好多公司都说自己在用“人工智能”,就像以前说自己靠“区块链”一样。(咱们都见过好多回啦)同样,咱们可能现在就在个泡泡里。互联网在 2000 年泡泡破了,可咱们现在用的互联网应用,以前在科幻小说里才有。
但我觉得最近咱们在这方面的进步可不只是吹出来的,是因为过去这一年,我每个星期都花好几个小时跟各种大型语言模型打交道,它们解决我给的难任务的本事让我特别吃惊。所以我能说,这些模型让我写代码的速度至少快了 50%,不管是做研究项目还是自己弄点编程的小副业。
我在网上看到好多说大型语言模型有用没用的人,要么太乐观,说所有工作三年里都能自动化,要么特别悲观,说一点用没有,以后也不会有。
所以在这篇文章里,我就是想让大家讨论得实际点。我不会说以后会怎么样。我就是想列个表,这是我(一个研究机器学习的程序员和科学家)跟不同的大型语言模型交流的 50 次,这些交流让我做研究的本事强了不少,还帮我弄了些随便的编程小项目。这里面包括:
- 用我以前没用过的技术弄出个完整的网络应用程序。
- 教我怎么用各种框架,就算我以前没用过。
- 把几十个程序改成 C 或者 Rust 语言,性能能提高 10 到 100 倍。
- 把大的代码库简化,让项目简单不少。
- 给我去年写的差不多每一篇研究论文写一开始的实验代码。
- 把几乎所有无聊的任务或者一次性的脚本都自动化了。
- 差不多完全代替了我以前在网上找怎么设置和配置新软件或者项目的搜索。
- 在帮我解决错误信息方面,代替了差不多 50%的网上搜索。
要是给这些应用例子分分类,大概能分成“帮忙学习”和“把日常无聊的事自动化”这两类。前面那个对我特别重要,因为能让我轻松对付以前觉得难的任务;后面那个也重要,因为能让我专心做我最拿手的,解决真正难的问题。
关键是,这些例子都是我怎么实实在在用大型语言模型的。不是为了显摆技术多牛,就是根据我工作的实际情况。这就是说,这些例子可能看着不怎么厉害,但其实我平常工作好多也普普通通的,现在能用的大型语言模型差不多把这些工作都自动化了。
通过这篇文章,我的目的就是一个例子接一个例子地给你看,过去这一年我怎么用大型语言模型提高工作效率,一直说到你听烦了为止。要知道,就算你可能看过不少例子了,其实我给你看的还不到我用大型语言模型的总数的 2%。
细微差别
要说互联网做得不好的地方,那肯定是对细节的处理。我绝对不觉得现在的大型语言模型能统治世界,也不打算说以后的模型能做啥不能做啥。我就想说说,现在的模型对我到底有没有用。
你可能会问,为啥还得写篇文章来证明语言模型有用呢?这不是明摆着的事吗?但其实,不管是在学术界、软件工程领域还是媒体行业,都有不少人说大型语言模型一点用没有,就是一阵风,过几年就没人提了,对世界一点影响没有。我不同意这些观点,因为现在的大型语言模型已经证明有用啦。
但同时,我也得说,还有另一帮声音特别大的人,他们觉得现在的模型能把所有程序员都代替了,大家都不用学编程了,因为很快都得失业。虽然反驳这些不是我这篇文章的主要目的,但我得说,我不支持这种特别极端的看法。
另外,我也不会说“只要目的好,用啥办法都行”,就算这些模型训练的时候有好多不好的影响,我也不觉得就该使劲用。
我知道这些模型可能有不好的后果,可能特别严重,像乱传错消息、乱用、监控人、抢人工作(甚至有人担心能让人灭绝)。我以后会写篇文章仔细说说大型语言模型可能带来的坏处,到时候会在这放个链接。不过,这跟语言模型有没有用是两码事——这才是我在这想说的。
我也知道你可能因为语言模型老出不准的信息、老重复知道的事、碰上复杂情况就完蛋这些毛病不想用它们——可能我比你更清楚这些缺点。但这篇文章不说这些。因为我觉得,就算有这些毛病,模型还是有用的。
而且,我也知道培训这些模型的伦理问题争议可大了。你可能不同意没经过允许就用人家的数据来训练(我可能比你更明白这里面的事)。也许你关心的是那些为了训练模型拿很少钱的人。我承认这些都是问题,但这篇文章也不说这些。
就像我一直说的:我在这说的,就是这些模型现在这个样子到底有没有用。
我的背景简介
一般来说,我不是那种别人说啥我都信的人。比如说,十年前信息安全界流行加密货币的时候,我从来没写过关于区块链的研究论文。我也从来没买过比特币,因为在我看来,除了能拿来赌钱和骗人,一点实际价值没有。我一直都怀疑,每次有人跟我说“有个新技术能改变世界”,我都不搭理。
所以,第一次有人跟我说人工智能能大大提高我的工作效率,还能改变我平常工作的办法,我也不信,我说:“等我看到真有用我才信。”
另外,我是个搞安全研究的。这差不多十年里,我一直忙着证明人工智能模型在碰到没训练过的情况的时候怎么就不行了。我证明了只要稍微改改机器学习模型的输入,它的输出就能全错;或者这些模型就是记住了训练数据里的一些例子,实际用的时候就重复。我很清楚这些系统的缺点。
但是,现在我在这说,我觉得现在的大型语言模型是互联网出来以后,对我工作效率提高最大的东西。说实话,要是今天让我在能用互联网和一个最先进的语言模型里选一个来解决工作里随便一个编程任务,我选语言模型的次数能超过一半。
怎么用语言模型
下面我就说说我怎么用大型语言模型来提高工作效率。
你可能对我举的例子不感兴趣,觉得太荒唐。也可能这些例子跟你的需要没关系,这我能理解。但我只能从我自己的角度说。这些例子都是我过去一年跟大型语言模型交流的记录里直接拿出来的。
1、给我开发完整的应用
去年,我弄了个测验,让人看看 GPT-4 在处理几个特定任务上怎么样。这个测验可火了,有超过一千万的页面浏览量。你可能想不到,我差不多让 GPT-4 给我写了这个应用的第一个版本。这是通过一连串的问题弄的,我先问应用的基本结构,然后一点点加功能。整个交流有 30000 个字,把当时的 GPT-4 模型的本事都快试到底了。你要是看看这些交流,能看到从我跟模型说需求让它写完整个东西,到我让它改具体的地方(比如说“别比平均分,用核密度估计说它在哪个百分位”),还有我复制粘贴错了的信息(比如说,“画图错了:numpy.linalg.LinAlgError: 奇异矩阵”),还有我就问个简单问题(比如“怎么在网页上用 JavaScript 加个 iframe,内容是从字符串加载的?”)。
这个办法能行,主要是因为语言模型擅长处理别人解决过的问题,这个测验 99%的内容就是些基础的 HTML 和 Python 后端服务器,谁都能写。这个测验让人喜欢不是因为技术多牛,是因为测验的内容。把重复的部分都自动化了,我就能轻松弄好这个项目。
其实,要是没有语言模型帮忙,我可能根本就不会弄这个测验,因为我不想花时间从头写整个网页应用。就算我会编程!我相信,就算是现在的模型,也能让大多数人光靠问问题就能解决以前解决不了的重要任务。
我还有些类似的例子以后说,像我让模型给我写整个应用,等这些应用发出来,我会明说有语言模型帮忙。
2、当新技术的向导
我以前总能跟上新框架的步子。但一个人的时间有限,因为我的工作,我大部分时间都在跟最新的研究进展,不是最新的 JavaScript 框架。
这就是说,我开始一个不是我研究领域的新项目的时候,一般有两个选择:一个是用我知道的技术,就算这些技术可能老了十年二十年,对小项目也够用;另一个是学新的(一般也更好)办法。这时候语言模型就有用啦。对我来说新的框架或者工具,像 Docker、Flexbox 或者 React,对别人可能很熟。世界上可能有成千上万的人很了解这些技术。现在的语言模型也能懂。这就是说,我能通过跟语言模型交流学习,学会解决任务需要的知识,不用靠那些假设读者啥都懂、目标特别明确的死板教程。
比如说,今年早些时候,我弄一个 LLM 评估框架的时候,想在一个限制的环境里运行 LLM 生成的代码,省得它把我电脑上随便的文件删了啥的。Docker 是干这个的好工具,可我以前没用过。
重要的是,这个项目的目的不是学会用 Docker,Docker 就是我达到目的的一个工具。我就需要学会 10%,保证能安全用就行。
要是在 90 年代,我可能得买本关于 Docker 的书,从头学,看前面几章,然后跳着看怎么弄我想要的功能。过去十年好点了,我可能会在网上找怎么用 Docker 的教程,跟着做,然后找遇到的错误信息,看有没有人跟我一样。
但现在,我只要让一个语言模型教我用 Docker 就行。
3、开始新项目
想起来,我最早学的编程语言是 Java。我特别喜欢编程,但有一件事我特别烦:面对新项目的空白屏幕。特别是用 Java 的时候!就算是让程序编译个“hello world”程序——这个“public static void main string args”到底是干啥的?括号放哪?哪些字母大写?为啥这用花括号,那用方括号?
所以我就像小孩一样——让我爸帮我弄。
二十年过去了,我还是不喜欢用不熟悉的框架开始新项目。光为了弄好开头的代码就得花好多时间,而且我都不知道自己在干啥。
比如说,我最近想试试写点 CUDA 代码,看看一个简单的贪心搜索在 GPU 上的性能跟别人在 CPU 上高效优化的比怎么样。
但我不会 CUDA 编程。我会写 C 语言,知道 GPU 咋工作、内核啥功能、内存咋布局啥的,但真要写往 GPU 发任务的代码?我不知道从哪开始。所以我直接让模型给我写 CUDA 程序的初稿。完美吗?肯定不是!但这是个开头。这就是我要的。你能看到这里面代码好多错!其实我完全能接受。我不是要完美的办法,就是要个开头,我能从这接着弄。要是以后的模型能做得更好,那就太棒了。但现在我有的已经帮了大忙了。
另一方面,我在家弄一些个人项目的时候,用了个树莓派 Pico W。这是我第一次用。我想让它给我干点事,特别是跟网络有关的。再说,我肯定能在网上找到有人说怎么弄我想弄的。但你最近看过网上的东西吗?前五个结果经常是些没用的垃圾,代码有问题,就为了搜索引擎优化改了改,但还是不行。
所以,我直接让一个语言模型教我怎么弄我想弄的。我以前弄过微控制器,所以大概知道它们咋工作。但我没用过 Pico W。我就需要点帮忙弄好所有依赖的东西,然后我能自己弄剩下的。
我给新的微控制器写的第一个“hello world”程序一般就是让一个 LED 灯闪。这能让我试试能不能编译上传代码到设备里,引脚设置对不对,基本上知道我在干啥。所以,我就直接让弄个闪的程序。(再说一遍:网上有这个吗?几乎肯定有。但那样我就得去找。)我有了这个代码能运行了,从这我就知道后面咋弄了。我知道 python 咋工作(信不信由你!)。所以,我能从这接着改东西,把特殊的 Micro Python 的东西弄好。
我碰到别的要专门处理的问题,我能再让模型帮我。比如说,我接着就让模型给我写个连 wifi 的脚本。
4、简化代码
我是个安全研究员,经常得处理别人的研究项目,里面好几千行代码,我得弄明白咋工作才能攻击。这听着不难,要是每个人都写清楚的代码,确实不难,但现实不是这样。研究人员一般没动力发清楚的代码。所以,经常发出来的都是乱乱的代码能凑合用就行。(我自己也这样。)
我不能给你举跟研究有关的例子,但我能给你说我正在弄的一个个人项目的例子。听说我对康威的生命游戏特别着迷。最近,我想找个快的办法,用 Python 评估一些生命游戏的模式。有个 C++的工具叫 golly 能做这个,但我不想把我的 Python 代码改成 C++的。
golly 有个命令行工具正好我能用——我要做的就是简化那个支持 50 种不同命令行选项的 C++代码,让它只做我想要的。所以我把 500 行的 C++代码给大型语言模型,让它给我个更短的文件做一样的事。
你知道吗?这可太管用了。然后,我让它给我个围绕 C++代码的 Python 封装器。也管用。这是那种让人头疼的任务,要是我自己弄,可能永远弄不完。但现在我能让别人帮我弄,我得到的东西比我原来的 Python 代码快 100 倍。
我发现我经常这么干。这还有个例子,我用 Python 也这么干。
再说一遍,这些任务不复杂。但每次这么干,我都能省好多时间。这就是我觉得大型语言模型现在厉害的原因之一:它们的用处可能不咋好看,也不会因为说“这是我用大型语言模型简化日常工作的普通办法”就被网上夸,但这是真的有用。
5、处理无聊的任务
我好多要做的任务都特别无聊,不用想太多,但又必须做。
其实,我发现我拖着不做任务,经常是因为我知道做这些会无聊会难受。大型语言模型大大减轻了这种难受,让我知道做任务的时候只要解决好玩的问题就行。所以,我一个一个给你说说我让大型语言模型帮忙解决的特别普通的问题。
比如说,最近我得把一个用 Python 3.9 写的程序拆开。大部分 Python 反编译器只支持到 Python 3.7,在我这个 3.9 的上用不了。
反编译其实不难,主要是弄对控制流程别出错。所以,我没自己花时间把几千个操作码和几百行代码弄好,让大型语言模型帮我弄了。它干得特别好!比我想的好多了。这有三个交流,我让模型帮我干了这个。另一个例子是,我要把一些没结构的数据弄成有结构的格式。比如说,我做一个项目,要列一些书名和作者名。我在网上找了些没结构的格式的数据,让大型语言模型帮我弄好格式。最近,我写一篇博客说怎么破解一个保护,想展示我改的代码的全部差别。所以我把差别和以前怎么把差别弄成 HTML 的例子贴上,让大型语言模型按以前的格式给我弄差别。另外,我工作的时候经常要给我用的资源弄引用。谷歌学术引用论文很容易,我能直接复制粘贴。但引用网页就有点麻烦;我最近开始让大型语言模型给我弄引用(确保这是正确的!)我可以继续举出至少一百个类似的例子。但我想你已经明白了我的意思。
我完全明白这种任务可能会让人觉得“就这?”但我们要记住,五年前这些模型几乎不能连贯地写出一个段落,更别说为你解决整个问题了。
6、让每个用户都变成“高级用户”
要是你看过不太会用某个工具的人用,可能会有点难受。他们可能花好几分钟甚至几小时去做一个本来用个宏或者同时用几个程序就能自动完成的任务。可是,学这些操作技巧要花时间,还很难。比如说,我最近想写个 Python 程序处理苹果 Lisa 键盘的输入。我在网上找到一个人用 C 语言写的相关代码,里面好多像#define KEYNAME key_code 这样的语句,我想把它们变成一个 Python 字典,把整数代码对应到字符串。我是个 Emacs 用户。我知道在 Emacs 里咋解决,这对我不难。这是我刚记下来的关键操作:C-h C-s #def [enter] M-f [delete] C-d M-f C-[space] M-f C-w C-a C-y : " M-f ", C-g C-] } C-[ { 虽说这对我很自然,可到现在,我在 Emacs 上花了大半辈子才这么熟练,熟练到这都成自然反应了。但你知道现在我把大型语言模型连到编辑器里,我会咋做不?C-h C-h 请把这些 #define 重写成{keycode: string,...}的字典格式。然后,文本就在我眼前重写好了!就是在这种情况下,我觉得大型语言模型对不是专家的人的潜在用处甚至比专家还大。这个模型给每个人都提高了起点,要是你以前完全不会,现在突然能做很多事。
7、当作 API 参考
真正的程序员想搞懂某个工具咋工作会去读参考手册。但我比较懒,我更想直接得到答案。所以现在我就问大型语言模型。我给别人展示这些例子的时候,有人会有点防备,说:“大型语言模型没做啥你用别的工具做不了的事!”你知道不?他们说得对。但是,用搜索引擎能做的事,用实体书讲这个主题的也能做;用实体书能做的事,读源代码也能做。不过,每一种都比前一种简单。事情越简单,你就做得越频繁,做法也不一样。这就是我问“哪个$命令可以传递所有剩余参数”然后得到答案的例子。(紧接着是另一个“我该咋用这个东西”的问题!)这其实是我用大型语言模型最常用的办法之一。我没法给你展示更多这样的例子,是因为我在 Emacs 和我的 shell 里都内置了问大型语言模型的工具。所以,我想做这些事 90%的时候,都不用离开我的编辑器。