DeepMind科学家万字分享:50个AI提效用例详解,工作中我是这么用AI的
文章作者是 DeepMind 的机器学习专家 Nicholas Carlini,不同于别人的介绍 AI 应用实例的文章,这次 Nicholas Carlini 详细讲解了自己在日常中如何使用 ChatGPT,比如写代码、优化代码、修复错误等,而且将完整的对话分享了出来。
在这些对话中,可以看到 Nicholas Carlini 的每一条具体的 prompt,以及最终如何生成可用的结果。
鉴于对话较长,很难用文档的形式呈现,我们在每个案例下附上了对话的链接,可以直接点击查看。
我不认为现在 AI 模型(LLM)的用处被过分夸大了。
诚然,任何新兴技术都会吸引投机取巧的人。很多公司都爱宣称自己「正在应用 AI 技术」,就像他们以前喜欢讲「基于区块链技术」一样。(我们已经多次见识过这种现象)我们可能正处在一个泡沫之中。互联网泡沫在 2000 年破裂,但现在我们所使用的许多 app,放在过去是科幻小说里才有的东西。
不过我认为,我们最近取得的技术进步并非仅仅是炒作。过去一年里,我每周都会花上一些时间和不同的大型语言模型互动,他们解决复杂问题的能力让我感到惊讶。
正因如此,我可以说,这些模型让我在编写研究项目和个人项目的代码时,效率至少提高了 50%。很多在网上讨论大型语言模型(LLM)效用的人,要么非常乐观,认为所有工作都会在三年内实现自动化;要么非常悲观,认为 LLM 至今一无是处,将来也不会有所作为。
在这篇文章里,我想尝试把讨论拉回到现实中,不对未来做出任何预测。我想要列举 50 个例子,展示一个程序员和机器学习领域的研究科学家,是如何通过与不同的大型语言模型进行对话,实质性地提升我的研究能力,并辅助我开展各种编程项目的。
这些例子包括:
使用我从未接触过的技术从头搭建整个 Web 应用。
教我如何使用各种框架,尽管我之前从未使用过它们。
将众多程序迁移到 C 语言或 Rust 语言,实现 10 到 100 倍的性能提升。
精简庞杂的代码库,大幅简化项目结构。
为过去一年里我撰写的每篇研究论文草拟初步的实验代码。
自动化处理几乎所有重复性任务或一次性脚本。
几乎完全取代了网络搜索,协助我搭建和配置新的软件包或项目。
在帮助我调试错误信息方面,代替几乎一半网络搜索的功能
我将这些例子归纳为两大类,一个是「助力我的学习」,另一个是「简化乏味的工作」。
助力学习的重要性不言而喻,它帮助我能够掌握过去难以应对的技能。简化乏味的工作同样关键,它节省了我的精力,让我能够集中注意力在最擅长的领域,攻克那些棘手的问题。最关键的是,这些例子都是我实际使用大型语言模型(LLMs)来帮助我的真实例子。
我做这些不是为了炫耀我的能力,而是因为我真的在完成实际的工作。这就意味着这些例子并不花哨,我每天做的大部分工作本身也不花哨,目前我在用的 LLMs 几乎帮我自动化了所有这些工作。
在这篇文章里,我的目标其实就是用一个又一个具体的例子让你目不暇接,向你展示我是如何在过去一年中利用 LLMs 显著提升我的工作效率的。不过要知道,我展示的还不到 LLMs 帮助我的案例的 2%。
文章内容相当长,可以根据题目寻找你好奇的部分,进行阅读。
原文链接:https://nicholas.carlini.com/writing/2024/how-i-use-ai.html
点击关注,发现更多 AI 创业者
00
讨论前提
如果非要说互联网哪里做得不好,我觉得是容易产生误解。我并不是打算宣称,当今大型语言模型 (LLM) 将会统治世界,我也不会去讨论未来模型可能或不可能实现的功能。我仅想探讨的是,现在的模型对我的实际帮助。
你可能会好奇——为什么有人会专门写一篇文章来证明语言模型的实用性?这不是明摆着的吗?但事实上,似乎有很多人——无论是在学术界、软件工程领域,还是媒体圈——都在广泛宣扬 LLMs 毫无建树,是一时的炒作,几年后便会消失,对世界毫无影响。我将通过具体的例子说明,这些人的看法是错误的,现有的 LLMs 已经显示出了它们的实用价值。
然而,我需要对观点限定一下,因为还有另一群人持有完全相反的观点:他们认为当前的模型能够取代所有程序员,人们无需再学习编程,因为明年他们就会失业。我不会在这里直接反驳这些人的观点,但我需要明确,我并不是在为这些人辩护。
此外,我不会去主张「目的正当化手段」,说我们应该不顾这些模型可能带来的负面影响去训练它们。我完全清楚这些模型可能带来的负面(甚至可能是极其负面)后果,像是散布虚假信息到,到监视人类、工作岗位的流失。)(甚至有人担忧人类的灭绝?)我将在不久的将来专门写一篇文章,来讨论 LLMs 可能带来的有害影响。但这与我们今天要讨论的 LLM 是否有用的议题是分开的——正如我所说,这才是我想要在这里探讨的。
我当然理解,你可能会因为语言模型容易产生幻觉、重复事实,在面对复杂情况时可能彻底失败的倾向而不愿使用它们——可能我对这些局限性的了解比你更深。这篇文章不会讨论这些。因为我认为,即便存在这些缺陷,模型仍然可以发挥其作用。
我当然也理解,训练这些模型的伦理问题是值得质疑的。也许你不喜欢它们在未经人们同意的情况下,使用人们的数据进行训练(我可能比你更理解这一点)。或者你可能在考虑那些为了直接训练这些模型而只得到微薄报酬的人。我认同,这些都是问题。但这篇文章也不会讨论这些。
正如我在前文多次强调的:我将只讨论,现有的模型是否具有实用性。
个人背景简介
通常,我不容易完全相信什么东西。比如,尽管十年前我亲身经历了网络安全领域内对加密技术的炒作和热潮,我从未写过关于区块链的论文,我也从未拥有过比特币。它们几乎没有什么用途——除了赌博和欺诈。一直以来,我是一个对所有主张持怀疑态度的人。每当有人告诉我「新技术将改变世界」,我的通常表现得很冷漠。
所以,当我第一次听说这个 AI 工具将会非常有用,并且会显著改变人们处理日常工作的方式时,我的反应基本上是一样的:「眼见为实。」
此外,我还是一名安全研究员。在过去的近十年里,我的日常工作就是展示 AI 模型在面对面对它们未经过训练的环境时,是如何彻底失败的。我已经证明,轻松地稍稍改变输入,就能让机器学习模型产生极其错误的输出;或者大多数机器学习模型是如何从它们的训练数据集中记忆特定的例子,并在人们使用时重复。我完全理解这些系统的局限性。
然而,即便如此,我还是要说,我认为自从互联网诞生以来,当前的大型语言模型为我的生产率带来了最大的提升。说实话,如果你今天让我选择解决一个随机的编程任务,要么通过互联网,要么通过一个最先进的语言模型,一半以上的情况下我都会选择语言模型。
下面的内容,是我如何利用大模型(LLMs)来助力我的工作。
你或许对我的应用案例不感兴趣,觉得它们有点傻,可能对你毫无帮助。我承认这确实有可能,但我只能写我自己的体验。这里每个案例都是真实的,是我从过去一年与大型语言模型的对话记录中直接提取的。
01
为我构建完整应用
去年我开发了一个测试,人们可以在网站上测试自己能多精准地预测 GPT-4 解决任务的能力。这个测验非常受欢迎,浏览量已经超过了一千万。
你猜我怎么做的?我几乎让 GPT-4 为我写了整个应用程序的初始版本。开发过程是通过一系列问题来实现的,从询问应用程序的基本结构开始,之后我逐步增加各种功能。整个对话长达 3 万字,这对 GPT-4 模型的能力是一个真正的考验。
完整对话:https://chatgpt.com/share/39e7db3d-acee-409a-9629-87a2a6a9db22
如果你翻看这次对话,你会看到我提出的所有 prompt。有时候,我仅仅用文字描述我的需求,请求模型提供完整的代码,有时我会提出具体的变更请求(比如,"Instead of saying how this compares to the average score can you say what percentile it is, using the KDE?"))。还有一些情况,我会粘贴完全未指定的错误消息,寻求 AI 帮助(e.g., "Plotting: numpy.linalg.LinAlgError: singular matrix")。我还会仅询问简单的一次性问题("How do I add an iframe to a page with javascript that has contents loaded from a string?"))。
通常,这种方法之所以行得通,是因为这些模型能够很好地处理人们已解决的问题,并且这个小测试的绝大部分只是一些基础的 HTML 代码,以及 Python 会作为网页服务器的后端支持,这是世界上任何有代码能力的人都可以完成的。
这个小测试之所以吸引人,并非它背后的技术让人感兴趣,而是它的内容。通过自动化处理那些乏味的程序,我非常轻松地制作出了这个小测试。
坦白地说,我确信,如果不能利用 LLM 的辅助,我可能不会开发这个测验——因为我本不愿意花时间从零开始编写整个网络应用程序。而且我还是懂得编程的人。我相信,即便是目前的模型,也足够让大多数人通过简单地请求解决方案,来完成他们以前无法完成的任务。
我手头还有几个类似的例子,我让模型帮我编写了整个应用程序,等到它们上线时,我会尝试明确这些应用程序是在 LLM 的辅助下开发的。
02
了解新技术的导师
作为新技术的引路人,我过去总是能够掌握最新的技术框架。
但人一天的时间有限,因为我的工作类型,我主要的精力都放在了跟进最新的研究进展上,而不是紧追 JavaScript 框架的更新。这意味着,当我开始一个与我的研究领域无关的新项目时,我有两个选择。一是使用我现有的知识,虽然这些知识可能已经有些过时,但对于一些小型项目来说,还是足够的。二是去学习那些新的、通常也更先进的技术方法。
这就是大模型大显身手的时候了。对我来说很新的 Docker、Flexbox 或 React 这些新框架或工具,对其他人来说可能已是耳熟能详。全球可能有成千上万的人对这些技术了如指掌。因此,现有大模型能够提供帮助。
这就意味着,我不必局限于那些预设了特定读者、特定知识背景和特定目标的静态教程,而是可以与大模型进行实时互动,学习可以帮助我解决特定任务的知识。
举个例子,今年年初搭建一个大模型 (LLM) 的评估框架时,我需要在受控环境中运行 LLM 生成的代码,以避免它误删我电脑上的文件。Docker 是完成这项任务的理想工具,尽管我之前从未接触过。
评估框架:https://nicholas.carlini.com/writing/2024/my-benchmark-for-large-language-models.html
重要的是,我的目标并不是学习如何使用 Docker,而是把它作为一个工具,目的是实现我需要的功能。我只需要掌握 Docker 的一小部分知识,足以让我确信我在以最基本的方式安全地使用它。
如果这发生在 90 年代,我可能需要购买一本关于 Docker 基础的书籍,从头学起,跳读章节来找到我需要的内容。在上一个十年,情况有所改善:我会在网上搜索一些关于 Docker 的教程,尝试跟着做,然后根据我遇到的错误信息上网搜索,看看是否有人遇到过相同的问题。
但现在,我只需要向语言模型求助,让它教我 Docker 的相关知识。
完整对话:https://chatgpt.com/share/40dcc017-9cc6-4a99-8eac-959a171fbb2f
当我成功配置并启动了 Docker 之后,我遇到了一些在 Linux 环境下运行时的权限问题。我希望能解决这些问题,于是我向语言模型寻求帮助。
完整对话:https://chatgpt.com/share/1e3940c1-70d9-4747-a0c3-f48106a5b9f6
通过这个过程,我首次接触了 Podman。随后,我请求语言模型帮我将所有针对 Docker 编写的代码转换为等效的 Podman 版本。
完整对话:https://chatgpt.com/share/91506eb7-9596-440e-a833-f4b823e52c0e
接着,我发现我要知道如何在 Docker 容器中传递宿主机的图形处理单元(GPU),我向语言模型提出了这个疑问。
完整对话:https://chatgpt.com/share/6537ce71-c89a-4d9b-ab3d-fc3582c1c559
03
开始新项目的助手
回想起来,我最初接触的编程语言是 Java。我非常喜欢编程,但面对一个新项目的空白屏幕时,我还是感到非常头疼。特别是使用 Java 编程的时候!哪怕是编写一个简单的「Hello World」程序,也会让我困惑——"public static void main string args"这一串代码是什么意思?括号应该怎么放?哪些字母需要大写?还有,为什么这里用花括号,那里又用方括号呢?
于是,我采取了任何一个孩子遇到难题时可能采取的行动——请我父亲帮我完成。
时光飞逝二十年,如果要使用那些我不太熟悉的框架开始新项目,我还是会感到头疼。仅仅摆弄那些模板代码,就要浪费大量时间,主要是我还对整个过程一头雾水。
举个例子,最近我打算尝试编写一些 CUDA 程序,测试一些简单的贪心搜索算法在 GPU 上的性能,并将其与别人已经高效优化过的 CPU 版本进行比较。
但是我不知道如何编写 CUDA 程序。我知道怎么写 C。我了解 GPU 的工作原理、内核的作用以及内存布局和一切。但实际上编写代码以将作业发送到 GPU?不知道如何开始。所以我只是让模型在我的 CUDA 程序中给我写第一遍。完美吗?不可能!但这只是一个开始。而这正是我想要的。
完整对话:https://chatgpt.com/share/1ead532d-3bd5-47c2-897c-2d77a3896427
你会看到,这里的代码有挺多错误,但对此我并不介意。我追求的并非完美无缺的解决方案,而是希望有个草稿,之后我可以自行深入。如果将来的模型能够更加出色,那自然再好不过。不过,目前大模型的能力已经极大地帮到了我。
或者,换个话题,谈谈我进行的其他个人项目。
我正在使用的是树莓派 Pico W,这是我首次接触它。我期望它能够为我完成一些任务,特别是处理一些网络功能。当然,我确信网上肯定有详尽的教程指导如何实现我的需求。但你有没有留意过现在的互联网?搜索结果的前五条往往是一些充斥着过时代码的低质量内容,这些代码自 2008 年以来就未曾真正更新,仅仅是为了搜索引擎优化而稍作调整,实际上仍然无法正常工作。
因此,我选择向一个语言模型求助,让它帮我达成我的目标。我之前有过使用微控制器的经验,所以对它们的工作原理还算了解。但 Pico W 对我来说还是头回用,我所需要的,仅仅是一些基础的引导,帮我搞定所有必要的依赖项,之后我就可以自行探索。
对于任何一款新的微控制器,我编写的第一个程序总是让 LED 灯闪烁。这个简单的程序可以帮助我验证代码能否成功编译并上传到了设备,确保所有引脚配置无误,从而让我对自己的操作有基本把握。所以,我们就直接来请求一个让 LED 闪烁的程序吧。(顺便一提:这种程序在网上几乎肯定能找到。但那样我还得费心去搜索。)
完整对话:https://chatgpt.com/share/4e6c74a0-1739-432d-880c-df12c0abf0a4
一旦这段代码开始正常工作,接下来的事情我就心中有数了。毕竟,我对 Python 的运作方式还是了如指掌的(不管你信不信!)。这样我就可以继续在原有基础上进行编辑,解决了 Micro Python 的问题。
当我再次遇到需要特别处理的问题时,我会直接请求模型协助。比如,接下来我就直接请求模型帮我写一个连接 Wi-Fi 的脚本。
完整对话:https://chatgpt.com/share/c9d024e1-c279-4409-bbda-d99efdcaec25
接下来,当我又一次陷入困境,这次是因为需要连接到 MQTT 服务器,我便再次向模型求助,以解决这个问题。
完整对话:https://chatgpt.com/share/4b9190d8-4a50-4eb5-bdde-ebf457e2cdd5
我现在已经养成了这样的习惯。比如,本节开头提到的例子是真实发生的——我在寻求如何利用 Flexbox 进行布局。毕竟我上一次学习 HTML 布局方式时,用的是 div 元素,而不是表格。
完整对话:https://chatgpt.com/share/e91b44f8-f2fd-45a9-af7e-1ffd95bfd073
04
简化代码
作为安全研究领域的一名专家,我经常遇到这样的场景:我要检查一个全新的代码库,其中可能包含了数千行由他人编写的研究项目代码。我的任务是理解这些代码的工作原理,以便我进一步分析并尝试发现潜在的安全漏洞。
理想情况下,如果所有代码都编写得井井有条,这项工作应该并不复杂。然而,现实世界并非如此,研究者们往往没有足够的动机去编写和发布整洁的代码。结果就是,人们可能会将任何能够运行的代码——无论其质量如何——公之于众。老实说,我自己在某些情况下也会这么做。
尽管我手头没有可以在此分享的研究案例,但我可以分享一个我正在做的个人项目的例子。有人曾说,我对康威的生命游戏有着难以自拔的迷恋。最近,我一直在寻找一种方法,能够从 Python 快速评估一些生命游戏的模式。有一个非常出色的 C++工具 Golly 能够做到这一点,但我并不想将我的 Python 代码转换为 C++。
康威:https://nicholas.carlini.com/writing/2022/multiplexing-circuits-game-of-life.html
Golly:https://golly.sourceforge.io/
Golly 提供了一个命令行界面工具,正好符合我的需求——我所需要的只是找到一种正确的方法来调用它。第一步是获取这个 C++代码,它原本支持大约 50 种不同的命令行选项,而我需要做的是让它只执行我想要的那一个功能。于是我将这 500 行 C++代码输入到 LLM 中,并请求生成一个能够实现相同功能的更简洁的版本。
完整对话:https://chatgpt.com/share/e2edc8ab-5d6f-4627-8283-d8b6e448cd54
结果出人意料地好,它完美地运行了。之后,我又请求了一个围绕这个 C++代码的 Python 封装器。同样,这也成功了。
还有一项任务,它繁琐到我可能永远不会亲自动手去做。但由于现在可以请别人代劳,我得到了一个速度比我原来的 Python 代码快上 100 倍的工具。
我发现自己越来越频繁地这样做。还有一个例子,用 Python 来执行这项完全相同的任务。
完整对话:https://chatgpt.com/share/1b44ae40-ce49-4751-812c-c7d5d38a3383
再次强调,这些任务本身并不复杂。但每次这样做,都能为我节省大量的时间。这正是我认为大语言模型(LLMs)当今令人惊叹的原因之一:它可能看起来并不起眼,也不会因为说「这是我使用 LLM 简化生活的平凡方式」而在网上获得大量赞誉,但它确实为我的生活带来了实质性的便利。
05
处理无聊的任务
有很多事情我不得不做,这些事情枯燥无味,不需要动脑筋,但却必须完成。
事实上,我发现自己之所以会拖延任务,往往是因为我知道完成这些任务会感到无聊和痛苦。LLMs 极大地减轻了这种痛苦,让我在开始任务时就知道自己只需要解决有趣的问题。因此,我想逐一介绍一些通过请求 LLMs 帮忙而解决的非常普通的问题。
比如最近,我需要对一个用 Python 3.9 编写的程序进行反编译。大多数 Python 反编译工具只支持 Python 3.7 及更早版本,而我用的那个 3.9 版本的二进制文件无法运行。
现在,反编译并不是一项特别困难的任务。它主要是一个避免犯错的练习,你需要跟随程序中的跳转指令来重建控制流程。因此,我没有花时间手动翻译几千条操作码,这些操作码对应数百行代码,而是让一个大型语言模型帮我完成了这项工作。它的表现非常出色,超出了我的预期。通过三次不同的对话,我得以让模型来为我做这件事。
完整对话:https://chatgpt.com/share/90c41b0a-f4ec-4afb-af78-12c70b91c378https://chatgpt.com/share/7ad7908c-f743-435d-aa38-1fbfd9ca6673https://chatgpt.com/share/ac7a971a-911c-4553-87b6-06f3049b8dae 另一个例子是,有时我需要获取一些非结构化数据,并将其格式化为结构化格式。举个例子,当我在做一个项目时,我需要整理出一个包含书名和作者名字的书单。我在网上找到了一些格式混乱的数据,于是请求大型语言模型帮我整理这些数据。结果,模型帮我很好地完成了这项工作,使数据变得井然有序。完整对话:https://chatgpt.com/share/2049edf7-b10d-4e4a-98d0-c4979f338048
再比如,我最近在撰写一篇博文,介绍我是如何攻破某个防御系统的,并且想要展示我所做的代码修改的全部差异。于是我提供了(1)代码差异的内容,以及(2)之前将代码差异格式化为 HTML 格式的示例,最后请求大型语言模型按照之前的方式帮我将这个差异也转换成相应的 HTML 格式。
完整对话:https://chatgpt.com/share/7640ae1d-c03d-4075-b622-a91782718896
再比如,在我的工作过程中,我常常需要为引用的资源创建引用。对于学术论文,Google Scholar 让这件事变得很容易,我只需简单地复制并粘贴现成的引用格式。然而,对于网页引用,这个过程就稍显麻烦;最近,我开始尝试让大型语言模型帮我自动生成引用。(需要强调的是,我会亲自核实这些引用的准确性!)
完整对话:https://chatgpt.com/share/b11270e4-bd5a-4501-b20d-1951bb44e737
我可以继续举出至少一百个类似的例子。但我想你已经明白了我的意思。
我完全明白这种任务可能会让人觉得「就这?」但我们要记住,五年前这些模型几乎不能连贯地写出一个段落,更别说为你解决整个问题了。
06
让每一个人都成为「超级用户」
如果你曾目睹某人使用工具的熟练程度远不如你,那可能会有些令人难受。你会看到他们花费数分钟,有时甚至几小时来完成一项任务,而这项任务明明可以通过某种巨集来自动化,或巧妙地并行运行应用程序来自动化的任务。
然而,掌握实现自动化的技巧需要时间,并且颇具挑战性。
例如,我最近试图编写一个 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, ...}
然后,文本就在我眼前被重写了!
在这种情形下,我认为大语言模型的潜在效用对非专业人士来说,甚至可能比专业人士更高。模型为所有人提供了一个基础水平的提升,如果你之前一无所知,突然之间你就能够做很多事情了。
07
作为 API 参考
那些真正的程序员们,当他们想要了解一个工具的工作原理时,会去翻阅官方的参考手册。但是我是一名懒惰的程序员,更希望答案能直接送到我面前。所以,我开始求助于语言模型。
当我向一些人展示这些例子时,他们可能会有些抵触,反驳说:「大语言模型并没有做出任何你用现有工具做不到的事情!」你猜怎么着?他们说的没错。但同样,使用搜索引擎能做到的事情,读一本实体书也能做到,而读书能做到的事情,通过阅读源代码也能做到。
然而,每一样工具的使用,都比前一种更简便。当某件事变得更加容易时,你不仅会更频繁地去做,而且还会以更多样化的方式去应用。
所以,当我询问「哪个$命令能够接收所有剩余的参数」并得到答案时,就是这样的例子。(紧接着,我可能又会立刻提出另一个「这个东西怎么用」的问题!)
完整对话:https://chatgpt.com/share/08f4fcbc-06fa-4bed-b884-5b971fb88030
比如,当我需要在 LaTeX 文档中将文字设为红色时,我不再翻阅文档或上网搜索,而是直接向语言模型提问。
完整对话:https://chatgpt.com/share/7f606e88-e9d8-43b8-956f-5b094afba3b4
当我需要了解如何在 LLDB 中使用与 GDB 命令功能相似的命令时,我采取相同的方法。
完整对话:https://chatgpt.com/share/dbc73612-961b-4feb-853f-90ad5b82e069
或者当我想知道一些查找命令是如何工作的。
完整对话:https://chatgpt.com/share/5dbdd5a9-63e7-487b-a9f4-67a63996bc2b
或者如何使用 lpr。以及如何重新绑定一些 latex 命令。
完整对话:
https://chatgpt.com/share/9d14cbbf-6337-4913-ae24-f308baf49048
https://chatgpt.com/share/5f89c11d-936a-478e-8969-050fcfea32de
这实际上成了我使用大语言模型最频繁的场景之一。我之所以不能给你展示更多这样的例子,是因为我在 emacs 编辑器和我的 shell 中都内置了一个可以查询大语言模型的工具。因此,约 90% 的情况下,当我需要进行这类查询时,我根本无需离开我的编辑环境。
08
搜索难以找到的信息
过去,在网上搜索内容是一项需要技巧的活。你需要精心挑选哪些词汇加入到你的搜索请求中?是使用复数形式还是单数?是使用过去时态吗?您希望避免哪些字词出现在页面上?你是想搜索包含 X 和 Y 的结果,还是 X 或 Y 中的任一个?
这种情况已经不复存在。我记不得上一次使用 OR 在 Google 中搜索是什么时候了。同样,我也忘记了上一次使用减号 (-) 来排除某些搜索结果是什么时候。现在,大多数情况下,你只需简单地输入你想要找的内容,搜索引擎就会帮你找到。
然而,搜索引擎还没有完全达到自然语言查询的水平。它仍然有点像在玩一个反向的「危险问答」游戏,你需要试图根据答案,来倒推关键词,而不是基于问题。我认为,这种技巧几乎是我们所有人都已经遗忘了的。
对于今天的一些简单任务(而且随着时间的推移,越来越多的任务将会如此),语言模型表现得更好。我只需输入「所以我知道+对应于__add__,但是~是什么」,它就会直接告诉我答案是__inv__。
完整对话:https://chatgpt.com/share/e05b6d20-c02c-4fbd-bef2-53d43c0ffb21
这通常是用传统搜索引擎难以找到的内容。的确,我知道如何提问以便找到答案。如果我输入「python documentation metaclass "__add__"」,可能就能在页面上搜索到~并得到答案。但你知道吗?直接向大语言模型提问同样有效。
每次这样做可能只节省了几秒钟,但当你正忙于解决编码任务,同时试图在脑海中记住无数事项时,能够将你正在解决的问题一股脑儿地倒出来,并得到一个清晰的答案,这真的非常神奇。
这并不是说大语言模型在这方面已经无可挑剔。它们只有在某个信息在网上被频繁重复后才会知道。而「频繁」的标准则取决于具体的模型,所以确实需要花点心思去考虑,我是应该向模型提问,还是应该求助于互联网。但可以肯定的是,这些模型会不断进步。
或者,当我遇到随机崩溃的问题时,我会把看到的所有信息都告诉模型,并请求解释,就像我现在所做的,当我仅仅输入 zsh 没有找到匹配项 "远程通配符传输问题"。
完整对话:https://chatgpt.com/share/b5924669-b53a-4723-b9e1-56845974a256
或者,举一个完全不同的例子,去年我在撰写一篇博文时,我希望文章中第一个单词的首字母大写,其他文字环绕它排列,就像我刚才在这个句子中展示的那样。这种效果被称为「首字下沉」,但我之前并不了解这个术语。我只知道我想要的视觉效果,于是我向语言模型描述说:「我想要它看起来像一本精美的书籍,文字环绕着'O'排列」,然后它就给了我确切的答案:
完整对话:https://chatgpt.com/share/4706f9f1-fbfe-475f-b29d-b80cc6c92d65
这个任务也是属于「我之所以会去做,全因为有了大语言模型」的类型——我原本不会花大量时间去琢磨如何实现这个效果,这不划算。但正因为我可以直接向模型提问,我就这么办了,这也让我的文章更加好看。
09
解决一次性任务
程序可以分为两类。一类是你想要精心编写的程序,它们将会长期存在,这些代码的整洁性至关重要,因为你需要在未来几年内维护它们。
另一类程序可能只运行 25 秒;它们帮你完成某个任务,任务完成后就会被立即丢弃。在这些情况下,我根本不关心代码的质量,而且程序是完全独立的,我现在几乎只用来 LLMs 为我编写它们。
请注意:大多数这些情况再次出现,你会看着它们说「就这?」。但就像我之前说的,我每天只有那么多小时来处理一个项目。如果我能节省编写一次性使用的程序的时间和精力,我会选择这样做。
最典型的情况可能就是帮助我生成图表,可视化我某些研究实验生成的数据。我手头有几十甚至上百个这样的例子。它们看起来基本上都是一样的,所以这里只展示一个:
完整对话:https://chatgpt.com/share/17e9d433-aeba-4535-a67c-4c14147bb374
再举一个类似的例子,就是当我手头有某种格式的数据,需要将其转换成另一种格式时。这通常是一项一次性的工作,一旦转换完成,相应的脚本就会被我丢弃。
完整对话:https://chatgpt.com/share/bc99c46b-d1a8-48ea-8d46-411182f415d6
我可以举出无数类似的例子。很多时候,当我需要编写一个简单的脚本时,我会选择让大语言模型来代劳。比如,我请求大语言模型为我编写一个脚本,它能够大声朗读我的论文,以便我可以检查是否有低级的语法错误。
完整对话:https://chatgpt.com/share/d52a9754-dd68-4151-ae5b-0107ee9dc400
在很多情况下,如果我不太确定自己想要什么,我会先向语言模型请求一些基础代码,然后在此基础上进行迭代改进。
例如一个临时任务,我需要迅速处理一些数据。如果回到 2022 年,我可能会花上两分钟用 Python 写个程序,然后让它运行几个小时,因为这种程序只运行一次——优化它所花费的时间可能比程序本身运行的时间还要长。但现在,我当然会选择花同样的两分钟时间,请求一段 Rust 代码帮我完成这个任务。
完整对话:https://chatgpt.com/share/7b1772f6-e298-4caa-90e9-f4c3c70438d1
再举一个例子,我请求大语言模型帮我下载一个数据集,并对其进行初步处理。对我来说,这容易做到吗?可能吧。但这并不是我想要投入精力去考虑的任务;我更愿意将注意力集中在我将要对数据集进行的研究。去除这些干扰的价值,远远超过了它为我节省的那几分钟时间。
完整对话:https://chatgpt.com/share/7114d352-03fc-419c-b97d-e22b044fa4eb
还有一次,我编写了一个程序,目的是用小立方体进行 3D 打印像素画图像。在这个过程中,我需要将 PNG 图像转换成 STL 文件,但这并非项目的核心,这只是一个在实现目标过程中必须完成的步骤。因此,我请求大语言模型帮我解决这个问题。
完整对话:https://chatgpt.com/share/7e9bdcab-dba8-4b68-8742-877be9f1cc7e
再比如,最近我在尝试使用 Docker Compose 来配置一个新项目。过程中遇到了一些难题,我当时只想尽快让它运行起来,至于问题所在,打算之后再细究。于是我采取了一种直接的方法:反复复制粘贴错误信息,直到最终得到了一个能够运行的解决方案。
完整对话:https://chatgpt.com/share/a58a95c5-b6c5-4e05-8b8f-29ee7d7a9755
我经常在很多情况下,一开始就要求得到一个完整的解决方案,然后寻求如何对其进行修改的提示。比如在这次对话中,我一开始请求一个解析 HTML 的程序,随后又询问有关 API 引用或其他可能的改进方法的提示。
完整对话:https://chatgpt.com/share/211a98cc-225b-46c1-8602-ca7ac1b4945b
或者,还有一次,我想跟踪我的计算机在一段时间内使用了多少内存和 CPU。我本可以花几分钟时间找出适当的命令,并将它们组合成一个脚本来完成这项工作... 但我选择了更简单的方法,直接向语言模型求助来完成这项任务。
完整对话:https://chatgpt.com/share/8fb393e3-17dc-411b-8980-7baa89811093
最近我开始涉足一些电子领域的工作,我有一个用 C 语言编写的程序,原本是为 Arduino 设计的,但我需要将其移植到树莓派 Pico 上,并使用 MicroPython 来运行。这个转换过程本身并没有太多技术含量,它只是一项必须完成的任务。因此,我没有亲自动手,而是选择让语言模型来代劳。
完整对话:https://chatgpt.com/share/6960ac4b-51e6-491e-934d-f048a9df69df
在另一个项目中,我需要利用一些先进的机器学习模型,在一个交互式循环中对图像进行分类。我有能力自己编写这样的程序,但我选择直接请求模型来帮我完成这项工作。
完整对话:https://chatgpt.com/share/dc8e2ac6-a918-44ab-b967-284373acb624
10
入门科普专家
我最近开始对电子学产生了兴趣。我年轻的时候做过一些电子项目,并在大学期间上过几门相关课程。但现在我想进行实际的电子项目,我发现有许多我不了解的细节,这让开始任何项目都变得困难。
我本可以找一本实用电子学的书籍来研读,也许将来我会这么做,以便更深入地理解这个领域。但我不想把时间花在感觉像学习的事情上。我之所以投身电子制作,部分原因是为了从日常的阅读和撰写论文中暂时抽离。
这就是大语言模型发挥作用的地方。它们可能不具备世界上最顶尖专家的知识,但有成千上万,甚至数百万人知道任何我可能遇到的电子问题的答案。因此,语言模型很可能也包含了这些答案。它们乐于直接向我提供所需的答案,让我能够在不纠结于细节的情况下享受乐趣。尽管我可能通过互联网搜索也能获得答案,但在处理了一天复杂的研究代码之后,能够轻松地向模型提问,这种便利性实在令人感到放松。
以下是我向语言模型提出的一些关于电子学基础的问题。这些答案是否完美?不得而知。但你知道他比什么强吗?比我一无所知要强得多。
(这篇文章已经相当冗长,到了这里,你可能和我一样,对阅读它感到疲惫。因此,我将不再对这些例子进行评论。)
我询问的一些基本 PCB 设计问题的例子:
完整对话:https://chatgpt.com/share/cc940032-77e0-4127-9074-b8ddc0147b40
我提出的一些基本的焊接问题:
完整对话:https://chatgpt.com/share/020723cf-610a-4f80-9b47-c74790a4df0d
我提出的一些基本的电容器问题。
完整对话:https://chatgpt.com/share/dca63ae7-0580-4090-959b-e2278115bc0e
我提出的一些基本的 LED 问题
完整对话:https://chatgpt.com/share/5caf55c6-1048-4904-b941-446b6e3e59c2
我还咨询了有关软盘的基础知识的问题。
完整对话:https://chatgpt.com/share/dcf4c9ae-af16-4b95-adf2-628b9e5dbb53
我可以继续举例,但我相信你应该已经理解了我的意思。
11
更快解决有已知解决方案的任务
几乎所有的事情,都曾有人做过,你想做的所有事情几乎都不是新的。而语言模型擅长的就是提供它们已经见过的解决方案。
在最近的一个项目中,我需要提升一些 Python 代码的性能。于是我(1)请求大语言模型用 C 语言重写它,然后(2)请求它构建一个接口,使我能够从 Python 调用 C 代码。
这些任务都不算「难」。将 Python 代码转换为 C 语言,我相信我可以在一两小时内完成。尽管我不太了解 Python 到 C 的 API 是如何工作的,但我确信通过阅读文档我能弄清楚。
但如果必须自己来做,我可能永远不会开始这个任务。这并不是我重视的事情,我宁愿等待计算机来解决这个任务,而不是花时间让它更快地运行那些我并不需要频繁执行的事情。
但是,将 Python 转换为 C 主要是一个技术流程,对于简单的程序来说,存在一个标准的 Python 到 C 的调用约定。所以我直接请求大语言模型帮我完成这项工作。
自那以后,我预期这将是我能够做到的事情,基本上每当我想要一些快速的代码时,我都会描述我想要的 Python 并请求优化 C。
完整对话:https://chatgpt.com/share/aee2ea95-82ce-4647-b245-8db8f9512b49
在其他情况下,我也会采取相同的方法,但如果我觉得相比 C 语言的输出,更容易验证 Rust 语言输出的正确性,我就会请求得到 Rust 代码而非 C 代码。
完整对话:https://chatgpt.com/share/7cd3e302-b525-4d41-ad76-492bee7393ff
再比如,并行化 Python 函数本身不是难事,可以通过 multiprocessing 库来实现。困难的地方是编写一些模板化的代码,之后它就自动完成了。但编写这些代码本身有些繁琐,会分散你对实际工作的专注。现在,每当我需要进行并行化操作时,我就直接让大语言模型来代劳。
完整对话:https://chatgpt.com/share/5d228e09-fc98-4977-8829-f532ff0bc903
有时在尝试测试一些 API 时,我会先写一个 curl 请求,然后开始运作。一旦 curl 请求工作正常,并且我需要以编程方式重复执行这个任务,我就会将其转换为 Python 代码。过去,我可能会采用一些不太优雅的方法,比如使用 os.popen() 来执行 curl 命令,但这种方法并不理想。更好的做法是将其转换为使用 Python 的 requests 库,但这会花费一些时间,所以我之前不会这么做。但现在,我可以直接请求大语言模型来帮我完成这项工作,用更短的时间获得一个更加整洁的程序。
完整对话:https://chatgpt.com/share/0627f7e3-8f0e-431e-b245-a93d9d8ecce4
对于我即将在这里分享的一个新项目,我需要了解人们通常使用哪些设备作为简单的无线电发射器。因为我所寻求的是一个普通人可能会给出的答案,所以大语言模型是理想的选择!
完整对话:https://chatgpt.com/share/302541d0-dd99-4bd6-a8ed-9c43372f546e
12
修复常见错误
在 2022 年之前,遇到流行工具或库的错误消息时,我会遵循以下步骤:
复制错误信息
粘贴到 Google 搜索
点击排名靠前的 Stack Overflow 链接
核实问题是否与我遇到的情况相符;如果不是,返回第 2 步
应用推荐的最佳解决方案
如果无效,返回第 2 步,尝试不同的搜索词,祈祷,等等
因为老实说,通常出问题的工具与你最终要解决的任务关系不大,你并不真正关心如何让它正常工作,只希望它能正常工作。那么在 2024 年,这一过程变为了:
复制错误信息
向 LLM 询问「我该如何解决这个错误?」
按照大语言模型提供的方案,逐步解决问题
如果它不起作用,请对 LLM 说「不起作用」
我没有展示这一过程的记录(或者说,我找了一个小时也没找到)。但实际上有一个好理由:我已经将它集成到了我的工作流程中。
作为 emacs 用户,我设置了我的环境,每当我运行的程序以非零状态码退出时(意味着出现问题),它就会自动调用当前最快的大语言模型,并要求它解释答案,同时请求一个可以直接应用的修复代码的补丁。
尽管目前的模型在大多数情况下还不足以超越我,但它们正在接近。看到大语言模型修复了个很难追踪的 bug 时,我会感到非常惊喜——这 bug 是因为不知道哪儿的代码中有一个拼写错误。
13
以及其他数不清的事
我上面提供的对话链接,仅代表了我去年与大型语言模型(LLMs)互动总数的一小部分,还不到 2%。我没有链接到其他对话的原因不是因为模型让我失望(尽管有很多这样的案例),而是因为(1)它们中的很多都与我已经提供的链接内容重复,或者(2)它们不容易解释,你也可能无法直观地理解它们为何对我有所帮助。
我预期,未来我使用这些模型的频率将会持续增长。作为参考,我在 2024 年通过网页界面发起的 LLM 查询比 2023 年增加了 30%---至于通过 API 的查询增长,我无法给出确切数字,但我猜测至少增加了 2 到 3 倍。
14
评估 LLMs 的能力,
而不是局限
在面试求职者时,我得到的最好建议是,根据候选人的能力和潜力来评价他们,而不是他们所不擅长的。
我相信,如果我提出一些简单的问题,可能会让你觉得自己不够称职。以一个极端的例子来说:世界上有十亿人说普通话,而我连数到十都不会。如果有人让我参加普通话的小学考试,我肯定会考得一塌糊涂。
即便在计算机科学的领域内,也有很多我完全不了解的领域。我对 SQL 的了解仅限于写出一个有效的 SELECT 语句。这真的是我唯一会写的句子。
因此,我不太理解为什么有人会在网上争论说大语言模型只是炒作,因为「它们甚至不能 XXX」。这里的 XXX 可能是:
... 计算一个句子中的单词数量!
... 写一首诗,每句话的首字母都是「a」!
... 做两位数的乘法!
... 从列表中随机选择一个元素!
你上次真正需要做这些事情,并且真心认为大语言模型是合适的工具是什么时候?
同样,我不会因为人类不能在脑海中进行 64 位整数的除法——这对计算机来说是一项非常简单的任务——而认为人类毫无用处。我认为,因为你可以构造出一个它们不能解决的任务就否定大语言模型是没有意义的。显然这是容易的——真正的问题是,你能否找到它们提供价值的任务?
程序员已经很清楚,某些事物对不同的目的可能有用。想要编写操作系统?也许你应该使用 C 而不是 Python。没有人会说「看看 Python 有多傻,它甚至不能强制变量与 32 字节边界对齐!」这是因为 Python 不适用于这种抽象层次的问题。语言模型也是一样。它们在非常高的抽象层次上运行;你不能期望它们解决即使是最简单的程序也能解决的任务。但你可以期待它们解决不同类型的任务。
15
结论
撰写本文,我有两个目的。
首先,就像我在文章开头讲的,我想说,大语言模型(LLMs)已经为我提供了极大的帮助。
其次,我经常看到有人再说,他们对 LLMs 感兴趣,但不知道它们能如何帮到自己。希望这篇文章能让你看到我是如何利用 LLMs 的。至少对我而言,LLMs 功能强大。它们不是万能的,甚至做不到大多数事情。但现有的模型,已经为我提供了巨大的价值。
当我展示这些例子时,最常见的反对意见是:「这些任务很简单!任何计算机科学专业的本科生都能学会!」确实如此。一个本科生,只需几小时的搜索,就能告诉我如何正确诊断 CUDA 错误,哪些包可以重新安装。只需几小时的努力,他们就能将程序用 C 语言重写。只需几小时的学习,他们就能掌握相关知识,解答我关于该主题的任何疑问。
遗憾的是,我没有这样一个随时待命、有求必应的本科生。但我拥有大模型。当然,大模型尚未发展到能解决我程序员工作中有趣的那些难题,目前的模型只能处理简单任务。
回想五年前,LLMs 最大的成就就是写出一段听起来像英语的段落,它们能将一句话连贯地连接到下一句,我们就已然感到惊讶,它们几乎没有实际用途。然而今天,它们已经至少提高了我 50% 的编程工作效率,让我从繁琐的工作中解脱出来,构建了以前我从未尝试过的东西。
所以当有人说「LLMs 只是炒作」,或者说「LLMs 没有给任何人带来任何实际价值」时,我很清楚他们错了,因为 LLMs 为我带来了价值。也许我是特例,也许我是唯一找到让这些模型发挥作用的人。但我只能代表我自己发言。考虑到 LLMs 显著提升了我的效率——一个在使用 LLMs 之前已有 20 年编程经验的人——我想大概率还有其他人也能从中受益。
目前我们讨论的还只是现有的模型。未来五年会如何发展,尚未可知,在下一篇文章中,我将对此进行一些预测。但我不知道自己是应该因此感到兴奋还是忧虑。
更多阅读
在这段被下架的视频里,谷歌前CEO说了很多真话外网玩疯了,NSFW、毫无底线,FLUX 成为图片生成新王者
资源多到什么程度,才能创业追 OpenAI?
2000万用户,Gamma创始人:PPT是痛点,但产品好才能解决痛点
转载原创文章请添加微信:founderparker