在《GPT最佳实践 - 提升Prompt效果的六个策略》 (opens in a new tab)中,我们介绍了OpenAI官方发布的"GPT 最佳实践"指南的六个策略,其中第四个策略是“给 GPT 时间思考”。
如果让你计算17乘以28,你可能不会立即知道答案,但是可以花时间算出来。类似地,当GPT试图立即回答问题时,它会犯更多的推理错误,而不是花时间计算出答案。在回答之前,要求给出一系列的推理过程可以帮助GPT更可靠地推理出正确的答案。
具体方法:
- 提示模型不要匆忙得出结论,而是要先找出自己的解决方案
- 使用内心独白或一系列查询来隐藏模型的推理过程
- 询问模型在之前的处理过程中是否遗漏了什么内容
提示模型不要匆忙得出结论,而是要先找出自己的解决方案
有时候,当我们明确指示模型在得出结论之前从基本原理出发进行推理,我们可以得到更好的结果。例如,假设我们需要一个模型来评估学生对数学问题的解决方案,最明显的解决方法就是简单地询问模型“学生的解决方案”是否正确。
SYSTEM Prompt
确定学生的解决方案是否正确。
USER Prompt
问题描述:我正在建设一个太阳能发电设施,并且我需要帮助以解决财务问题。
- 土地每平方英尺价格为$100
- 我可以以每平方英尺$250的价格购买太阳能板
- 我谈判了一份维护合同,第一年将花费我固定的$100,000,以及额外的每平方英尺$10
第一年运营的总成本作为平方英尺数量的函数是多少?
学生的解决方案:设x为安装面积(以平方英尺为单位)。
1.土地成本:100x
2.太阳能板成本:250x
3.维护成本:100,000 + 10x
总成本:100x + 250x + 100,000 + 10x = 450x + 100,000
输出的结果是,学生的解决方案是正确的。
但是学生的解决方案实际上是不正确的!我们可以通过提示模型首先生成自己的解决方案来让模型注意到这一点。
SYSTEM Prompt
首先,针对这个问题,请先思考并找出你自己的解决方案,列出计算过程。
将你的解决方案的函数与学生的解决方案的函数分别列出来,再将函数进行比较,评估学生的解决方案是否正确。
请在你自己完成问题的解决方案之后,再判断学生的解决方案是否正确。
这次得出了正确的结论,学生的答案是错误的。
使用内心独白或一系列查询来隐藏模型的推理过程
使用内心独白
前面的策略表明,在回答特定问题之前,模型有时需要详细地推理问题。对于某些应用来说,模型用于得出最终答案的推理过程是不适合与用户分享的。例如,在辅导应用中,我们可能希望鼓励学生自己解决问题,但模型对学生解决方案的推理过程可能会泄露答案给学生。
内心独白是一种可以用来缓解这个问题的策略。内心独白的思路是指导模型将那些“不应被用户看到的输出部分”放入一种结构化的格式中,以便于解析。然后,在将输出呈现给用户之前,对输出进行解析,并且只显示输出的一部分。
SYSTEM Prompt
按照以下步骤回答用户的问题。
步骤1 - 首先自己解决问题。不要依赖学生的解决方案,因为它可能是错误的。将所有此步骤的工作用三个引号(""")括起来。
步骤2 - 将你的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。将所有此步骤的工作用三个引号(""")括起来。
步骤3 - 如果学生犯了错误,确定你可以给学生什么提示而不泄露答案。将所有此步骤的工作用三个引号(""")括起来。
步骤4 - 如果学生犯了错误,提供上一步中的提示给学生(不用三个引号括起来)。与其写“步骤4 - ...”,不如写“提示:”。
USER Prompt
问题陈述:一个盒子里有4个红球和6个蓝球。从盒子中不放回地抽出两个球。抽出的两个球中有一个是红色和另一个是蓝色的概率是多少?
学生解决方案:(4/10)*(6/9) = 24/90 = 4/15
如果使用GPT 3.5,回答的结果不太稳定,效果不好。
因此,下面使用GPT 4来测试。由于我的账号没有GPT 4的API权限,所以将SYSTEM和USER的提示合并后,放到ChatGPT Plus网页版中的GPT 4来测试。
前三个步骤,模型按照要求解答,并以三个引号括了起来。
最后一部分,是在判断了学生的答案有误之后,用于展示给学生的解题提示。
在实际的应用开发中,对于GPT的回复,可以通过指定的格式(三个引号)将前三个步骤的结果过滤掉,只返回最后一步的提示内容展示给学生。
使用一系列的查询来实现
或者,这可以通过一系列查询来实现,其中除了最后一个查询之外,所有查询的输出都对最终用户隐藏。
首先,我们可以让模型来解决问题。由于这个初始查询不需要使用学生的解决方案,因此可以省略。这样做还有一个额外的优点,即模型的解决方案不会因“学生尝试的解决方案”而产生偏差。
USER Prompt
已知一个盒子里有4个红色的球和6个蓝色的球。现在从这个盒子里抽出两个球,并且抽出后不放回盒子中。请问,抽出的两个球中有一个是红色而另一个是蓝色的概率是多少?请一步步思考
接下来,我们可以让模型使用所有可用的信息来评估学生解决方案的正确性。
SYSTEM Prompt
将你的解决方案与学生的解决方案进行比较,评估学生的解决方案是否正确。
USER Prompt
问题陈述:"""一个盒子里有4个红色的球和6个蓝色的球。从盒子里抽出两个球,不放回。抽出的两个球中有一个是红色而另一个是蓝色的概率是多少?"""
你的解决方案:"""有两种可能的成功结果:要么我们先抽一个红色球然后是一个蓝色球,要么我们先抽一个蓝色球然后是一个红色球。我们将找出这些结果各自的概率,然后将它们加在一起。
1)先红后蓝:第一个抽到红色球的概率是4/10,因为总共有10个球中有4个是红色的。抽了一个红色球后,剩下3个红球和6个蓝球,所以下一个抽到蓝色球的概率是6/9。所以,这种结果的概率是(4/10)*(6/9)。
2)先蓝后红:第一个抽到蓝色球的概率是6/10,因为总共有10个球中有6个是蓝色的。抽了一个蓝色球后,剩下4个红球和5个蓝球,所以下一个抽到红色球的概率是4/9。所以,这种结果的概率是(6/10)*(4/9)。
现在我们把这两种结果的概率加在一起:(4/10)(6/9)+(6/10)(4/9)= 24/90 + 24/90 = 48/90。这个分数简化为8/15,所以抽出一个红球和一个蓝球的概率是8/15。"""
学生的解决方案:"""(4/10)*(6/9)= 24/90 = 4/15"""
最后,我们可以让模型使用自己的分析来以乐于助人的导师的角色构建回复。
SYSTEM Prompt
你是一名数学导师。如果学生犯了错误,请以不透露答案的方式向学生提供提示。如果学生没有犯错,只需给他们一个鼓励性的评论。
USER Prompt
问题陈述:"""一个盒子里有4个红色的球和6个蓝色的球。从盒子里抽出两个球,不放回。抽出的两个球中有一个是红色而另一个是蓝色的概率是多少?"""
你的解决方案:"""有两种可能的成功结果:要么我们先抽一个红色球然后是一个蓝色球,要么我们先抽一个蓝色球然后是一个红色球。我们将找出这些结果各自的概率,然后将它们加在一起。
1)先红后蓝:第一个抽到红色球的概率是4/10,因为总共有10个球中有4个是红色的。抽了一个红色球后,剩下3个红球和6个蓝球,所以下一个抽到蓝色球的概率是6/9。所以,这种结果的概率是(4/10)*(6/9)。
2)先蓝后红:第一个抽到蓝色球的概率是6/10,因为总共有10个球中有6个是蓝色的。抽了一个蓝色球后,剩下4个红球和5个蓝球,所以下一个抽到红色球的概率是4/9。所以,这种结果的概率是(6/10)*(4/9)。
现在我们把这两种结果的概率加在一起:(4/10)(6/9)+(6/10)(4/9)= 24/90 + 24/90 = 48/90。这个分数简化为8/15,所以抽出一个红球和一个蓝球的概率是8/15。"""
学生的解决方案:"""(4/10)*(6/9)= 24/90 = 4/15"""
分析:"""学生的解决方案是错误的。他们只考虑了先抽一个红色球然后抽一个蓝色球的情况,而忽略了先抽一个蓝色球然后抽一个红色球的情况。正确的解决方案是将这两种情况的概率相加,即8/15。"""
使用这种方法,一次只让模型解决一个问题。同时,将前一个步骤得到的内容,合并到最新的查询Prompt中,这样得到的效果确定性更强。这其实就是逐步引导GPT去思考问题的过程,而每一个问题都会更加明确、简单,因此效果会比较稳定。
询问模型在之前的处理过程中是否遗漏了什么内容
SYSTEM Prompt
你将会收到一个由三个引号包含的文档。你的任务是选出与以下问题有关的摘录:"人工智能历史中有哪些重要的范式转变。"
确保摘录包含解释它们所需的所有相关上下文 - 换句话说,不要提取缺少重要上下文的小片段。请按照以下的JSON格式提供输出:
[{"excerpt": "在这里插入摘录"},
...
{"excerpt": "在这里插入摘录"}]
USER Prompt
文档的内容太长太长,省略...
ASSISTANT Result
省略
USER Prompt
还有更多相关的摘录吗?注意不要重复摘录。同样地,确保摘录包含解释它们所需的所有相关上下文 - 换句话说,不要提取缺少重要上下文的小片段。
由于官方例子的英文内容特别长,不好在这里展示。而且,ChatGPT在中文的某些场景下的效果不太好,本例的中文效果不太稳定。
但对于本方法,其中最关键的是这句“还有更多相关的摘录吗?”,因为模型的回复有时候是不完整的,所以可以采用追问、质疑等方式来让模型进一步的思考,从而回答得更加完整。