大模型prompt基本知识小结
用好大模型,关键在于为不同任务设计合理的提示策略。典型的代表方法之一是
上下文学习(in-context learning)
思维链提示(chain-of-thought prompting)
规划方法(planning)
Prompting
一、构建prompt
1. 关键要素
一个有效的提示离不开四个关键要素:
任务描述、输入数据、上下文信息和提示风格
先看三个直观的例子(question answering、meta-review generation、Text-to-SQL),图中蓝色部分为任务描述,红色为上下文,绿色为示例,金色为提示风格:
a. question answering

b. meta-review generation

c. Text-to-SQL
2) 任务描述
任务描述是LLM需要遵循的指令,要清晰地说明任务目标。如果输入或输出格式特殊,需要详细说明,甚至可以用关键词突出强调,从而更好地引导模型。
3) 输入数据
多数情况下,自然语言描述直接简单。但对于知识图谱、表格等结构化数据,需要先“线性化”为可读的序列(比如把三元组转成文本)。编程语言也是一种好方法,还可以配合外部程序执行器得到更精确的结果。
4) 上下文信息
除了任务描述和输入数据,某些任务特别依赖背景信息。例如开放域问答中检索到的文档就是支持证据,文档质量和相关性直接影响答案质量。因此需要以恰当的模板或格式包含这类信息。另外,上下文中的任务示例有助于模型理解复杂任务的目标、输出格式和映射关系。
5) prompt style
不同模型对提示风格的敏感度不同。总体而言,应当把提示写成清晰的问题或详细的指令。在某些场景下,添加前缀或后缀能有效提升效果——例如前缀“让我们逐步推理”能引导模型分步思考,前缀“您是该任务的专家”可提高特定任务的表现。对于ChatGPT这类聊天式模型,与其一次性给出长而复杂的提示,不如拆分成多个子任务提示,通过多轮对话逐次输入。
2. 设计原则
基于关键要素,总结几条实用原则:
- 指令要明确具体。比如“给定一个长文档,我想生成一个简洁的摘要”并补充“摘要长度不超过50字”。越明确,模型越容易理解。
清楚地表达任务目标:
- 把复杂任务拆成子任务,模型可以逐个击破,最终结果更准确。
分解为简单、详细的子任务:
- 如后文所说,在提示中加入少量输入输出对(即少样本示例),模型无需参数更新就能学会语义映射。关键是这些示例要高质量。
提供few-shot演示:
- LLM在特定格式的数据上预训练过,采用它们熟悉的格式能让指令更有效。
使用模型友好的格式:
3. 有用的tips
除了设计原则,现有经验和研究还总结了一些实用技巧(详见下表12)。需要说明的是,这些提示通常以通用方式给出,并不一定是特定任务的最佳方案。
4. 经验分析
为了展示提示对任务性能的实际影响,我们选了几个典型任务(语言生成、知识利用、复杂推理、结构化数据生成、信息检索)做了对比实验。每个任务分别使用遵循上述原则的精心设计提示和一个简化提示。以下几条结论值得注意:
- 例如在WIKIFact数据集上,更详细的任务描述将性能从29.25提升到31.21。
精心设计的prompt能明显提升ChatGPT的zero-shot或few-shot性能。
- 在Color Objects任务上,设计提示把得分从53.20提高到66.75,说明复杂任务尤其需要精心设计。
越复杂的任务,从prompt工程中受益越多。
- 对GSM8k,用代码格式的few-shot示例把数学推理转为代码生成,充分发挥ChatGPT的代码合成能力,再结合外部程序执行器获得精确结果。
数学推理任务中,基于编程语言的格式更有效。
- 不过在某些任务上仍弱于专门训练过的监督模型,毕竟那些模型用特定任务数据优化过。
知识利用和复杂推理任务中,合适提示的ChatGPT能达到甚至超越监督基线。
- 比如一般推荐和会话推荐,只要能用自然语言清楚描述,ChatGPT就能上手。但表现距离参考基准还有差距,领域知识和任务适应仍是关键。
借助合适的prompt工程,LLM能处理非传统NLP任务。
二、Prompt优化
手动创建提示直观但耗时,而且模型对提示很敏感,一个不好的提示可能大幅拉低性能。因此大量研究提出了自动化优化方法,主要分为
离散提示优化
连续提示优化
a. 离散提示优化
离散提示由自然语言标记组成,简单灵活,但搜索空间巨大。现有方法包括基于梯度的、基于强化学习的、基于编辑的和基于LLM本身的几种。
b. 连续提示优化
连续提示由连续嵌入组成,可通过下游任务的损失梯度直接更新。这类研究主要在PLM时代流行,在LLM时代因参数量过大而关注有限。主流方法包括:有足够标注数据时的直接学习,以及数据稀缺时的迁移学习。
In-Context Learning
作为一种特殊的提示形式,上下文学习(ICL)最早随GPT-3提出,如今已成为使用LLM的典型方法。
一、ICL Formulation
如前所述,ICL使用自然语言提示,包含任务描述和/或几个示例(演示)。图14展示了过程:先准备好任务描述,从数据集中选择若干示例,按照特定顺序组合成提示,最后把测试实例附在末尾输入LLM,让模型在无梯度更新的情况下生成输出。

