大模型开发(八):基于思维链(CoT)的进阶提示工程

news2024/10/6 6:41:24

全文共8000余字,预计阅读时间约16~27分钟 | 满满干货(附复现代码),建议收藏!

本文目标:介绍提示工程基础类方法、思维链提示方法和LtM的提示方法,并复现解决论文中四个经典推理问题

大模型开发(八):基于思维链(CoT)的进阶提示工程

代码下载点这里

内容多为近两年LLM领域的科研成果,但结论多为英文语境下的解决方案,因此,将会围绕这些高价值科研结果进行系统梳理,并且结合中文语境的实际情况提出中文内容逻辑推断的解决方案。

一、介绍

截至2023年7月29日为止,在Completions模型中,gpt-3系列模型(如’text-davinci-003’模型)是最强大的,同时也是第一批拥有涌现能力的大语言模型(LLM),即哪怕模型未经特定任务的训练,但在适当的提示下,仍然能够解决某些特定领域的问题。

比如它的数学能力,大语言模型甚至不知道数字代表的真实含义,只是在学习了无数的语料之后,发现了一些数学结论之间的潜在概率关系,就能最终涌现出了数学运算或者复杂推理的能力,这是很强的。要知道,大语言模型的训练目标目标是生成或预测文本,而不是进行问答。

但是,大模型的这种“涌现能力”其实并不稳定,在不修改模型本身参数(微调)的情况下,模型涌现能力极度依赖对模型的提示过程,即对同样一个模型,不同的提示方法将获得质量完全不同的结果。

一个完整的用户和大语言模型的交互流程,也被称为大语言模型(LLM)的提示工程(Prompt engineering),提示工程是激发模型涌现能力(激发模型潜力)的非常关键的技术。提示工程和微调同属对模型涌现能力的引导和优化方法,但相比微调,提示工程成本更低、使用更加灵活,且对于提升模型在小语义空间内复杂语义理解效果更好。在很多时候,甚至需要要先设计提示工程进行文本标注,再使用这些标注的文本进行模型微调。

二、四个经典推理问题

对于提示工程来说,其侧重点是要解决复杂语义理解问题,而要验证模型是否具备这种能力,可以观察模型是否能解决复杂逻辑推理问题。

若通过模型能够在提示工程引导下,解决原始状态下无法解决的推理问题,则说明提示工程能够提升模型的推理能力,并且越有效的提示工程对模型推理能力提升幅度越大。这点能够通过设置不同复杂程度的推理问题来进行验证。

看一下以下四个经典的推理问题:

推理题1、2来自论文:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

image-20230719091658909

切换到中文语境下:

  • 推理题 1

prompt1 = ‘罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?’

代码如下:

import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")

prompt1 = '罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?'

response1 = openai.Completion.create(
            model="text-davinci-003",
            prompt=prompt1,
            max_tokens=1000,
            )

response1["choices"][0]["text"].strip()

看下推理结果:

image-20230719092147846

  • 推理题 2

prompt2 = ‘食堂总共有23个苹果,如果他们用掉20个苹果,然后又买了6个苹果,请问现在食堂总共有多少个苹果?’

看下代码:

prompt2 = '食堂总共有23个苹果,如果他们用掉20个苹果,然后又买了6个苹果,请问现在食堂总共有多少个苹果?'
response2 = openai.Completion.create(
            model="text-davinci-003",
            prompt=prompt2,
            max_tokens=1000,
            )

response2["choices"][0]["text"].strip()

看下推理结果:

image-20230719092449486

这个推理题更加复杂一点,即食堂不仅增加了6个苹果,而且还消耗了20个苹果。有增有减,大模型就无法做出正确判断了。正确答案应该是目前食堂还剩23-20+6=9个苹果。

推理题3来自论文:Large Language Models are Zero-Shot Reasoners

image-20230719093003045

切换到中文语境:

  • 推理题 3

prompt3 = ‘杂耍者可以杂耍16个球。其中一半的球是高尔夫球,其中一半的高尔夫球是蓝色的。请问总共有多少个蓝色高尔夫球?’

看下代码:

prompt3 = '杂耍者可以杂耍16个球。其中一半的球是高尔夫球,其中一半的高尔夫球是蓝色的。请问总共有多少个蓝色高尔夫球?'
response3 = openai.Completion.create(
            model="text-davinci-003",
            prompt=prompt3,
            max_tokens=1000,
            )

response3["choices"][0]["text"].strip()

看下推理结果:

image-20230719093255881

