编注: 本文是「2024 年度征文」记录赛道的入围文章。文章代表作者个人观点,少数派仅对标题和排版略作修改。


写作这篇文章的时间为 ChatGPT 发布约两年零两个月之后,正值国产开源大模型 DeepSeek 「小蓝鲸」在全球掀起风浪的时刻。

人工智能(Artificial Intelligence,AI)已经渗透进了几乎所有传播媒介。它在互联网某片文字角落隐匿藏身,又在引发「恐怖谷效应」的人物图片中显露无遗。它在语音和音乐中施展魔法,又会因为片刻的一致性缺失而在视频中露出马脚。

在过去一年 AI 引领的科技浪潮中,有人捧起诺贝尔奖的桂冠,有人喜提「中国教父」级称号后黯然离场,有人陷入「宫斗」疑云又重回宝座,有人豪掷千金狂堆算力基建。

在宏大叙事之外,AI 能帮我这个微小的个体做些什么?

过去一年,我开始将阅读、思考、写作当成最重要的三件事。不再为自己书看的少而焦虑,而是从问题和需求出发开启主动阅读。不再只是机械性地阅读,而是带有批判性的思考和理性的的论证。最终的写作输出让我体验到了大脑的「质变时刻」,激励我敢于分享的动力源泉则来自于《Show Your Work!》1一书。

本文将从文字、图片、视频三个领域入手,依次记录我如何让 AI 协助我解决创作过程中遇到的编程问题。在文章的结尾,还有一个想要重塑学习的人对 AI 的真诚独白。

在进一步阅读之前,请先知晓以下基本信息:

  • 我使用的大模型:以下案例中所使用的大模型均为 GPT-4o;
  • 我的编程水平:停留在看过 Python 基础教程的入门级水平。
文章概览
本文概览

文字

我的写作工作流是在 Obsidian 记录灵感和创作初稿、在 Typora 完成文章的配图和排版。而这两个软件的主题个性化设置都需要使用我没有学过的 CSS,这我不得不求助于 AI。

尽管 Obsidian 社区提供了悬浮目录的插件,但其外观样式实在是谈不上美观。我一心想将它改造成少数派网页端悬浮目录的样式。然而,仅凭我在主题定制的过程中学到的那一点点 CSS 知识,更改一个如此复杂的 CSS 文件着实超出我的能力了……

在 Typora 排版公众号文章

之所以选择单独在 Typora 排版文章,是因为 Typora 能够实现与图床的联动,而且我可以将 Typora 中的文字样式直接复制到公众号编辑栏中。

我对文章排版的要求是在兼顾移动端阅读体验的同时形成差异化的风格。于是,我先让 AI 生成了一个大体的 CSS 模版,再将代码文件放置到 Typora 的主题文件夹内测试。AI 生成的代码确实把我的文章排版做了改动,但谈不上什么美感。在进一步的询问诸如「如何更改加粗字体的颜色」、「如何将文字设置为两端对齐」、「解释 margin 和 padding 的含义」等问题后,整体的文字样式有了进一步的优化。在这一过程中,最有趣的就是我一旦修改一个参数,Typora 编辑器中的文字样式就会发生相应的改变。这种即时的反馈是编程最令我着迷的地方之一。

GPT对话_公众号排版
让 AI 编写一段用于文字排版的 CSS 代码

然而,无论 AI 如何向我解释 margin 和 padding 的含义,我还是不知道这两个调整间距的参数究竟有什么区别。最终,我还是依靠自己用搜索引擎找到的一张 CSS 盒子模型示意图,才终于了解了这二者的差别。

有了这些努力,我信心倍增,开始向 AI 提一些更个性化的需求。例如,「修改上述代码让引用块中最后一行文字单独设置为右对齐」、「如何单独将圆括号内的文字颜色设为灰色」。

提出第一个需求,是因为我想将这一行用来表明引用来源,如「——人名」。而将圆括号的解释文本设为灰色,是为了区分其与正文文本的主次关系,从而优化阅读体验。针对这两个需求,AI 并没有给我理想的解决方案。而这一过程中最痛苦的经历就是:我眼巴巴地看着它自信满满地一顿输出,结果当我把它修改后的代码复制过来运行时,才发现它根本并没有解决我提出的修改问题

