1. 介绍
Prompt Engineering 是一种人工智能(AI)技术,它通过设计和改进 AI 的 prompt 来提高 AI 的表现。Prompt Engineering 的目标是创建高度有效和可控的 AI 系统,使其能够准确、可靠地执行特定任务。
如果你从来没有使用过Prompt Enginerring,可以看Google的这个prompt教程:
https://learningprompt.wiki/zh-Hans/docs/chatGPT/tutorial-basics/brief-introduction
prompt Engineering的介绍和使用网上已经有很多帖子介绍,这里并不重复说明。本博客主要总结OpenAI官网推荐的Prompt的提示策略和技巧。
2. 提示技巧
2.1 清晰的指令要求
我们输入给大模型的prompt,最好是清晰的,不带歧义的。具体有以下几种方式可以构建清晰的prompt。
-
在查询中包含详细信息以获得更相关的答案:例如在prompt中提供所有重要的细节或者背景信息。
-
指定角色:例如,在prompt模板里,指定大模型的角色,可以是老师、学生、专家等等,让大模型以特性的角色来回答问题。
你是一个小学老师,麻烦将下面文本改写成小学生弄听得懂的话。需要改写的文本:xxxxxxxxx
-
使用特定的分隔符来区分不同的输入部分:例如用三重引号、XML标签等分隔符来划分需要不同处理的文本。
你是一个小学老师,麻烦将下面文本<text>改写成小学生弄听得懂的话。""" <xxxxxxxxx> """
-
提供例子:这个很好理解,类似few-shot,在模型正式回答问题前,附带一些样例,期望大模型能从样例中获得一些启发。
你是一个小学老师,麻烦将下面文本<text>改写成小学生弄听得懂的话。""" <文本1> """# output <答案1>""" <xxxxxxxxx> """# output
-
指定所需要的输出长度:可以要求模型输出指定长度的单词、段落等。
请为我介绍国内最值得去爬的10座山,并说明原因。
提供充足的参考文本
-
指导模型使用参考文本回答:在prompt里,如果可以提供与当前查询相关的信息,那么就可以要求模型根据参考文本来回答问题。
输出景区A的攻略。# 参考文本 """ xxxxxxxxxxx(某一天A景区的天气和售票情况) """# 输出格式 <当前天气>: <票价>: <行程攻略>:
-
指示大模型用制定参考文本中的引用来回答
2.2 将复杂的任务分解为简单的子任务
- 使用意图分类来识别与用户查询相关的指令:如果某一任务存在大量的独立的指令集,这种情况下可以先对查询进行分类,最后根据分类结果来确定要执行哪些指令。通过定义固定类别和硬编码与处理给定类别中的任务相关的指令来实现。此过程可以递归应用,将任务分解为一系列阶段。该方法的优势是每次查询仅包含执行任务下一阶段所需指令,与使用单个查询执行这个任务相比,错误率更低。还可以降低成本,因为更大的提示运行成本更高。
- 对于需要长时间的对话应用,总结或过滤之前的对话:由于模型具有固定上下文长度,因此用户和助手之间的对话(其中整个对话包含在上下文窗口中)不能无限期地继续下去。一旦输入的大小达到预定的阈值长度,会触发一个总结部分对话的查询,并且前一次对话的摘要可以作为系统消息的一部分。或者,可以在整个对话过程中在后台异步总结前一次对话。
- 分段总结长文档并递归构建完整摘要:由于模型具有固定上下文长度,因此它们不能用于在单个查询中汇总长度超过上下文长度减去生成的摘要的长度的文本。要总结非常长的文档(例如一本书),我们可以使用一系列查询来总结文档的每个部分。可以将各部分摘要连接起来并进行总结,从而生成摘要的摘要。此过程可以递归进行,直到总结整个文档。如果需要使用有关前面部分的信息来理解后面的部分,那么另一个有用的技巧是在总结该部分内容的同时,在书中任何给定点之前包含文本的连续摘要。
2.3 给模型思考的时间
- 在匆忙得出结论之前,指导模型自己找到解决方案:当明确指示模型在得出结论之前从第一原则进行推理时,我们回得到更好的结果。例如,假设我们想要一个模型来评估学生对数学问题的解决方案。最明显的方法是直接询问模型学生的解决方案是否正确。
- 使用内心独白或一系列查询来隐藏模型的推理过程:内心独白的理念是指示模型将输出中本应对用户隐藏的部分放入结构化格式中,以便于解析它们。然后将输出呈现给用户之前,对输出进行解析,并只显示部分输出。
- 询问模型在之前的传递中是否遗漏来什么:假设使用模型列出于特定问题相关来源的摘录。列出每一个摘录后,模型需要确定是否应该开始编写另一个摘录或是否应该停止。如果源文档很大,模型通常会过早停止并无法列出所有相关摘录。在这种情况下,通常可以通过使用后续查询提示模型来查找之前传递时遗漏的任任何摘录来获得更好的性能。
2.4 使用外部工具
- 使用基于嵌入的搜索实现高效的知识检索(RAG应用):如果外部信息作为输入的一部分,模型可以利用这些信息源。这可以帮助模型生成更明智和最新的响应。例如,如果用户询问有关特定电影的问题,将有关该电影的高质量信息(例如演员、导演等)添加到模型的输入中可能会很有用。嵌入可用于实现高效的知识检索,以便可以在运行时将信息动态添加到模型输入中。
- 使用代码执行进行更精确的计算或调用外部API:语言模型不能依靠自身准确地执行算术或长时间计算。在需要的情况下,可以指示模型编写和运行代码,而不是自己进行计算。具体来说,可以指示模型将要运行的代码放入指定的格式(例如三重反引号),生成输出后,可以提取并运行代码。最后,如果需要,可以将代码执行引擎(如python解释器)的输出作为模型的输入。
- 让模型访问特定的功能:Chat Completions API允许在请求中传递函数描述列表。这使模型能够根据提供的模式生成函数参数。生成的函数参数由API以JSON格式返回,可用于执行函数调用。函数调用提供的输出随后可以在以下请求中反馈到模型中以关闭循环。这使使用OpenAI模型调用外部函数的推荐方式。