第三个逻辑题的数学计算过程并不复杂,但却设计了一个语言陷阱,即一半的一半是多少。能够发现,模型无法围绕这个问题进行准确的判断,正确答案应该是16*0.5*0.5=4个蓝色高尔夫球。

推理题4 来自论文LEAST-TO-MOST PROMPTING ENABLES COMPLEX REASONING IN LARGE LANGUAGE MODELS

image-20230719150659795

  • 推理题 4

prompt4 = ‘艾米需要4分钟才能爬到滑梯顶部,她花了1分钟才滑下来,水滑梯将在15分钟后关闭,请问在关闭之前她能滑多少次?’

看下代码:

prompt4 = '艾米需要4分钟才能爬到滑梯顶部,她花了1分钟才滑下来,水滑梯将在15分钟后关闭,请问在关闭之前她能滑多少次?'
response4 = openai.Completion.create(
            model="text-davinci-003",
            prompt=prompt4,
            max_tokens=1000,
            )

response4["choices"][0]["text"].strip()

看下推理结果:

image-20230719094130749

这个题计算过程最复杂的,涉及多段计算以及除法运算。正确的计算过程应该是先计算艾米一次爬上爬下总共需要5分钟,然后滑梯还有15分钟关闭,因此关闭之前能够再滑15/5=3次。

从上述结果来看,'text-davinci-003’在Zero-shot的情况下,逻辑推理能力较弱,只能围绕相对简单的、只有线性运算过程的推理问题进行很好的解答,对于这四个推理题,模型只正确回答了第一个问题,其他问题都答错了,模型的推理能力堪忧。

下面通过不同的提示法,看如何加强模型的逻辑处理能力,从而解决这些问题

三、One-shot & Few-shot提示学习法

最简单的提示工程的方法就是通过输入一些类似问题和问题答案,让模型参考学习,并在同一个prompt的末尾提出新的问题,依次提升模型的推理能力。这种方法也被称为One-shot或者Few-shot提示方法。

One-shot和Few-shot最早由OpenAI研究团队在论文《Language Models are Few-Shot Learners》中率先提出,这篇论文也是提示工程方法开山鼻祖,不仅介绍了提示工程的两大核心方法,同时也详细介绍这么做背后的具体原因。

具体的应用来说,Few-shot提示方法并不复杂,只需要将一些类似的问题的问题+答案作为prompt的一部分进行输入即可

做个实验:首先把模型能够正确回答的第一个例子作为提示词输入,查看能否顺利推理出第二个问题:

Few-shot的编写格式:

当需要输入多段问答作为提示词时,以Q作为问题的开头、A作为回答的开头(也可以换成“问题”、“答案”),并且不同的问答对话需要换行以便于更加清晰的展示,具体方法是通过转义符+换行来完成,这样换行之后仍然还在一个字符串内。

代码如下:

prompt_Few_shot1 = 'Q:“罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?” \
                  A:“现在罗杰总共有11个网球。” \
                  Q:“食堂总共有23个苹果,如果他们用掉20个苹果,然后又买了6个苹果,请问现在食堂总共有多少个苹果?” \
                  A:'

response_Few_shot1 = openai.Completion.create(
                     model="text-davinci-003",
                     prompt=prompt_Few_shot1,
                     max_tokens=1000,
                     )

response_Few_shot1["choices"][0]["text"].strip()

看下推理结果:

image-20230719101912636

虽然无法确定模型预测过程发生了何种变化,但在学习了第一个例子之后,模型确实能够对第二个问题做出准确判断。能够发现Few-shot在提升模型逻辑推理能力方面能够起到一定作用。

再测试一下将两个例子的问答都作为提示词进行输入,看看模型是否能正确回答第三个问题。代码如下:

prompt_Few_shot2 = 'Q:“罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?” \
                  A:“现在罗杰总共有11个网球。” \
                  Q:“食堂总共有23个苹果,如果他们用掉20个苹果,然后又买了6个苹果,请问现在食堂总共有多少个苹果?” \
                  A:“现在食堂总共有9个苹果。” \
                  Q:“杂耍者可以杂耍16个球。其中一半的球是高尔夫球,其中一半的高尔夫球是蓝色的。请问总共有多少个蓝色高尔夫球?” \
                  A:'

response_Few_shot2 = openai.Completion.create(
                     model="text-davinci-003",
                     prompt=prompt_Few_shot2,
                     max_tokens=1000,
                     )

response_Few_shot2["choices"][0]["text"].strip()

看下推理结果:

