只要学得够慢,就不用学了

上一篇讲了编程的三个时代:人工编写、机器学习、自然语言。既然自然语言成了新的编程语言,人人都成了施法者,大家肯定迫不及待想练一把咒语。然而 AI 时代有个笑话:“只要你学得够慢,你就不用学了。”还有一个类似的流行语:“一觉醒来,错过好多;一年过去,什么也没错过。”

从“学了再说”到“用到再学”

这些话其实在方向上对了一半。变化快、用到时又容易查的细节,可以晚点学。

编程语言里有一种概念叫惰性求值:表达式先不算,等到真有人要用它的值再算。Haskell 靠这个能表示一个无穷长的列表,只取用其中需要的部分。机器学习里也有一个概念叫惰性学习:基本的 k 近邻算法把样本存着,不预先拟合一个参数化的预测模型,等查询来了再比对。在 AI 时代,值得学的东西太多,学东西又变得很快,我们理应也这样学,尤其是下面几类知识:

  1. 近期未必用得上,真用到时又容易查、容易学;
  2. 当前任务只需要弄清输入输出,可以暂时当黑箱;
  3. 更新很快,提前熟记的细节可能到时候又得重学。

随着技术的进步,查和学的成本变了。2011年 Science 上的研究发现,预期以后还能访问某条信息时,受试者对信息本身的回忆较差,对存放位置的记忆反而更好。我们会把记忆的一部分交给外部系统。AI 又往前走了一步:除了帮你找,还能按你的问题解释、举例、陪你试。

很多人对这类知识有收集癖。我怀疑这里有一点应试教育留下的惯性:太多人都只关注一个东西对闭卷考试有没有用,但现实是一场开卷考试。过去我们经常是 “just in case learning”——学了再说;现在则应该是 “just in time learning”——用时再学。就像某些 JIT 编译器的做法,哪段代码跑热了,再集中优化哪段。等发现学了以后可以提升自己的工作效率,再学也不迟。

原理性知识更保值

也有知识值得早点学,因为它会反复帮你判断新问题。你不需要会推导 Transformer,但有几个心智模型,建了就一直管用。

模型看到的字跟你看到的不一样。 它先把文字切成一块一块的 token——有时是一个词,有时是半个词。strawberry 在你眼里是十个字母1,在模型眼里可能是两三个 token。这就是为什么早期模型数不清里面有几个 r:它的颗粒度跟你不一样。不过这不是天花板——切法本身没有丢信息,新模型完全可以学会更好地处理这类问题。别把某一代模型的短板,当成所有模型永远跨不过去的坎。

流畅不等于正确。 语言模型的基本训练目标是“给定前文,预测下一个最合理的 token”。靠这个目标,它能学到大量知识和推理模式,但训练过程没有附送一个事实核验器。所以它说得越顺,你越该多问一句:这个说法我能验证吗?

“我明明说过了”——但它可能已经看不见了。 每个模型有一个上下文窗口,一次能看多少内容是有上限的。聊到后面,最早的几轮对话可能已经滑出窗口。你觉得对话记录还在,但对模型来说那段话已经不在视野里了。另外,聊天时模型的权重不会即时更新——它能从你这轮给的例子里学到一条规则,但关掉对话就忘了,除非产品另有记忆功能帮你存。模型的知识截止日期约束的是训练时学到的东西,不妨碍它读你刚贴进去的材料。

2017年那篇 Attention Is All You Need 到现在,模型变化巨大,但 token、上下文窗口、训练和推理的区别这几个概念仍然有解释力。判断一条知识值不值得长期学,我会看它能不能解释多个现象,能不能在换了工具之后继续帮我作判断。原理也会被修正;一个好的 mental model,还应该让你知道自己的判断在哪些地方靠不住。

系统提示词与用户提示词

先说 ChatGPT、Claude 这类 chatbot。你在对话框里输入“帮我列个提纲”“这段再短一点”,就是用户提示词(user prompt)。产品还会在背后提供系统提示词(system prompt),交代助手的基本身份、行为规则等。打个比方,把模型当作临时工:系统提示词像公司规矩,用户提示词是你交给他的具体事情。如果你对更完整的提示词写作指南感兴趣,可以参考社区维护的已经泄漏的系统提示词。题外话,我觉得用户应该对这些影响信任的信息享有知情权,就像主流通用编译器几乎都是全面开源的。

