写好提示词之前,先搞懂零样本和少样本的区别

提示工程(Prompt Engineering)是一门「通过设计和优化提示词来引导大语言模型产生期望输出」的技术。由于大模型的能力很大程度上由提示词激发,它已成为与大模型协作的核心技能。本文整理自 Prompt Engineering Guide 中文版(promptingguide.ai),从最基础的零样本/少样本提示,讲到思维链与自我一致性等进阶技术,所有示例均为指南原文。

提示工程示意(AI 生成插图)
提示工程示意(AI 生成插图)

一、零样本提示(Zero-Shot Prompting)

当今的大语言模型经过海量数据训练,并经过指令微调,因此在不少任务上无需任何示例就能给出答案——这就是零样本提示。指南原文示例:

提示:
将文本分类为中性、负面或正面。
文本:我认为这次假期还不错。
情感:
输出:
正面

二、少样本提示(Few-Shot Prompting)

当任务较复杂或需要特定输出格式时,在提示中提供少量示例(demonstrations)能显著改善效果。指南原文的反义义词示例:

提示:
优秀的意思是反面词是糟糕的。
巨大的意思是反面词是微小的。
耐心的意思是反面词是___

指南指出少样本提示的两个要点:示例的分布与措辞对结果影响很大;格式不固定的任务(如数学推理)需要更可靠的技术。随机标签比固定顺序标签效果好;标签空间与分布比真实标签更重要——只提供分布格式即可奏效。

三、思维链提示(Chain-of-Thought Prompting)

思维链由 Wei 等人(2022)提出,通过中间推理步骤实现复杂的推理能力,可与少样本提示结合使用。指南原文的完整示例——判断一组数中的奇数之和是否为偶数:

提示:
这组数中的奇数加起来是偶数:4、8、9、15、12、2、1。
A:将所有奇数相加(9、15、1)得到25。答案为False。

这组数中的奇数加起来是偶数:17、10、19、4、8、12、24。
A:将所有奇数相加(17、19)得到36。答案为True。

这组数中的奇数加起来是偶数:16、11、14、4、8、13、24。
A:将所有奇数相加(11、13)得到24。答案为True。

这组数中的奇数加起来是偶数:17、9、10、12、13、4、2。
A:

这组数中的奇数加起来是偶数:15、32、5、13、82、7、1。
A:
输出:
将所有奇数相加(15、5、13、7、1)得到41。答案为False。

指南原文的评述:「哇!我们可以看到在提供推理步骤时得到了完美的结果。」作者还发现仅提供一个示例就足以解决此任务,并强调这是足够大的语言模型才会出现的新兴能力

四、零样本 CoT:一句魔法咒语

Kojima 等人(2022)提出的零样本 CoT 不需要任何示例,只需在原始提示后添加「让我们逐步思考」。指南原文的苹果算术题——不加咒语时模型直接给出错误答案 11:

提示:
我去市场买了10个苹果。我给了邻居2个苹果和修理工2个苹果。
然后我去买了5个苹果并吃了1个。我还剩下多少苹果?

让我们逐步思考。
输出:
首先,您从10个苹果开始。
您给了邻居和修理工各2个苹果,所以您还剩下6个苹果。
然后您买了5个苹果,所以现在您有11个苹果。
最后,您吃了1个苹果,所以您还剩下10个苹果。

这个简单的提示在算术推理任务上效果显著,「在您没有太多示例可用于提示时特别有用」。

五、Auto-CoT:自动构建思维链示例

手工构建多样化且有效的思维链示例成本很高。Zhang 等人(2022)提出 Auto-CoT,利用 LLM「让我们一步步思考」自动生成推理链,消除人工环节。它包含两个阶段:

  • 阶段 1:问题聚类——将给定问题划分为若干聚类;
  • 阶段 2:演示抽样——从每个聚类中选择一个代表性问题,用 Zero-Shot-CoT 生成其推理链。

选择代表性问题的简单启发式可以是问题长度(如 60 个 tokens)和理由步骤数(如 5 个推理步骤),以此鼓励模型使用简单而准确的演示。为减轻自动生成的链中错误的影响,演示的多样性至关重要

六、自我一致性(Self-Consistency)

由 Wang 等人(2022)提出,自我一致性「旨在替换链式思维提示中使用的天真贪婪解码方法:通过少样本 CoT 采样多个不同的推理路径,并使用生成结果选择最一致的答案」,在算术和常识推理任务上显著提升 CoT 性能。指南原文的经典示例——「当我 6 岁时,我的妹妹是我的一半年龄。现在我 70 岁了,我的妹妹多大?」直接提问时模型会答错(35),而用 CoT 采样多条推理路径:

输出 1:当我6岁时,我的妹妹是我的一半年龄,也就是3岁。
现在我70岁了,所以她是70-3 = 67岁。答案是67。

输出 2:当叙述者6岁时,他的妹妹是他年龄的一半,也就是3岁。
现在叙述者70岁了,他的妹妹应该是70-3 = 67岁。答案是67。

输出 3:当我6岁时,我的妹妹是我的一半年龄,也就是3岁。
现在我70岁了,所以她是70/2 = 35岁。答案是35。

多数答案(67)出现了两次,即成为最终答案——通过多数投票消除单次推理的偶然错误。

七、方法选择速查

场景推荐技术
任务简单、模型指令遵循好零样本提示
需要特定输出格式 / 冷启动分类少样本提示
数学、逻辑等需要推理的任务思维链(CoT)
没有示例可用零样本 CoT(”让我们逐步思考”)
构建示例成本高Auto-CoT
追求推理稳定性自我一致性(多次采样 + 投票)