image-20230719102248425

模型对第三个问题仍然回答错误。接下来尝试把前两个问题作为提示词的一部分,让模型回答第四个问题,看下代码:

prompt_Few_shot3 = 'Q:“罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?” \
                  A:“现在罗杰总共有11个网球。” \
                  Q:“食堂总共有23个苹果,如果他们用掉20个苹果,然后又买了6个苹果,请问现在食堂总共有多少个苹果?” \
                  A:“现在食堂总共有9个苹果。” \
                  Q:“艾米需要4分钟才能爬到滑梯顶部,她花了1分钟才滑下来,水滑梯将在15分钟后关闭,请问在关闭之前她能滑多少次?” \
                  A:'

response_Few_shot3 = openai.Completion.create(
                     model="text-davinci-003",
                     prompt=prompt_Few_shot3,
                     max_tokens=1000,
                     )

response_Few_shot3["choices"][0]["text"].strip()

看下推理结果:

image-20230719102628347

第四个问题也回答错误。这也说明了Few-shot提示方法能够一定程度提高模型推理能力,但提升的幅度有限,对于稍微复杂些的推理问题,模型仍然无法做出准确的回答。

Few-shot的使用方法较为简单,但实际上Few-shot有非常多的变种方法,其中一类非常重要的变种方法就是围绕提示的示例进行修改,即在示例中不仅提供问题+答案,同时还会增加一些辅助思考和判断的“提示”。

四、思维链提示法

4.1 Zero-shot-CoT提示方法

Zero-shot-CoT是在Few-shot思想下,一种更好的提示方法。它借助思维链(也被称为思考链,Chain of Thought,CoT)提示法来解决这个问题。一种非常简单而有效的方式是:在提示词尾部追加一句“Let’s think step by step”,即可大幅提高模型推理能力。

这种方法最早由东京大学和谷歌在论文《Large Language Models are Zero-Shot Reasoners》中提出。由于只需要修改提示词而无需手动编写推导的成功示例(无需编写思维链样本),因此这种方法也被称为Zero-shot-CoT。

根据原论文描述,作者在测试Zero_shot_CoT方法时曾尝试过多组不同的提示词尾缀,并在一个机器人指令数据集上进行测试,最终发现“Let’s think step by step”效果最好,其他指令及各指令准确率排名如下:

image-20230719104708205

如果切换到中文语境下,对指令“Let’s think step by step”进行中文翻译,做了大量的测试后,得出结论:“请一步步进行推理并得出结论”要远远好于“请让我们一步步进行思考”等类似的提示词语句,这种情况也给了非常深刻的启发,那就是大模型的“思考过程”是黑箱模型,哪怕表意近似的提示词对模型来说实际的影响力可能会有非常大的区别,大家可以自行测试一下,效果差别很大。

在中文语境下使用指令“请一步步进行推理并得出结论”测试一下,

  • 推理题 1

看下代码

prompt_Zero_shot_CoT1 = '罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?请一步步进行推理并得出结论。'

response_Zero_shot_CoT1 = openai.Completion.create(
                          model="text-davinci-003",
                          prompt=prompt_Zero_shot_CoT1,
                          max_tokens=1000,
                          )

response_Zero_shot_CoT1["choices"][0]["text"].strip()

看下推理结果:

image-20230719105416603

  • 推理题 2

看下代码:

prompt_Zero_shot_CoT2 = '食堂总共有23个苹果,如果他们用掉20个苹果,然后又买了6个苹果,请问现在食堂总共有多少个苹果?请一步步进行推理并得出结论。'

response_Zero_shot_CoT2 = openai.Completion.create(
                          model="text-davinci-003",
                          prompt=prompt_Zero_shot_CoT2,
                          max_tokens=1000,
                          )

response_Zero_shot_CoT2["choices"][0]["text"].strip()

看下推理结果:

image-20230719105626548

  • 推理题 3

看下代码:

prompt_Zero_shot_CoT3 = '杂耍者可以杂耍16个球。其中一半的球是高尔夫球,其中一半的高尔夫球是蓝色的。请问总共有多少个蓝色高尔夫球?请一步步进行推理并得出结论。'

response_Zero_shot_CoT3 = openai.Completion.create(
                          model="text-davinci-003",
                          prompt=prompt_Zero_shot_CoT3,
                          max_tokens=1000,
                          )

response_Zero_shot_CoT3["choices"][0]["text"].strip()

看下推理结果:

image-20230719105804601

  • 推理题 4

看下代码:

