译自
https://learn.codesignal.com/preview/courses/78/advanced-techniques-in-prompt-engineering
因为内容比较简单,固一个主题下的5课一起翻译
这里是第5个主题: 提示工程中的高级技术
由于第四个主题没啥干货,固跳过
良心出品,干货满满,简单易懂
其中:思维链是非常重要且有效的技术,后面将单独开文重点介绍!!
本文要点
系统提示技巧与窍门
迭代式提示构建:一步一步的指南
与大型语言模型一起头脑风暴
思维链在提示工程中的应用
用回溯法进行的思维链
系统提示技巧与窍门
引言
欢迎来到高级提示工程技巧。这是一个关于提示工程概念的更高级课程,旨在提供技能,以提升你在这一新兴技能集上的坚实基础。我们从理解如何创建出色的系统消息开始,但在我们继续之前,让我们回顾一下什么是系统消息。
理解系统提示
系统提示是特殊类型的指令,通常对LLM系统的最终用户隐藏,特别是当LLM系统构建为类似ChatGPT这样的聊天界面时。尽管像ChatGPT这样的知名LLM聊天界面的系统消息正在不断迭代,但ChatGPT的系统消息的早期版本是这样开始的:
复制
YouareChatGPT,alargelanguagemodeltrainedbyOpenAI,basedontheGPT-4architecture.
你是ChatGPT,一个由OpenAI训练的大型语言模型,基于GPT-4架构。
-Imageinputcapabilities:Enabled
-图像输入能力:已启用
-Conversationstartdate:2023-12-19T01:17:10.597024
-对话开始日期:2023-12-19T01:17:10.597024
-Deprecatedknowledgecutoff:2023-04-01
-过时的知识截止日期:2023-04-01
...
开始使用系统提示
虽然在你自己的环境中系统消息文件可以命名为任何内容,但你会注意到在CodeSignal IDE中它被称为system.md。配置系统消息以获得高质量输出的最佳提示之一是给LLM鼓励和赞扬。
这里有一个例子:
__CONTEXT__
-YouareanexpertinDataScience.
__CONTEXT__
-你是数据科学领域的专家。
据观察,当你告诉LLM它们有很高的IQ时,它们倾向于产生更好的输出,如下所示:
__CONTEXT__
-YouareanexpertinDataSciencewithanIQof159.
-你是一个拥有159IQ的数据科学领域的专家。
利用系统提示来调整语气和风格
有效实施系统提示允许你一致地指定AI交流中的语气和风格。这是一个策略性的举措,确保每个回应都遵循定义的角色或专业水平,而无需每次都进行手动设置。
考虑如何全局设置风格和语气要求:
__CONTEXT__
-YouareanexpertinDataSciencewithanIQof159.
-你是一个拥有159 IQ的数据科学领域的专家。
__REQUIREMENTS__
-Youarealsoahelpfulassistant.
-你也是一个有帮助的助手。
-Youshouldmaintainapositiveandhelpfuloutlookand
-你应该保持积极和有帮助的态度和风格。
实践时间
有了这些关于系统提示的见解,现在是时候让你自己尝试和练习制作你自己的提示了。记住,AI驱动响应的有效性往往可以追溯到初始提示的质量。通过将这些技巧和窍门应用到你的系统提示中,你将有能力塑造AI的输出,以匹配你所期望的语气、风格和专业水平,提供一个更顺畅和更可预测的互动体验。
迭代式提示构建:一步一步的指南
引言
欢迎来到掌握大型语言模型(LLMs)的提示工程的下一步:迭代式提示构建。通过迭代精化,我们可以将最初的、高层次的问题转化为更精确的提示,从而得到我们所需的确切输出。让我们深入了解如何利用这项技术。
理解迭代式提示构建
迭代式提示构建的思想是从一个简单的提示开始,并使用LLM的输出来增强你的提示,而不是从头开始编写整个提示。
在大多数情况下,复杂的提示需要格式指南、全面的示例、详细的要求等等。从头开始做这一切可能是一项艰巨的任务。这就是从简单开始,并使用你最初的输出来迭代增强和改进你的提示变得方便的地方。
起点
假设我们想构建一个全面的提示,以从项目符号列表返回JSON文档。从头开始创建完整的提示可能需要一些时间,但与LLM合作迭代地构建它,我们可以做得更快。
__ASK__
Givemeasamplebulletedlistwithtwo-levelnesting.
给我一个带有两级嵌套的示例项目符号列表。
样例输出:
Here'sanexampleofasamplebulletedlistwithtwo-levelnesting:
-MainTopic1
-Subtopic1.1
-Subtopic1.2
-Detail1.2.1
-Detail1.2.2
-MainTopic2
-Subtopic2.1
-Subtopic2.2
-Detail2.2.1
-Detail2.2.2
-SpecificDetail2.2.2.1
-SpecificDetail2.2.2.2
-MainTopic3
-Subtopic3.1
-Subtopic3.2
在这个输出中,我们有一个示例,我们可以用它来改进我们最初的提示。
通过迭代细化
让我们进入迭代的下一步,并在给出示例的同时请求转换:
__ASK__
Giventhebulletedlistbelow,convertitintoaJSONdocument
根据下面的项目符号列表,将其转换为JSON文档
----
-MainTopic1
-Subtopic1.1
-Subtopic1.2
-Detail1.2.1
-Detail1.2.2
-MainTopic2
-Subtopic2.1
-Subtopic2.2
-Detail2.2.1
-Detail2.2.2
-SpecificDetail2.2.2.1
-SpecificDetail2.2.2.2
-MainTopic3
-Subtopic3.1
-Subtopic3.2
样例输出:
HereisthebulletedlistconvertedintoaJSONdocument:
这是项目符号列表转换成的JSON文档:
{
"MainTopic1":{
"Subtopic1.1":[],
"Subtopic1.2":[
"Detail1.2.1",
"Detail1.2.2"
]
},
"MainTopic2":{
"Subtopic2.1":[],
"Subtopic2.2":[
{
"Detail2.2.1":[]
},
{
"Detail2.2.2":[
"SpecificDetail2.2.2.1",
"SpecificDetail2.2.2.2"
]
}
]
},
"MainTopic3":{
"Subtopic3.1":[],
"Subtopic3.2":[]
}
}
精确到位
即使我们的请求已经被细化,我们也可能没有完全达到目标。模型可能返回一个冗长的回复,或者可能没有按照我们希望的那样整齐地格式化JSON。这就是精确限制发挥作用的地方。通过明确说明我们的需求——例如,要求响应只包含JSON,不包含任何额外的评论——我们进一步细化了提示。此外,如果我们得到的初始结果并不完全符合我们的想法,我们可以进行一些手动调整,使其完全符合我们的需求。
__ASK__
Givenabulletedlist,convertitintoaJSONdocument
给定一个项目符号列表,将其转换为JSON文档
__CONSTRAINTS__
-YourresponseshouldincludeONLYtheJSONrepresentation
-你的回应应该只包括JSON表示
-EnsuretheJSONiscorrectlyformattedaccordingtostandardconventions
-确保JSON格式正确,按照标准惯例
-Closelyfollowtheformatandexamplegivenbelow.
-严格遵循下面给出的格式和示例
__EXAMPLE__
Input:
-MainTopic1
-Subtopic1.1
-Subtopic1.2
-Detail1.2.1
-Detail1.2.2
-MainTopic2
-Subtopic2.1
-Subtopic2.2
-Detail2.2.1
-Detail2.2.2
output:
{
"MainTopic1":{
"Subtopic1.1":[],
"Subtopic1.2":[
"Detail1.2.1",
"Detail1.2.2"
]
},
"MainTopic2":{
"Subtopic2.1":[],
"Subtopic2.2":[
"Detail2.2.1",
"Detail2.2.2"
]
}
}
现在,这是一个非常稳定的提示,应该能够非常一致地工作。我们将在练习部分看到运行这个提示的一些示例,以观察其力量。
实践出真知
从一个初步的、模糊的请求到一个捕捉我们需求精髓的高度具体的提示的过程,是迭代式提示构建的核心。这种方法使我们能够比手动完成所有工作快得多地构建强大的提示。让我们看看你在即将到来的实践中对这个想法的掌握程度。
与大型语言模型一起头脑风暴
引言
欢迎来到“头脑风暴”课程,这是我们在“高级提示工程技巧”课程中旅程的下一步。在这一课中,我们将深入探讨使用头脑风暴法细化和增强我们为大型语言模型(LLMs)设计的提示的复杂性。我们的重点不仅仅是产生想法;我们旨在以一种能让我们从LLMs获得最佳可能结果的方式来结构化这些想法。当处理复杂任务或寻求创新解决方案时,这种方法特别有益。让我们探索如何在提示工程中有效地应用头脑风暴技巧。
理解头脑风暴技术
头脑风暴,本质上,是关于产生广泛的想法以解决特定的挑战或问题。这是人类解决问题中一个熟悉的概念,但可以被创造性地适应于与LLMs的工作。就像一群人在会议中交换想法一样,我们可以与LLM迭代细化我们的提示,以探索问题或任务的不同角度和方法。
与LLM头脑风暴的一个简单第一步可能看起来像这样:
__ASK__
Generate5uniqueideasforimprovinguserengagementonasocialmediaplatformdesignedforartists.
生成5个独特的想法,用于提高为艺术家设计的社交媒体平台上的用户参与度。
__CONTEXT__
-Theplatformallowsforimageandvideouploads.
-平台允许上传图片和视频。
-Usersarepredominantlyvisualartists.
-用户主要是视觉艺术家。
__CONSTRAINTS__
-Listideasinbulletpoints.
-列出要点中的想法。
-Focusonfeaturesthatcouldbeimplementedwithinamobileapp.
-专注于可以在移动应用中实现的功能。
通过头脑风暴迭代提示细化
虽然这是一个很好的开始,但上述提示相当于请一个人提出5个想法。如我们所知,当你向多个人询问同一个问题时,头脑风暴效果最佳。在LLMs的案例中,记住它们是下一个词预测机器,所以后面生成的想法会受到前面想法的偏见影响。因此,更好的组织头脑风暴的方式是独立运行以下提示5次。
__ASK__
Generate1uniqueideaforimprovinguserengagementonasocialmediaplatformdesignedforartists.
生成1个独特的想法,用于提高为艺术家设计的社交媒体平台上的用户参与度。
__CONTEXT__
-Theplatformallowsforimageandvideouploads.
-平台允许上传图片和视频。
-Usersarepredominantlyvisualartists.
-用户主要是视觉艺术家。
__CONSTRAINTS__
-Focusonfeaturesthatcouldbeimplementedwithinamobileapp.
-专注于可以在移动应用中实现的功能。
头脑风暴整合
再次,就像人类的头脑风暴一样,在产生想法后,你需要有人帮助将不同的想法整合成一个聚焦的结果。按照上述示例,假设我们请3个独立的LLM实例各自提出3个想法。然后我们会构建一个整合器提示,以帮助最佳想法胜出。同样,重要的是每次这些LLM运行都是独立进行的,而不是在一个线程中,以避免之前对话的偏见。
__ASK__
We'veaskedseveralexpertstocomeupwithuniqueideasforimprovingengagementonasocialmediaplatformdesignedforartists.Yourtaskistoevaluatetheseideasandsuggestthebestoption.
我们已经请几位专家提出了一些独特的想法,以提高为艺术家设计的社交媒体平台上的参与度。你的任务是评估这些想法并提出最佳选项。
__CONSTRAINTS__
-Donotsuggestnewideasfromyou,pickawinnerfromthegivenlistoranideathat'samergeofsomeofthegivenones.
-不要提出你的新想法,从给定列表中选择一个赢家,或者是某些给定想法的合并。
__CONTEXT__
-Theplatformallowsforimageandvideouploads.
-平台允许上传图片和视频。
-Usersarepredominantlyvisualartists.
-用户主要是视觉艺术家。
-Expertswereaskedtofocusonfeaturesthatcouldbeimplementedwithinamobileapp
-专家们被要求专注于可以在移动应用中实现的功能
__IDEAS__
...
实践时间
现在你已经掌握了头脑风暴技巧,轮到你使用这种方法来应对挑战了。从广泛开始,生成一系列想法或反馈,然后通过连续的迭代来缩小焦点。这个过程不仅丰富了与LLM的互动,也提高了你可以从中得出的解决方案的质量。让头脑风暴开始吧!
思维链在提示工程中的应用
引言
欢迎进入我们探索高级提示工程技巧之旅的下一个阶段。我们将重点介绍_思维链_方法。这种方法不仅能增强模型的输出,还通过引导模型通过逻辑推理序列,帮助获得精确的答案。
理解思维链
思维链方法是一种强有力的技术,鼓励模型在得出答案时“大声思考”。这种技术在处理需要逐步推理的复杂问题时特别有用。与大多数成年人知道通过逐步思考来思考复杂问题的最佳方式不同,大型语言模型(LLMs)没有这种本能的理解。明确提示模型详细说明其思考过程,被证明能够导致更准确、更有帮助的回应。
在提示设计中的重要性
设计利用思维链方法的提示需要在查询中清晰,并且在期望中精确。目标是引导模型远离仅仅猜测或跳跃到结论,而是向着逐步解决问题的方向努力。这个策略不仅有助于实现更可靠的输出,还使用户(和开发者)能够理解模型答案背后的逻辑。
未使用思维链的示例
大型语言模型(LLMs)在数学计算方面特别不擅长的一项任务。让我们看一个例子:
__ASK__
What's197*971
虽然多次运行后你可能会得到正确答案,但更多时候LLM会犯错,回应的数字如191,087、191,987等,这些都是不正确的。
应用思维链
现在让我们看看当我们改变它来应用思维链时会发生什么。应用这种方法最标准的方式是添加一个要求逐步思考。其他可接受的选项包括
__ASK__
what's197*971
__REQUIREMENTS__
-Thinkstep-by-step
样本输出:
Step1:Multiply7(unitsplaceof197)by971
7*971=6797
Step2:Multiply9(tensplaceof197)by971andaddazeroattheend
9*971=8739=>87390
Step3:Multiply1(hundredsplaceof197)by971andaddtwozeroesattheend
1*971=971=>97100
Step4:Addalltheresultsfromsteps1,2,and3
6797+87390+97100=191287
Therefore,197*971=191,287
而这个回应是准确无误的。
更进一步
当涉及到思维链时,你越能帮助指导大型语言模型(LLM)的思考过程朝正确的方向发展,你就越有可能得到高质量和准确的回应。例如,我们可以改进数学计算的方式是暗示使用相关的整数可能有助于计算,像这样:
__ASK__
what's197*971
__REQUIREMENTS__
-ThinkStepbyStep
-Identifymoreroundnumbersthatcanbecombinedtocomputethis.
样本输出:
Tocalculate197*971,wecanbreakitdownintosimplercalculationsbyidentifyingroundnumbersthatcanbecombined.
为了计算197*971,我们可以通过识别可以组合的整数将其分解成更简单的计算。
Let'sbreakdown197and971intomultiplesof100andtheremainingnumbers:
让我们将197和971分解成100的倍数和剩余的数字:
197=100+97
971=900+71
Now,wecanmultiplytheseinparts:
现在,我们可以分部分乘这些数字:
(100+97)*(900+71)
=100*900+100*71+97*900+97*71
Calculatingtheindividualproducts:
计算各个乘积:
100*900=90,000
100*71=7,100
97*900=87,300
97*71=6,887
Nowweaddtheseresultsup:
现在我们将这些结果加起来:
90,000+7,100+87,300+6,887=191,287
Therefore,197*971isequalto191,287.
实践时间
学习了如何构建你的提示以有效利用_思维链_方法后,现在轮到你用这种方法进行实验了。记住,目标是鼓励模型逐步思考问题,并以简洁准确的答案作为结论。让我们开始练习吧!
用回溯法进行的思维链
最后一章
欢迎来到高级提示工程技巧的最后一章,题为“用回溯法进行的思维链”。这是另一种高级的提示工程方法,使我们能够在高度复杂的情况下帮助LLMs找到解决方案。让我们从理解其背后的核心思想开始。
理解用回溯法进行的思维链
用回溯法进行的思维链的核心思想是,在分析了情况之后,帮助LLM向后思考,而不仅仅是单向行驶。正如您可能记得的,LLMs被设计为下一个词预测机器,而在问题需要回顾的情况下,它们自然趋于变得越来越不有效。我们作为提示工程师的目标是通过创建特定指示来帮助他们应对这一挑战,指示他们在到达某一点后如何回溯。
简单示例
让我们看一个简单的示例提示,它包含了思维链,仅此而已。
__ASK__
Finda10-digitnumberwherethefirstdigitishowmanyzerosinthenumber,theseconddigitishowmany1sinthenumberetc.untilthetenthdigitwhichishowmany9sinthenumber.
找到一个10位数,其中第一位表示该数中0的数量,第二位表示1的数量,以此类推,直到第十位表示9的数量。
__REQUIREMENTS__
-Let'sthinkStep-by-Steptosolvethisproblem
-让我们一步一步来解决这个问题
示例输出:
Step1:
Thenumberhas10digits.Let'sassumethenumberisrepresentedasabcdefghij.Nowweneedtofindthevalueofeachdigitfrom'a'to'j'basedonthegivenconditions.
Step2:
Thefirstdigitishowmanyzerosareinthenumber.Sincetherearenozerosinthenumber,thefirstdigitmustbe0.
Step3:
Theseconddigitishowmanyonesareinthenumber.Tohaveoneoneinthenumber,theseconddigitmustbe1.
Step4:
Continuingthispattern,thethirddigitmustbe2,thefourthdigitmustbe3,andsoonuntilthetenthdigitis9.
Step5:
Puttingallthedigitstogether,thenumberwearelookingforis0123456789.
这个数有10位。让我们假设这个数表示为abcdefghij。现在我们需要根据给定的条件找到每个数字'a'到'j'的值。
步骤2:
第一位是数中0的数量。由于数中没有0,第一位必须是0。
步骤3:第二位是数中1的数量。为了在数中有一个1,第二位必须是1。
步骤4:11按照这种模式,第三位必须是2,第四位必须是3,依此类推,直到第十位是9。
步骤5:
将所有数字组合起来,我们要找的数是0123456789。
正如您所看到的,LLM尝试得很好,但结果完全错误。原因是这种问题反过来从结束处开始工作要比另一种方式容易得多。
引入回溯
通过使用标准的思维链方法,线性地通过问题前进是有效的,但在某些情况下,您可能需要重新审视并修正早期的步骤。这就是“回溯”发挥作用的地方。它涉及到在初步分析之后返回来得出最终答案。让我们增强上面的提示以看一个例子:
__ASK__
Finda10-digitnumberwherethefirstdigitishowmanyzerosinthenumber,theseconddigitishowmany1sinthenumberetc.untilthetenthdigitwhichishowmany9sinthenumber.
找到一个10位数,其中第一位表示该数中0的数量,第二位表示1的数量,以此类推,直到第十位表示9的数量。
__REQUIREMENTS__
-ForwardAnalysis
-前向分析
-Thinkstep-by-steptoanalyzetheproblem
-一步一步思考分析问题
-donotsuggestananswer.
-不要给出答案。
-Backtracking
-回溯
-Aftertheinitialstep-by-stepanalysis,workbackwardfromtheendtocomeupwiththeanswer.
-在初步的逐步分析之后,从结束处向后工作以得出答案。
注意这里的一个关键组成部分不要给出答案 - 这样做是为了避免让LLM产生偏见。如果LLM在进行前向分析(即思维链)时产生了一个答案,即使在回溯之后,即使可能是错误的,它也更有可能坚持那个答案。
示例输出:
1.Let'sstartbylistingouttherequirements:
-Thefirstdigitishowmanyzerosareinthenumber
-Theseconddigitishowmanyonesareinthenumber
-Continuethispatternuptothetenthdigit,whichishowmanyninesareinthenumber
2.Thinkaboutthepossibleconstraints:
-Thetotalnumberofdigitsis10
-Eachdigitcanrangefrom0to9
3.Let'sconsidertheprobleminreverse:
-Thetenthdigithastobethenumberofninesinthenumber,sowealreadyknowitwillbe0sincetherearenoninesinthenumberyet.
-Theninthdigitwillbethenumberofeightsinthenumber,whichisalso0sothattheninthdigitwillbe0aswell.
-Continuethispatternuptothefirstdigit,whichwillbethenumberofzerosinthenumber.
4.Workbackwardfromthelastdigit:
-Thetenthdigitis0
-Theninthdigitis0
-Theeighthdigitis0
-Theseventhdigitis1
-Thesixthdigitis0
-Thefifthdigitis0
-Thefourthdigitis0
-Thethirddigitis1
-Theseconddigitis2
-Thefirstdigitis6
Therefore,the10-digitnumberthatfitsthecriteriais6210001000.
这次答案绝对正确,您可以看到整体分析的深度更强。
其他考虑因素
在解决像上面这样的复杂问题并处理复杂情况时,应用一种技术如用回溯法进行的思维链是不够的。即使在这种情况下,如果您多次运行上面的提示,您会发现并不是所有先进的LLMs都能总是得到正确的答案。
这就是结合高级技巧来救援的地方。您可能还记得我们在这门课程中学到的头脑风暴方法。您可以运行上述提示5-10次,而不是仅运行一次并信任输出,然后编写一个整合提示,审查所有输出并确定哪个解决方案是正确的。这将极大地增加您的提示得出正确答案的能力。
一些练习,完成了
现在您已经学会了如何在提示工程中使用用回溯法进行的思维链,是时候测试您的知识了。看到您完成这门课程真是令人兴奋。我们都为您在这里所取得的成就感到骄傲。
祝您提示工程愉快!