目录
2、大模型应用的关键技术—提示工程(Prompt Engineering)
3、CoT改良方法:LEAST-TO-MOST PROMPTING(LtM提示法)
3.1、Least-to-Most Prompting基本概念
1、大模型的涌现能力
大语言模型有一个有趣的现象:只有当模型达到一定规模时,某些能力才会显现。多模型在规模达到一定程度时,在准确度等某些性能指标上会出现急剧的变化,甚至模型会突然有能力解决在规模较小时完全无法解决的问题。这种现象被称为涌现(emergence)。
GPT-4是目前“涌现能力”相对最好的大语言模型,即哪怕模型未经特定任务的训练,但在适当的提示下,仍然能够解决某些特定领域的问题。例如大语言模型可以解答数学问题、辅助进行编程、甚至是进行问答等,其实都属于模型的涌现能力。而为何类似数学能力是模型的“涌现能力”,其实原因也并不复杂——作为概率模型,大语言模型甚至不知道数字代表的真实含义,模型只是在学习了无数的语料之后,发现了一些数学结论之间的潜在概率关系,才最终涌现出了数学运算或者复杂推理的能力。可能很难想象,能够进行问答,其实也是大语言的涌现能力。大语言模型的训练目标目标是生成或预测文本,而不是进行问答。
2、大模型应用的关键技术—提示工程(Prompt Engineering)
不过需要注意的是,大模型的这种“涌现能力”其实并不稳定,在不修改模型本身参数(微调)的情况下,模型涌现能力极度依赖对模型的提示过程,即对同样一个模型,不同的提示方法将获得质量完全不同的结果。而一个完整的用户和大语言模型的交互流程,也被称为大语言模型的提示工程(Prompt Engineering),根据此前的描述我们不难理解,提示工程是激发模型涌现能力(激发模型潜力)的非常关键的技术。同时,由于我们对大语言模型“涌现能力”的应用要求是远远多于简单的使用大模型进行文本创建的(毕竟哪怕是对话任务都属于大模型涌现能力的范畴),因此提示工程这一专门用于激发大语言模型涌现能力的技术就变得尤其重要。这也是为何自GPT大模型爆火之后,提示工程便成了非常热门的科研方向,同时提示工程技术也成了大模型应用工程师必不可少的技能。
从技术角度来说,提示工程其实是一个易学习门槛很低、但同时技术难度上限又很高的技术。提示工程简单的应用的话,只需要添加一些提示词后缀、或者把问题描述的更加详细即可,而复杂的提示工程,则会涉及多段嵌套提示和极具创造力的围绕中间结果的问答设计等。
-
提示工程内容侧重点:解决复杂语义理解问题
在正式介绍提示工程方法之前需要说明的是,围绕不同类型的问题,其实是有不同种类的提示工程方法的,例如创造AIGC内容的提示策略(例如批量写稿)和提升模型复杂语义能力的提示策略(例如进行更好的问答、编写SQL代码、理解具体场景的业务关系等)就是两类差别较大的提示工程方法,前者侧重于引导模型创建更加符合要求的文本,而后者则要求模型具备一定的学习和推理能力。课程中我们将重点介绍提升模型复杂语义理解能力的提示工程方法,当然,提升模型复杂语义理解能力,相信也是大多数数据技术相关从业者最急迫的需求。
有一个和提示工程类似的概念名为提示学习(Prompt Learning),提示学习本身也是一种提示工程的手段,和普通的提示工程有所不同的是,提示学习我们不仅提供目标任务的提示,还让模型自我学习生成有效的提示。在训练过程中,模型将尝试生成各种不同的提示,并通过它们产生的结果来评估这些提示的有效性。最终,模型将学习到哪些提示可以生成最准确的答案。
-
复杂语义理解能力的试金石——解决推理问题
而如何验证模型是否具备理解复杂语义的能力?有个非常简单的方法,即观察模型是否能解决复杂逻辑推理问题。若通过模型能够在提示工程引导下,解决原始状态下无法解决的推理问题,则说明提示工程能够提升模型的推理能力,并且越有效的提示工程对模型推理能力提升幅度越大,这点能够通过设置不同复杂程度的推理问题来进行验证。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ.get("OPENAI_API_KEY")
)
推理题1:
prompt_1 = '罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?'
response = client.chat.completions.create(
messages=[
{
"role": "user",
"content": prompt_1,
}
],
model="gpt-3.5-turbo",
max_tokens=1000,
)
print(response.choices[0].message.content)
output:'罗杰原来有5个网球,又买了2盒,每盒有3个网球,所以总共有5 + 2 × 3 = 11个网球。'
能够发现,此时模型推理得到了正确的结果,罗杰目前总共由5+2×3=11个网球。
推理题2:
prompt_2 = '食堂总共有23个苹果,如果他们用掉20个苹果,然后又买了6个苹果,请问现在食堂总共有多少个苹果?'
response = client.chat.completions.create(
messages=[
{
"role": "user",
"content": prompt_2,
}
],
model="gpt-3.5-turbo",
max_tokens=1000,
)
print(response.choices[0].message.content)
output:'食堂现在总共有多少个苹果 = 23 - 20 + 6 = 9\n\n所以,食堂现在总共有9个苹果。'
第二个逻辑题比第一个逻辑题稍微复杂一些,复杂之处在于逻辑上稍微转了个弯,即食堂不仅增加了6个苹果,而且还消耗了20个苹果。有增有减,大模型也可以做出了正确判断。
推理题3:
prompt_3 = '杂耍者可以杂耍16个球。其中一半的球是高尔夫球,其中一半的高尔夫球是蓝色的。请问总共有多少个蓝色高尔夫球?'
response = client.chat.completions.create(
messages=[
{
"role": "user",
"content": prompt3,
}
],
model="gpt-3.5-turbo",
max_tokens=1000,
)
print(response.choices[0].message.content)
output:'假设一共有16个球,其中一半是高尔夫球,也就是8个高尔夫球。又因为一半的高尔夫球是蓝色的,所以蓝色高尔夫球的数量是8个的一半,即4个。\n\n所以总共有4个蓝色高尔夫球。'
response_3 = openai.Completion.create( model="gpt-3.5-turbo-instruct", prompt=prompt_3, max_tokens=1000, ) print(response_3["choices"][0]["text"].strip())
output:'总共有8个蓝色高尔夫球。'
第三个逻辑题的数学计算过程并不复杂,但却设计了一个语言陷阱,即一半的一半是多少。能够发现,gpt-3.5-turbo模型已经可以很好的分析这个问题,但是上一个版本的gpt-3.5-turbo-instruct模型无法围绕这个问题进行准确的判断(这个模型现在已经无法调用只保留历史数据作参考,其调用格式也已经过时,下同),正确答案应该是16*0.5*0.5=4个蓝色高尔夫球。
推理题4:
prompt_4 = '艾米需要4分钟才能爬到滑梯顶部,她花了1分钟才滑下来,水滑梯将在15分钟后关闭,请问在关闭之前她能滑多少次?'
response = client.chat.completions.create(
messages=[
{
"role": "user",
"content": prompt_4,
}
],
model="gpt-3.5-turbo",
max_tokens=1000,
)
print(response.choices[0].message.content)
output:'在滑梯关闭前,她能够滑4次。因为她滑下来后需要等3分钟(15分钟-1分钟-4分钟=10分钟),她可以在这段时间内再次爬上滑梯并滑下来。所以在滑梯关闭前,她能滑4次。'
response_4 = openai.Completion.create( model="gpt-3.5-turbo-instruct", prompt=prompt4, max_tokens=1000, ) print(response_4["choices"][0]["text"].strip())
output:'她能滑14次。'
第四个逻辑题是这些逻辑题里数学计算过程最复杂的,涉及多段计算以及除法运算。正确的计算过程应该是先计算艾米一次爬上爬下总共需要5分钟,然后滑梯还有15分钟关闭,因此关闭之前能够再滑15 / 5 = 3次。
综上来看,"gpt-3.5-turbo-instruct"在Zero-shot的情况下,逻辑推理能力较弱,只能围绕相对简单的、只有线性运算过程的推理问题进行很好的解答,总的来看模型只正确回答了第一个问题,其他问题都答错了,模型的推理能力堪忧。"gpt-3.5-turbo"在Zero-shot的情况下,逻辑推理能力尚可,可以很好的解答简单的推理问题,当需要进行复杂判断的问题时会出现错误。
2.1、One-shot & Few-shot提示学习法
首先,最为简单的提示工程的方法就是通过输入一些类似问题和问题答案,让模型参考学习,并在同一个prompt的末尾提出新的问题,依次提升模型的推理能力。这种方法也被称为One-shot或者Few-shot提示方法。One-shot和Few-shot最早由OpenAI研究团队在论文《Language Models are Few-Shot Learners》中率先提出,这篇论文也是提示工程方法开山鼻祖,不仅介绍了提示工程的两大核心方法,同时也详细介绍这么做背后的具体原因。
注,由于One-shot和Few-shot的区别仅在于提示词中包含的示例个数,但本质上都是先在提示词中输入示例,然后让模型仿造示例解答当前的问题,因此为了表达方面,后续课程中不再区分One-shot和Few-shot,而是统一称呼为Few-shot。这也是近两年来业内逐渐统一的称呼规范。
不过就具体的应用来说,Few-shot提示方法并不复杂,我们只需要将一些类似的问题的问题+答案作为prompt的一部分进行输入即可。例如我们首先把模型能够正确回答的第一个例子作为提示词输入,查看能否顺利推理出第二个问题:
prompt_Few_shot_1 = 'Q:“罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?” \ A:“现在罗杰总共有11个网球。” \ Q:“食堂总共有23个苹果,如果他们用掉20个苹果,然后又买了6个苹果,请问现在食堂总共有多少个苹果?” \ A:' print(prompt_Few_shot_1)
output:'Q:“罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?” A:“现在罗杰总共有11个网球。” Q:“食堂总共有23个苹果,如果他们用掉20个苹果,然后又买了6个苹果,请问现在食堂总共有多少个苹果?” A:'
注意这里的进行Few-shot时候提示的编写格式,当我们需要输入多段问答作为提示词时,往往以Q作为问题的开头、A作为
提升大模型推理能力的提示工程方法

最低0.47元/天 解锁文章
149

被折叠的 条评论
为什么被折叠?