整个流程可用公式表示:

其中 I 为任务描述,Dk 为演示,xk+1 为查询输入。由于ICL性能严重依赖演示,设计时需要重点关注三个方面:如何选择示例、如何格式化每个示例、以及如何安排顺序。
下面从演示设计和底层机制两个角度展开。顺便提一下,ICL与指令调优关系密切,但指令调优需要微调模型,而ICL只在使用时提示模型;同时指令调优能增强LLM在zero-shot设置下的ICL能力。
二、Demonstration Design
1. Demonstration Selection
不同演示示例会导致天差地别的性能,因此选择哪些示例是关键。主要方法分两种:
- 简单低成本,常用K-NN检索选取与查询语义相似的示例。但这种方法只单独评估每个示例,忽略了整体效果。后续有研究引入多样性策略,或同时兼顾相关性与多样性。
基于启发式方法:
- 利用LLM本身来评估示例的信息量(例如观察添加示例后的性能增益),或者用LLM标注正负例训练密集检索器。还可以把选择问题表述为强化学习,让LLM作为奖励函数训练策略模型。甚至直接用LLM生成演示,完全不需要人工干预。
基于大模型的方法:
无论哪种方法,选出的演示都应该包含与任务和查询相关的足够信息。
2. Demonstration Format
选定示例后,需要把它们集成到提示中。简单做法是用预定义模板实例化输入输出对。更高级的做法包括添加任务描述或使用思维链增强推理能力。例如,有研究收集了人类编写的任务描述数据集,微调后不仅提升了可见任务性能,还能泛化到未见任务。为了减少人工成本,一种半自动化方法用少量种子描述引导LLM为新任务生成任务描述。
Auto-CoT和least-to-most prompting是两种代表方法:前者用“让我们逐步思考”激发LLM自动生成推理步骤;后者先让LLM分解问题,然后顺序解决子问题。
3. Demonstration Order
LLM有时会受“近因偏差”影响——容易重复演示末尾的答案。因此合理安排示例顺序很重要。早期工作提出了一些启发式方法,比如按嵌入空间中与查询的相似度排序。
三、底层机制
预训练后的LLM在不更新参数的情况下展现出惊人的ICL能力,这引发了两个核心问题:预训练如何影响ICL?推理时LLM如何执行ICL?
1. 预训练如何影响ICL
ICL能力随模型规模增大而显著增强。一些研究表明,专门设计的训练任务(如持续预训练或微调)能让小规模PLM也具备不错的能力。此外,理论分析指出,ICL可解释为在具有远程连贯性的文档上进行预训练的结果;基于next-word prediction的LLM能从语言数据中存在的组合结构学到ICL能力。
2. LLM如何执行ICL
推理时有两种主要机制:
任务识别
任务学习
- LLM从演示中识别出任务是什么,然后利用预训练阶段获得的先验知识来执行。有研究假设预训练数据中存在一个潜在任务变量,LLM能通过演示捕获它。实证支持这一点——即使随机替换演示中的输入或标签,性能也不会严重受损,说明模型主要靠识别任务而非从演示中学习。
任务识别:
- LLM通过演示真正学习到预训练期间未见的新任务。这种机制常从梯度下降角度分析,视为隐式微调。LLM的前向计算生成关于演示的元梯度,并通过注意力机制隐式执行梯度下降。某些注意力头能执行与任务无关的原子操作,这些原子操作与ICL能力密切相关。也有研究把ICL抽象为算法学习过程:LLM在预训练时参数内部编码了隐式模型,ICL中的示例相当于提供了学习算法(如梯度下降或封闭形式解),在前向计算中更新模型。实验表明,LLM可以有效地学习简单线性函数甚至决策树等复杂函数。
任务学习:
最近的研究指出,任务识别和任务学习所需模型规模不同:任务识别能力更容易获得(350M参数的小型LM也能展现),而任务学习至少需要66B参数的LLM。小型LM倾向于依赖先验知识而忽略标签,大型LLM则能超越先验知识,从演示中获取新知识。为了提升任务学习能力,Meta-In-Context Learning建议在提示中包含多个相关任务,符号调整则强制模型从语义无关标签的演示中学习。
Chain-of-Thought Prompting
思维链提示是一种改进策略,能显著提升LLM在算术、常识、符号等复杂推理任务上的表现。与ICL直接用输入输出对不同,CoT在输入和输出之间加入了中间推理步骤作为桥梁。下面先介绍基础方法及其改进,再讨论何时有效以及为什么有效。
一、基础CoT Prompting方法
CoT最初作为ICL的扩展提出:每个演示从 <输入,输出> 扩充为 <输入, CoT, 输出>,其中CoT是一系列中间推理步骤。LLM通过这些增强的演示为新输入生成CoT和答案。但CoT的获取通常需要人工注释。好在研究发现,用“让我们逐步思考”“take a deep breath and work on this problem step by step”等简单指令就能触发LLM自动生成CoT,大大降低了使用门槛。
图15展示了CoT的生成过程,遵循链式结构,逐步生成:

