和 AI 讨论这篇文章
ChatGPTClaude

模型越强,越得先把要什么说清楚

这几个月我干活的方式,基本是把事情交代给 agent 去做,自己不太动手。交代得多了,有个感受越来越明显:模型越强,你说不清楚自己要什么的代价越大。

你说错,它就非常高效地按你说错的方向去做,做得又快又完整,一路做到底。它不会帮你把话补严实,你要求里含糊的地方,它全给你放大。这个问题其实一直都在,只是以前模型自己也做不好,暴露不出来,锅还能甩给模型。

所以这一代模型出来之后,我发现真正要升级的是我跟它交代事情的方式。这套方法不复杂,也谈不上多原创,大概一半来自 Anthropic 一个工程师最近写的文章,一半是我自己踩坑踩出来的。但它确实管用,把我从反复返工里捞了出来,值得完整讲一遍。

先讲我自己翻车的事。上个月我废了两篇已经写完的稿子,两篇播客反应文,AI 写的。稿子单看手艺挑不出毛病:结构工整,论据齐全,中文也通顺。但我越读越不对劲,这两篇读起来太像产品软文了,跟我博客想要的方向完全不是一回事。最后整篇报废,一个字没用上。

关键是 AI 一步都没做错,素材和要求它都老老实实照办了。问题出在我给的要求里,根本就没有「别写成软文」这一条。我自己也是读到成稿那一刻才意识到,原来我心里一直有这条要求,只是它理所当然到我从来没说出口。

后来我琢磨这个事,发现它不是个案,是一类通病。你跟 agent 干活,给它的所有东西——prompt、context、规则文件、参考资料——凑起来是一张地图。而活真正发生的地方——你的 codebase、你的业务、你脑子里那些自己都没察觉的偏好——是疆域。军事学里有句老话,叫地图不是疆域,放在这儿正好。

拿写代码举个例子。你说「给系统加一个第三方登录」,这句话在地图上就一行。疆域里的东西多得多:老的认证模块当年是怎么设计的,已有用户的登录状态怎么迁移,企业客户是不是还依赖某个旧行为,登录页要不要跟着改。这些你一个字没提,但每一条都决定成品对不对。

地图和疆域之间差的那一块,Anthropic 那篇文章管它叫 unknowns。我更愿意叫空白:就是你没画、agent 路过的时候只能靠猜的地方。

地图与疆域地图与疆域

那它撞上空白为什么不停下来问你?这得从 agent 干活的方式说起。agent 没有跨 session 的记忆,每次开工都是从头开始,你给它的地图就是它眼里的全部世界。而它受的训练是把活干完,不是把你问烦。所以走到没画的地方,它的本能是按训练里见得最多的走法接着走。这么猜,十次里大概有八次说得过去,但落到你的具体场景里对不对,全看运气。活越大,路过的空白越多,猜错的地方就越攒越多。

想明白这一层,「prompt 到底该写多细」这个老争论就好理解了。写太死,它明明看见了更好的路,也只会闷头执行你的错误指令;写太松,它就拿行业里通行的做法给你填空,通行做法到你这儿往往不合身。两种写法栽的是同一个地方:你不知道自己的地图哪里没画。

那空白怎么找?Anthropic 那篇给了个拆法,分四格。这个四格最早是拉姆斯菲尔德在记者会上讲出来的,被群嘲了很多年。当年嘲得冤不冤我不知道,但我只能说,放到 AI 协作上,这个框架是真的好用。

四种空白四种空白

第一格,你知道自己知道的。就是已经写进 prompt 的那些,不用管。

第二格,你知道自己不知道的。比如要做个功能,数据结构还没想好,你心里清楚这儿有个坑。

第三格,你不知道自己知道的。这格最麻烦。有些要求你从来不会写出来,因为太理所当然了,理所当然到你根本不觉得那是个要求,可成品一旦犯了,你一眼就能认出来。我那两篇报废稿就死在这格:「别写成软文」在我心里理所当然到从来没说出口。taste(品味)这类东西基本全在这格,说不出来,但看到就认得。