prompt_Zero_shot_CoT4 = '艾米需要4分钟才能爬到滑梯顶部,她花了1分钟才滑下来,水滑梯将在15分钟后关闭,请问在关闭之前她能滑多少次?请一步步进行推理并得出结论。'

response_Zero_shot_CoT4 = openai.Completion.create(
            model="text-davinci-003",
            prompt=prompt_Zero_shot_CoT4,
            max_tokens=1000,
            )

response_Zero_shot_CoT4["choices"][0]["text"].strip()

看下推理结果:

image-20230719110114882

尽管答案正确,但推理过程并不正确,至于总共能滑3.5次云云,更是不符合逻辑。因此第四题其实仍然回答错误。

经过四个逻辑推导题的验证,确实相比Few-shot,Zero-shot-CoT确实更加有效,即能够通过更加简洁的提示来大幅提高模型推理能力。

该篇论文的另外两个重要结论:

需要重点关注的第二个结论是:在这篇论文中首次提出了利用大模型进行两阶段推理的设想,即第一个阶段先进行问题的拆分并分段解答问题(Reasoning Extraction),然后第二阶段再进行答案的汇总(Answer Extraction),这给予了后续LtM提示方法很大的启发。

image-20230719110418641

该篇论文的第三个重要结论:作者通过测试验证,在实际使用过程中,Zero-shot-CoT要略弱于Few-shot-CoT方法

image-20230719110601240

论文中明确表示:模型越大,CoT效果越好,换而言之就是模型越大,CoT对模型“涌现能力”的激发效果越好。并且GPT-3在GSM8K数据集上能达到55%左右准确率。

GSM8K是一个非常著名的小学数学应用题组成的数据集,往往用于测试模型的推理能力。

4.2 Few-shot-CoT提示方法

从诞生时间上来说,Few-shot-CoT诞生时间要早于Zero-shot-CoT,它们之间的区别是:Zero-shot-CoT是零样本提示的情况下通过修改提示词后缀激发模型的思维链,而Few-shot-CoT则是通过编写思维链样本作为提示词,让模型学会思维链的推导方式,从而更好的完成推导任务

该方法最早由谷歌大脑团队在论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》中首次提出,也是在这篇论文中思维链的概念被首次提出,因此该论文可以说是思维链的开山鼻祖之作。

相比于Few-shot,Few-shot-CoT的不同之处只是在于需要在提示样本中不仅给出问题的答案、还同时需要给出问题推导的过程(即思维链),从而让模型学到思维链的推导过程,并将其应用到新的问题中。论文中给出了一系列的结论,用于论证思维链在这些领域应用的有效性。

image-20230719152322893

例如,围绕推理1,手动写一个思维链作为Few-shot的示例:

'Q:“罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?”
A:“罗杰一开始有五个网球,又购买了两盒网球,每盒3个,共购买了6个网球,因此现在总共由5+6=11个网球。因此答案是11。” ’

在获得了一个思维链示例后,就可以以此作为样本进行Few-shot-CoT来解决第二个推理问题,看下代码:

prompt_Few_shot_CoT2 = 'Q:“罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?” \
                        A:“罗杰一开始有五个网球,又购买了两盒网球,每盒3个,共购买了6个网球,因此现在总共由5+6=11个网球。因此答案是11。” \
                        Q:“食堂总共有23个苹果,如果他们用掉20个苹果,然后又买了6个苹果,请问现在食堂总共有多少个苹果?” \
                        A:'

response_Few_shot_CoT2 = openai.Completion.create(
                         model="text-davinci-003",
                         prompt=prompt_Few_shot_CoT2,
                         max_tokens=1000,
                         )

response_Few_shot_CoT2["choices"][0]["text"].strip()

看下推理结果:

image-20230719151329759

从结果上看,模型能够非常好的回答第二个问题,接下来把前两个问题的思维链作为提示词输入,来引导模型解决第三个问题,看下代码:

prompt_Few_shot_CoT3 = 'Q:“罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?” \
                        A:“罗杰一开始有五个网球,又购买了两盒网球,每盒3个,共购买了6个网球,因此现在总共由5+6=11个网球。因此答案是11。” \
                        Q:“食堂总共有23个苹果,如果他们用掉20个苹果,然后又买了6个苹果,请问现在食堂总共有多少个苹果?” \
                        A:“食堂最初有23个苹果,用掉20个,然后又买了6个,总共有23-20+6=9个苹果,答案是9。” \
                        Q:“杂耍者可以杂耍16个球。其中一半的球是高尔夫球,其中一半的高尔夫球是蓝色的。请问总共有多少个蓝色高尔夫球?” \
                        A:'