或许,AI 只能帮我走到这了。我并没有气馁,结合 AI 教给我的 CSS 知识和我对 Markdown 语法的了解,我开始了自己的优(zhē)化(teng)。

在引用块的设计上,我参照了 Untag 网站的引用块样式,将引用块的背景设置为渐变颜色。

引用块1.0
引用块 1.0 样式

我刚开始尝试通过增加空格强行把引用源挤到屏幕的最右边,然而计算机很快就揭示了我的愚蠢。在经过一系列的失败之后,最终我想到了一个折中的办法:考虑到我在写作中很少使用到代码块,我把代码块伪装成了引用块的样式并让它单独承载引用来源

引用块2.0
我心心念念的引用块样式

沿着同样的思路,我用行内代码块盛放圆括号中的内容并为其更改了颜色。最终,文字整体的排版风格符合我的预期。

整体排版风格
Typora 整体排版风格示例

如此一来,我在 Obsidian 中只需要使用 Markdown 语法安心写作,然后将文字复制到 Typora 中获得预制的排版样式,最终再粘贴到公众号编辑栏中发布。

Obsidian 主题定制

Obsidian 是我的主力笔记软件,我同样希望它能够拥有满足我笔记需要的主题样式。

我对 Obsidian 主题的修改相对克制,只想在默认主题下通过定义 CSS 片段修改部分样式。而一上来我就遇到了麻烦:它对 Typora 能够调用的 CSS 文件并没有反应。

于是,我指定 GPT-4o 专门为 Obsidian 生成一个 CSS 代码片段。配合着少数派作者 @手动贩卖机的文章《如何使用 CSS 改出一个令我满意的 Obsidian 外观?》,我似乎摸到了点门道。

GPT对话_Obidian 主题定制
让 AI 生成专用于 Obsidian 的 CSS 代码

除了灵感记录,我在 Obsidian 上的另一个重要记录就是阅读笔记。在阅读笔记的样式上,我参照了《芝加哥大学论文写作指南》中提供的阅读笔记模版2,并为适配电子阅读笔记作出一些调整。每一条阅读笔记结构上都要标明关键词、文献来源、文献页码以及阅读日期,部分无法标记页码的引文,我使用了章节数来代替。

AI 基本能够实现我提出的改进需求,这让我大受鼓舞。在这一过程中唯一遇到的挫折就是在导入字体时遇到了障碍。后来,在 Obsidian 论坛中我才发现这是软件的一个错误:它只有在输入字体全称时才能导入新的字体。

Obsidian 笔记示例
Obsidian 笔记样式示例

「少数派风格」悬浮目录

有了前面的经验,我跃跃欲试地想要对 Obsidian 悬浮目录插件 Floating TOC3下手了。我很感激插件作者及维护者付出的努力,但它现在的外观真是一言难尽:指示条的形状和对齐方式不够美观、鼠标聚焦和当前位置的标题颜色有冲突、调用出目录时指示条丢失…… 总之一句话,我想要少数派风格的悬浮目录!而拥有这一诉求的人并非只有我一个,在插件的 Github 页面以及 B 站相关视频的评论区,我看到了有着与我同样审美需求的 Obsidian 用户。

悬浮目录相关评论
体现少数派审美的时刻

话不多说,先让 AI 帮我分析一下代码的结构(一开始用中文提问发现效果不佳,故改用英文)。AI 确实帮我详细梳理了整个代码文件的结构,并对代码的一些细节提供了解释。但是,当我让它针对我提出的外观改进要求修改代码时,它就又开始「迷之自信」模式了,生成的代码根本无法契合我的需要。

GPT对话_悬浮目录代码解释
要求 AI 分析插件的 CSS 代码文件

看来还是得靠自己了。此处省略一段艰难的读码、改码过程,看看最终的修改效果。

桌面端悬浮目录截屏带阴影
桌面端悬浮目录效果演示
移动端悬浮目录
移动端悬浮目录效果演示