八、ReAct 框架:推理 + 行动

Yao 等人(2022)提出的 ReAct 框架,让 LLM 以交错的方式生成推理轨迹任务特定操作——这是当今 Agent(智能体)范式的技术源头。指南原文:「生成推理轨迹使模型能够诱导、跟踪和更新操作计划,甚至处理异常情况。操作步骤允许与外部源(如知识库或环境)进行交互并且收集信息。」「结果表明,ReAct 可以在语言和决策任务上的表现高于几个最先进水准要求的基线,还提高了 LLMs 的人类可解释性和可信度。」

指南给出的完整 ReAct 提示示例(摘自论文,HotpotQA 问答任务):

问题 科罗拉多造山带东部区域延伸到的区域的海拔范围是多少?
思考 1 我需要搜索科罗拉多造山带,找到科罗拉多造山带东段延伸的区域,
      然后找到该区域的海拔范围。
操作 1 搜索 [科罗拉多造山带]
观察 1 科罗拉多造山带是科罗拉多及其周边地区造山运动的一段。
思考 2 它没有提到东部地区。所以我需要查一下东部地区。
操作 2 查找 [东部地区]
观察 2 (结果 1 / 1) 东部区域延伸至高平原,称为中原造山带。
思考 3 科罗拉多造山运动的东部区域延伸到高平原。所以我需要搜索高平原,
      找到它的海拔范围。
操作 3 搜索 [高平原]
观察 3 高平原指的是两个截然不同的陆地区域之一。
思考 4 我需要搜索高平原(美国)
操作 4 搜索 [高平原(美国)]
观察 4 高平原是大平原的一个分区。从东到西,高平原的海拔从 1800 到
      7000 英尺 (550 到 2130 米) 不等。[3]
思考 5 高平原海拔高度从 1800 到 7000 英尺,所以答案是 1800 到 7000 英尺。
操作 5 结束 [1800 到 7000 英尺]

指南原文总结了 ReAct 与 CoT 的对比结论(在 HotpotQA 与 Fever 基准上用 PaLM-540B 评估):

  • CoT 存在事实幻觉问题——缺乏与外部世界的接触或无法更新自己的知识,导致错误传播;
  • ReAct 的结构性约束降低了它在制定推理步骤方面的灵活性;
  • ReAct 很大程度上依赖于它正在检索的信息——非信息性搜索结果会阻碍模型推理;
  • 将 ReAct 与 CoT + 自我一致性结合的提示方法通常优于所有其他提示方法

ReAct 已被 LangChain 等框架内置为 Agent 的标准范式。指南给出的 LangChain 示例(搜索 + 计算器两个工具):

llm = OpenAI(model_name="text-davinci-003", temperature=0)
tools = load_tools(["google-serper", "llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)

agent.run("奥利维亚·王尔德的男朋友是谁?他现在的年龄的0.23次方是多少?")

运行时模型自动完成「搜索男友 → 查年龄 → 调用计算器求 0.23 次方」的完整思考-行动链,最终输出:「哈里·斯泰尔斯, 奥利维亚·王尔德的男朋友, 29 岁。他年龄的 0.23 次方是 2.169459462491557。」

九、思维树(Tree of Thoughts)

对于需要探索或预判战略的复杂任务,链式思考等简单提示技巧是不够的。Yao 等人(2023)提出的思维树(ToT)框架「基于思维链提示进行了总结,引导语言模型探索把思维作为中间步骤来解决通用问题」。指南原文的描述:

「ToT 维护着一棵思维树,思维由连贯的语言序列表示,这个序列就是解决问题的中间步骤。使用这种方法,LM 能够自己对严谨推理过程的中间思维进行评估。LM 将生成及评估思维的能力与搜索算法(如广度优先搜索和深度优先搜索)相结合,在系统性探索思维的时候可以向前验证和回溯。」

指南以论文中的「算 24 游戏」为例:任务被分成 3 个思维步骤,每步保留最优的 5 个候选项;执行广度优先搜索(BFS)时,每步候选项都要求模型给出「sure/maybe/impossible(一定能/可能/不可能)」的评估,并抽样 3 个评估结果——「目的是得到经过少量向前尝试就可以验证正确的局部解,基于『太大/太小』的常识消除那些不可能的局部解」。报告的结果显示,ToT 的表现大大超过了其他提示方法

Hulbert(2023)进一步把 ToT 框架概括成了一段简短的提示词,让 LLM 在一次提示中完成多专家多轮的中间思维评估:

假设三位不同的专家来回答这个问题。
所有专家都写下他们思考这个问题的第一个步骤,然后与大家分享。
然后,所有专家都写下他们思考的下一个步骤并分享。
以此类推,直到所有专家写完他们思考的所有步骤。
只要大家发现有专家的步骤出错了,就让这位专家离开。
请问...

参考来源

  • Prompt Engineering Guide 中文版:提示技术(promptingguide.ai/zh/techniques)
  • Wei et al., “Chain-of-Thought Prompting Elicits Reasoning in Large Language Models”(arXiv:2201.11903)
  • Kojima et al., “Large Language Models are Zero-Shot Reasoners”(arXiv:2205.11916)
  • Zhang et al., “Automatic Chain of Thought Prompting”(arXiv:2210.03493)
  • Wang et al., “Self-Consistency Improves Chain of Thought Reasoning in Language Models”(arXiv:2203.11171)

本文为技术文档摘录整理,内容合并自下列官方资料(官方文档、官方 GitHub 仓库、论文与权威媒体报道),技术数字以官方原文为准,版权归原作者所有。

主要菜单