response_Few_shot_CoT3 = openai.Completion.create(
                         model="text-davinci-003",
                         prompt=prompt_Few_shot_CoT3,
                         max_tokens=1000,
                         )

response_Few_shot_CoT3["choices"][0]["text"].strip()

看下推理结果:

image-20230719151528383

继续叠加,看最后一个问题,代码如下:

prompt_Few_shot_CoT4 = 'Q:“罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?” \
                        A:“罗杰一开始有五个网球,又购买了两盒网球,每盒3个,共购买了6个网球,因此现在总共由5+6=11个网球。因此答案是11。” \
                        Q:“食堂总共有23个苹果,如果他们用掉20个苹果,然后又买了6个苹果,请问现在食堂总共有多少个苹果?” \
                        A:“食堂最初有23个苹果,用掉20个,然后又买了6个,总共有23-20+6=9个苹果,答案是9。” \
                        Q:“杂耍者可以杂耍16个球。其中一半的球是高尔夫球,其中一半的高尔夫球是蓝色的。请问总共有多少个蓝色高尔夫球?” \
                        A:“总共有16个球,其中一半是高尔夫球,也就是8个,其中一半是蓝色的,也就是4个,答案是4个。” \
                        Q:“艾米需要4分钟才能爬到滑梯顶部,她花了1分钟才滑下来,水滑梯将在15分钟后关闭,请问在关闭之前她能滑多少次?” \
                        A:'

response_Few_shot_CoT4 = openai.Completion.create(
                         model="text-davinci-003",
                         prompt=prompt_Few_shot_CoT4,
                         max_tokens=1000,
                         )

response_Few_shot_CoT4["choices"][0]["text"].strip()

看下结果:

image-20230719151733004

哪怕输入了前三个问题的思维链作为提示词样本,第四个问题仍然无法得到正确的解答。

另外,根据《Large Language Models are Zero-Shot Reasoners》论文中的结论,从海量数据的测试结果来看,Few-shot-CoT比Zero-shot-CoT准确率更高

重点强调了模型体量和思维链效果之间的关系,简而言之就是,模型越大、Few-shot-CoT应用效果越好。如下图:

image-20230719152541138

同样以GSM8K数据集为例进行了说明,能够看出模型效果LaMDA(137B)< GPT-3(175B) < PaLM(540B)。和Zero-shot-CoT类似,模型越大、CoT对模型潜在能力激发效果越好。

4.3 CoT改良方法:LEAST-TO-MOST PROMPTING(LtM提示法)

在谷歌大脑提出的CoT被实际验证能够大幅提升大语言模型的推理能力不久,来自谷歌大脑的另一个团队在此基础上发表了另一篇重量级论文《LEAST-TO-MOST PROMPTING ENABLES COMPLEX REASONING IN LARGE LANGUAGE MODELS》,并在其中提出了一种名为Least-to-Most(LtM)的提示方法,将大语言模型的推理能力进一步提高。这种名为LtM的提示方法不仅能够将模型在GSM8K上的表现提高至62%,甚至在某些特殊语义解读场景下能够达到3倍于CoT的效果。

该方法是截至目前围绕模型推理能力提升的最为有效的提示学习方法。

LtM提示方法提出的初衷是为了解决CoT提示方法泛化能力不足的问题——即通过人工编写的思维链提示样本可能并不能够很好的迁移到别的问题当中去,换而言之,就是解决问题的流程迁移能力不足,即泛化能力不够。而这种泛化能力不足则会导致“新的问题”无法使用“老的模板”进行解决。

即然要找到更加普适的解决问题的流程会非常复杂,那能否“千人千面”让大模型自己找到解决当前问题的思维链呢?答案是肯定的,谷歌大脑基于这个思路开发了一种全新的提示流程,即先通过提示过程让模型找到解决该问题必须要分步解决哪几个问题,然后再通过依次解决这些问题来解决最原始的问题。

整个提示过程会分为两个阶段进行,第一个阶段是自上而下的分解问题(Decompose Question into subquestion),第二个阶段是自下而上的依次解决问题(Sequentially Solve Subquestion),而整个依次回答问题的过程,其实就可以看成是CoT的过程,只不过LtM会要求模型根据每个不同的问题,单独生成解决问题的链路,以此做到解决问题流程的“千人千面”,从而能够更加精准的解决复杂推理问题。而整个过程问题的由少变多,则是LEAST-TO-MOST一词的来源。

