← leozhang's notes

Prompt 是新的接口设计,不是新的搜索词

2026-04-30

用 LLM 写代码这件事最大的认知陷阱是把 prompt 当成"搜索框"——你输入一个想法,它返回一段实现,看上去工作流就该是这样。

但搜索框的契约是模糊的:你打几个关键词,搜索引擎用启发式凑出最相关的几条结果,你再人肉筛选。它不会按你想的方式去执行某种"流程"。

LLM 不一样。LLM 会把你写下来的每一句话**当作一份执行 spec**。你说"加个错误处理",它会就近找一处 try/except 包起来;你说"加个有用的错误处理",它会开始想"我应该捕获什么、log 什么、什么情况降级"。两个 prompt,两份完全不同的实现。区别不在搜索质量,而在你写的 spec 完不完整。

从"问"到"约定"

我现在写 prompt 的时候不再想"我要问什么",而是想"我要和一个会逐字执行的同事约定什么"。约定大概包含几层:

没写边界的时候我经常会得到"顺手把那个老方法重构了一下"——它技术上没错,但完全不是我要的那次提交。

边界比目标更重要

这是反直觉的一点。一开始我以为只要把"目标"写得越细越好,结果就会越准。后来发现真正影响产出质量的是负面边界——明确告诉它不要做什么。

因为模型默认是有"上进心"的:你给它一个待修的 bug,它会顺便清理它觉得丑的代码、补几个它觉得缺的测试、改几个它觉得不专业的命名。每一处单独看都"更好",合在一起就是一个不能 review 的 PR。

"修这个 bug,不要碰任何其他文件"——这句话的价值常常超过整个目标描述。

verify, don't trust the summary

第二个反直觉的事:模型告诉你"已完成"的时候,你别信它的总结,要看 diff。

这不是说模型在撒谎,而是它的总结是基于"我打算做什么"而不是"我实际写到文件里的是什么"。中间任何一步——文件没写成功、edit 应用错位置、改了之后又被覆盖——它的总结都不会更新。

这条规矩我吃过太多次亏才学会。现在 review AI 改的代码时,我先看 git diff,再读它的解释。

结果

把 prompt 当 spec 写之后,我的 PR 数量没变,但每个 PR 改回的次数明显少了。AI 不再是"快速地干各种你没想清楚的事",而是"严格按照你想清楚的事干"。后者更慢,但慢得有意义。