1、人工智能模型是否被过度炒作?
我认为“人工智能”模型(即大型语言模型)并没有被过度炒作。
确实,任何新技术都会吸引一些投机取巧的人。而且,许多公司喜欢说他们在“使用人工智能”,就像他们以前声称他们是由“区块链”驱动的一样。(我们一次又一次地看到这种现象。)可能我们现在确实处在一个泡沫中。互联网在2000年泡沫破裂,但现在的互联网应用以前可是科幻小说里的东西。
我认为最近的进展不仅仅是炒作的原因是,过去一年里,我每周花至少几个小时与各种大型语言模型互动,并且一直对它们解决我给出的越来越难的任务的能力印象深刻。因此,我的研究项目和业余项目的代码编写速度至少提高了50%。
大多数我在网上看到讨论LLM(大型语言模型)实用性的人,要么极其乐观,声称所有工作将在三年内自动化,要么极其悲观,认为它们没有任何贡献,也永远不会有。
在这篇文章中,我只是想让讨论更加实际。
我不打算对未来做出任何预测。我只是想提供一个清单,列出我(一个研究机器学习的程序员和研究科学家)与不同大型语言模型进行的50次对话,这些对话显著提高了我的研究能力并帮助我完成了各种编程业余项目。其中包括:
使用我从未使用过的技术构建整个Web应用程序。
教我使用之前从未使用过的各种框架。
将数十个程序转换为C或Rust语言,以提高10-100倍的性能。
精简大型代码库,从而显著简化项目。
编写了我去年几乎所有研究论文的初始实验代码。
自动化了几乎所有单调的任务或一次性脚本。
几乎完全取代了为帮助我设置和配置新包或项目而进行的网页搜索。
大约50%地取代了为帮助我调试错误消息而进行的网页搜索。
如果我要将这些例子分为两大类,它们将是“帮助我学习”和“自动化无聊的任务”。
帮助我学习显然很重要,因为这意味着我现在可以做以前觉得有挑战性的事情;
但自动化无聊的任务对我来说同样重要,因为它让我可以专注于我最擅长的事情,并解决困难的问题。
最重要的是,这些例子是我实际使用LLM帮助我的真实方式。它们不是为了展示某种令人印象深刻的能力;它们源于我完成实际工作的需要。这意味着这些例子并不光鲜亮丽,但我每天做的很多工作也并不光鲜,而目前可用的LLM让我几乎可以自动化所有这些工作。
我在这篇文章中的希望是,通过一个接一个的例子,让你对过去一年里我如何具体使用LLM提高生产力感到疲倦。
请知道,当你感到疲倦时——你肯定会——你只看到了我使用LLM帮助我的不到2%的例子。
2、细微差别
如果说互联网有一件事做得不好,那就是处理细微差别。我不会声称今天的LLM(大型语言模型)会接管世界。
我不会谈论未来的模型可能或不可能做到的事情。我只会讨论今天的模型是否对我有帮助。
你可能会想——为什么有人会写整篇文章来证明语言模型是有用的?这不是显而易见的吗?!
但是,似乎有一大群人——在学术文献中,在软件工程领域,甚至在媒体圈——他们广泛宣称LLM毫无贡献,只是又一个炒作周期,几年后就会在对世界毫无影响的情况下消亡。
我将论证这些人是错误的,因为当前的LLM已经很有用了。
但我觉得有必要对我所说的话进行一些说明,因为还有另一群人(同样声音很大)声称相反的观点:今天的模型可以取代所有程序员,人们不应该学习编程,因为明年他们都会失业。我不会明确反驳这些人的观点(这不是这篇文章的重点),但我要明确的是,我并不是在为他们的观点辩护。
我也不会试图争辩“目的证明手段的正当性”,说我们应该训练这些模型,尽管它们有很多有害影响。
我完全理解这些模型会带来负面(可能非常负面)的后果。从虚假信息到滥用、监控再到工作替代。(或者,如果你相信某些人的话,人类灭绝??)
我会在某个时间点写一整篇关于我对LLM有害影响的看法的文章。
但这与语言模型是否有用的问题是分开的——正如我所说,这才是我想在这里讨论的。
我也理解你可能不想使用语言模型的原因是它们容易产生幻觉、复述事实、并且由于缺乏鲁棒性而惨遭失败——我可能比你更了解这些限制。
但这篇文章不会涉及这些问题。因为我认为,尽管有这些缺陷,模型仍然是有用的。
我还进一步理解,训练这些模型的伦理问题至多是可疑的。
也许你不喜欢它们在未经许可的情况下使用了人们的数据进行训练(我可能比你更了解这个问题)。
或者你在考虑那些为了明确训练这些模型而拿着微薄报酬的人。我同意这些都是问题。但这篇文章也不会涉及这些问题。
正如我多次强调的:我只会讨论模型是否有用。
3、关于我的一些背景
通常情况下,我不是一个容易相信事物的人。例如:尽管在十年前经历了安全社区中的加密货币热潮,但我完全避免写任何关于区块链的论文。
我从未拥有过比特币。它们基本上没有用途——除了赌博和欺诈。日复一日,我对所有的主张都持怀疑态度。每当有人告诉我“[新技术]将改变世界”时,我的普遍反应是冷漠。
因此,当我告诉你,当有人第一次告诉我这项人工智能技术将会非常有用并显著改变我处理日常工作的方式时,我的反应基本上是相同的:“眼见为实。”
更重要的是,我还是一名安全研究员。在过去将近十年的日常工作中,我一直在展示人工智能模型在面对任何它们未经过训练的环境时是如何惨败的。
我已经证明,稍微扰动机器学习模型的输入就能让它们产生极其错误的输出;或者,大多数机器学习模型会记住训练数据集中的特定示例,并在使用时重复它们。我完全理解这些系统的局限性。
然而,我在这里说的是,我认为当前的大型语言模型是自互联网问世以来,对我的生产力提升最大的一项技术。
老实说,如果今天你让我选择是使用互联网还是使用一个最先进的语言模型来解决我工作中的一个随机编程任务,我很可能会在超过一半的时间里选择语言模型。
4、我如何使用大语言模型?
以下是我如何使用大型语言模型(LLM)来帮助我的方式。
你可能不喜欢我的使用案例。你可能认为它们很愚蠢。
这些使用案例也可能与你有关的事情毫无关系。我接受这可能是真的。但我只能代表自己说话。这些案例都是我从过去一年与某个LLM的聊天记录中直接提取出来的。(铭毅备注:代码部分参见原文博客,数千行代码,不方便放到博文)
4.1 为我构建完整的应用程序
去年,我制作了一个测验,让人们测试他们预测GPT-4解决一系列任务能力的准确度。最终,这个测验非常受欢迎——它获得了超过一千万次的页面浏览量。你猜怎么着?
我几乎让GPT-4为我编写了这个应用程序的整个初始版本。
我通过一系列问题来实现这一目标,首先是询问应用程序的基本结构,然后逐步构建各种功能。
整个对话总共长达3万字,它确实考验了当时最先进的原始GPT-4模型的能力。
如果你仔细查看这段对话,你会看到各种例子,从我只用文字描述我想要的东西并要求模型提供完整实现的消息,到我要求进行特定更改的消息(“能不能不比较平均分数,而是用KDE说出百分位数?”),再到我复制并粘贴错误消息并提问的情况(例如,“绘图时:numpy.linalg.LinAlgError: singular matrix”),还有我只要求简单的一次性答案的情况(“如何用JavaScript添加一个内容从字符串加载的iframe到页面?”)。
一般来说,这之所以有效,是因为语言模型擅长解决人们之前解决过的问题,而这个测验的99%只是一些基本的HTML和一个Python后端服务器,世界上任何人都可以写出来。
这个测验有趣且受欢迎的原因并不是因为背后的技术,而是测验的内容。
因此,将所有无聊的部分自动化,使得我很容易就能完成这个测验。
事实上,我可以自信地说,如果没有语言模型的帮助,我可能根本不会制作这个测验——因为我不想花时间从头编写整个Web应用程序。
而且我还是一个懂得编程的人!我相信,即使是当前的模型,也足以让绝大多数人解决他们以前无法解决的有意义的任务,只需询问解决方案。
我还有一些类似的例子,其中我让模型为我编写整个应用程序,当它们上线时,我会尽量明确说明这些是借助语言模型完成的。
4.2 作为新技术的导师
曾几何时,我总是紧跟新框架的步伐。但是一个人的时间是有限的,由于工作的关系,我大部分时间都在跟踪最新的研究进展,而不是最新的JavaScript框架。
这意味着,当我要开始一个与我特定研究领域无关的新项目时,我通常有两种选择。
首先,我可以使用我已经知道的东西。这些通常已经过时了十年或二十年,但如果项目很小,通常也够用了。
或者,我可以尝试学习新的(通常更好的)做事方式。
这时语言模型就派上用场了。因为对于我来说大部分新框架/工具,比如Docker、Flexbox或者React,对其他人来说并不新鲜。
世界上可能有几十万到几百万人彻底了解这些东西。因此,当前的语言模型也同样了解这些。
这意味着我不需要阅读一些静态的入门教程,这些教程假设读者知道特定的事情并且想要实现特定的目标。
我可以与语言模型互动,学习我需要解决任务的任何知识。
例如,今年早些时候,我在构建一个LLM评估框架时,希望能够在一个受限环境中运行LLM生成的代码,这样它不会删除我电脑上的随机文件之类的。Docker是完成这项任务的完美工具,但我以前从未使用过它。
现在,重要的是,这个项目的目标不是使用Docker。Docker只是我为了实现目标需要的工具。我只想理解Docker的10%,以便能够自信地以最基本的方式安全使用它。
如果我在90年代做这件事,我基本上得买一本关于如何从基本原理使用Docker的书,读前几章,然后尝试跳跃阅读,找出我想要的内容。在这之后情况有所改善;
如果我在过去十年做这件事,我会在网上搜索一些描述如何使用Docker的教程,尝试跟着做,然后在网上搜索我遇到的错误信息,看看是否有人遇到同样的问题。
但今天,我只需要请语言模型教我Docker。所以这里是我这样做的过程。
一旦我设置并运行了Docker,我发现它在Linux上运行时存在一些权限问题。我希望这些问题能够消失,于是我就请模型帮我解决这个问题。通过这个过程,我了解了Podman,并请模型将所有特定于Docker的代码改写成Podman版本。
然后,当我想弄清楚如何在Docker容器中传递主机的GPU时,我也向模型寻求帮助。
4.3 开始新项目
当我年轻时,我的第一门编程语言是Java。(这可能是个错误。)我真的很喜欢编程,但我绝对讨厌面对新项目的空白屏幕。
尤其是Java!甚至只是让它编译一个“Hello World”程序——“public static void main string args”是干什么的?括号应该放在哪里?哪些字母需要大写?为什么这里用花括号而那里用方括号?
于是,我做了任何一个孩子都会做的事——我请我父亲帮我完成。
快进到二十年后,我仍然不喜欢使用不熟悉的框架开始新项目。仅仅是处理模板代码就需要花费很多时间,而且我对自己在做什么没有任何了解。
例如,最近我想尝试编写一些CUDA代码,以在GPU上基准测试一些简单贪婪搜索的性能,并将其与某人高效优化的CPU实现进行比较。
但我不知道如何编写CUDA程序。我会写C语言。我了解GPU的工作原理、内核的作用、内存布局等等。但实际编写代码将任务发送到GPU?
我不知道如何开始。所以我请模型给我写一个初稿的CUDA程序。它完美吗?绝对不!但这是一个开始。而这正是我想要的。
你会注意到这里的代码经常是错误的!其实我完全可以接受这一点。我并不寻求完美的解决方案。我需要的是一个起点,然后我可以从那里开始改进。
如果未来的模型能做得更好,那就太棒了。但即使是现在的模型,已经对我有很大的帮助了。
另外,完全不同于上面提到的项目,对于我在家里进行的一些个人项目,我使用了一块树莓派Pico W。这是我第一次使用它。我希望它能为我做一些事情,特别是一些网络方面的事情。现在,我确信我可以在网上找到一些好的教程,描述如何实现我想要的功能。
但是,你最近有没有看过互联网?前五个搜索结果通常只是一些垃圾内容农场,里面有2008年写的有bug的代码,只是为了SEO而更新,根本不起作用。
所以,我只是请一个语言模型教我如何做我想做的事。我以前使用过微控制器,所以大致了解它们的工作原理。但我从未使用过Pico W。我只需要一些帮助来处理所有的依赖项,然后我可以自己解决其余的问题。
我总是为新微控制器编写的第一个“Hello World”程序是让一个LED闪烁。这让我可以测试我是否能够编译并上传代码到设备,所有引脚是否设置正确,并基本了解我在做什么。所以我直接请求模型给我写一个闪烁程序。(再说一次:这在网上存在吗?几乎肯定存在。但是我还得去搜索它。)
一旦我把这段代码运行起来,从这里开始我就知道该怎么做了。我知道Python是如何工作的(信不信由你!)。所以我可以直接从那里继续编辑内容,已经把特别的Micro Python部分处理好了。
当我遇到另一个需要特别处理的问题时,我可以再次请求模型帮助我。比如在这里,我继续请求模型为我写一个连接到WiFi的脚本。
然后,当我再次遇到困难时,这次需要连接到一个MQTT服务器,我就请求模型帮我解决。我现在经常这样做。甚至这一节开头的例子也不是假设——这里是我询问如何使用Flexbox的方法,因为上次我学习新的HTML布局方式还是用div替代表格的时候。
4.4 简化代码
作为一名安全研究员,我经常遇到这样的情况:需要处理一个包含几千行代码的新仓库,这是别人的研究项目,我必须弄清楚它是如何工作的,然后才能进行攻击。
这听起来不难,如果每个人都写干净的代码,这真的不应该难,但现实并非如此。研究人员没有动力发布干净的代码。所以人们常常会发布他们手头能用的任何垃圾代码。(我也这样做。)
我没有可以在这里分享的研究相关例子,但我可以分享一个我正在进行的个人项目的例子。据说我对康威的生命游戏有一种不健康的痴迷。最近,我尝试找到一种从Python快速评估一些生命模式的方法。有一个很棒的C++工具叫golly可以做到这一点,但我不想把我的Python代码改写成C++。
现在golly有一个CLI工具可以实现我想要的功能——我只需要找到正确调用它的方法。第一步是处理支持大约50种不同命令行选项的C++代码,只让它执行我想要的一个功能。所以我把全部500行的C++代码丢给LLM,并请求一个简化版的文件,只做相同的事情。
你知道吗?它完美地完成了。然后我请求为C++代码编写一个Python包装器。结果也成功了。
这又是一个我觉得太麻烦以至于我自己可能永远不会去做的任务之一。但是因为现在我可以请求别人帮我完成,所以我得到了一个比原来的Python代码快100倍的东西。
我发现自己经常这样做。这里有另一个例子,我在做同样的任务,这次是用Python。
同样,这些任务都不难。但每次我这样做时,我都节省了大量时间。这是我认为现有LLM(大型语言模型)很棒的一个方面:这并不光鲜亮丽,也不会因为你说“这里有一个无聊的方式,我用LLM让我的生活更轻松”而得到很多网络赞誉,但这是现实。
4.4 处理单调的任务
有很多事情我必须做,但它们非常无聊,不需要任何思考,但却需要完成。
事实上,我发现自己拖延任务的主要原因之一是因为我知道完成它们会感觉很烦人和痛苦。LLM极大地减少了这种痛苦,让我更容易开始工作,因为我只需要解决有趣的问题。因此,我想介绍一些完全平凡的问题,这些问题我通过请求LLM帮我解决了。
例如,最近我不得不反汇编一些用Python 3.9编写的Python程序。大多数Python反汇编器只适用于Python 3.7及以前版本,但在我使用的3.9二进制文件上运行失败。
反汇编其实并不是很难的任务。主要是避免在你跟随goto重构控制流时出错。因此,我没有花时间手动为几百行代码的几千个操作码执行这项转换,而是请求LLM为我完成。
这效果非常好!比我预想的要好得多。这里有三次不同的对话,我让模型为我做了这件事。
另一个例子是,当我需要将一些非结构化数据转换为结构化格式时。例如,我在做一个项目时,需要获取带有作者姓名的书名列表。所以我在网上找到了某种非结构化格式的数据,并请求LLM为我格式化它。
或者,最近我在写一篇关于如何突破某些防御的博客文章,并且想展示我修改的完整代码差异。所以我粘贴了(1)代码差异和(2)一个之前如何将差异转换为HTML格式的示例,然后请LLM将这个差异按之前的格式输出。
再举一个例子,作为我工作的一部分,我经常需要生成我使用的资源的引用。Google Scholar让引用论文变得很容易,我只需复制粘贴正确的引用即可。但引用网页稍微有些麻烦;最近,我就直接请求LLM为我生成引用。(需要明确的是:我会检查这些引用是否正确!)我可能还能举出至少一百个类似的例子。但我想你已经明白我的意思了。
我完全理解这类任务可能有人会看了说“就这样??”。但让我们记住,五年前,LLM还几乎无法串连起一个连贯的段落,更不用说为你解决整个问题了。
4.5 使得每个用户成为“高级用户”
如果你曾经看过某人在使用某个工具时比你熟练度低得多,这可能会让人有些痛苦。你会看到他们在一个可以通过某种宏或巧妙地使用并行应用程序自动化的任务上花费数分钟甚至数小时。
但是,学习这些必要的“咒语”需要时间,而且很有挑战性。
例如,最近我试图编写一个Python程序来处理来自Apple 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中足够流畅,以至于这变得自然。但你知道现在我连接到编辑器上的LLM会让我输入什么吗?
C-h C-h rewrite these
#defines to a dictionary of {keycode: string, ...}
然后,文本会突然在我眼前被重写!
正是在这种情况下,我认为LLM的潜在实用性对于非专家甚至比专家更高。
模型提高了每个人的起点,如果你以前什么都做不了,现在突然你可以做很多事情。
4.6 作为API参考
真正的程序员想要了解一个工具的工作原理时,会阅读参考手册。
但我是一个懒惰的程序员,我只想要现成的答案。所以现在我直接问语言模型。
当我向一些人展示这些例子时,他们会有些防御地说:“LLM并没有做任何你不能用已有工具做到的事情!”你知道吗?他们是对的。
但是,用搜索引擎你能做到的事情,实际上你也可以用关于这个话题的书做到,而你用书能做到的事情,通过阅读源代码也能做到。
但每一步都比前一步更容易。而当某件事变得更容易时,你就会更频繁地去做,并且以不同的方式去做。
所以,这里是我问“什么$东西能给出所有剩余参数”并得到答案。(紧接着是另一个“我怎么使用这个东西”的问题!)
实际上,这是我最常用LLM的方法之一。我之所以不能给你提供更多这样的例子,仅仅是因为我在Emacs和Shell中内置了一个查询LLM的工具。
所以90%的情况下,当我想做这些事情时,甚至不需要离开我的编辑器。
4.7 搜索难以找到的内容
过去,在互联网上搜索内容是一项需要技巧的技能。查询中需要包含哪些特定词汇?应该是复数形式还是单数形式?过去式吗?哪些词汇你希望页面上不要出现?我需要的是X和Y,还是X或Y?
现在情况不同了。我记不起上次在谷歌中使用OR进行查询是什么时候了。也记不起上次使用减号(-)来排除部分结果是什么时候了。大多数情况下,现在你只需写下你想找到的内容,搜索引擎就会为你找到。
但是搜索引擎仍然不是100%的自然语言查询。它仍然有点像在玩反向危险游戏,试图使用答案中会出现的关键词而不是问题。我认为几乎所有人都忘记了我们学会这项技能的过程。
对于一些简单的任务(随着时间的推移越来越多),语言模型今天表现得更好。我可以直接输入“我知道+对应__add__,但~对应什么?”它会直接告诉我答案是__inv__。
这是用标准搜索引擎很难搜索到的东西。是的,我知道有一种方法可以找到答案。可能如果我输入“python documentation metaclass "add"”,然后在页面上搜索~,我就能找到答案。但你知道还有什么方法有效吗?直接向LLM提问。
这样做每次只能节省几秒钟,但当你正忙于解决某个编码任务,同时试图记住无数事情时,能够直接抛出你要解决的问题并得到连贯的答案是非常棒的。
这并不是说他们今天在这方面表现得完美。语言模型只知道那些在网上被反复提及的事情。“反复提及”到底意味着什么取决于模型,所以我确实需要花一些脑力思考是该问模型还是问互联网。但模型只会变得越来越好。
或者,每当我遇到随机崩溃时,我会把看到的内容输入模型并请求解释,比如在这里我输入zsh no matches found "Remote wildcard transfer issue"时的做法。
或者,作为一个完全不同的例子,去年我在写一篇博客文章时,想让第一个词的首字母变大,并让其余的文本围绕它排版,就像我刚刚在这个句子中所做的那样。现在,这种效果被称为首字下沉。但我当时并不知道这一点。我只知道我想要的效果,所以我问语言模型“我想让它看起来像一本华丽的书,文字围绕着O”,它给了我正是我想要的效果:
这项任务又属于“我只因为有LLM才做的”类别——我不会认为花费大量时间来弄清楚如何做到这一点是值得的。
但是,因为我可以直接问模型,我就问了,这让我的文章变得更好看了一些。
4.8 解决一次性任务
有两种程序。第一种是你希望做得好的程序;
这些程序会存在一段时间,并且代码的整洁性很重要,因为你需要维护它们好几年。
第二种是存在仅仅25秒的程序;它们帮助你完成某个任务,然后立即被丢弃。
在这些情况下,我完全不关心代码质量,程序是完全独立的,现在我几乎只用LLM来为我编写这些程序。
请注意:这些案例大多数是那种你看了会说“就这样?”的例子。但就像我之前说的,我每天只有这么多时间来处理一个特定项目。如果我能省下写一个再也不会用到的程序的时间和精力,我会选择这样做。
最常见的例子可能是帮助我生成可视化一些研究实验结果数据的图表。我有几十个这样的例子。可能更接近一百个,而不是零。它们看起来基本一样,所以这里只展示一个:
或者,另一个类似的例子是,当我有一种格式的数据并想将其转换为另一种格式的数据时。通常这是我只需要做一次的事情,一旦完成,我就会把生成的脚本扔掉。
但我可以给你举出成千上万这样的例子。很多时候,当我想编写一个足够简单的脚本时,我会直接请求LLM为我编写一个完整的脚本。例如,这里我请求LLM为我编写一个脚本,能把我的论文读给我听,以确保它们没有愚蠢的语法问题。
在很多情况下,当我不完全知道自己想要什么时,我会从请求模型提供一些初始代码开始,然后从那里进行迭代。例如,这是一个一次性任务,我只需要快速处理一些数据。在2022年,我会花两分钟用Python编写这个脚本,然后等上几个小时运行,因为它只运行一次——优化它所花的时间比Python程序运行的时间还要长。但现在呢?我当然会花同样的两分钟请求一个Rust代码来为我处理数据。
或者,这里是另一个例子,我请求模型为我下载一个数据集,并对其进行一些初步处理。对我来说容易吗?
是的,可能很容易。但这不是我想要思考的任务;我想要思考的是我将用这个数据集进行的研究。消除干扰非常有价值,远不止节省的几分钟时间。
还有一次,我在编写一个程序,以便能够用小方块3D打印一些像素化的图像。为此,我想将一个PNG文件转换为STL文件;但这不是项目的重点。这只是必须要完成的一件事。所以我请求LLM为我解决这个问题。
或者,另一个例子是,我最近想用Docker Compose来设置一个新项目。我遇到了问题,只是想尽快让它运行,然后再弄清楚出了什么问题。所以我采取了几次来回的方法,只是不断复制错误信息,直到最终得到了一个可行的解决方案。
在许多情况下,我还会从请求完整的解决方案开始,然后请求修改它的提示。在这段对话中,我首先请求一个解析HTML的程序,然后请求API参考或其他改进方法的提示。
还有一次,我想跟踪我的计算机在一段时间内的内存和CPU使用情况。我可以花几分钟时间找出适当的命令并将它们串联成一个脚本,完成我想要的功能……或者我可以直接请求语言模型为我完成。
最近我一直在尝试做一些电子方面的事情,我有一个在Arduino上运行的C程序,但我想让它在Raspberry Pi Pico上运行MicroPython。这个转换过程没有什么有趣的地方;它只是需要完成。所以我没有自己做,而是请求语言模型来做。
在另一个项目中,我需要使用一些高级机器学习模型在交互循环中对一些图像进行分类。我可以自己编写代码,或者我可以请求模型为我完成。
4.9 解释事物
我最近开始对电子学产生兴趣。年轻时我曾做过一些电子方面的事情,大学时也上过几门相关课程。但现在我想要实际做一些项目时,发现有成千上万的小问题让我难以顺利进行。
我可以去读一本关于实用电子学的书。我可能在某个时候会这样做,以便深入了解这个学科。但我并不想把时间花在感觉像在学习的事情上。我做电子学的一半原因只是为了从整天读写论文中解脱出来。
这就是LLM大显身手的地方。它们的知识不如世界上最顶尖的人,但有成千上万甚至数百万人知道我可能提出的任何电子问题的答案。
因此,这意味着语言模型也可能有答案。而且它很乐意把答案喂给我,这样我就可以在不纠结细节的情况下享受乐趣。尽管我可能可以再多花一点时间,通过搜索互联网得到答案,但在花了一天时间研究复杂的代码后,直接请求模型帮我解决问题的便利性简直太让人放松了。
这里有一些我向语言模型询问电子学基础问题的例子。这些答案是完美的吗?谁知道呢。但你知道它们比什么好吗?比我一无所知要好。
(这篇文章已经很长了,到现在你可能读得和我写得一样累。所以我就不加评论,直接给你这些例子。)
4.10 解决有已知解决方案的任务
几乎所有的事情之前都有人做过。你想做的几乎没有什么是真正新颖的。而语言模型在提供它们之前见过的事情的解决方案方面表现得非常出色。
最近一个项目中,我需要提高一些Python代码的性能。所以我(1)请LLM用C语言重写它,然后(2)请它构建一个接口,让我可以从Python调用C代码。
这些任务都不“难”。我相信将Python转换为C是我能在一两个小时内完成的事情。尽管我不知道Python->C API的具体工作方式,但我相信我可以通过阅读文档来弄清楚。如果必须自己动手,我永远不会做这件事。因为这不是重要路径上的事情,我宁愿等待让计算机来解决这个任务,而不是花时间去加快那些我不需要经常运行的东西。
但将Python转换为C(主要)是一个简单程序的技术过程,只有一个标准的Python->C调用约定。所以我就请LLM帮我完成。
从那以后,我基本上认为这是我能做到的事情,基本上每当我需要一些快速的代码时,我就会用Python描述我想要的东西,并请求优化的C代码。
4.11 修复常见错误、bug等
2022年之前,当我遇到某个流行工具或库的错误信息时,我会遵循以下步骤:
复制错误信息 -->粘贴到Google中-->点击顶部的StackOverflow链接 验证问题是否与我想问的一致;
如果不一致,回到第2步 将最上面的解决方案应用于任务如果不奏效,回到第2步,更改搜索词,祈祷等
因为说实话,通常出问题的工具离你最终要解决的任务有五个层级之远,你真的不关心它是如何工作的,只要它能正常工作就行。那么现在2024年是什么样的呢?
复制错误信息问LLM“如何修复这个错误?[错误]” 按照LLM建议的分步解决方案进行操作 如果不奏效,说“这不起作用”
现在,我没有任何对话记录来展示这些例子。(或者,我找了一个小时也没找到。)但这其实是有充分理由的:我已经将其直接集成到我的工作流程中了。
我是一个Emacs用户。我设置了环境,这样每当我运行一个程序并以非零状态码退出(意味着出现了错误)时,它会自动调用最新最快的LLM,请它解释答案,并并行请求一个可以直接应用的补丁来修复代码中的错误。
今天的模型在大多数情况下还不足以在这个任务上胜过我,但它们越来越接近了。而且偶尔我会得到一个惊喜,当LLM修复了一个我知道会很难找到的错误,因为我在某个地方打错了字。
4.12 处理成千上万的其他事情
我上面所有对话(铭毅:篇幅原因,咱们没有贴出,需要看英文博文。)仅占我在过去一年与LLM互动总数的不到2%。我没有链接其他对话的原因不是因为模型让我失望(尽管有很多这样的情况),而是因为(1)其中很多重复了我已经链接的模式,或者(2)它们不容易解释发生了什么,你也很难看出它们对我有什么用。
我完全预计未来我对这些模型的使用会继续增长。
作为参考,我在2024年通过Web界面进行了比2023年多30%的LLM查询——而我甚至无法统计API查询的增加量,但我猜测至少是2到3倍。
5、评估LLM能做什么,而不是它们不能做什么
我从评估求职者的面试中得到的最好的建议之一是根据他们能做什么来评估,而不是他们不能做什么。
我怀疑我可以问你一些简单的问题让你看起来很无能。一个极端的例子是:世界上有十亿人说普通话;我连数到十都不会。如果有人给我一份小学的普通话考试,我会惨不忍睹地失败。
即使在计算机科学领域,也有整个领域我一无所知。我对如何构建SQL的知识仅限于如何写一个有效的SELECT语句。这就是——字面上——我唯一会写的语句。
所以,当我看到有人在网上争论LLM只是炒作,因为“它们甚至不能[X]”时,我真的不理解。这里的[X]可能是:
统计一句话中的单词数!写一首每个单词都以字母“a”开头的诗 计算两位数的乘积 从列表中选择一个随机元素
因为你上次真正需要做这些事情并且真的认为LLM是正确工具是什么时候?
同样,我不会因为人类不能在头脑中除64位整数——对计算机来说完全琐碎的任务——就认为人类完全无用。
我也不认为因为你能构建一个LLM无法解决的任务就认为LLM无用。显然,这很容易——问题是你能否找到它们能提供价值的任务?
程序员已经很清楚某物可以用于不同的目的。想要写一个操作系统?也许你应该用C而不是Python。没有人会说“看Python多傻,你甚至不能强制一个变量对齐到32字节边界!”这只是抽象层次的问题。语言模型完全一样。
它们在非常高的抽象层次上工作;你不能期望它们解决连最简单的程序都能解决的任务。但你可以期望它们解决不同种类的任务。
6、结论
我写这篇文章有两个动机。
第一个是我在开头提到的:我想论证LLM已经为我提供了很多价值。
但还有:我看到很多人说“我喜欢使用LLM的想法,但不知道它们如何能帮助我”。
所以希望,如果你是那些人之一,你可以看到一些我如何使用它们的例子。
因为,对我来说,至少,LLM可以做很多事情。它们不能做所有事情。它们甚至不能做大多数事情。但现有的模型,提供了相当大的价值。
在展示这些例子后,我最常听到的反驳之一是“但这些任务很简单!任何计算机科学本科生都能学会做!”你知道吗?
没错。
一个本科生可以,通过几个小时的搜索,告诉我如何正确诊断那个CUDA错误以及哪些包可以重新安装。
一个本科生可以,通过几个小时的工作,重写那个用C编写的程序。
一个本科生可以,通过几小时的学习,研究相关教材并教我我想知道的任何东西。
不幸的是,我没有那个能放下所有事情来回答我所有问题的神奇本科生。但我有语言模型。
所以当然;语言模型还不足以解决我作为程序员工作中有趣的部分。而现有的模型只能解决简单的任务。
但五年前,LLM能做得最好的事情是写一个看似合理的英文段落。当它们能从一个句子到下一个句子形成连贯的想法时,我们感到惊讶。它们的实际用途为零。然而今天,它们已经提高了我在编程工作中的生产力至少50%,并消除了很多单调乏味的工作,使我建立了几个我从未尝试过的东西。
所以当人们说“LLM只是炒作”并且所有LLM对任何人没有实际价值时,对我来说显然他们是错的,因为它们对我有价值。
也许我是个例外。也许我是唯一一个找到使这些模型有用方法的人。
我只能代表自己说话。但鉴于LLM能显著提高我的生产力——一个在使用LLM前已经编程20年的人——我怀疑还有其他人也能从中受益。
而这只谈到了现有的模型。我们拭目以待接下来的五年会带来什么。
在下一篇文章中,我会对此做一些猜测。但我不知道是该感到兴奋还是害怕。
7、作者简介
Nicholas Carlini 是Google DeepMind的研究科学家(此前在Google Brain),专注于机器学习与计算机安全的交叉领域研究。
最近的工作从对抗角度研究神经网络的属性。
于2018年在加州大学伯克利分校获得博士学位,并于2013年在同校获得计算机科学和数学学士学位。
研究主要开发针对机器学习系统的攻击,以展示这些系统的安全和隐私风险。其工作曾获IEEE S&P、USENIX Security和ICML的最佳论文奖,并被《纽约时报》、《BBC》、《Nature》、《 Science 》、《连线》杂志和《大众科学》等媒体广泛报道。
在研究之外,作者喜欢编写各种创意代码,包括一个用单个printf调用编写的混淆井字棋游戏(赢得IOCCC 2020最佳表演奖)、一个用13k的WebGL + JavaScript编写的Doom克隆,以及一个基于康威生命游戏构建的完全功能的CPU。
https://github.com/carlini
https://nicholas.carlini.com/
8、铭毅说明
1、原文作者是谷歌 DeepMind (此前在Google Brain)高级研究员、加州大学伯克利分校博士 Nicholas Carlini
2、原文包含大量对话和代码,非常详尽!非常值得一读。
3、我们尽量对原文(不含代码和 LLM的会话部分)原汁原味的翻译。
4、中文全文 15000字左右,建议逐字逐句读完,并欢迎留言交流。
5、原文地址
https://nicholas.carlini.com/writing/2024/how-i-use-ai.html#intro
吴恩达 x Open AI ChatGPT ——如何写出好的提示词视频核心笔记
OpenAI 发布 ChatGPT 4o:更智能、更快速、更实惠的 AI 体验