Prompt Engineering 涵盖了一系列从基础到高级的技术,这些技术旨在优化与LLM的交互,以获得更佳的输出。本节将详细介绍一些核心的实现技术。
6.1. 基础提示技术:Zero-shot, One-shot, Few-shot Prompting
这些是Prompt Engineering中最基本也是应用最广泛的技术,它们主要利用了LLM强大的上下文学习(In-Context Learning, ICL)能力。
-
Zero-shot Prompting (零样本提示):
定义与原理: 直接向LLM提出任务或问题,而不提供任何与该任务相关的已完成示例。它完全依赖模型在预训练阶段学习到的广泛知识和模式泛化能力来理解指令并生成答案。
实现方法: Prompt结构通常为
[任务描述/指令] + [输入数据]
。示例:
"将以下英文句子翻译成中文:'The weather is nice today.'"
适用场景: 适用于任务相对简单、明确,或者LLM对该类任务已有很强先验知识的情况(例如,常见的翻译、简单问答、文本摘要等)。也常用于快速测试模型对新任务的初步理解能力。
局限性: 对于复杂、新颖的任务,或需要特定输出格式、风格的任务,Zero-shot的效果往往不够理想,模型可能无法准确理解意图或生成符合要求的输出。
-
One-shot Prompting (单样本提示):
定义与原理: 在Prompt中提供一个与当前任务相关的已完成示例(一个输入-输出对),以引导模型更好地理解任务要求和期望的输出形式。
实现方法: Prompt结构通常为
[示例输入1] -> [示例输出1]\n[任务描述/指令,可选] + [新输入数据]
。示例 (情感分类):
文本:这部电影真是太棒了! -> 情感:积极
文本:我非常不喜欢这个产品。 -> 情感:
适用场景: 当任务比Zero-shot能处理的略复杂,或者需要模型遵循一个特定的简单模式或格式时。One-shot可以看作是Few-shot的一个特例。
局限性: 单个示例可能不足以充分展示任务的多样性或复杂性,有时示例的选择会极大地影响性能(即存在"示例敏感性")。
-
Few-shot Prompting (少样本提示):
定义与原理: 在Prompt中提供少量(通常是2到5个,但有时更多)与当前任务相关的已完成示例。通过向模型展示多个输入及其对应的期望输出,LLM能够通过其上下文学习能力,更准确地把握任务的内在逻辑、模式、风格和输出格式,从而在新输入上做出更优的预测。这是发挥LLM ICL能力的关键方式。
实现方法: Prompt结构通常为:
[示例输入1] -> [示例输出1]
[示例输入2] -> [示例输出2]
...
[示例输入N] -> [示例输出N]
[任务描述/指令,可选] + [新输入数据]
示例 (简单的算术题模式学习):
问题:2 + 3 = ? -> 答案:5
问题:5 * 7 = ? -> 答案:35
问题:10 - 4 = ? -> 答案:
适用场景: 适用于比Zero-shot和One-shot更复杂的任务,特别是那些需要模型学习特定格式、风格、细微差别或内在逻辑的任务。例如,代码生成、特定类型的文本摘要、复杂分类、数据提取等。
局限性:
- 示例选择关键: 示例的质量、多样性、代表性以及与新输入数据的相似性,都会显著影响模型性能。选择不当的示例可能误导模型。
- Prompt长度增加: 示例会占用宝贵的上下文窗口Token数,对于上下文窗口有限的模型,能提供的示例数量受限。
- 过拟合风险: 如果示例过于同质化或数量过多,模型可能过度拟合示例中的特定模式,而丧失对新情况的泛化能力。
- 成本: 获取和标注高质量的示例本身可能需要一定成本。
Few-shot Prompting的调优建议:
- 示例的选择与构建: 选择与目标任务高度相关的、高质量的、多样化的示例。确保示例中的输入和输出都是正确的,并且格式清晰、一致。
- 示例的数量: 根据任务复杂度和模型能力,通过实验确定最佳的示例数量。并非总是越多越好。
- 示例的顺序: 某些模型对示例的排列顺序敏感。可以尝试不同的顺序,或者将与测试输入最相似的示例放在靠近新输入的位置。
- 示例的格式: 在示例中清晰地标记输入和输出部分,使用一致的分隔符。
- 结合明确指令: 即使提供了示例,通常也建议在最后加上清晰的任务描述或指令,以进一步明确任务目标。
6.2. 思维链技术 (Chain-of-Thought, CoT) 及其变种
思维链(Chain-of-Thought, CoT)Prompting是一种旨在提升大型语言模型在需要多步推理的任务(如算术题、常识推理、符号推理等)上表现的技术。其核心思想是通过在Prompt中引导LLM生成一系列中间的、连贯的推理步骤,最终导出答案,而不是直接给出结果。这模仿了人类解决复杂问题时的思考过程,有助于模型更准确地进行逻辑推导。
实现步骤/方法:
-
Few-shot CoT (少样本思维链): 这是CoT最初被提出的形式。在提供给模型的Few-shot示例中,不仅给出问题和最终答案,更重要的是,详细展示从问题到答案的中间思考过程(推理链)。
Prompt结构示例 (数学应用题):
Q: 罗杰有5个网球。他又买了2罐网球,每罐有3个。他现在有多少个网球?
A: 罗杰一开始有5个球。2罐网球,每罐3个,所以是 2 * 3 = 6个新网球。他总共就有 5 + 6 = 11个网球。所以答案是11。
Q: 自助餐厅有23个苹果。他们用了20个做午餐,然后又买了6个。他们现在有多少个苹果?
A: 自助餐厅最初有23个苹果。他们用了20个,所以剩下 23 - 20 = 3个苹果。然后他们又买了6个,所以现在有 3 + 6 = 9个苹果。所以答案是9。
Q: [新的复杂数学问题]
A: [模型被期望在此处生成类似的推理链和答案]
-
Zero-shot CoT (零样本思维链): 后续研究发现,即使不提供包含推理链的示例,也可以通过在原始问题的末尾附加一个简单的触发短语(如 "Let's think step by step." 或中文的 "让我们一步一步地思考。" 或 "请逐步分析。")来有效地引导大型模型(通常指百亿参数以上)生成推理链并提高答案准确性。
Prompt结构示例:
Q: 一个杂耍演员能同时抛接16个球。其中一半是高尔夫球,高尔夫球中又有一半是蓝色的。请问有多少个蓝色的高尔夫球?
A: Let's think step by step.
[模型在此后会尝试生成推理步骤和最终答案]
变种技术简介:
- Least-to-Most Prompting (从少到多/从易到难提示): 将一个复杂问题分解为一系列更简单的、相互依赖的子问题。先让模型解决第一个子问题,然后将该子问题的答案作为上下文(或输入的一部分)提供给模型,让其解决第二个子问题,以此类推,直到解决整个复杂问题。这种方法有助于模型逐步构建解决方案,降低了单步推理的复杂度。
- Auto-CoT (自动化思维链): 这是一种尝试自动化生成Few-shot CoT示例中推理链的方法。例如,可以先用Zero-shot CoT让模型为一些问题生成初步的推理链,然后对这些生成的链进行筛选或人工修正,再用作Few-shot CoT的示例。
- LogiCoT (逻辑思维链): 旨在将符号逻辑的原则融入CoT,以增强推理的结构性和连贯性。
适用场景与局限性:
-
适用场景: 主要用于需要多步逻辑推导的任务,如数学题求解(特别是应用题)、常识推理、符号操作、需要解释其决策过程的问答系统等。
-
局限性:
- 对于非常简单的任务,CoT可能引入不必要的计算开销和Prompt长度。
- 生成的推理链的质量高度依赖于模型自身的基础推理能力;模型有时会生成看似连贯但实际上错误的推理步骤(即"推理幻觉")。
- Zero-shot CoT的效果通常不如精心设计的Few-shot CoT稳定和强大,且对模型规模有一定要求(通常在大型模型上效果更明显)。
- Few-shot CoT需要人工构造高质量的包含推理过程的示例,这本身可能是一项耗时的工作。
效果衡量与调优建议:
-
效果衡量: 主要关注最终答案的准确率。同时,也可以人工评估生成的推理链的合理性、连贯性和正确性,这有助于理解模型的"思考"过程并发现潜在问题。
-
调优建议:
- 对于Few-shot CoT,核心在于优化示例中的推理过程,确保其清晰、简洁、正确、且具有代表性。
- 尝试不同的Zero-shot CoT触发短语,看哪种对特定模型和任务更有效。