提示工程的目标,是有效地设计与改进提示词,从而在各类任务上从大语言模型(LLM)拿到更好的结果。
前面章节里的基础示例虽然有趣,但只是入门。这一章要讲的是更进阶的提示工程技术——它们让我们能完成更复杂的任务,并提升 LLM 的可靠性与性能。下面 18 种技术,大致可以按「需要什么能力」来分组阅读:从最朴素的零样本/少样本,到引导模型一步步推理的思维链家族,再到让模型连接外部知识、调用工具、甚至像智能体一样反思与行动的高级范式。
今天的大模型(如 GPT-3.5 Turbo、GPT-4、Claude 3)经过指令微调、在海量数据上训练,因此具备「零样本」完成部分任务的能力。
这种技术在做什么
零样本提示指的是:与模型交互的提示里不包含任何示例或演示,而是直接指示模型去完成任务,不给它任何范例来「带方向」。
它之所以行得通,靠的是大规模训练 + 指令微调。论文(Wei et al. 2022)显示指令微调能提升零样本学习能力——即用「以指令形式描述的数据集」去微调模型;此外 RLHF(基于人类反馈的强化学习)被用来扩展指令微调,让模型更贴合人类偏好,这正是 ChatGPT 这类模型背后的方法。
下面的情感分类里,我们没给模型任何「文本→情感」的范例,模型却已经理解了「情感(sentiment)」是什么——这就是零样本能力在起作用。
Classify the text into neutral, negative or positive. Text: I think the vacation is okay. Sentiment:
Neutral
尽管大模型零样本能力惊人,在更复杂的任务上它仍会力不从心。少样本提示通过在提示中放入演示来实现「上下文学习(in-context learning)」,引导模型给出更好的表现。
核心思路
少样本提示是在提示里放入若干「输入 + 期望输出」的演示(demonstration),这些演示作为条件(conditioning),为随后我们真正想让模型回答的样例「定调」。
据 Touvron et al. 2023 的观察,少样本能力是在模型规模扩大到足够大时才涌现出来的(Kaplan et al., 2020)。换句话说,它不是被显式训练出来的功能,而是规模带来的副产品。
经典做法是先给模型几对「文本—标签」示范,再把待分类的新文本接在后面;模型会顺着前面演示的格式与规律,把答案补全。
思维链提示由 Wei et al. (2022) 提出,通过中间推理步骤,赋予模型复杂推理能力。它可以与少样本提示结合,在「需要先推理再作答」的复杂任务上拿到更好结果。
标准思维链(Few-shot CoT)
在演示里,不只写出最终答案,还把得出答案的推理链条一并写出来。模型看到「这样推→所以答案是…」的范例后,会模仿这种「边推理边作答」的方式。
在「判断一组数里的奇数之和是否为偶数」任务中,演示里写明「把所有奇数(9,15,1)加起来得 25,所以答案是 False」。给了这种推理示范后,模型对新题也能算对。原指南还指出:哪怕只给一个这样的范例,往往也足够了。
作者强调:这是一种涌现能力(emergent ability),只有在足够大的语言模型上才会出现。小模型即便看了推理演示,也未必能复现这种链式推理。
零样本思维链(Zero-shot CoT)
Kojima et al. (2022) 提出一个更简单的点子:在原始提示后面加上一句「Let's think step by step(让我们一步步思考)」,就能在没有任何范例的情况下触发推理。
I went to the market and bought 10 apples.
I gave 2 apples to the neighbor and 2 to the
repairman. I then bought 5 more apples and ate 1.
How many apples did I remain with?
→ 输出:11 apples(错误)...How many apples did I remain with?
Let's think step by step.
→ 模型逐步:10 → 给出4个剩6 → 买5个=11
→ 吃1个 = 10 apples(正确)自动思维链(Auto-CoT)
手工编写多样且有效的 CoT 演示很费力,还可能不是最优解。Zhang et al. (2022) 提出 Auto-CoT:用 LLM 配合「Let's think step by step」自动逐个生成推理链作为演示。自动生成难免出错,因此关键在于「演示的多样性」来抵消错误的影响。
- 阶段一:问题聚类把数据集里的问题划分成若干个簇(cluster)。
- 阶段二:演示采样从每个簇里挑一个代表性问题,用零样本 CoT + 简单启发式规则生成它的推理链。
这里的「简单启发式」可以是问题长度(如约 60 个 token)、推理步骤数(如 5 步),目的是鼓励模型用简洁而准确的演示。
元提示是一种进阶技术,它聚焦于任务与问题的结构和句法层面,而不是具体的内容细节;目标是构造一种更抽象、更结构化的方式来与 LLM 交互,强调信息的「形式与模式」而非传统的「内容中心」做法。
五个关键特征
- 面向结构:优先关注问题与解答的格式、模式,而非具体内容。
- 句法导向:把句法当作「期望回答/解法」的模板。
- 抽象示例:用抽象化的示例作为框架,只展示问题与解法的结构,不纠缠具体细节。
- 通用性强:可跨多个领域使用,为各类问题提供结构化回应。
- 分类式方法:借鉴类型论(type theory),强调对提示中各组成部分进行分类与逻辑编排。
相比少样本提示的优势
Zhang et al. (2024) 报告,元提示与少样本提示的根本差别在于:元提示是结构导向,少样本是内容驱动。在 MATH 基准的解题示例中,二者形成鲜明对比。元提示的优势包括:
| 优势 | 含义 |
|---|---|
| Token 效率 | 聚焦结构而非细节内容,减少所需 token 数。 |
| 公平比较 | 弱化具体示例的影响,为比较不同解题模型提供更公平的方式。 |
| 零样本效力 | 可视为一种零样本提示——具体示例的影响被降到最低。 |
自洽性是较为进阶的技术之一,旨在替换思维链里那种朴素的「贪心解码」。思路是:通过少样本 CoT 采样出多条不同的推理路径,再用这些生成结果挑出「最一致的答案」。它能提升 CoT 在算术与常识推理任务上的表现。
📎 需先理解 思维链 CoT——自洽性是建立在 CoT 之上的「多采样 + 投票」增强。
- 多次采样推理路径对同一个问题,用带温度的采样让模型生成多条不同的「推理 + 答案」。比如一道年龄题,模型可能走出几条不同算法。
- 提取每条路径的最终答案从每条推理链末尾取出它给出的答案(如三条分别得 67、67、35)。
- 多数表决统计哪个答案出现得最多,把「多数答案」作为最终结果。原指南示例里 67 出现两次、35 出现一次,于是 67 胜出——而单次贪心解码恰恰可能错答成 35。
就像让一群学生各自独立解同一道题,然后看大家答案的「众数」。即使个别人算错,只要多数人沿不同思路殊途同归到同一个答案,这个答案就更可信——比只信任「第一个举手的人」稳健得多。
一个流行思路是:把知识/信息纳入提示,帮助模型做出更准确的预测。那么——能不能让模型在作答前先自己生成知识?这正是 Liu et al. (2022) 尝试的:生成知识,作为提示的一部分,尤其用于常识推理类任务。
它解决什么问题
分两步:① 先用模型针对问题生成若干条相关「知识」;② 再把这些知识拼进提示,让模型据此作答。
原指南举例:直接问「高尔夫的一部分是不是要比别人得更高的分?」模型会错答「Yes」,暴露了它在「需要世界知识」的任务上的局限。先让模型生成关于高尔夫规则的知识(高尔夫是用最少杆数完成、杆数越少越好),再据此作答,模型就能纠正为「No」。
原指南还观察到一个有趣现象:用不同的生成知识去引导,模型给出的两个答案置信度差异很大——一条知识让它非常自信地答对,另一条措辞略不同的知识则让它信心明显更低。这说明「喂什么知识」对最终判断影响显著。
为提升 LLM 的可靠性与性能,一项重要技术是把任务拆成子任务:用一个提示完成一个子任务,把它的输出当作下一个提示的输入,如此串成一条「提示操作链」。
为什么要把提示串起来
提示链:一个任务被拆成多个子任务,每一步对上一步的输出做转换或进一步处理,逐步逼近最终目标状态。
面对一个「事无巨细的超长提示」,模型常常处理不好;拆成链后不仅性能更好,还能提升透明度、可控性和可靠性——你能更容易地调试问题、定位并改进出问题的那个环节。它在搭建对话助手、提升个性化与用户体验时尤其有用。
回答关于长文档的问题时,可设计两个提示:提示 1 负责从文档里抽取与问题相关的引文(用 <quotes> 标签输出,若无则回「No relevant quotes found!」);提示 2 接收这些引文 + 原文档,据此组织出一个准确、友好、有帮助的回答。
- 提示 1:抽取引文给定文档与问题,先只做一件事——把相关引文摘出来,用
<quotes></quotes>包裹。 - 提示 2:据引文作答把上一步抽出的引文连同原文档喂进来,让模型基于这些证据写出最终答案。你甚至可以在链中再加一步去清理引文里的引用编号。
对于需要探索或具备策略性前瞻的复杂任务,传统提示方法力不从心。思维树(ToT)在思维链之上做了推广,鼓励模型探索「作为中间步骤的思路(thoughts)」来进行通用问题求解。
ToT 是怎么运作的
ToT 维护一棵思路树,其中每个「思路」是一段连贯的语言序列,作为解题的中间步骤。模型能通过「深思熟虑的推理过程」对中间思路自我评估进展;再把这种生成 + 评估思路的能力,与搜索算法(如广度优先 BFS、深度优先 DFS)结合,实现带前瞻与回溯的系统化探索。
论文用「Game of 24」做数学推理任务,需把思路拆成 3 步、每步一个中间等式;每一步只保留最优的 b=5 个候选。在 BFS 里,模型被要求把每个候选思路评估为「sure / maybe / impossible(确定能/也许/不可能到达 24)」,据此剪掉「太大/太小」的不可能解,保留有希望的分支(每个思路评估采样 3 次)。
论文报告 ToT 在这类任务上大幅超越其他提示方法。
两个版本的差异
Yao et al. (2023) 与 Long (2023) 的核心思想相似——都通过「多轮对话 + 树搜索」增强复杂问题求解。主要区别在于:Yao 用通用的 DFS/BFS/束搜索(不针对具体问题做适配);而 Long 提出一个由强化学习训练的「ToT 控制器」来决定何时回溯、回溯几层。后者能从新数据或自博弈中学习(类似 AlphaGo vs 暴力搜索),因此即便底层 LLM 固定,这套 RL 驱动的 ToT 系统也能持续进化。
把 ToT 当成一句提示用
Hulbert (2023) 提出 Tree-of-Thought Prompting,把 ToT 的核心思想浓缩成一个简单提示,让 LLM 在单个提示里就去评估中间思路。示例提示大意是:
Imagine three different experts are answering this question. All experts will write down 1 step of their thinking, then share it with the group. Then all experts will go on to the next step, etc. If any expert realises they're wrong at any point then they leave. The question is...
此外 Sun (2023) 对这种提示做了大规模实验,并提出 PanelGPT——让多个 LLM 像「专家组讨论(Panel discussion)」那样来提示。
通用语言模型经过微调可完成情感分析、命名实体识别等任务,这些通常不需要额外背景知识。但对于更复杂、知识密集型的任务,可以构建一个能访问外部知识源的系统——这能提升事实一致性与可靠性,并缓解「幻觉(hallucination)」问题。
RAG 是什么、怎么工作
RAG 由 Meta AI 研究者提出,把「信息检索组件」与「文本生成模型」结合。它接收输入,从某个来源(如维基百科)检索出一组相关/支撑文档,把这些文档作为上下文与原始提示拼接,再喂给生成器产出最终输出。
因为 LLM 的参数化知识是静态的。RAG 让模型无需重新训练就能接入最新信息:它可被高效微调、其内部知识可被高效修改,从而适应「事实会随时间变化」的场景,通过基于检索的生成产出更可靠的输出。
Lewis et al. (2021) 给出通用微调配方:用预训练的 seq2seq 模型作参数化记忆,用维基百科的密集向量索引作非参数化记忆(由神经预训练检索器访问)。
RAG 在 Natural Questions、WebQuestions、CuratedTrec 等多个基准上表现强劲;在 MS-MARCO 与 Jeopardy 问题上,它生成的回答更具事实性、更具体、更多样;在 FEVER 事实核查上也有提升。如今这类「检索器 + LLM(如 ChatGPT)」的组合越来越流行,用于提升能力与事实一致性。
把思维链与工具交错使用,已被证明是应对许多任务的强大且稳健的方法。但这类做法通常需要手工编写任务专属演示,并精心脚本化「模型生成」与「工具调用」的交错。ART 提出用一个冻结的 LLM 自动生成中间推理步骤(作为程序)。
ART 怎么运作
① 面对新任务,ART 从任务库里挑选多步推理 + 工具使用的演示;② 在测试时,每当需要调用外部工具,就暂停生成,把工具的输出整合进来,再继续生成。
ART 鼓励模型从演示中泛化,以零样本方式分解新任务、在合适位置调用工具。它还是可扩展的:人类可以直接更新任务库与工具库,来修正推理步骤里的错误或添加新工具。
在 BigBench 与 MMLU 基准的未见任务上,ART 显著超越少样本提示与 Auto-CoT;当引入人类反馈时,性能甚至超过手工编写的 CoT 提示。
📎 相关:ART 与 ReAct 都属于「推理 + 工具/行动」一类,区别在于 ART 更强调自动从库中检索演示并把推理写成可调用工具的程序。
APE 是一个自动生成与筛选指令的框架。它把「指令生成」这个问题,当作一种自然语言合成问题来处理,并用 LLM 把它当作黑盒优化问题来生成并搜索候选解。
- 生成候选指令一个充当「推理模型」的大语言模型,在给定输出演示后,生成一批针对该任务的候选指令。
- 执行并评分这些候选指令被「目标模型」执行,再根据计算出的评估分数,选出最合适的那一条。
「Let's work this out in a step by step way to be sure we have the right answer.」
这句话在 MultiArith 与 GSM8K 基准上提升了表现。
延伸:自动优化提示的相关工作
APE 触及了「自动优化提示」这一重要主题。原指南列出了几篇关键论文供深入:
| 方法 | 核心思路 |
|---|---|
| Prompt-OIRL | 用离线逆强化学习,生成「依赖具体查询」的提示。 |
| OPRO | 用 LLM 来优化提示;让模型「Take a deep breath」竟提升了数学题表现。 |
| AutoPrompt | 基于梯度引导的搜索,为多种任务自动构造提示。 |
| Prefix Tuning | 微调的轻量替代:为 NLG 任务前置一段可训练的连续前缀。 |
| Prompt Tuning | 通过反向传播学习「软提示(soft prompts)」。 |
思维链方法依赖一组固定的、人工标注的范例。问题是:这些范例未必是不同任务下「最有效」的例子。Active-Prompt 应运而生,用于让 LLM 适配到不同任务专属的范例提示(这些范例带有人工设计的 CoT 推理)。
- 初始查询用「带或不带少量 CoT 范例」的方式去查询 LLM,对一组训练问题各生成 k 个可能答案。
- 计算不确定性基于这 k 个答案计算一个不确定性指标(用「分歧度 disagreement」)。
- 挑最不确定的来标注选出最不确定的那些问题,交给人类去标注 CoT 推理。
- 用新范例推理把这些新标注的范例,用于推理每一个问题。
就像老师批改作业时,把精力优先花在「全班答案最五花八门、最拿不准」的那几道题上——给这些题写出标准解题过程,收益最大。Active-Prompt 让「人工标注」这种稀缺资源,花在模型最迷糊的地方。
Li et al. (2023) 提出这一技术,目的是更好地引导 LLM 生成期望的摘要(及其他输出)。
核心机制
训练一个可调的策略语言模型(policy LM),专门用来生成「刺激/线索(stimulus / hint)」。这个策略 LM 可以很小,经优化后去生成引导黑盒冻结大模型的提示线索。
和标准提示相比,这是把「越来越多地用强化学习来优化 LLM」的趋势落到实处——不直接改大模型,而是训练一个小的「向导」在它旁边轻声指路。
PAL 让 LLM 读懂自然语言问题,并把程序作为中间推理步骤生成出来。它与思维链的关键区别在于:CoT 用自由文本得到解,而 PAL 把求解这一步「卸载」给一个程序运行时(如 Python 解释器)。
它和 CoT 的根本差异
模型不再用文字「口算」推理,而是生成一段可执行代码;真正的计算由解释器完成,模型只负责把问题翻译成程序。
原指南用 LangChain + OpenAI 搭了个能算日期的应用。给模型若干「日期理解」范例后,问:「Today is 27 February 2023. I was born exactly 25 years ago. What is the date I was born in MM/DD/YYYY?」
# 今天是 2023/2/27,25 年前出生 today = datetime(2023, 2, 27) born = today - relativedelta(years=25) # 按 %m/%d/%Y 格式化 born.strftime('%m/%d/%Y')
这段 llm_out 的内容是一段 Python 代码片段,再用 exec 执行它,最终输出:02/27/1998。计算的正确性由解释器保证,而非靠模型「心算」。
CoT 像是让模型口头一步步算(容易在某一步算错);PAL 则是让模型列出算式后交给计算器——分工明确:语言模型擅长理解题意、把问题结构化成程序;解释器擅长精确执行。
ReAct 让 LLM 以交错的方式同时生成推理轨迹(reasoning traces)与任务专属的行动(actions)。推理轨迹帮助模型归纳、追踪、更新行动计划,甚至处理异常;行动步骤则让模型能与外部源(如知识库或环境)交互、获取信息。
📎 ReAct 融合了 思维链 与工具调用。原指南指出:最佳做法是把 ReAct 与 CoT 结合,从而同时利用模型的内部知识与推理中获取的外部信息。
它为何能改善表现
纯 CoT 虽能做算术和常识推理,但无法访问外部世界、也无法更新自身知识,容易导致事实幻觉与错误传播。ReAct 让系统能动态推理来「创建、维护、调整行动计划」,同时与外部环境(如维基百科)交互、把额外信息纳入推理。一句话:检索信息支撑推理,推理又指引下一步该检索什么。
面对 HotpotQA 这类问题,模型会生成「Thought(思考)→ Act(行动,如 Search/Lookup)→ Obs(从环境得到的观察)」的求解轨迹,循环往复直到 Finish 给出答案。
Thought 1 我需要搜索「Colorado orogeny」,找出其东段延伸到的区域… Act 1 Search[Colorado orogeny] Obs 1 Colorado orogeny 是一次造山运动… Thought 2 它没提到东段,我需要查「eastern sector」 Act 2 Lookup[eastern sector] Obs 2 东段延伸进 High Plains,称 Central Plains orogeny ... (反复 思考→行动→观察) Act 5 Finish[1,800 to 7,000 ft]
实验结论
- 知识密集任务(HotpotQA / Fever):ReAct 普遍优于「只行动(Act)」;在 Fever 上超过 CoT,在 HotpotQA 上略逊于 CoT。
- 原因分析:CoT 易出事实幻觉;ReAct 的结构约束降低了推理步骤的灵活性,且高度依赖检索质量——无信息量的搜索结果会带偏模型。
- 把 ReAct 与「CoT + 自洽性」结合、并允许在两者间切换的方法,整体表现最好。
- 决策任务(ALFWorld 文字游戏 / WebShop 购物环境):ReAct 优于 Act——没有「思考」的 Act 无法正确把目标分解为子目标;但当前基于提示的方法离人类专家水平仍有差距。
实践中,LangChain 已内置 ReAct 框架,可把 LLM 与各种工具(如搜索 API、计算器)组合成执行任务的智能体。
Reflexion 是一个用语言反馈来强化「基于语言的智能体」的框架。按 Shinn et al. (2023) 的说法,它是一种「言语(verbal)强化的新范式」,把策略参数化为「智能体记忆编码 + 所选 LLM 参数」。
高层来看,Reflexion 把来自环境的反馈(自由语言或标量)转化为语言反馈,即「自我反思(self-reflection)」,作为下一轮(episode)里 LLM 智能体的上下文。这让智能体能快速有效地从过去的错误中学习,在许多高级任务上提升表现。
三个组成模型
为 Actor 的输出打分:输入一条生成轨迹(短期记忆),输出一个奖励分数。不同任务用不同奖励函数(决策类任务会用 LLM 与基于规则的启发式)。
由一个 LLM 担任,生成「言语强化线索」帮助 Actor 自我改进。它结合奖励信号、当前轨迹与持久记忆,产出具体、相关的反馈并存入记忆;这些存于长期记忆的经验被智能体用来快速改进决策。
简言之,Reflexion 的关键步骤是:a) 定义任务 → b) 生成轨迹 → c) 评估 → d) 反思 → e) 生成下一条轨迹。它通过引入自评、自我反思与记忆组件,扩展了 ReAct 框架。
效果
实验显示 Reflexion 在多类任务上显著提升:决策类(AlfWorld,ReAct+Reflexion 用自评技术完成 130/134 任务,大幅超过 ReAct)、推理类(HotPotQA)、编程类(Python 的 HumanEval,以及 MBPP、Rust、Leetcode Hard 上多达 SOTA)。
什么时候该用 Reflexion
- 需要从试错中学习:适合决策、推理、编程等可通过反思过往错误来改进的任务。
- 传统 RL 不切实际时:它无需微调底层语言模型,在数据与算力上更高效,是轻量替代。
- 需要细致反馈:言语反馈比标量奖励更细腻具体,利于做有针对性的改进。
- 看重可解释性与显式记忆:自我反思被存入记忆,便于分析与理解其学习过程。
传统思维链只聚焦语言模态。多模态 CoT 则把文本与视觉信息纳入一个两阶段框架。
- 阶段一:依据多模态信息生成「依据(rationale)」结合文本与图像,先产出推理依据。
- 阶段二:答案推断利用上一步生成的、信息丰富的依据,推断出最终答案。
Liu et al. (2023) 引入 GraphPrompt——一个面向图(graph)的全新提示框架,用于提升下游任务的表现。
技术全景对照表
把前面所有技术按「解决什么核心问题」横向对照,便于回看与定位。
| 技术 | 提出 | 核心一句话 |
|---|---|---|
| 零样本 | — | 不给示例,直接下指令,靠模型内在能力。 |
| 少样本 | Brown 等 / Touvron 2023 | 放几对演示做上下文学习,规模够大才涌现。 |
| 思维链 CoT | Wei 2022 | 演示出中间推理步骤,或加「一步步思考」。 |
| 元提示 | Zhang 2024 | 关注问题的结构/句法而非具体内容,省 token。 |
| 自洽性 | Wang 2022 | 对 CoT 多采样多条路径,再投票取众数答案。 |
| 生成知识 | Liu 2022 | 先让模型自造相关知识,再据此作答。 |
| 提示链 | — | 把任务拆成子任务,前一步输出喂给后一步。 |
| 思维树 ToT | Yao / Long 2023 | 维护思路树,自评 + 搜索,带前瞻与回溯。 |
| RAG | Lewis 2021 | 检索外部文档拼进上下文,缓解幻觉、接最新知识。 |
| ART | Paranjape 2023 | 自动从库取演示,把推理写成可调工具的程序。 |
| APE | Zhou 2022 | 把写提示当黑盒优化,让模型自动生成并筛选指令。 |
| Active-Prompt | Diao 2023 | 按不确定性挑最该标注的样例做 CoT 标注。 |
| DSP | Li 2023 | 训练小策略模型生成线索,引导黑盒大模型。 |
| PAL | Gao 2022 | 生成可执行程序,把计算交给解释器。 |
| ReAct | Yao 2022 | 交错「思考→行动→观察」,边推理边调工具。 |
| Reflexion | Shinn 2023 | 把环境反馈转成语言自反思,存入记忆迭代改进。 |
| 多模态 CoT | Zhang 2023 | 图+文两阶段:先生成依据,再推断答案。 |
| GraphPrompt | Liu 2023 | 面向图数据的提示框架(细节待补)。 |