日常聊天,直接在对话框里说需求就行。同一段对话里,之前的消息通常也会作为上下文参与后续回答,不必每轮从头交代。如果有经常重复的偏好,例如“用中文回答,技术术语保留英文”,可以存进 ChatGPT 的自定义指令。只适用于某一组对话的背景和要求,则可以放进 Claude 的项目知识和项目指令。

这些是产品提供的个性化入口,并不等于直接编辑厂商的系统提示词。对使用者来说,先把眼前的事情说清楚就够了;哪句话反复要说,再把它存起来,省得每次重复。系统提示词优先级总是高于用户提示词。

agent 里的提示词分布则更加复杂,之后介绍的时候再说。

角色提示词已经只是 cosplay 了

理解了这层分工,再看那些流行的提示词技巧,就容易判断哪些工作还需要我们来做。

斯坦福 2025年秋季的 CS146S: The Modern Software Developer 的课件上写着 Use role prompting aggressively to make system prompts more powerful。所谓角色提示词,就是开头先来一句“你是一位顶级前端专家”。很多人把它当作固定起手式,好像少了这句,模型就不知道怎么写前端了。

在 Fable 5.1 / GPT-6 Astra 这一代经过充分后训练的助手模型上,我的默认做法是直接交代任务,省掉这句起手式。认真理解问题、运用相关知识、尽量给出有帮助的回答,本来就是厂商在训练的行为。把模型塑造成一个好助手的工作,已经有很大一部分在它交到用户手里之前完成了。

厂商通过指令微调和 RLHF等后训练方法,用回答示范和偏好反馈来调整模型,让它更好地遵循请求、帮助用户。“当一个有帮助的助手”已经成为模型学到的默认行为,不需要用户在每次对话里从头教起。Anthropic 的 persona selection model也提供了这样的理解:后训练塑造和完善了 Assistant 这个角色。

不额外指定人设时,你面对的也已经是一个被专门塑造过的助手。“帮我写一个 React 网页”这份任务本身,也已经提供了前端开发的情境。一句“你是顶级前端专家”能带来多少额外价值,要看它在这个基础上又补充了什么,而不能只看它是否让输出发生了变化。

这就是我省掉通用人设的理由:它想提醒模型做的事,很可能已经包含在默认助手的行为和任务要求里。这里的“调好了”,指以帮助用户为目标、面向广泛任务优化过的默认行为;具体任务做得好不好,仍然要看结果。因此,我会先直接说任务,发现不足再补充要求,而不是把“你是专家”当作必需品。

要是我希望它“像面试官一样一次只问一个问题”,或者“从无障碍审查者的角度检查这个网页”,情况就不同了:我在指定这次合作的方式或检查范围。这些信息未必能从“帮我做个网页”里推出来。角色仍然可以是这种要求的简写;真正有用的是它补充的任务信息。

已有实验也提醒我们,不必迷信头衔。Zheng 等人的研究于 2023年首次公开、2024年定稿:研究者把 162个人设放进系统提示词,在四个模型家族的九个模型、2,410道 MMLU 选择题上做对照,没有发现添加人设能稳定提高总体准确率。这项研究没有测试 Fable 5.1 这一代模型,不能代替对它们的评估;它检验的是“加个人设就能变强”这个常见假设。

CS146S 课件上的例子,我用 Fable 5.1 照着试了一遍:同一道题(最长回文子串),交给两个人设。

Gen Z digital bestie —— 对话记录

A helpful assistant that loves programming at the level of a senior software developer —— 对话记录

这一次,两边都把程序写对了,也都顺手提醒我有更高效的 Manacher 算法;最明显的差别在语气词。

这一次看起来很像 cosplay,或者说 VTuber,皮套换了,人没换。

滥用角色扮演本质上只是一种偷懒。你没有把任务的具体需求想清楚,指望靠一个通用角色来代替。这和高考作文开头引一句名人名言一样,光有一个气势,却没有什么独特的信息量。

至于一句人设为什么会改变模型的行为,等到深入讲 LLM 原理时,我会另写一篇《为什么人设会改变行为》,把条件概率、attention 和角色表示拆开来讲。

有一种失效叫招安

2022年有篇论文发现,加上 “Let’s think step by step” 这样的提示,能把当时模型在 MultiArith 上的正确率从 17.7% 提高到 78.7%。如果一句话这么好用,这么泛用,那它就应该出现在系统提示词里。果然后来出现了会在内部进行推理的模型,OpenAI 的建议反而是不必再加这句话。曾经需要人手动提醒的动作,变成了模型的默认行为。