image-20230719153447415

上图是论文中提出的理解LtM提示过程的示例,这里的例子就是一直尝试解决的第四个推理问题。

论文中通过提示模板“To solve __, we need ti first solve:”来引导模型创建子问题,模型会根据原始问题提出子问题“艾米一次爬上滑梯+滑下滑梯总共用时多少”,然后先解决这个子问题,再解决原始问题,不难发现,这其实是一个非常简单的两阶段解决问题的过程——第一个阶段只额外分解了一个子问题(即总共分两个问题作答)。

根据论文中给出的结果,第一阶段模型能够非常顺利的回答“艾米一次爬上滑梯+滑下滑梯总共用时多少”——5分钟,然后据此顺利回答出在滑梯关闭之前艾米还能玩三次的准确结论。

在第二个阶段、即Sequentially Solve Subquestion并不是简单的依次解决两个问题,而是在解决了子问题之后,将原问题、子问题和问题和答案三部分都作为prompt输入给大语言模型,让其对原始问题进行回答。

所以,LtM的核心并不仅仅在于引导模型拆分问题,还在于及时将子问题的问题和答案回传给模型,以便更好的围绕原始问题进行回答。

理论上整个过程会有三次调用大模型的过程,问答流程如下:

image-20230719153925634

按照这种方式尝试一下,看下代码:

prompt_Zero_shot_LtM4 = 'Q:“艾米需要4分钟才能爬到滑梯顶部,她花了1分钟才滑下来,水滑梯将在15分钟后关闭,请问在关闭之前她能滑多少次?”\
                         A:为了解决“在关闭之前她能滑多少次?”这个问题,我们首先要解决的问题是'

response_Zero_shot_LtM4 = openai.Completion.create(
                          model="text-davinci-003",
                          prompt=prompt_Zero_shot_MtL4,
                          max_tokens=1000,
                          )

response_Zero_shot_LtM4["choices"][0]["text"].strip()

结果如下:

image-20230719154836609

LtM提示过程能够非常好的解决这个推理问题。并且,在实际测试过程中,模型不仅能够拆解任务,而且还能够自动根据拆解的子问题答案回答原始问题,最终做到在一个提示语句中对原始问题进行准确回答。

‘为了解决“__”这个问题,我们首先要解决的问题是__’也是经过验证的、最为恰当、同时也最能够得到准确回答的提示词模板,建议经常使用,并验证其功能。

同理,在使用LtM测试其它的三个问题:

  • 推理题 1

代码如下:

prompt_Zero_shot_LtM1 = 'Q:“罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?”\
                         A:为了解决“罗杰总共又多少个网球?”这个问题,我们首先要解决的问题是'

prompt_Zero_shot_LtM1 = openai.Completion.create(
                        model="text-davinci-003",
                        prompt=prompt_Zero_shot_LtM1,
                        max_tokens=1000,
                        )

prompt_Zero_shot_LtM1["choices"][0]["text"].strip()

看下推理结果:

image-20230719155124426

  • 推理题 2

代码如下:

prompt_Zero_shot_LtM2 = 'Q:“食堂总共有23个苹果,如果他们用掉20个苹果,然后又买了6个苹果,请问现在食堂总共有多少个苹果?”\
                         A:为了解决“现在食堂总共有多少个苹果”这个问题,我们首先要解决的问题是'

prompt_Zero_shot_LtM2 = openai.Completion.create(
                        model="text-davinci-003",
                        prompt=prompt_Zero_shot_LtM2,
                        max_tokens=1000,
                        )

prompt_Zero_shot_LtM2["choices"][0]["text"].strip()

看下推理结果:

image-20230719155512353

  • 推理题 3

代码如下:

prompt_Zero_shot_LtM3 = 'Q:“杂耍者可以杂耍16个球。其中一半的球是高尔夫球,其中一半的高尔夫球是蓝色的。请问总共有多少个蓝色高尔夫球?”\
                         A:为了解决“总共有多少个蓝色高尔夫球”这个问题,我们首先要解决的问题是'

prompt_Zero_shot_LtM3 = openai.Completion.create(
                        model="text-davinci-003",
                        prompt=prompt_Zero_shot_LtM3,
                        max_tokens=1000,
                        )

prompt_Zero_shot_LtM3["choices"][0]["text"].strip()

推理结果如下:

image-20230719155714258

