思维链(Chain-of-Thought,CoT)提示词要求模型在给出最终答案之前,先把推理过程写出来。这一想法由 Google 的 Wei 等人在 2022 年提出,他们表明,带有中间步骤的解题示例可以提升算术和逻辑问题上的结果。
为什么写出步骤会有帮助
语言模型每次生成一个 token,并以此前的全部内容为条件。如果它必须立刻作答,答案就是在没有任何中间工作的情况下预测出来的。如果它先写出步骤,这些步骤就成为预测答案所依据的上下文的一部分。在纸面上推理,就是工作记忆。
零样本思维链
最简单的形式是加一句指令,要求先推理。
A warehouse ships 240 orders a day. 15% need gift wrap, which adds
4 minutes each. How many staff hours a day does gift wrap take?
Work through the problem step by step, then give the final answer
on its own line as "Answer: <number> hours".
有两个细节很重要。要求在答案之前给出推理,并为答案设定一个固定的标记,方便你的代码找到它。
少样本思维链
这里的示例除了结果,还展示了推理过程,模型便会模仿这种方法。
Q: A plan costs $12 a month or $120 a year. How much does the yearly
plan save over 2 years?
Reasoning: Monthly for 2 years is 12 x 24 = $288. Yearly for 2 years
is 120 x 2 = $240. The difference is 288 - 240 = $48.
Answer: $48
Q: {{question}}
Reasoning:
当任务有你希望被遵循的特定流程时,就用这种方式。
结构化推理
对于由代码读取的答案,用标签或字段把思考与结果分开。
Think through the eligibility rules inside <reasoning> tags.
Then give the decision inside <decision> tags as "approve" or "reject".
在 JSON 中,把推理字段放在结论字段之前。字段是按顺序生成的,所以位于结论之后的推理无法影响结论。参阅结构化输出提示词。
推理模型改变了建议
许多当前的模型在响应之前会在内部推理,通常由名为 thinking、reasoning effort 或 extended thinking 的设置控制。对于这些模型:
- 不要再加“一步一步地思考”。 它们本来就在这样做,这条指令可能让输出变长却不会更好。
- 描述目标和约束,让模型自己选择方法。
- 用服务商提供的控制项来决定花费多少推理,而不是靠提示词的措辞。
- 当需要有人核对答案时,仍然要求在输出中给出简短的理由。
对于不在内部推理的更小、更快的模型,以及任何你需要在响应中看到推理过程的场合,显式的思维链仍然有用。
思维链何时有用,何时没用
| 任务 | 有用吗? |
|---|---|
| 多步算术或逻辑 | 有用 |
| 需要运用多条规则的决策 | 有用 |
| 调试:从症状找出原因 | 有用 |
| 简单的分类或提取 | 很少;还会增加成本 |
| 创意写作 | 没用 |
| 在提供的文本中查找某个事实 | 没用 |
成本是实实在在的:推理是输出 token,通常比输入 token 定价更高,还会增加延迟。
关于解释的提醒
写出来的推理是一种看似合理的说明,并不是答案如何产生的可靠记录。模型可能先得出结论,再写出一段听起来正确的理由。请把推理当作需要验证的东西,尤其是在决策会影响到人的时候。
自洽性
自洽性由 Wang 等人在 2022 年提出,建立在思维链之上。启用采样,把同一个推理提示词运行多次,使路径各不相同,然后取出现次数最多的最终答案。
- 将 CoT 提示词发送 N 次(例如 5 次),温度设为大于零。
- 从每个响应中提取最终答案。
- 返回出现次数最多的答案。
不同的推理路径会犯不同的错误,但正确的路径往往会趋于一致。投票可以过滤掉偶尔的失误。
适用于: 问题只有一个可以精确比较的正确答案(数字、标签、是或否),并且准确率值得付出 N 倍的成本。
不适用于: 答案是无法投票的自由文本,或者单次调用已经足够可靠。如果票数平分,就把它当作问题有歧义或提示词规格不足的信号。
从推理到流水线
当问题的步骤事先已知,不要让一个提示词把它们全部推理一遍。给每一步一个单独的提示词,这就是提示词链。当步骤取决于模型必须去获取的信息时,把推理与工具结合起来:这就是 ReAct 提示词。
先检查提示词
推理无法修复一个不清楚的问题。目标含糊或规则冲突的 CoT 提示词,会认真地推理出错误的答案。在花 token 做推理之前,先用 PromptFlowEngine 提示词分析器过一遍。