在和 AI 分分离离又重新捡起来这么持续了几年后,我终于对如何与 AI 共事有了点眉目。

而在此之前,我和 AI 的状态就像是:

  • 我:(看到了一个很漂亮的烟花效果)
  • 我:「你去造火箭。」
  • AI:「好的。」(内心独白:我造不出来,但是用户说要造,那就造吧。)
  • AI:「造好了——🚀。」
  • 我:「?」

为此我研究得出的结论是:理解 AI 能做什么,照顾 AI 给它讲清楚事情,给它能它做的事情,而不是胡乱扔出来一大堆烂摊子让它干活。

把事情讲清楚

在我和 AI 互相争吵了一阵子之后,我发现 AI 有点毛病。

AI 缺乏自主能力。在让 AI 去写几个迷你的 Python 脚本来完成我的数值分析课程实验——没有问题,一遍过。而让 AI 去「用 Latex 帮我写实验报告」的时候,它会产生相当多乱七八糟的内容。可以说,AI 完全不能直接根据「我需要做实验」而自行搞明白各部分细节,它需要我细致的指导才能顺利完成工作。

AI 和人一样需要去猜。在和 AI 共事的时候,因为我表达不清楚,AI 又缺乏自主能力,它只会默默接受然后去猜我想要什么,而我则无法理解 AI 这样做的动机——因为它也不会表达困惑。因此每次出现矛盾就会互相谩骂和指责,就像这样:

  • 我:「我没有说的事情不要做。」
  • AI:「你说的太对了,我不小心做了你没有说的事情,对不起我这就改。」

——然后下次依旧犯同样的错误,因为 AI 并不会主动指出我没有事前把事情讲清楚这点,只会毫不在意的接受错误进行改正。

这两个问题是导致我和 AI 冲突不断的原因,事实上在人身上其实也会出现——我时常在网上吵架,但是由于知道对面是一个具有主体性和自主意识的人,如果我随便乱说会被抓住把柄接而被喷似。但在 AI 面前就不会,因为我原来默认 AI 是理性的,而事实上除非是我犯了 1+1=1 这种它资料库里全写着不对的事实错误,其他错误它是不会主动指出来的。

为此我想出了解决办法,那就是专门给它一个任务找我毛病,虽然后面变成了找碴达人,但总得来说效果比我自己想办法写细需求好。而实际上,后来我在网上看到其他人也是这样的,比如说 grill-me Skill 就是这样通过让 AI 不断质问来搞明白你想要表达什么,也让 AI 知道如何跟你沟通,它的提示词很短但是我试过了,很有效果。

grill-me 的提示词主要如下:

Interview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.

Ask the questions one at a time.

If a question can be answered by exploring the codebase, explore the codebase instead.

除此外,还有一个 grill-me 同一个作者的改进版本:grill-with-docs Skill。这个 Skill 可以在质问的同时翻阅和更新文档,把你的表达整理好成为你和 AI 的共同语言,从而达到是不同的会话,其他 AI 也能通过翻阅文档知道你想要表达什么的效果。

把事情讲简单

AI 的另一个毛病就是做不了复杂的事情。

这和 AI 的上下文机制有相当密切的联系,但是不用展开也能直觉去理解:我之前让 AI 扮演 GM 和我玩 TRPG——一种文字冒险游戏,规则实际上就几百字,涉及的概念也相当简单,一开始 AI 可以很好扮演 GM,而到后面 AI 就会跟醉酒了一样注意力乱飘。后来回想,实际上在扮演 GM 的时候,随着游戏进行产生了非常多的线索,而「要时刻注意到这些线索」这个游戏进行的核心条件之一是越来越复杂的,也难怪 AI 到后面越来越糊涂。

我使用一种办法来让事情变得简单——

把事情写到文档里,而不是压缩上下文

通常的办法就是所谓的「压缩」——把聊天的过程压缩起来,让 AI 忘了过程只记住压缩的结果,这样就可以让 AI 不那么容易糊涂。不过我并不喜欢压缩,因为它有另一个不可靠的副作用——比如说我让AI扮演 GM 主持文字游戏:「我挥舞附魔火花的剑吓退敌人。」,然后它照做了。当我点击了一下「压缩上下文」后,再继续挥剑——结果火花没了,变成普通剑气。因为压缩时丢失了「附魔」这个关键信息。