LtM提示过程能够非常好的帮助模型解决上述问题,这也说明MtL对大语言模型的推理能力提升效果非常显著,可以说是截至目前,尝试过的(解决推理问题方面)最有效的一类提示方法。

五、总结

本篇文章首先引入了四个经典推理问题,然后详细讲解了One-shot与Few-shot提示学习法。核心部分是思维链提示法,包括Zero-shot-CoT提示方法、Few-shot-CoT提示方法,以及CoT的改良方法LEAST-TO-MOST PROMPTING(LtM提示法)。这些深度的内容旨在帮助理解和掌握更加进阶的提示工程技巧,以便在大模型开发中实现更高效的应用和优化。

参考论文:

  • Few-shot技术参考文献:《Language Models are Few-Shot Learners》
  • Zero-shot-CoT参考文献:《Large Language Models are Zero-Shot Reasoners》
  • Few-shot-CoT参考文献:《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》
  • LtM方法参考文献:《LEAST-TO-MOST PROMPTING ENABLES COMPLEX REASONING IN LARGE LANGUAGE MODELS》

最后,感谢您阅读这篇文章!如果您觉得有所收获,别忘了点赞、收藏并关注我,这是我持续创作的动力。您有任何问题或建议,都可以在评论区留言,我会尽力回答并接受您的反馈。如果您希望了解某个特定主题,也欢迎告诉我,我会乐于创作与之相关的文章。谢谢您的支持,期待与您共同成长!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/772703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JimuReport积木报表 v1.5.9版本发布—免费的可视化报表

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

中睿天下与北京理工大学网络攻防溯源联合实验室揭牌仪式成功举行

7月17日&#xff0c;中睿天下和北理工共建网络攻防溯源联合实验室揭牌仪式暨“网络安全攻防对抗实战”暑期课程开幕式在北京理工大学举行。中睿天下联合创始人魏海宇、创新实验室负责人朱鲲鹏、北京理工大学网络空间安全学院副院长嵩天、副院长张延军、副院长刘莲及部分师生代表…

c++qt 学习笔记,与注意事项

目录 1 构建一个简单的应用 1.1 创建工程 1.2 widget.h文件修改 1.3 widget.cpp文件修改 1.4 生成可执行exe文件 2 内置部件总结 2.1 输入部件类 2.1.1 普通按钮QPushButton示例 2.1.2 工具按钮QToolButton 2.1.3 单选按钮QRadioButton 2.1.4 复选按钮 2.1.5 con…

Unity - Stencil Test 开关,无法通过脚本或是 shader lab 开关来控制

查看过 shader lab 文档: ShaderLab command: Stencil&#xff0c;没有看到 stencil test 关闭的功能&#xff0c;我真的无语。。。 只能开&#xff0c;不能关&#xff0c;意思一个 shader lab 一旦编写了 stencil { } 的内容&#xff0c;就必须开启。。。 好 low 的设计 在网…

【C语言】深剖数据在内存中的存储

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在回炉重造C语言&#xff08;2023暑假&#xff09; ✈️专栏&#xff1a;【C语言航路】 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你…

密码学学习笔记(十六 ):Schnorr签名算法

交互式零知识证明 零知识证明(ZKP)就是不会将证据泄露给验证者的知识证明。Schnorr身份认证识别协议是一个交互式ZKP&#xff0c;它满足了完备性、可靠性、零知识性。所谓的交互式ZKP方案通常包含3个步骤&#xff08;承诺、挑战和证明&#xff09;&#xff0c;在文献中通常被称…

传奇新手小白架设单机给玩家充值元宝教程

阿杰今天和大家说说架设的单机如何给玩家和给自已充值元宝的教程 相信有很多玩家都架设过单机吧&#xff0c;架设容易&#xff0c;但是还有一些搞不明白&#xff0c;就是版本里面需 要充值点和积分回馈点才能领取的&#xff0c;那么这些怎么设置呢&#xff1f;今天就教大家两种…

【Express.js】evp-express-cli

evp-express-cli evp-express-cli 是笔者结合自己的实践经验编写的一款 express 手脚架&#xff0c;以一种比较合适的流程构建的 express 架构。 文档 安装用法 命令新建项目运行模板 验证数据库RedisAuthRabbitMQSocketIONacos 开发工具 BabelEsintJestPkgPM2 资源配置日志异…

【Docker】详解docker安装及使用

详解docker安装及使用 1. 安装docker2. Docker镜像操作3. Docker容器操作4.知识点总结4.1 docker镜像操作4.2 docker容器操作4.3 docker run启动过程 参见docker基础知识点详解 1. 安装docker 目前 Docker 只能支持 64 位系统。 systemctl stop firewalld.service setenforce…

