自22年3月我第一次接触GPT以来,就对此产生了非常浓厚的兴趣,
从一首诗、一个故事、一首歌、一行代码都无时不刻的彰显着GPT的卓越能力。
紧接着整个世界都非常忙碌的开始沸腾起来,
在AI这个领域,每天都有无数的话题,
包括图文、视频、评论围绕着它产生,速度之快前所未有!
为什么?恰恰是因为有了GPT,
他让不太会写文案的人轻轻松松写出看上去还算不错的文案,
让完全连构图都不懂的人动动嘴皮就生成出精美的图片,
虽然一切都看上去还不那么完美,但也足以让人类疯狂的产出前所未有的内容。
世界的未来会变成什么样?最近一段时间我通常都会想这个问题。
媒体大肆渲染的AI取代人类、失业等问题是一定会发生的,也正在发生着。
但我感受到的是GPT带来了更多的范式创新,
那就是工具和经验的民主化所带来的全新的可及性定义。
传统上,工具与经验的获取和应用可能受限于专业知识、技能门槛或资源限制,
导致只有少数人能够从中受益。
然而,GPT的出现重新定义了这种情况。
GPT能够理解和生成人类语言,包括文章、故事、代码等。
这使得GPT成为一个强大的工具,能够辅助人们解决各种问题,
并且将工具和经验的获取过程民主化。
通过GPT,人们不再需要具备深入的专业知识或掌握复杂的技能,
就能够利用它来生成所需的工具、规则、指导或其他形式的经验。
这大大降低了使用工具和获取经验的门槛,
使更多人能够参与其中,从而实现了可及性的重新定义。
GPT的影响不仅仅是技术层面的,它还具有社会和经济影响。
通过将工具和经验的民主化,
GPT为个人、组织和社区提供了更平等的机会,促进了创新和发展。
人们可以更轻松地使用GPT来解决问题、创造内容和探索新领域,
这为社会带来了更广泛的参与和多样化的观点。
所以未来究竟会变成什么样子其实并不重要,重要的是我们自己有了更多无限可能。
案例
最近遇到一件事情,我从网络上下载了几百集的动画片想给天宝看。我把这些动画片导入到NAS系统中后,发现Video Station系统无法正常展示。原因是这些动画片有相应的文件夹层级,而NAS系统无法识别。因此,我必须重新整理这些视频文件,以便NAS系统能够识别它们。
下载的文件目录结构是这样的。
image.png我们可以看到,该文件夹的层级结构并不复杂。一个顶层文件夹下面有若干的子文件夹,每个子文件夹下面都是相应的视频文件。然而,NAS系统只能识别一个文件夹下带有若干文件,否则就会显示异常。因此,我们必须按照NAS系统的要求和规定进行文件编排。
可以预见的是,如果按照传统的手工作业的方式,哪怕是你拥有一个重命名文件的软件工具,在文件足够多、层级复杂的情况下工作量也是非常之大的。在写这篇文章之前,我顺便查了一下网络上关于批量重命名的方法,发现不乏使用Advanced Renamer这类细分专业软件的,但是这些玩意儿可不简单,学起来还是挺费劲的。
俗话说“不要造轮子”,意思是拿来主义。但我认为这句话现在已经不太适用了。在互联网时代和开源精神的影响下,我们可以轻松地使用现成的轮子,但是如果想要真正成为顺手的工具,仍然需要不断地寻找符合自己使用感觉的工具。有时开源工具可能不能满足我们的需求,而免费工具又可能缺少一些功能。而且它们还可能会突然向你收费。在过去,因为造轮子的成本往往超过收益,人们没得选!
然而,现在这个时代已经几乎颠覆了传统!我是一个深度的GPT使用者,因此我尝试使用GPT来创造一个轮子。
1、 先把目录拷贝一份出来,好做实验。(实验环境windows 10 1803)
先运行cmd,cd到文件路径下,使用tree /f
命令把目录列出来(tf是我自定义的)
我现在需要做实验,当然需要一份完全一样的副本。我想使用Windows批处理脚本快速生成txt副本。这样会很方便。打开GPT并编写提示词,然后使用生成的文件目录生成它们。:
在GPT中编写提示词在GPT中编写提示词
新建step1.bat文件,把上面生成的命令行拷贝进去,双击运行或者在cmd下运行后结果就出来了。
image.png这个还是挺简单的,你只需要用自然语言告诉它你要干什么就行了。有难度吗?没啥难度,关键是你得把话说清楚。当然,这里还会牵扯到一些提示工程学里的提示词优化技巧,不过这就是另一回事了。
2、接下来要把这些文件按照你的规则进行重命名,交给GPT生成第一版代码。
具体怎么做呢?其实思路是一样的,先思考清楚你要做什么,预期得到的结果是什么,然后告诉GPT。
这其实跟我做产品设计的逻辑和流程是一样的。我会研究问题,整理需求,把它们写下来,再画图,然后和RD讨论一番,告诉他们我期望得到的结果。最后,再提交给测试单元。道理是一样的。
基于当前的问题,我整理了我的需求,如下所示:
1、创建一个新的文件夹,命名为xxxx。
2、将A文件夹(含子文件夹)下的所有文件复制到新建的xxxx文件夹下。
3、把这些文件重命名,涉及到规则比如加前缀、编号、加入章节名称、章节排序
针对规则的描述需要更加详细一点,就像产品经理向RD讲解需求一样,只有你把需求表述清楚,开发人员才能满足你的需求。先将提示词编排好然后喂给GPT。这里我将提示词完整地列出来。
请编写命令行代码,创建新文件夹命名为xxxx,复制A文件下的所有文件到文件夹并重新命名;
命名规则:每个二级文件夹(比如“学语文4集”)为一节,整个文件的所有文件集数拉通排列,
但每个小节内部的编码单独编排,
在分节编码时应考虑编码顺序,
一般规则是按照文件本身的编码顺序来,比如1、2、3、4....,
或者是按照上、中、下这种规则来编排为1、2、3。
最终输出结果“第1集 学语文01”,其中第1集为拉通排列的结果,01为小节内部的编码:
这是原始结构
-----------------------------------------------------------------------------
A
├─学语文4集
│ 1.txt
│ 2.txt
│ 3.txt
│ 4.txt
│
├─快乐数学2集
│ 快乐学数学上.txt
│ 快乐学数学下.txt
│
├─拼音城堡5集
│ 1.txt
│ 2.txt
│ 3.txt
│ 4.txt
│ 5.txt
│
└─数学大闯关3集
1.txt
2.txt
3.txt
-------------------------------------------------------------------------
我期望的结果如下,其中「xxxx 第1集 学语文01.txt」是整个文件的名称
xxxx 第1集 学语文01.txt
xxxx 第2集 学语文02.txt
xxxx 第3集 学语文03.txt
xxxx 第4集 学语文04.txt
xxxx 第5集 快乐数学01.txt
xxxx 第6集 快乐数学02.txt
xxxx 第7集 拼音城堡01.txt
xxxx 第8集 拼音城堡02.txt
xxxx 第9集 拼音城堡03.txt
xxxx 第10集 拼音城堡04.txt
xxxx 第11集 拼音城堡05.txt
xxxx 第12集 数学大闯关01.txt
xxxx 第13集 数学大闯关02.txt
xxxx 第14集 数学大闯关03.txt
这就是完整的提示词,分了好几个部分,关键就是要说清楚。
最初,GPT尝试生成.bat文件的命令行,但是尝试了好几次优化后结果都不如意。可能是因为.bat文件本身的能力有限。之后,改用shell脚本进行生成。
#!/bin/bash
# 切换到目录 D:/tmp
cd "D:/tmp" || exit
# 设置目标文件夹名
targetfolder="xxxx"
# 创建目标目录 xxxx
mkdir "$targetfolder"
# 初始化集数计数器
counter=1
# 遍历 A 目录下的所有二级子目录
for section in A/*; do
# 获取二级子目录名称(一节名称)
section_name=$(basename "$section")
# 初始化小节内部编码计数器
section_counter=1
# 排序二级子目录下的所有文件
sorted_files=($(ls -v "$section"/*))
# 遍历二级子目录下的所有文件
for file in "${sorted_files[@]}"; do
# 获取文件名(不含扩展名)
filename=$(basename "$file" | sed 's/\.[^.]*$//')
# 格式化集数计数器
count=$(printf "%02d" "$counter")
# 格式化小节内部编码计数器
section_count=$(printf "%02d" "$section_counter")
# 去除小节名称中的数字和集字
section_name=$(echo "$section_name" | sed 's/[0-9]//g' | sed 's/集//g')
# 去除节内编码中的集字
section_count=$(echo "$section_count" | sed 's/集//g')
# 重命名并复制文件到目标目录
cp "$file" "$targetfolder/$targetfolder 第$counter集 $section_name$section_count.${file##*.}"
# 增加小节内部编码计数器
((section_counter++))
# 增加集数计数器
((counter++))
done
done
3、三次迭代的过程中出现一些不可控的问题,但重要的是最后解决了。
我用GPT生成的代码执行了一次居然就成功了,本着精益求精我让GPT优化一次,他给了一些建议
image.png这就是GPT带来的可及性跃迁!不仅是我没使用过shell编程,GPT提出的三项优化甚至可能连一个初级程序员也想不到,这就是工具和经验民主化带来的巨大意义,这种感受是震撼的。
#改进了包括以下几个细节,错误处理
mkdir "$targetfolder" || { echo "Cannot create directory $targetfolder"; exit 1; }
#使用find替代ls,采用sort -v排序
sorted_files=($(find "$section"/* -type f | sort -V))
……
# 遍历二级子目录下的所有文件
for file in "${sorted_files[@]}"; do
……
# 重命名并复制文件到目标目录
cp "$file" "$targetfolder/$targetfolder 第$counter集 $section_name$section_count.${file##*.}" || { echo "Cannot copy $file to $targetfolder/$targetfolder 第$counter集 $section_name$section_count.${file##*.}"; exit 1; }
……
然后增加了一行代码,增加运行过程输出提示
# 输出将要复制的文件和目标位置
echo "Copying $file to $targetfolder/$targetfolder 第$counter集 $section_name$section_count.${file##*.}"
我测试了优化后的代码,结果发现文件名中有空格就出问题了。我把代码交给了GPT进行二次优化,但生成的代码又出现了排序问题。GPT调整了几次,但问题仍未解决。几轮下来,我感觉GPT有点崩溃了,这就是我前文提到的几乎失控的情况。
image.png我没有继续追问,因为很可能徒劳无功,这时我必须换个问法。我注意到问题出在之前的两次迭代,第一次代码编码排序没问题,但处理不了空格,第二次代码处理了空格,但是编码排序有问题,所以我索性把两段代码全给他,让他自己处理。
没想到,还真奏效。提示词大致如下,都没怎么优化,但他就是能懂。
比较这两段代码,代码1能够正确拉通排列集数,代码2能够正确处理文件名中带有空格的文件,
如何能同时解决这两个问题:
代码片段1
代码片段2
最后完整版的代码。别说了,哪怕我懂,我也未必能解决得了,除了代码以外他还清晰的给出了两段代码的区别和问题原因云云,说实话,我都懒得看。
#!/bin/bash
# 切换到目录 D:/tmp
cd "D:/tmp" || { echo "Unable to change directory to D:/tmp"; exit 1; }
# 设置目标文件夹名
targetfolder="xxxx"
# 创建目标目录 xxxx
mkdir -p "$targetfolder" || { echo "Cannot create directory $targetfolder"; exit 1; }
# 初始化集数计数器
counter=1
# 遍历 A 目录下的所有二级子目录
for section in A/*; do
# 获取二级子目录名称(一节名称)
section_name=$(basename "$section")
# 初始化小节内部编码计数器
section_counter=1
# 使用find找到所有文件,并通过管道传给while循环
while IFS= read -r -d '' file
do
# 获取文件名(不含扩展名)
filename=$(basename "$file" | sed 's/\.[^.]*$//')
# 格式化集数计数器
count=$(printf "%02d" "$counter")
# 格式化小节内部编码计数器
section_count=$(printf "%02d" "$section_counter")
# 去除小节名称中的数字和集字
section_name=$(echo "$section_name" | sed 's/[0-9]//g' | sed 's/集//g')
# 输出将要复制的文件和目标位置
echo "Copying $file to $targetfolder/$targetfolder 第$counter集 $section_name$section_count.${file##*.}"
# 重命名并复制文件到目标目录
cp "$file" "$targetfolder/$targetfolder 第$counter集 $section_name$section_count.${file##*.}" || { echo "Cannot copy $file to $targetfolder/$targetfolder 第$counter集 $section_name$section_count.${file##*.}"; exit 1; }
# 增加小节内部编码计数器
((section_counter++))
# 增加集数计数器
((counter++))
done < <(find "$section" -type f -print0 | sort -z)
done
# 输出完成消息
echo "All files copied successfully."
彩蛋:我还是附一个代码和优化描述
代码2片段中有问题的部分
image.png
网友评论