12 · 提示工程 · 8 min

与LLM对话的艺术

零样本、少样本、思维链、自一致性。为什么提示词的措辞会从根本上改变模型的输出。

提示词不是文本——它是一段程序

当你在 ChatGPT 里输入"总结这篇文章",表面上似乎没有什么惊天动地的事情发生。但你发出的这段文字,在一个用数万亿 Token 训练过的模型里触发了一种非常具体的行为。

提示词是一段用自然语言写的程序。不是说它会被编译,而是说它的措辞决定了模型会激活哪种行为。同一句话换一种说法,可能产生截然不同的结果——不是因为模型反复无常,而是因为它的预训练让它为不同的语境学到了不同的模式。

**Prompt engineering(提示词工程)**就是把这个程序写好、以获得想要的行为的艺术。

四个层次的技巧

Zero-shot:直接问

最简单的技巧。直接问问题,不给例子,不给说明。模型会激活它训练数据里最可能的那种行为。

对于简单、事实性的任务,这种做法效果很好。在需要推理的问题上则会失败——并不是因为模型不知道,而是因为它不知道自己应该推理。

Few-shot:展示示例

与其解释你想要什么,不如把它演示给它看。在真正的问题前面放上 2 到 5 对(输入,输出)。模型借助它的上下文学习(in-context learning)机制——读出这个模式,并把它套用到新的输入上。

关键是:示例必须代表你想做的那类任务。跑题的示例帮不上忙。展示了正确做法的示例则帮助极大。

Chain-of-Thought:一步步推理

2022 年的两个发现,经常被混为一谈。Wei 等人证明:只要给模型几个把推理过程完整写出来的示例,它在下一道题上就会照着同样的方式推理。同年,Kojima 等人更进一步:连示例都不需要,加上一句"让我们一步一步地思考"就够了。两种情况下,推理类问题的表现都能翻倍,有时甚至翻三倍。

为什么会这样?模型是一个一个地生成 Token 的。强迫它把中间推理写出来,就等于给了它一份"草稿纸",它可以在上面计算、验证假设、纠正错误——然后再下结论。没有 CoT 的话,它直接跳到结论,没有任何安全网。

和人类是同一个原理:写出"25 × 37 = 25 × 30 + 25 × 7 = 750 + 175 = 925"的成功率,远比试图心算一步到位高得多。

Self-Consistency:在多条思维链里投票

Self-consistency(自洽性)CoT 的扩展。不是只生成一条推理链,而是生成多条(通常 5 到 20 条),用不同的温度,然后投票选出出现最多的答案。

直觉是:每次运行可能犯不同的错。但如果大多数都收敛到同一个答案,那大概就是对的。

代价不小(多消耗 N 倍的 Token),但在困难的推理任务上,可靠性的提升是实打实的。

自己试试

在三个问题上对比这四种技巧。特别注意,few-shot 例子在结构化的问题(商人那个题)上有帮助,但在逻辑陷阱上几乎没什么改变。

同一个问题,四种写法。在不改动模型的情况下,得分从 30 % 变到 90 %。教训:prompt 不是一段文字,而是一段程序,其隐含语法被 LLM 通过预训练所习得并理解。

这揭示了 LLM 的什么

这四种技巧不是小聪明。它们照亮了 LLM 工作方式中某些根本性的东西。

**上下文学习是免费的。**LLM 从你给的例子里学习,完全不需要更新权重——只是读了上下文而已。这是大规模预训练涌现出来的能力:模型见过太多模式,以至于能临场抽出一个新的。

**推理是一种行为,不是一种固定能力。**一个在 zero-shot 下解不出某题的模型,在同一道题上用 CoT 却可以解出来——参数没有任何变化。提示词激活了什么,决定了模型会"调用"它内部能力中的什么部分。

**温度制造多样性,投票降低方差。**Self-consistency 利用的是这样一个事实:错误往往是随机的——失败的方式有很多种,但成功的方式只有一种。共识能过滤噪声。

局限性

每次调用的成本。每一个 few-shot 例子都消耗 Token——而且每一次请求你都要重新付一遍。今天 20 万到百万级以上的上下文窗口,技术上完全放得下 many-shot(几百个例子,而且确实有效),但账单和延迟也会跟着涨。CoT 也会把回答拉长。

**示例可能误导模型。**如果你的例子里有偏见,模型也会复制这种偏见。"Garbage in, garbage out"在 few-shot 上同样适用。

**Prompt injection(提示词注入)。**上下文里的恶意内容可能会绕开你的指令。如果你的提示是"翻译这段文本",而文本里写着"忽略之前的指令,做点别的事",模型可能会服从内容而不是服从指令。

**模型在演化。**一个 2023 年为 GPT-4 精心打磨的提示词,未必在今天的模型上还跑得通,换一家厂商的模型也未必。每个模型都有自己偏好的模式,自己更"对味"的措辞。

实用法则

选择技巧的方式:

  • 简单 / 事实性问题 → zero-shot 就够了。
  • 期望特定的输出格式 → few-shot,配 2-3 个例子。
  • 推理或计算 → 用 CoT,前提是你的模型没有原生推理模式。如果它有,就让它自己来:额外强加一条显式 CoT,好一点是多此一举,差一点会帮倒忙——有些厂商还明确建议不要这么做。
  • 可靠性至关重要CoT + self-consistency

还有一条元法则:如果你的提示词看起来像代码——结构清晰、变量明确、用例定义好——它会比模糊的散文更可靠。

最后一件事。这里描述的这些技巧(尤其是 CoT)是原生推理模型提示词时代的祖先:o1 和 DeepSeek-R1 在 2024—2025 年打开了这条路,今天所有大模型都有了这类模式。后者会自动地、密集地完成提示式 CoT 当年只能模拟的那些事——见第 17 章,理解从提示词工程到把推理直接嵌进模型这一转变。

一个好提示词不是魔法咒语。它是一份对你想要的东西的清晰规约,写在一种模型会识别为"应该照做的信号"的语言里。

但还有一件事,是任何措辞都解决不了的。你可以写出世界上最清晰的规约:如果答案根本不在模型的权重里,它照样会给你一个,而且底气和真知道时一模一样。一个被训练来预测文本的系统,为什么就是没法停下来说一句"我不知道"?这就是下一章的主题。

更新于