Docker 应用容器引擎 (一)

Docker 应用容器引擎 Docker是什么 是一个开源的应用容器引擎&#xff0c;基于GO语言开发并遵循了apache2.0协议开源 是在linux容器里运行应用的开源工具 是一种轻量级的“虚拟机” Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的…

NOTA WL12,新型双功能整合剂,正电子发射断层扫描 (PET) 显像剂

&#xff08;文章资料汇总来源于&#xff1a;陕西新研博美生物科技有限公司小编MISSwu&#xff09;​ NOTA-WL12试剂 | 基础知识概述&#xff08;部分&#xff09; 英文名称&#xff1a;NOTA-WL12 CAS号&#xff1a;N/A 分子式&#xff1a;N/A 分子量&#xff1a;N/A 规格标准…

【Linux】Docker 基本管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Docker 基本管理 Docker 概述Docker 核心概念Docker 安装部署Docker 镜像操作Docker 容器操作 Docker 概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵…

如何在Windows 10中启用或禁用缩略图预览

文件资源管理器可以在 Windows 10 中显示文件和文件夹的缩略图或图标。 本教程将向你展示如何在文件资源管理器中为你的帐户、所有用户或Windows 10 中的特定用户启用或禁用缩略图预览。 缩略图预览仅在打开并且选择了中等图标、大图标或超大图标文件夹视图布局时显示。 如果缩…

【T1】T1飞跃版红字反冲,提示单据已生成了凭证,不能红冲。但是联查凭证不存在。

【问题描述】 T1飞跃专业版&#xff0c;在经营历程中操作【红字反冲】的时候&#xff0c; 提示&#xff1a;单据已生成了凭证&#xff0c;不能红冲。 但是选中单据&#xff0c;点击联查凭证的时候&#xff0c;又提示【单据没有凭证】。 【解决方法】 针对账套库执行下述语句&…

若依vue -【 33 ~ 】

33 登录日志 系统管理 > 日志管理 > 登录日志 1 应用场景 统计用户的活跃度用户错误输入密码多少次 2 后台实现 &#xff08;1&#xff09;SysLoginController#login&#xff1a;登录 /*** 登录方法* * param loginBody 登录信息* return 结果*/PostMapping("…

(七)「消息队列」之 RabbitMQ 发布者确认(使用 .NET 客户端)

发布者确认&#xff08;Publisher Confirms&#xff09; 发布者确认是一个 RabbitMQ 扩展&#xff0c;用于实现可靠的发布。当在通道上启用发布者确认时&#xff0c;客户端发布的消息将由代理异步确认&#xff0c;这意味着它们已在服务器端得到处理。 0、引言 先决条件 本教程…

Spring、SpringBoot、SpringCloud、SpringCloud Alibaba、Elasticsearch版本对应,附下载地址

1、GitHub Alibaba 发布SpringCloud Alibaba和SpringCloud 、SpringBoot版本 Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot2022.0.0.0-RC2Spring Cloud 2022.0.03.02022.0.0.0-RC1Spring Cloud 2022.0.03.0.02021.0.5.0*Spring Cloud 2021.0.52.6.132021.0.4…

Linux查看某进程所部署的目录路径

1.首先查看系统中正在跑的进程都有什么 ps -ef 2.然后通过抓取你要看的进程名&#xff0c;比如哪些服务 ps -ef | grep xxxxx(服务名) Linux在启动一个进程时&#xff0c;系统会在 /proc 下创建一个以PID命名的文件夹&#xff1b; 在该文件夹下会有我们的进程的信息&#…

【蓝图】p28按键+鼠标点击实现开关门

p28&#xff0c;创建门的蓝图类 actor和组件的区别、门的轴心点修改 创建一个Actor 添加一个静态网格体组件 创建一个门框 同理创建一个门Door 注意&#xff08;当门的中心点不在边角上时&#xff09; 创建一个Scene组件 把物体变换位置 这时只需要旋转Scene就可以旋转…

开发者评价:Serverless 容器最值得推荐的能力是什么?

Kubernetes 作为云原生计算的基础项目&#xff0c;已经在开发者和企业中获得广泛支持。它可以帮助企业加快部署频率、提升应用弹性、优化资源利用率、改善系统可用性。然而其自身复杂性和陡峭的学习曲线依然让一些开发者望而生畏&#xff1b;与此同时&#xff0c;随着企业数字化…