经过一番改造,Obisidan 的悬浮目录终于变成了我想要的样子!但是它仍有一些瑕疵有待后续改进,如标题过多或过长时出现的显示问题。回顾我的这一段改码经历,我觉得 AI 是在用它的亲切感引诱我去自己动手写代码,而它又确实是一个免费且随时为我解惑的编程老师

图片

在 Typora 完成文章的排版之后,我仍然不满意的是一级标题的样式。标题文字大小和颜色容易调整,但是使用一些特殊的字体则会在不同的终端设备上出现差异。我想为自己的文章配上较为醒目的大标题,一些公众号对上述问题的解决方案是直接用文本图片来当作标题。我没有选择用 Adobe Illustrator(为免歧义省去缩写)来制作,而是转而去尝试让 AI 帮我写一段可以复用的代码用以直接生成我想要的标题文本图片。

我在公众号文章及小红书上使用的配图多为示意图和表格,因此我把 Keynote 作为我的主力作图软件。而直接将 Keynote 文件转为图片格式,图片质量很差,先转成 PDF 再转成图片格式才能保持图像的分辨率。然而,令我没想到的是,这个简单的操作在我这里却出现了意外……

制作标题文本图片

在公众号文章的标题文本图片的制作上,我在公众号「那个NG」中的标题样式设计的基础之上,对配色和数字图案进行了符合整体排版风格的修改。

AI 建议我使用 Python 的 Pillow 库来生成我想要的文本图片。在按照指示安装好完所需要的库以后,我迫不及待地在终端内运行了 AI 提供的代码。

GPT对话_文本图片生成
AI 建议我使用 Pillow 库来制作文本图片

代码运行良好,生成了一张带有「Hello,World」字样的图片。经过与 GPT-4o 反复的沟通以及我对颜色、字体、圆角弧度、阴影偏移量等参数的调整,终于实现了我想要的样式。

这是标题一(初始)
标题图片样式 1.0

然而,这个图片还存在着两个问题:一是数字和文字的位置太靠下了;二是圆角矩形能看到明显的锯齿。在解决这两个问题的过程中,AI 再一次失灵了。最终,我还是通过搜索引擎找到了 Pillow 说明文档中关于文本对齐参数的解释。AI 已经计算对了居中文本的锚点位置,但是在对齐参数上使用了错误的默认值。

Pillow 文本对齐
这确实有点难为我和 AI 了

而针对图形的锯齿问题,AI 给出了几个解决方案,但它们都不适配于我所处的场境。最后,我还是通过搜索引擎找到了「先放大后缩小」的边缘锯齿解决方案。

这是标题一
标题图片样式 2.0

这样,我每次只需要更改代码中的标题文字就能得到统一样式的标题文本图片了。

PDF 转图片

用 PDF 阅读器不就能实现 PDF 转图片吗,为什么多此一举要靠代码实现?因为我电脑上的 PDF 阅读器没此功能啊!

也就是在我满心欢喜地准备把从 Keynote 转来的 PDF 再导出为图片时,我才发现自己买断制购买的 PDF Expert 2 竟然没有提供导出功能。本着省钱的原则,我还是求助 AI 帮我写了一段代码。

GPT对话_pdf转图片
我只需再安装一个 pdf2image 模块

或许是这个需求过于简单和明确,AI 生成的代码运行良好,我只是让它额外增加了一个询问页码的功能。

终端运行pdf转图片代码
AI 生成的 PDF 转图片代码在终端内运行流畅

到这里,我终于构建起了从 Keynote 作图到导出高清图片的闭环。

视频

在文字排版和图片制作方面尝到用代码提高效率的甜头后,我开始思考这一模式能否用在视频制作上。我很早就关注了专注于用视觉动画呈现数学知识的 Youtube 频道 3Blue1Brown ,频道上那些精美的动画正是用频道所有者 Grant Sanderson 基于 Python 开发的数学动画引擎 Manim 制作的。我了解到还有类似的用编程制作视频的产品,如 Remotion 和 Motion Canvas。

而顺着这一思路,我也了解到动效制作软件 After Effects(AE)也可以使用代码。其代码使用的入口有两个:一个是指示图层属性执行某种操作的表达式,一个是指示应用程序执行某些操作的脚本4。二者都基于 JavaScript 语言编写。

