原文: Pair Programming with the ChatGPT AI – Does GPT-3.5 Understand Bash?

在过去的几个星期,我们已经听到了很多关于人工智能和自然语言处理的消息——特别是关于 OpenAI 的最新版本 GPT。

最近发布的 GPT 3.5,特别是非常新的 ChatGPT 工具,绝对是一个巨大的飞跃。

你可能已经读到有人要求人工智能起草房地产合同和遗嘱,甚至生成编程代码。这篇文章从一个稍微不同的角度来探讨这个工具。

如果你想用视频来补充学习,你可以在这里观看这篇文章的视频版本:

用 ChatGPT 和 Bash 脚本进行实验

我决定看看 ChatGPT 是如何处理 Linux Bash 脚本的。但是(破坏者警报!)当我执行该工具的建议——包括好的代码和差的代码——我开始意识到有一个更强大的好处:有机会与一个非常有帮助的伙伴结对编程。

人工智能最终没能解决我的问题,但它失败的方式绝对是迷人的。看着人工智能寻找新的答案,绝对是疯狂的。

第一次尝试——ChatGPT 试图解决这个问题

让我们看看这一切是如何发生的。以下内容,或多或少,是我提供给人工智能的最初提示:

给我写一个 Bash 脚本,要求输入一个 YouTube 视频的 URL,然后使用 yt-dlp 程序从该 URL 下载。脚本应该把文件名改为 “myvideo.mp4”。

几秒钟后,ChatGPT 告诉了我一个脚本。代码是这样的:

#!/bin/bash

# Prompt user for YouTube video URL
read -p "Enter YouTube video URL: " url

# Download video from YouTube using yt-dlp
yt-dlp $url

# Get the name of the downloaded video file
yt-dlp $url

# Change the downloaded video filename to "myvideo.mkv"
mv video-filename.mp4 myvideo.mp4

人工智能显然知道什么是 Bash 脚本以及如何呈现代码。它甚至对每一行代码的注释都做得很好。人工智能知道如何正确地提示用户输入,然后如何将输入的字符串导入一个叫作 url 的变量中。

它还知道 yt-dlp 程序以及它是如何工作的,适当地给它输入了所提供的 URL。然后它至少试图将下载的视频文件重命名为 myvideo.mp4。但是,当它假设下载的文件名是 video-filename.mp4 时,一切都崩溃了。呜呼!

无论如何,人工智能很有帮助地告诉我如何从其代码中创建脚本,然后运行它。

第二次尝试——ChatGPT 纠正了自己的错误

我的第一个后续提示指出了明显的错误。几秒钟后,ChatGPT 承认了自己的错误,并提出了改进措施。

你是对的,我提供的脚本不会像预期的那样工作,因为它假定下载的视频将被保存到一个名为 video-filename.mp4 的文件中。然而,这并不能保证是这样的。为了解决这个问题......

在这里,人工智能是如何完全参与到这个过程中来的,真是令人震惊。它记住了它的第一个代码,倾听并理解了我的抱怨,并思考了一个解决方案。这就是第二次尝试。

#!/bin/bash

# Prompt user for YouTube video URL
read -p "Enter YouTube video URL: " url

# Download video from YouTube using yt-dlp
yt-dlp $url

# Get the name of the downloaded video file
filename=$(basename $url)

# Change the downloaded video filename to "myvideo.mkv"
mv $filename.mp4 myvideo.mp4

好吧,解决方案看起来是对的。basename 是一个 Linux 工具,可以剥离文件系统的目录,只留下实际的文件名。

问题是,变量 url 不包含本地文件名,而是一个互联网地址。这个肯定是行不通的。

第三次尝试——ChatGPT 再次尝试

所以我又试了一次,解释了那不是合适的工具。而 ChatGPT 又进行了一次尝试。

#!/bin/bash

# Prompt user for YouTube video URL
read -p "Enter YouTube video URL: " url

# Extract the filename from the URL
filename=$(basename $url)

# Download the video using the yt-dlp tool and specify the filename
yt-dlp -o $filename $url

# Change the downloaded video filename to "myvideo.mkv"
mv $filename.mp4 myvideo.mp4

这一次,它显示它已经熟悉了 yt-dlp 的文档,建议我们使用 -o 参数给下载的视频一个名字,basename 现在应该对它起作用。每一次迭代,人工智能都会给我更新的代码,供我剪切和粘贴使用。

当然,这也是行不通的。在下一次尝试中,我感觉到人工智能有点绝望了。

如果一开始你没有成功......至少你会学到一些东西

我打算跳过接下来的一两次尝试,因为我们遇到了一个问题:来自 YouTube 的视频并不总是 MP4,它们有时是 MKV,甚至是 WEBM。这种不确定性可能会扰乱我们正在使用的文件名,所以我要求 ChatGPT 在代码中加入这个功能。

#!/bin/bash

# Prompt user for YouTube video URL
read -p "Enter YouTube video URL: " url

# Extract the filename from the URL
filename=$(basename $url)

# Download the video using the yt-dlp tool and specify the filename
yt-dlp -F mp4 -O $filename $url

# Change the downloaded video filename to "myvideo.mkv"
mv $filename.mp4 myvideo.mp4

当我报告说这也不能工作时,人工智能开始感到困惑。首先,它告诉我,-F 选项期待一个有效的视频格式,但 “mp4” 并不有效。然后它又给我有效的选项,包括 “mp4”。

当人工智能建议的任何东西都不起作用时,它放弃了,建议我确保 yt-dlp 确实安装在我的机器上,并告诉我如何做到这一点。

我想这时候放弃也挺好。即使它没有解决这个问题,它的努力也令人惊讶,它确实向我展示了一些有用的语法,并让我思考。

如果你有兴趣,顺便说一下,这里是一个实际工作的脚本的样子:

#!/bin/bash

# Prompt user for YouTube video URL
read -p "Enter YouTube video URL: " url

# Download video from YouTube using yt-dlp
yt-dlp $url

# Get the name of the downloaded video file
original_filename=$(ls | awk '/mp4/ || /webm/ || /mkv/')

# Change the downloaded video filename to "myvideo.mkv"
mv "$original_filename" /home/ubuntu/vids/myvideo.mp4

前两行代码与 ChatGPT 建议的方式相同。但我随后通过列出当前目录中的所有文件来隔离文件名,并使用 awk 来过滤只包含 mp4、webm 或 mkv 的文件名。(这假定在同一时间,目录中永远不会有超过一个视频文件。)

然后文件名将被写入 original_filename 变量中。然后,我将使用该变量作为 move 命令的一部分来重命名文件 myvideo.mp4。就我所知,无论实际发送的是什么格式,这都是可行的。

总结

人工智能今天可能还没有为现实世界的编程任务做好准备,但我不想赌它明天......或明年的某个时候也不能做到。

不过,在此期间,我绝对会推荐你在面临具有挑战性的编程任务时使用 ChatGPT 这样的工具。

两个头脑(几乎)总是比一个好。

除了我的 YouTube 频道(你可以订阅),我的网站还链接到各种技术方面的好东西,如文章、书籍和课程。