第四格,你不知道自己不知道的。刚进一个新领域,该问什么不知道,「好」长什么样也没概念。

四格对应四种做法,不能用错格,这是我踩完坑之后最大的体会。具体是这样的。

  1. 让 agent 反过来采访你。

治第二格。你知道有些事没想好,又懒得一条条自己捋,那就别捋了,直接跟它说:动工之前你先采访我,一次问一个,把没说清的地方都问出来。

关键是要加一条过滤:只许问那些答案会牵动架构的问题。不加这条,它能问出二十个客气但不痛不痒的问题,把你烦死。加了这条,问出来的基本个个扎在要害上。哪些数据要存下来、用户销号了记录怎么办,这种答错方向就得推倒重来的问题,才值得在动工前占用你。

我常用的原话,可以直接抄:

动工前先别动手。你来采访我,一次问一个问题,把需求里含糊的地方问清楚。只问那些答案会牵动数据模型、接口约定、权限边界、迁移方案或用户可见行为的问题,命名和实现细节你自己定,别来问我。每答完一个,先更新你对整个方案的理解,再问下一个。

  1. 先打样,再开工。

治第三格,就是 taste 那格。既然说不出、只认得出,那就别逼自己说了,让它先出两三个方向完全不同的小样,你来挑。写文章,先出三个不同角度的开头,各两百字;做界面,先出四版路子完全不同的静态稿。挑中了,再往下做全套。跟印刷厂一个道理,先打样给客户过目,客户点头才开印,没有人直接开印一万册。

两百字的开头废三个,成本约等于零;四千字的成稿废两篇,就是我上个月的下场。同一个问题在小样里暴露,比在成稿里暴露便宜二十倍。

这篇文章自己就是这么写的。动笔前我让 claude 出了三个开头——翻车实录、概念科普、反直觉判断——各两百字,我挑了第三个,就是你现在读到的这个。

prompt 骨架长这样,照着改:

先别写全文。给我出 3 个方向差别很大的开头,每个两百字上下,各配一句话说明这个方向图什么。我挑一个,你再展开。

  1. 盲区扫描。

治第四格。刚进新领域,连问题都提不出来,那就先别干活,让它先给你画一张这个领域的地图:

我要做 X,这个领域我是外行。先别动手。帮我做一次盲区扫描,列出我多半没意识到的坑、我该问但不知道要问的问题,还有「好」在这行长什么样。按风险和回头成本排序,每条给出具体出处或代码位置,别给我一篮子空话。最后教我怎么给你提需求。

Anthropic 那篇文章里有个例子我记到现在,讲得挺好的。作者剪视频,觉得画面发灰,知道该调色,但不懂调色。他第一反应是让 claude 调几版让他挑,结果挑不动——他根本不知道好的调色长什么样,打样这招直接失灵。后来换了个问法,让 claude 先给他讲调色的基本门道,学明白了再挑,一下就顺了。

这个例子点破了一个容易搞混的地方:第三格和第四格的做法不通用。挑小样的前提是你认得出好坏;认不出,就先补课,把第四格的问题变成第三格的,再按第三格来。补课花你半小时,听着亏,其实比闷头重做三遍便宜多了。

  1. 拿参考物说话。

这条算前面几招的补充,但值得单独讲。有些东西你形容半天,不如直接指给它看。想要某个库的重试逻辑,别形容了,把那个库的源码指给它,让它读完照着做;想抄某个网站的设计感觉,别说「高级一点」「干净一点」,把网站丢给它,让它去读底下的代码。还有一点很多人没意识到:源码比截图好用,源码里带着结构信息,截图只有一个样子。

vendor/rate-limiter 这个库的退避重试就是我要的行为。读它的源码,把同样的逻辑在我们的 TypeScript 客户端里照着实现一遍。