是的,压缩的效果取决于压缩的提示词,就像「帮我总结」和「帮我总结他们的对话」两个侧重点不一样,从而可能会产生压缩概括的结果不一样。

比较难过的是,多数压缩工具还是一个黑箱按钮,无法控制保留什么。

因此,我会避免随意使用压缩,如果使用压缩,就应该做好现在内容损失被遗忘的一部分的准备。

不过倒也不是对这种情况束手无策,后来发现了一个比较好的办法可以解决压缩损失的问题——那就是在压缩前就把内容进行整理写进文档里面,再通过切分不同内容到不同文件中来控制上下文。

还是刚才那个例子:

  • 我:我让我的角色进行一个空中七百二十度纵向大回旋,手中的剑附魔上火花魔法,挥剑打出电火花,就像一个旋风大陀螺吓退所有人。
  • AI:你的角色进行了一个空中七百二十度纵向大回旋,手中的剑打出嗞嗞的红黄火花,围攻你的所有人都被你吓退了,生怕被火花打中。
  • 我:把玩家状态、物品状态、其他角色状态、当前事件线索整理成四个文档存起来。(然后使用压缩功能)
  • 我:我落地继续挥剑吓退他们。
  • AI:(玩家让我继续挥剑,注意到压缩提示词里让我在压缩后按需求重新读取状态文件,那里面有完整无损的状态,让我翻找一下玩家状态和物品状态、其他角色状态文件)
  • AI:(查看文件)
  • AI:你挥舞着大剑,甩飞出来一长串电火花,把他们吓退。

这样就能避免问题出现,同时虽然所有信息都存下来了,但是因为 AI 并不会翻阅所有文档(就像上面并没有需要翻「当前事件线索」文档),因此是可以有效进行压缩的。

因此,用写文档来替代压缩更不容易损失重要信息。

结合上面提到的 grill-me 技能,其同一个作者的升级版本:grill-with-docs 会很有用。在追问的同时将内容写入文档中,从而达到在其他时候即便没有讨论,也能通过文档回忆起先前的讨论内容,而不用反复压缩同一个会话进行工作。

拆分任务,让其更简单

既然 AI 容易办砸复杂的事情,那就把复杂的事情拆成数个简单的任务去做。每次做完一个任务始新的任务的时候,就可以开一个新的会话让 AI 忘掉上一个任务所有东西,直接从零开始新的东西。

可能有人会问:「如果上一个任务的东西有用怎么办?」,我的回答是——照样扔了。反正重要的东西还有我所要表达的重点都已经写到文档里面了,AI 可以自行去翻。

这种办法可以把「从一数到一万」这样有可能数错的任务切成「从一数到十」「从十数到二十」……一系列任务,而这样简单的任务可以减少上下文,避免使用压缩功能,属于是一举多得的好办法。

把所有综合起来,形成固定打法

于是就可以得到这样的工作流程,每当需要进行一个任务时候:

  1. grill-with-docs 或者 grill-me 跟 AI 讲述我的想法。然后不断被 AI 提问,并最后将讨论结果记录进文档中,可能是 PRD 文档也可能是 PLAN 文档,或者术语对照文档。
  2. 让 AI 拆分我这个任务进 TODO.md,直到我认为 TODO.md 中的每一个任务都足够简单,比如说「在这里提取出方法,然后暴露到模块中」。如果写清楚任务是一个麻烦事,但好在我找到一个好用的 Skill:to-issue.
  3. 让 AI 干活,然后去找奶茶喝。
  4. 让另一个 AI 对着 TODO.md 进行检查,然后我再点点点进行测试。
  5. 如果没问题就结束,如果有问题就回到第一步,跟 AI 说明 bug 让其修复。

并且时刻保持记住:避免使用压缩,多使用文档和新建会话来处理任务。

当然实际用的时候我并不会完全按照,例如我觉得修 bug 或者原来那个任务很简单的时候就不用切分了,不过大部分时候都是「新增一个功能」这类务都是需要切分的。

通过这样一个工作流,我和 AI 没那么容易产生冲突,也减少了吵架的危机。如果你也在跟 AI 吵架,也可以试试跟 AI 讲清楚、讲简单,给它质疑的机会。