文章目录
- 一. 逐步思考:零样本思维链
- 1. 数学计算推理
- 2. 注意有效的方面
- 二. 少样本学习
- 1. 基于提示词示例的学习
- 2. 单样本学习
- 三. 改善提示效果
- 1.指示模型提出更多问题
- 2.格式化输出
- 3.重复指示
- 4.使用负面提示
- 5. 添加长度限制
一. 逐步思考:零样本思维链
1. 数学计算推理
我们知道,GPT-4不擅长计算。比如,它无法计算369 × 1235:
prompt = "How much is 369 * 1235?"
chat_completion(prompt)
模型给出的答案是454965,但正确答案是455715。
GPT-4不能解决复杂的数学问题吗?
- 该模型从左侧开始,通过依次预测答案中的每个标记来给出完整的答案。这意味着GPT-4首先生成最左侧的数字,然后将其作为上下文的一部分生成下一个数字,以此类推,直到形成完整的答案。挑战在于,
每个数字都是独立预测的
,与最终的正确值无关。- GPT-4将数字视为标记,它没有数学逻辑。
后面的文章将探讨OpenAI如何通过插件来增强GPT-4。一个例子是计算器插件(agent),它可用于进行准确的数学运算。
提高语言模型的推理能力有一个诀窍。
比如,当要求模型计算369 × 1235时,我们可以看到模型试图一次性直接回答。
- 考虑到即使是我们自己,也很难在没有纸和笔的情况下计算这个乘法算式,因此我们可以通过提示词鼓励模型进行中间推理。 就像我们使用纸和笔计算一样,如果给模型足够的时间进行推理,它也可以解决复杂的问题。
- 在提示词的末尾添加“让我们逐步思考”这样的话,已被证明可以使模型解决更复杂的推理问题。
这种技术称为零样本思维链策略(zero-shot-CoT strategy),由Takeshi Kojima等人在2022年发表的论文“Large Language Models are Zero-Shot Reasoners”中提出。
思维链是指使用提示词鼓励模型逐步模仿推理的技术。
零样本这个术语意味着模型
不依赖于特定任务的示例
来执行这种推理,它已经准备好根据其一般的训练结果来处理新任务。与我们稍后就会讨论的少样本学习等技术不同,零样本学习试图在不需要特定任务示例
的情况下进行泛化。
prompt = "How much is 369 * 1235? Let's think step by step."
chat_completion(prompt)
模型的输出如下所示:
Step 1: Multiply 369 by 5 (the last digit of 1235).
369 * 5 = 1845
Step 2: Multiply 369 by 30 (the second last digit of 1235 is 3,
so multiply by 3 and add a 0 at the end).
369 * 30 = 11070
Step 3: Multiply 369 by 200 (the third digit of 1235 is 2,
so multiply by 2 and add two 0s at the end).
369 * 200 = 73800
Step 4: Multiply 369 by 1000 (the first digit of 1235 is 1,
so multiply by 1 and add three 0s at the end).
369 * 1000 = 369000
Step 5: Add the results from steps 1 to 4.
1845 + 11070 + 73800 + 369000 = 455715
So, 369 * 1235 = 455,715.
模型所用的方法发生了显著的改变。现在它将主要问题分解为更小、更容易管理的步骤,而不是试图直接解决问题。
2. 注意有效的方面
尽管提示模型逐步思考,但仍需注意,要仔细评估其回答
,因为GPT-4并非绝对可靠。
对于更复杂的算式,比如3695 × 123548,即使使用这个技巧,GPT-4也可能无法算出正确答案。
尽管这个技巧对大多数数学问题有效,但并不适用于所有情况。论文“Large Language Models are Zero-Shot Reasoners”的作者发现,
- 它对于多步算术问题、涉及符号推理的问题、涉及策略的问题和其他涉及推理的问题非常有效。
- 然而,它对于模型回答常识性问题没有显著效果。
二. 少样本学习
1. 基于提示词示例的学习
少样本学习(few-shot learning)是由Tom B. Brown等人在论文“Language Models Are Few-Shot Learners”中提出的,它指的是LLM仅通过提示词中的几个示例
就能进行概括并给出有价值的结果。在使用少样本学习技巧时,你可以给模型提供几个示例,如图所示。这些示例指导模型输出所需的格式。
在本例中,我们要求LLM将特定的单词转换成表情符号。很难想象如何通过提示词给模型下达这种“指令”。但是通过少样本学习,这变得很容易。给模型一些例子,它将自动尝试复制它们的模式:
我们得到以下输出消息:
少样本学习技巧提供了具有目标输出的输入示例。然后,在最后一行,我们提供了想让模型完成的提示词。这个提示词与之前的示例具有相同的形式。模型将根据给定示例的模式执行操作。
我们可以看到,仅凭几个示例,模型就能够复现模式
。
注意:
在提示词中提供示例时,务必确保上下文清晰且相关。清晰的示例有助于模型匹配所需输出格式并解决问题。相反,信息不充分或模棱两可的示例可能导致意外或错误的结果。
2. 单样本学习
指导LLM的另一种方法是单样本学习(one-shot learning)。
顾名思义,在单样本学习中,我们只提供一个示例来帮助模型执行任务。尽管这种方法提供的指导比少样本学习要少,但对于简单的任务或LLM已经具备丰富背景知识的主题,它可能很有效。
单样本学习的优点是更简单、生成速度更快、计算成本更低(因而API使用成本更低)。然而,对于复杂的任务或需要更深入理解所需结果的情况,少样本学习的效果可能更好。
请注意,你可以将这些技巧(提示词、零样本、少样本)结合起来使用,以获得更好的效果。开发人员的工作是找到最有效的提示词来解决特定的问题。请记住,提示工程是一个反复试错的迭代过程。
三. 改善提示效果
我们已经了解了几种提示工程技巧。采用这些技巧,我们可以引导GPT模型的行为,以使模型给出的结果更好地满足我们的需求。接下来将介绍更多技巧,可以在GPT模型编写提示词时酌情使用。
1.指示模型提出更多问题
在提示词的末尾,询问模型是否理解问题并指示模型提出更多问题。如果你正在构建基于聊天机器人的解决方案
,那么这样做非常有效。
举例来说,你可以在提示词的末尾添加如下文本:你清楚地理解我的请求了吗?如果没有,请问我关于上下文的问题。这样一来,当我回答时,你就能够更高效地执行我所请求的任务。
2.格式化输出
如果你想要一个JSON输出,那么模型往往会在JSON代码块之前和之后写入输出。如果你在提示词中说输出必须被json.loads接受,那么模型给出的结果可能更好。这种技巧适用于许多场景。
比如,使用此脚本:
prompt = """
Give a JSON output with 5 names of animals. The output must be
accepted by json.loads.
"""
chat_completion(prompt, model='gpt-4')
我们得到以下JSON代码块。
{
"animals": [
"lion",
"tiger",
"elephant",
"giraffe",
"zebra"
]
}
3.重复指示
经验表明,重复指示会取得良好的效果,尤其是当提示词很长时。基本思路是,在提示词中多次添加相同的指令
,但每次采用不同的表述方式。这也可以通过负面提示来实现。
4.使用负面提示
在文本生成场景中,负面提示是指通过指定不希望在输出中看到的内容来引导模型
。负面提示作为约束或指南,用于滤除某些类型的回答。
对于复杂任务,这种技巧特别有用:当以不同的表述方式多次重复指令时,模型往往能够更准确地遵循指令。
Extract the keywords from the following question: {user_question}.
Do not answer anything else, only the keywords.
没有这个提示词的话,模型往往不会遵循指示。
5. 添加长度限制
限制长度通常是不错的做法。如果你只希望模型回答1个词或者10个句子,那么不妨将要求添加到提示词中。
如下例子
- 指示模型用100个单词生成一篇内容翔实的新闻稿。
- 利用提示词:“如果你能回答问题,回答ANSWER;如果你需要更多信息,回答MORE;如果你无法回答,回答OTHER。只回答一个词。”
如果没有最后一句话,模型往往会生成句子,而不会遵循指示。