前言
毕竟openai是大模型的鼻祖,官方推荐的prompt教程还是有必要好好学习一下的
网站:
https://platform.openai.com/docs/guides/prompt-engineering

其中一共有6种策略
Six strategies for getting better results
Write clear instructions(写清晰的指令)
Provide reference text(提供参考文本)
Split complex tasks into simpler subtasks(将复杂的任务拆分为更简单的子任务)
Give models time to "think"(给模型时间“思考”)
Use external tools(使用外部工具)
Test changes systematically(系统地测试变化)
一、 Write clear instructions(写清晰的指令)
1.1 在查询中包含更多的上下文详细信息
为了获得高度相关的响应,请确保请求提供任何重要的详细信息或上下文。
白话讲:就是要尽可能提供这个问题的context,否则很有可能幻觉回答

1.2 要求模型采用角色
添加role的相关信息,让信息回答更收缩

1.3 使用分隔符清楚地标注输入的不同部分
三引号、XML 标记、节标题等分隔符可以帮助分隔要区别对待的文本部分。
三引号
xml
section title

其实就是用格式让大模型更理解,且让大模型减少歧义
1.4 指定完成任务所需的步骤
某些任务最好指定为一系列的步骤。显式的编写步骤可以使模型更容易遵循。

1.5 提供示例
没啥说的,few shot,也是实战中比较容易实现提升表现得方式

1.6 指定输出长度
可以要求模型生成具有给定目标长度的输出。目标输出长度可以根据单词、句子、段落、项目符号等的数量来指定.

二、 Provide reference text(提供参考文本)
2.1 指示模型使用参考文本进行回答
如果可以为模型提供与当前查询相关的可信上下文信息,那就可以指示模型使用提供的信息来撰写其答案。

这也是对抗幻觉的方式之一
2.2 指示模型使用参考文本中的引用来回答
添加citation的官方指引
三、 将复杂的任务拆分为更简单的子任务
3.1 使用意向分类来识别与用户查询最相关的指令
对于需要大量独立指令来处理不同情况的任务,首先对user input进行分类并使用该分类来确定需要哪些指令可能是有益的。
官网给的例子是一个客户服务应用程序的例子:

其中主要给的意思是 将每个查询分类为主要类别和次要类别,其中主要分类有计费、技术支持等,每个分类下面还有次要分类:计费的次要分类、技术支持的次要分类等。
可以理解为根据用户的输入,用大模型的能力先进行一次分类。
比如此时的输入被分类为:故障排除
则使用故障排除分类的特有prompt:

大概意思是通过对用户输入的初次分类,用以更合适的prompt模板。
3.2 对于需要很长对话的对话应用程序,总结或过滤以前的对话
由于模型具有固定的上下文长度(token限制),因此用户和大模型之间的对话(其中整个对话都包含在上下文窗口中)不能无限期地继续。
其实就是history的对话信息,不能都放进去。
对于这种情况给的两种结局方案
总结对话中的前几个回合。一旦输入的大小达到预定的阈值长度,这可能会触发一个查询,该查询汇总了过去的部分会话的摘要,并且可以这个摘要作为系统消息的一部分。或者,可以在整个对话的后台异步总结先前的对话的内容。
动态选择与当前查询最相关的对话的先前部分
3.3 分段总结长文本,递归构建完整摘要
主要的原因还是因为输入有一定的token的限制,所以对于非常非常长的文本,需要递归的构建,再得到最终的summary
要总结一个很长的文档,比如一本书,可以使用一系列查询来总结文档的每个部分。章节摘要可以串联和汇总,从而产生摘要的摘要。此过程可以递归进行,直到汇总整个文档为止。
四、Give models time to "think"(给模型时间“思考”)
4.1 在匆忙下结论之前,指示模型制定自己的解决方案
思路大概是通过给予一个完整的例子和解决方案,让大模型判断是非对错,去对比方案,让他自己去独立思考,并且找到逻辑,形成自己的解决方案,并解决。
官网的例子:例如,假设我们想要一个模型来评估学生对数学问题的解决方案。解决这个问题的最明显方法是简单地询问模型,学生的解决方案是否正确。
但是实际上是不正确的。
但是如果prompt改成这样,就可以得到正确的回答了

可以对比一下上下两个system的prompt,主要多的话术是:Then compare your solution to the student's solution and evaluate if the student's solution is correct or not. Don't decide if the student's solution is correct until you have done the problem yourself.
4.2 使用内心独白或一系列查询来隐藏模型的推理过程
前面的策略表明,在回答特定问题之前,模型有时对问题进行详细推理很重要。
但是对于某些应用程序,模型用于得出最终答案的推理过程不适合与用户共享。例如,在辅导应用程序中,我们可能希望鼓励学生自己找出答案,但模型对学生解决方案的推理过程可能会向学生揭示答案。
内心独白是一种可以用来缓解这种情况的策略。 这种策略其实就是对输出的内容进行结构化的编排,对于最终展示的部分,做相应的自定义解析就可以了,比如上面那个例子,其中推导过程和结果可以放在两部分。

或者另外一种方式就是多次访问大模型,进行chat。
通过一系列查询来实现最终目的,其中除最后一个查询外的所有输出都对用户隐藏。(相当于一步变多步,最后一步的输出是最终结果,对用户输出)
4.3 询问模型在之前的过程中是否遗漏了任何内容
主要是针对长文的summary,可能会出现遗漏的问题,不全面。
文中的一个例子来解释:假设我们正在使用一个模型来列出与特定问题相关的来源的摘录。列出每个摘录后,模型需要确定它是否应该开始编写另一个摘录,或者是否应该停止。如果源文档很大,模型通常会过早停止并且无法列出所有相关的摘录。在这种情况下,通常可以通过提示工程进行后续查询来查找在之前过程中遗漏的任何摘录,使与特定问题的摘录总结完全。

五、 Use external tools(使用外部工具)
5.1 使用RAG增强
这里直接看RAG的相关内容,后面补充
5.2 使用调用外部 API
这里应该说的就是function call,主要是agent里的一些自调用对应的api供能
5.3 为模型提供对特定函数的访问权限
这个与5.2是一套东西,主要也是function call,但对应于不一样的robot应该给与对应权限的外部function api
六、 Test changes systematically(系统地测试变化)
新prompt设计是否会使系统变得更好或更糟这个是不太好去衡量的。由于样本量有的时候很小,很难区分是真正的改进还是随机的运气。这种变化可能造成:提高了某些输入的效果,但会损害其他输入的效果,相当于一些case好了,其他case劣化了。
评估程序对于优化系统设计非常有用。好的评估:
代表现实世界的使用(或至少是多样化的)
易于自动化或重复
包含许多测试用例以获得更高的统计功效(有关指南,请参阅下表)

openai的自动评估的项目:https://github.com/openai/evals
推荐阅读:
公众号:AI蜗牛车
保持谦逊、保持自律、保持进步
发送【蜗牛】获取一份《手把手AI项目》(AI蜗牛车著)
发送【1222】获取一份不错的leetcode刷题笔记
发送【AI四大名著】获取四本经典AI电子书