Zero-shot 和 few-shot 能更清楚地说明这个区别。直接让模型把“今天天气很好”翻成英文,不先提供翻译示范,就叫 zero-shot(零样本提示);先给几组中英对照,再让它翻译新句子,就叫 few-shot(少样本提示)。这里的“样本”指提示中的任务示范,不是模型训练时看过的资料。GPT-3 的论文标题就叫 Language Models are Few-Shot Learners。

随着模型更擅长直接理解指令,一些任务可以先不贴例子,看看它能不能做好;但 few-shot 远没有因此过期。某种特定的语气、某种嵌套三层的 JSON 结构、某个边界情况到底该输出空数组还是报错——这些地方,贴一条样例可能比写一千字的说明更省事。Show, don’t tell,写作里很老的技巧。

这些提示词技巧仍然有效。恰恰因为足够通用,它们才会随着技术进步,被吸收到模型内部、系统提示词或官方 harness 里。所谓“失效”,是用户不必再手动提醒。

模型厂的工作和我们的工作

Naval 2026年2月在播客A Motorcycle for the Mind里说得更直白:他不热衷学那些“这样 prompt、那样搭 harness”的技巧,因为他相信技术适应他的速度,比他适应技术更快;在他看来,那些 workflow 和工具的寿命“以周计,顶多以月计,不以年计”。不过,他也留了一个例外:如果你眼下就在做前沿产品、需要每一点竞争优势,那就值得学。到 5月他讲了写代码的版本:不追 Ralph Wiggum、OpenClaw、plan mode 那些建议,把 Codex、Claude、Gemini 扔到同一个问题上反复跑,“浪费 token,节省时间”。

沿着 Naval 的思路,我愿意把用 AI 时花的功夫分成两类:their job 和 our job。Their job 是模型和工具开发者正在改进的事——让模型更会推理、更可靠地使用工具、更能适应人的说话方式。如果一个技巧只是替模型补短板,它的价值就可能随着模型升级而下降。当然,今天能帮你把活干好,今天学就有意义。Our job 是另一类。Naval 说他不学那些技巧,但紧接着那句是:

I just can speak English. And for someone like me who is relatively articulate with English and also has a structured mind, and I know how computer architectures work, and I know how computer programs work, and I know how programmers think, then I can actually very precisely specify what I want just through structured English.

这本身就是最强的提示词技巧:清楚的自然语言、结构化的头脑、知道机器怎么工作、知道程序员怎么想,然后把要什么精确地说出来。Naval 不是没有技巧,而是他的技巧在 AI 出现之前就练好了。他之前的表达、编程和判断的积累,不仅没有贬值,在 AI 时代还变得更有价值了。

真正属于自己的提示词技巧是写作

弥补模型短板的技巧,会随着模型换代而变得不再必要;把任务本身的信息表达清楚的能力,则永远不会过时。

把模型当成中介公司派来的临时工。这人极其聪明,读过很多书,会写很多语言。但他今天早上才到你公司,不知道你们做什么产品、给谁用、组里有哪些不成文的规矩、上次事故是怎么出的。对于他已经熟练的事,你不必从 for 循环教起;要花心思的是把这个项目特有的背景交给他。

提示词不必一开始就写得面面俱到。好的提示词技巧不止要 LLM-friendly,更要 human-friendly。如果每次开工都要先写一份完整规格,任务还没动,人可能就退缩了。评价一种提示词方法,也该把人的启动成本算进去。

《微习惯》主张把每天要求自己做的行动缩得很小;福格行为模型也强调,可以通过降低行为的难度,让行动更容易发生。借用这个思路,和 AI 合作的第一步也可以很小:先把想做的事说出来,没想清楚就让它帮着问、帮着试。

有了第一版,再看结果、补要求。写作有改稿,和 AI 合作也一样。我们关心的,应该包括人能不能轻松开始、把事情逐步做完,而不只是第一条提示词能让模型答得多好。

真要学提示词,我会先看模型厂商的官方指南:说清任务、交代背景、必要时给个例子。这些基本功更值得长期积累。官方的具体建议也会变,用到时再查最新版、看实际效果就好。AI 的通用性还意味着,你可以用 AI 来学习 AI。不知道怎么提问,就让它帮你理清问题;拿不准某件事值不值得投入时间和精力去学,也可以问 AI。你不必先把“如何使用 AI”学完,才开始使用 AI。

Let them do their job, and we do ours.

延伸阅读


  1. 写本文初稿时,笔者想重复这个实验。结果 AI 把 r 数对了,是3个,却把字母总数说成了9个。 ↩︎