四格对症下药四格对症下药

那是不是把前期功课做到极致就行了?也不是。问也是有成本的,而且越问收益越低。问到第五轮,它问出来的问题你自己都答不上来,再问下去就是互相折磨。

我自己的收手标准是:「做没做对」一旦能交给一条测试、一个脚本、一次 lint 来判断,就立刻收住,开工。到了这一步,让它干完直接跑检查,比你继续用嘴形容快得多。这块我在让 Agent 自己证明它做完了里写透了,验收这套搭得越硬,前期要说清的就越少。

另一个变化也在往同一个方向压:生成越来越便宜,「做三个再挑」会越来越多地赢过「问清楚再做一个」。taste 类的活尤其是这样,小样反正不值钱,多打几个样,比多聊三轮天划算。

干长活还得加一个动作。前面这些招全用在动工之前,但有些空白是干到一半才冒出来的:写到一半发现现成的架子装不下,测试跑起来才发现老逻辑里藏着没人知道的依赖。这种时候别指望 agent 停下来等你,给它立个规矩,一边干一边记偏航日志:

干活过程中记一本偏航日志。凡是实际代码跟计划对不上、你替我做了取舍、或者跳过了哪个边角情况,都记下来,写清发现了什么、牵扯到什么、你选了哪条路、哪里等我拍板。命名格式这类小事不用记。记完拣稳妥的路接着走,别停下来等我。

干完我翻一遍日志,五分钟就知道它在哪些地方替我拿过主意,比从头读改动快得多。真出了问题,也能查出来是从哪一步开始偏的。

最后说一条最要紧的,Anthropic 那篇没讲到:同一个坑别踩第二遍。

你用两篇报废稿换来「别写成软文」这条要求。接下来的分岔在于,这个教训是留在你脑子里,还是写进系统里。留在脑子里,换个话题、换个新对话,同一个坑多半还得再踩一遍。前面说过,agent 每次开工都是从你给的地图重新认世界,你不写下来,它就永远不知道,每个新 session 都不知道。

我的做法是当场写下来。那次报废之后,「别写成软文」进了我博客的配置,成了一条硬规矩,每篇新稿自动管着。「先打样」也一样,我把它写成了写作流程里的固定步骤,新文章不出三个开头不许写全文。地图每补一块,以后每次开工都能用上。

同一个坑只交一次学费:教训留在脑子里会再踩一遍,写进规矩以后都绕开同一个坑只交一次学费:教训留在脑子里会再踩一遍,写进规矩以后都绕开

再往前想一步。差距既然是疆域比地图多出来的那部分,缩小差距就有两条路。一条是每次干活把地图画细一点,这篇讲的全是这个。另一条更底层:把疆域本身修规整,让它天生好画——codebase 的目录一看就懂,约定一搜就到,规矩写在 agent 每次必读的地方。这些活干一次,以后每次都受益。这条路我单独写过一篇代码仓库是给 Agent 的 API,跟这篇正好是一体两面。

整套东西收一下。第二格用采访,让它一个一个问出来;第三格用打样,先挑再做;第四格先补课,补完当第三格用;形容不清楚的,直接甩参考物给它。验收一旦能交给机器判断,就收住开工。踩了坑,当场写进规矩,别留在脑子里。

反正我现在的感受是,「知道自己要什么」变成了一个要专门练的 skill。模型放大你的含糊,也一样放大你的清楚,你交代得越明白,它就做得越到位。至于你不知道自己要什么的那部分,前面也说了,可以让它帮你问出来。我现在踩到新的坑,第一反应就是回去把规矩补进配置里,补完这一步才算干完。

和 AI 讨论这篇文章
ChatGPTClaude
AI 随想第 28 篇 · 共 28 篇
← 上一篇下一篇 →

订阅更新

新文章发布时发到你的邮箱,不发别的。


© Xingfan Xia 2024 - 2026 · CC BY-NC 4.0