如何使用 ChatGPT 编写代码

ChatGPT最有趣的发现之一是它能写出相当不错的代码。我第一次测试它是在 2023 年,当时我让它为我妻子的网站编写一个 WordPress 插件。ChatGPT 做得很好,但那只是一个简单的项目。
那么,如何使用 ChatGPT 编写代码作为日常编程练习的一部分呢?以下是简要概述:
- ChatGPT 可能会生成有用或无用的代码。为了获得最佳效果,请提供清晰详细的提示。
- ChatGPT 擅长协助完成特定的编码任务或例程,而不是从头开始构建完整的应用程序。
- 使用 ChatGPT 查找并选择适合特定目的的编码库,并参与互动讨论以缩小您的选择范围。
- 谨慎选择AI 生成代码的所有者,并始终验证代码的可靠性。切勿盲目信任生成的输出。
- 将与 ChatGPT 的互动视为一次对话。根据 AI 的回答优化您的问题,使其更接近预期输出。
现在,让我们更深入地探索 ChatGPT。
ChatGPT 可以很好地完成哪些类型的编码?
关于ChatGPT和编码,有两个重要的事实。首先,AI可以编写有用的代码。
第二,人工智能可能会完全迷失,掉进兔子洞,徒劳地追逐自己的尾巴,并产生无法使用的垃圾。
我经历了一番艰难的尝试才明白这个道理。在我为妻子完成 WordPress 插件后,我决定看看 ChatGPT 能走多远。
我为一款 Mac 应用程序编写了一个非常仔细的提示,包括用户界面元素、交互、设置中提供的功能、工作原理等等的详细描述。然后,我将这个提示输入给了 ChatGPT。
ChatGPT 回应了大量文本和代码。然后,它在代码运行到一半时停了下来。当我要求 AI 继续时,它吐出了更多的代码和文本。我一次又一次地要求继续,它输出的代码越来越多。然而,所有输出都不可用。AI 无法识别代码应该放在哪里,如何构建项目,而且——当我仔细查看生成的代码时——它省略了我要求的主要操作,只留下了一些简单的文本描述,例如“程序逻辑放在这里”。
经过反复测试,很明显,如果你要求 ChatGPT 交付一个完整的应用程序,该工具会失败。由此推断,如果你对编程一无所知,却想让 ChatGPT 构建一些东西,它也会失败。
ChatGPT 的成功之处——而且做得非常好——在于它能够帮助那些已经懂得编程的人构建特定的例程并完成任务。不要要求它开发一个在菜单栏上运行的应用程序。但如果你要求 ChatGPT 开发一个在菜单栏上添加菜单的例程,并将其粘贴到你的项目中,那么这个工具的效果会相当不错。
另外,请记住,虽然 ChatGPT似乎 拥有大量特定领域的知识(而且通常如此),但它缺乏智慧。因此,该工具可能能够编写代码,但它无法编写包含需要深厚经验的特定或复杂问题的细微差别的代码。
使用 ChatGPT 演示技术、编写小型算法并生成子程序。您甚至可以使用 ChatGPT 将大型项目分解成多个部分,然后让其协助编写这些部分的代码。
因此,考虑到这一点,让我们看看 ChatGPT 如何帮助您编写代码的一些具体步骤。
如何使用 ChatGPT 编写代码
1. 缩小并完善你的请求
第一步是确定要向 ChatGPT 询问什么——但暂时不要问它任何问题。确定你的函数或例程要做什么,或者你想学习哪些内容并将其融入到你的代码中。确定要传递给代码的参数以及你想要得到的结果。然后思考如何描述它。
想象一下,你花钱请一位人类程序员来完成这项任务。你是否提供了足够的信息,让他/她能够完成你的任务?或者,你是否提供的信息太模糊,导致你雇佣的程序员更有可能提出问题,或者提交一些与你要求完全无关的内容?
举个例子。假设我想要对任何网页进行摘要。我想把这篇文章输入给人工智能,然后返回一个经过深思熟虑且合适的摘要。我的输入是指定一个网页网址。我的输出是一段带有摘要的文本。
2. 使用 ChatGPT 探索图书馆和资源
继续上面的例子,提取网页数据的一种传统方法是查找 HTML 段落标签之间的文本。
然而,随着人工智能工具的兴起,你可以使用人工智能库进行智能摘录和汇总。ChatGPT 的优势之一(也是你可以轻松验证以避免其“权威但错误”行为模式的领域)就是查找库和资源。
OpenAI(ChatGPT 的开发者)出售其法学硕士(LLM)的 API 访问权限,以实现我们想要的功能。但在本例中,我们假设我们不想支付交易费。
因此,让我们看看如何与 ChatGPT 进行交互,以了解如何在 PHP 中运行的项目中免费使用这样的工具。
我首先提出了一个问题,询问哪些库可以提供所需的功能。库(对于那些不是程序员的人来说)是指程序员可以访问的一组代码,它们为特定目的完成了大量繁重的工作。现代编程的很大一部分就是寻找和选择合适的库,所以这是一个很好的起点。
在这种情况下,我正在查看其他人编写的用于总结文本的代码块。这是我的第一个提示:
描述十种不同的开源 AI 库(以及它们所使用的语言),我可以使用这些库来生成任何网页主要核心内容的摘要,而忽略任何广告或嵌入材料。
这道题正好满足了我的需求,还提到了 OpenAI 的产品。我觉得 OpenAI 在这方面会做得很好,但对于这个假设的项目,我不想为 API 费用做预算。所以,我先缩小问题范围:
这些有免费的吗?
ChatGPT 的回答是:“是的,这十个 AI 库都是开源的,可以免费使用。但是,其中一些库可能有使用限制,或者需要付费才能访问额外的功能或资源。” 因此,基于这个回复,我澄清了我的疑问:
以下哪些库没有使用限制并且不需要任何额外的付款或许可?
注意,这完全是一场对话。我不需要重复最初的问题。我只是像身边有专家一样深入探究。这次,ChatGPT 给了我八个库选项,但没有一个提到我计划用来编写代码的 PHP 语言。所以,接下来是提示:
在这 8 个库中,我可以与 PHP 一起使用任何一个吗?
它返回了三个库,但我不确定每个库的作用是什么。所以,另一个问题:
Sumy、Gensim 和 NLTK 之间有什么区别?
我还是不确定,所以我明确了我的使用计划,然后询问:
如果我想创建网页新闻文章摘要,哪个库更适合?
答案清晰明了,而且很有希望:“Sumy 专为文本摘要而设计,其任务是从一段文本中捕捉最重要的信息,从而创建摘要。” 所以,是时候看看用 PHP 使用 Sumy 需要做些什么了。我针对这个项目的这一部分提出了最后一个问题:
您能解释一下如何在 PHP 中使用 Sumy 吗?
欢迎在您的电脑上随意操作,并将这些提示粘贴到 ChatGPT 中。请注意,在第一步中,我决定了要获取哪个程序模块的帮助。然后,在这一步中,我与 ChatGPT 进行了沟通,决定使用哪个库以及如何将其集成到我的项目中。
这种方法可能看起来不像编程,但我向你保证,它就是编程。编程不仅仅是把几行代码写到页面上。编程是要弄清楚如何整合各种资源和系统,以及如何与解决方案的所有组件进行交互。在这里,ChatGPT 帮助我完成了集成分析。
顺便说一句,我很好奇谷歌的 Gemini AI能否提供类似的帮助。相比 ChatGPT 的响应,Gemini 确实在编程规划方面提供了一些额外的见解。
所以,不要犹豫,使用多种工具来综合评估你的答案。故事如下:Gemini 与 ChatGPT:Gemini 能帮你编程吗? 自从我写了那篇文章后,谷歌为 Gemini 增加了一些编程功能,但效果并不理想。你可以在这里阅读关于这些功能的文章:我测试了 Google Gemini 的新编程技能。结果并不理想。最近,我深入研究了 Gemini Advanced。这款人工智能仍然没有通过很多测试。
接下来是编码。
3. 要求 ChatGPT 编写示例代码
好的,我们先暂停一下。这篇文章的标题是“如何使用 ChatGPT 编写代码”。确实如此。但我们真正要做的是让 ChatGPT 编写示例代码。
让我们明确一点。除非你编写的是小函数(比如ChatGPT 为我妻子编写的行排序器/随机器),否则 ChatGPT 无法生成你的最终代码。首先,你必须维护它。ChatGPT 修改已写代码的能力很差。差劲,指的是它根本做不到。所以,要想获得新的代码,你必须要求 ChatGPT 生成新的代码。正如我之前发现的那样,即使你的提示几乎完全相同,ChatGPT 也可能会意外地更改它给出的内容。
因此,底线是:ChatGPT 无法维护您的代码,甚至无法对其进行调整。
这种限制意味着你必须自己动手。众所周知,一段代码的初稿很少是最终版本。所以,即使你期望 ChatGPT 生成最终代码,它也只是一个起点,你需要将它完成,将它集成到更大的项目中,进行测试、改进、调试等等。
但这个问题并不意味着示例代码毫无价值——远非如此。让我们看一个我根据之前描述的项目编写的提示。以下是第一部分:
编写一个名为 summary_article 的 PHP 函数。
作为输入,summarize_article 将传递一个指向新闻相关网站(如 ZDNET.com 或 Reuters.com)上的文章的 URL。
我正在告诉 ChatGPT 它应该使用的编程语言。我还告诉了 AI 输入的内容,并提供了两个网站作为示例,以帮助 ChatGPT 理解文章风格。说实话,我不确定 ChatGPT 是否忽略了这一点指导。接下来,我将告诉它如何完成大部分工作:
在 summary_article 函数中,检索指定 URL 的网页内容。使用 PHP 中的 Sumy 库以及其他必要的库,提取文章正文(忽略所有广告或嵌入内容),并将其概括为大约 50 个字。确保摘要由完整的句子组成。如有必要,可以超出 50 个字来补充最后一句。
这种方法与我指导员工的方式非常相似。我希望他们知道,他们不仅限于使用 Sumy。如果他们需要其他工具,我希望他们能够使用它。
我还指定了一个大概的字数,以便为我想要的摘要内容设置一个范围。该例程的后续版本可能会将该数字作为参数。最后,我列出了我想要的结果:
处理完成后,编写代码summarize_article以便它以纯文本形式返回摘要。
最终的代码非常简单。ChatGPT 调用了另一个库(Goose)来检索文章内容。然后,它将摘要传递给 Sumy,限制其长度为 50 字,并返回结果。基础代码编写完成后,只需通过编程即可返回并进行调整,自定义传递给这两个库的内容,最终交付结果:
值得一提的是,我最初在 2023 年初尝试这项测试时,ChatGPT 创建了一个对其编写的例程的调用示例,使用了 2021 年之后的 URL。当时,也就是 2023 年 3 月,ChatGPT 的数据集只到 2021 年。现在,ChatGPT 的知识库已经扩展到 2024 年 6 月底,并且可以搜索网络。但我的意思是,ChatGPT 编造了一个它不可能知道的示例链接:
https://www.reuters.com/business/retail-consumer/teslas-musk-says-fremont-california-factory-may-be-sold-chip-shortage-bites-2022-03-18/
我对照路透社网站和 Wayback Machine 检查了该 URL,它并不存在。切勿假设 ChatGPT 准确无误。务必仔细检查它提供的所有信息。
4. 调试并完善生成的代码
我向你展示了 ChatGPT 犯错或产生幻觉的几种方式。所有程序员都会犯错,即使是人工智能程序员。
但是,您可以采取一些措施来帮助完善代码、调试问题并预测可能出现的错误。我最喜欢的新 AI 技巧是将代码输入到另一个 ChatGPT 会话(或完全不同的聊天机器人),然后询问:“这段代码有什么问题?”
不可避免的是,总有一些事情会发生。AI有时会识别出一些边缘情况或错误检查,需要添加到代码中,或者识别出一些不太可能发生的事件同时发生时可能崩溃的情况。然后,我会针对这些错误情况进行编码,使代码更加健壮。
ChatGPT 会取代程序员吗?
现在不行——或者至少现在还不行。ChatGPT 的编程水平可以达到天才一年级编程学生的水平,但它很懒(就像那个一年级学生一样)。这个工具可能会减少对入门级程序员的需求。
然而,就目前的水平而言,我认为人工智能会让入门级程序员(甚至是经验丰富的程序员)更容易编写代码和查找信息。这确实节省了时间,但人工智能无法独立完成许多编程任务——至少现在是这样。到2030年呢?谁知道呢。
如何在 ChatGPT 中获取编码答案?
直接问它就行了。你上面看到我是如何利用交互式讨论对话框来缩小答案范围的。别指望一个问题就能神奇地完成所有工作。但利用人工智能作为助手和资源,它会给你很多有用的信息。
当然,要对这些信息进行测试——正如 OpenAI 联合创始人约翰·舒尔曼所说:“我们最大的担忧在于事实性,因为模型喜欢捏造东西。”
ChatGPT 生成的代码能保证没有错误吗?
当然不行!但你也不能相信人类程序员写的代码。我绝对不相信自己写的任何代码。代码在编写过程中总是存在着巨大的缺陷。bug总是存在的。在发布之前,你需要测试、测试、再测试。然后,选择几个目标用户进行 Alpha 测试。最后,在更广泛的用户群体中进行 Beta 测试。
即使经过所有这些努力,也难免会有 bug。AI 玩编程并不意味着它就能写出没有 bug 的代码。不要轻信。务必验证。否则,你仍然无法获得完全没有 bug 的输出。这就是宇宙的本质。
如果我收到的代码是错误的,我该怎么办?
我建议把聊天机器人想象成一个不太合作的学生或下属。如果对方给你的代码不起作用,你会怎么做?你会让他们重新操作,并指导他们重新操作,直到正确为止。ChatGPT 也应该这样做(我已经用ChatGPT 4 和 4o测试过了)。当出现问题时,我会说:“不行。请重试。”
人工智能就是这样。它经常会给出同一个问题的不同版本。我有时会重复这个过程四五次,直到得到一个可行的答案。不过,有时人工智能会想不出答案。有时,重试的答案与你的要求 完全(我的意思是完全)无关。
当你发现AI的能力已经达到极限,无法再保持理智地处理问题时,你就必须系紧安全带,自己动手写代码了。但十有八九,尤其是在处理基础代码或界面编写的挑战时,AI都能成功完成任务。
在询问 ChatGPT 时,我对编程问题的描述应该有多详细?
详细一点。你留给解释的空间越大,人工智能就越会自行其是。当我在编程时向 ChatGPT 发出提示,让它帮我,我感觉自己是在给我的学生或我的员工布置编程任务。
我是否向对方提供了足够的细节来创建初稿,还是对方还需要问我其他问题?更糟糕的是,对方会不会因为缺乏指导而完全偏离方向?千万别偷懒。ChatGPT 可以为你节省数小时甚至数天的编程时间(对我来说确实如此),但前提是你一开始就给它提供有用的指导。
如果我使用 ChatGPT 编写代码,它归谁所有?
事实证明,目前还没有太多的案例来回答这个问题。美国、加拿大和英国都要求作品必须由人类创作才能享有版权,因此人工智能工具生成的代码可能不具备版权。此外,还存在基于训练代码来源和最终代码使用方式的责任问题。
ChatGPT 支持哪些编程语言?
答案是大多数语言。 我测试了常见的现代语言,例如 PHP、Python、Java、Kotlin、Swift、C# 等等。但我也用这个工具用 一些晦涩的黑暗时代语言编写代码,例如COBOL、Fortran、Forth、LISP、ALGOL、RPG(报表程序生成器,而不是角色扮演游戏),甚至 IBM/360 汇编语言。
锦上添花的是,我给出了这个提示:
编写一个序列,在 PDP 8/e 的前面板上以闪烁的 ASCII 灯显示“Hello, world”
PDP 8/e 是我的第一台电脑,ChatGPT 指导我如何使用前面板开关来启动程序。我既惊喜又欣喜,甚至还有点忐忑。
ChatGPT 能帮助我完成数据分析和可视化任务吗?
是的,很多操作无需代码即可完成。查看我关于此主题的完整文章: 我意识到 ChatGPT Plus 改变了我的业务的那一刻。
我还写了一篇关于生成图表和表格的文章: 如何使用 ChatGPT 制作图表和表格。
但有趣的地方就在这里。在上面的文章中,我请求 ChatGPT Plus “制作一个按人口排名的世界前五城市的条形图”,它成功了。但是你需要代码吗?试试问:
用 Swift 制作一张按人口排名的世界前五城市的条形图。从网上获取人口数据。确保包含所有必要的库。
通过添加“使用 Swift”来指定编程语言。通过指定数据来源并强制 ChatGPT Plus 包含库,AI 会引入程序所需的其他资源。这就是为什么从根本上来说,借助 AI 进行编程需要你具备编程方面的知识。但如果你具备编程方面的知识,那就太好了,因为三句话就能得到一段带注释的代码。是不是很棒?
ChatGPT 如何处理方言和实现之间的差异?
我们目前还没有 OpenAI 关于这个问题的确切细节,但我们对 ChatGPT 训练方式的理解可以对此问题提供一些线索。请记住,编程语言的方言和实现(以及它们的一些小特性)的变化速度远快于整个语言。这一现实使得 ChatGPT(以及许多编程专业人士)更难以跟上时代的步伐。
因此,我会根据以下两个假设进行工作:
- 方言变化越新,ChatGPT 知道的可能性就越小,并且
- 一种语言越流行,它学习的训练数据就越多,因此就越准确。
底线是什么?ChatGPT 可以是一个有用的工具。只是不要赋予它超能力。至少现在还不要。