由于我目前我仍没有明确对视频创作的需求,下面仅以两个示例演示一下 AI 能如何帮助我使用 Manim 库和 AE 表达式来制作视频动画。

使用 Manim 制作函数图像绘制动画

在对 Manim 库的代码一无所知的情况下,我尝试让 AI 帮我用 Manim 制作一个函数图像的绘制动画。

GPT对话_Manim 数学动画
让 AI 编写制作数学动画的代码

可喜的是,AI 生成的代码能够正常运行,在对其生成的代码未做任何修改的情况下我跑出了如下动画。

函数图像绘制1.0
由 AI 编写的代码制作的动画

但这并我想要的。在随后的对话中,我始终无法用语言向 AI 说清楚我想要的动画效果究竟是怎样的。只有当我在 AI 和 Manim 官方文档的帮助下学习了 Manim 绘制动画的基本框架之后,我才最终实现了我脑海里想象的画面。

函数图像绘制动画2.0
我脑海中的动画

使用 AE 表达式制作小球落地动效

有时,使用表达式来控制图层动画可以省去反复添加关键帧和调节速率曲线的步骤。我尝试让 AI 帮我生成一段用于模拟小球落地弹跳动效的 AE 表达式。

GPT对话_AE 篮球落地动效
AI 生成的 AE 表达式

可以看出,AI 真的在试图模拟真实物理世界的自由落体运动。然而,当我将上述代码复制到 AE 图层位置参数的表达式编辑器中之后,软件总是提示「无法将结果转变为数值」。我将这一错误反馈给 AI,它仍然没有解决这一问题。由于我还没有进一步探索,故暂未找到合适的解决办法。

值得一提的是,开发者 Hyper Brew 制作了一个集成有 ChatGPT 的 AE 插件 Klutz GPT,使得用户可以在 AE 中直接询问 AI 让其生成 AE 表达式或脚本。插件还会将软件提示的代码错误报告自动粘贴至输入框,以便让 AI 进一步修改代码。

AE 的 GPT插件
图截自 Klutz GPT 作者的 YouTube 频道:Hyper Brew

插件作者在简介里风趣地写道:

The most unreliable way to write expressions and scripts for After Effects.

结语

在这一段由个人创作需要而引发的编程学习过程中,编程给我带来的最有价值的思维方式就是「将复杂问题拆分成细小问题」。尽管写码、改码的过程耗费时间,但编程的边际效益会随着代码使用频率的增加而不断加大。如果套用黄仁勋推销 GPU 产品时所说的「The more you buy, the more you save」,可以将代码的可复用性带来的效率提升描述为「用的次数越多,省的时间越多」。

AI 降低了我学习编程的门槛,并成为了我最好的编程老师。它善于解决一些知识型问题,但在任务型问题上的表现则受到任务复杂度、模型泛化能力、提示词精确度等方面的限制。

本文在第三节「视频」部分显得有些草草收场,是因为我目前对视频创作仍没有明确的动机。私以为,作为一名普通用户,相比「AI 能不能……」「AI 大模型哪家强」这些问题,更多地去思考「我想用 AI 帮我做什么」「AI 帮我将任务完成度推进到了 X%,剩下的我该怎么办」或许更有价值。我也始终明白,无论这些科技巨头、商业巨鳄、拓宽人类知识边疆的学者以及充满理想和人文精神的算法工程师最终能否实现通用人工智能(Artificial General Intelligence,AGI),那起始的 0% 和逐步被硅基生命逼近的最后 1% 永远是留给有着血肉身躯的自己的。

在过去一年里,我结束了自己近二十年的学校生涯。而面对随后一系列的挫败感和无力感,我决定不再义愤填膺,也不再自怨自艾,而是选择以温和的方式重新教育自己一遍:让自己从教学对象变为学习发起者,让学习回归从需求出发、由问题引导的本源。

无比幸运的是,在这场孤独的旅程中能有 AI 一路伴我同行。

> 关注 少数派小红书,感受精彩数字生活 🍃

> 实用、好用的 正版软件,少数派为你呈现 🚀