通常CoT采用自然语言格式。但对于需要严格逻辑的复杂任务,文本可能不够精确,因此有些工作使用代码格式,利用其结构化、精确的性质;也有方法动态选择文本或代码来结合两者优势。
二、改进的CoT提示策略
尽管CoT提高了复杂推理性能,但仍存在推理错误和不稳定性。以下从更好的提示设计、增强生成策略、以及推理结构扩展三个方面介绍改进方向。
1. 更好的prompt设计
提示本身对CoT性能至关重要。直观的方法包括使用不同的CoT(每个问题多条推理路径),或者采用更复杂推理路径的提示来激发LLM的推理能力。但所有这些方法都依赖带注释的CoT数据集。为了摆脱限制,“让我们逐步思考”等神奇指令可以用来自动构建CoT。
2. 增强型CoT生成
LLM容易产生不正确的推理步骤且表现不稳定。两种典型增强方法:
- 对多条推理路径采样,而不是只用贪心解码。代表性方案self-consistency先生成多条路径,然后通过多数投票集成最一致的答案。但若大多数路径被误导,仍会出错。后续研究提出只投票选择复杂度最高的k条路径(因为复杂路径通常更优)。MCR则在生成下一步时参考其他路径的步骤。
基于采样的方法:
- 由于推理步骤的序列性质,错误会累积。最新研究用经过训练的验证器或LLM自身来验证步骤正确性。例如DIVERSE分别训练解决方案级和步骤级验证器,另一些方法让LLM通过专门格式逐步自我验证。还有研究提出反向推理验证:从预测结果反推必要条件,再与原问题对比。
基于验证的方法:
3. 推理结构扩展
链式结构限制了处理需要前瞻和回溯的复杂任务。因此研究提出了
树结构推理
图结构推理
- 在分层树中制定推理过程,中间思想为节点,LLM可并行探索多条路径,支持前瞻和回溯。
树结构推理:
- 树的拓扑仍有限制,图结构提供更大灵活性,能表征更复杂的关系和交互。
图结构推理:
三、CoT Prompt的进一步讨论
1. 为什么CoT prompting对LLM有效?
CoT推理是一种涌现能力,只对足够大的模型(通常10B以上参数)有正面影响,对小模型无效。它主要对需要逐步推理的任务有效(算术、常识、符号推理),而对于不依赖复杂推理的任务(如GLUE中的MNLI、SST-2、QQP),CoT可能导致性能下降。有趣的是,当标准提示本身结果很差时,CoT带来的收益才显著。
2. 为什么LLM能执行CoT推理?
从两个角度解释:
- 普遍认为来自对代码的训练,因为代码数据通过算法逻辑和编程流程组织,有助于提升推理能力。指令调优似乎不是关键,因为对非CoT数据做指令调优并不能提升CoT基准性能。
能力的起源:
- CoT与标准提示的主要区别在于加入推理路径。研究表明推理路径中有三个关键成分:符号、模式和文本。后两者(模式和文本)对性能至关重要,删除任何一个都会导致显著下降。但符号和模式本身的正确性并不重要。文本和模式之间存在共生关系:文本帮助LLM生成有用的模式,模式帮助LLM理解任务并反过来促进文本生成。
提示成分的影响:
复杂任务解决规划(Planning)
ICL和CoT提示是通用但简单的方法,然而在处理数学推理、多跳问答等复杂任务时仍显吃力。基于提示的
规划方法

-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名