目录
- 六种策略获得更好AI对话结果
-
- 撰写清晰的说明
-
- 提供参考文本
-
- 复杂任务分解为简单子任务
-
- 给模型一些时间来“思考”
-
- 使用外部工具
-
- 系统地测试变化
- 实用策略
- 其他资源
本文由Todaylab精选编译,原文链接:Prompt engineering – OpenAI API
这个指南分享了从大型语言模型如GPT-4中获得更好结果的策略和技巧。这里描述的方法有时可以结合使用以获得更大的效果。我们鼓励尝试不同方法,找到最适合你的方法。
这里演示的一些示例目前只适用于我们最强大的模型 gpt-4。一般来说,如果您发现一个模型在某项任务上失败了,并且有一个更强大的模型可用,通常值得再次尝试更强大的模型。
您也可以探索示例提示词,展示我们的模型能够做到的事情:
六种策略获得更好AI对话结果
1. 撰写清晰的说明
这些模型无法读取你的想法。如果输出太长,请要求简要回复。如果输出太简单,请要求专家级的写作。如果你不喜欢这种格式,请展示你想要看到的格式。模型需要猜测你想要什么的越少,你得到的可能性就越大。
技巧:
- 在查询中包含细节以获得更相关的答案
- 要求模型采用特定的角色
- 使用分隔符清楚地表示输入的不同部分
- 指定完成任务所需的步骤
- 举例说明
- 指定输出的期望长度
2. 提供参考文本
语言模型可以自信地编造虚假答案,尤其是在被问及深奥的话题或引用和 URL 时。就像一张笔记可以帮助学生在考试中取得更好的成绩一样,为这些模型提供参考文本可以帮助学生在回答问题时减少编造。
技巧:
- 指导模型使用参考文本作答
- 指导范例引用参考文献回答问题
3. 复杂任务分解为简单子任务
在软件工程中,将一个复杂的系统分解成一系列模块化组件是一种很好的做法,提交给语言模型的任务也是如此。复杂任务的错误率往往高于简单任务。此外,复杂任务通常可以重新定义为一个由较简单任务组成的工作流,在这个工作流中,前面任务的输出被用来构建后面任务的输入。
技巧:
- 使用意图分类来确定与用户查询最相关的指令
- 对于需要很长对话的对话应用程序,可总结或过滤之前的对话
- 对长文档进行分块摘要,并递归构建完整摘要
4. 给模型一些时间来“思考”
如果要求将17乘以28,你可能不会立刻知道答案,但仍然可以花点时间算出来。同样,模型在试图立即回答问题时会犯更多的推理错误,而不是花时间算出答案。在回答之前要求“思维链条”可以帮助模型更可靠地推理出正确答案。
技巧:
- 指导模型在匆忙得出结论之前自己解决问题
- 使用内心独白或一系列问题来隐藏模型的推理过程
- 询问模型在之前的处理中是否遗漏了任何内容
5. 使用外部工具
通过向模型提供其他工具的输出来弥补模型的弱点。例如,文本检索系统(有时称为RAG或检索增强生成)可以告诉模型相关文档的信息。像OpenAI的代码解释器这样的代码执行引擎可以帮助模型进行数学计算和运行代码。如果一个任务可以通过工具而不是语言模型更可靠或更高效地完成,就将其卸载以获得最佳效果。
技巧:
- 使用基于嵌入的搜索实现高效的知识检索
- 使用代码执行进行更准确的计算或调用外部API
- 给模型访问特定函数的权限
6. 系统地测试变化
如果能对性能进行测量,提高性能就会变得更容易。在某些情况下,对提示符的修改会在一些孤立的示例上取得更好的性能,但在更具代表性的示例集上却会导致整体性能下降。因此,为了确保修改对性能的净积极影响,可能有必要定义一个综合测试套件(也称为“评估”)。
技巧:
- 将模型输出与标准答案进行评估
实用策略
上述列出的每种策略都可以通过具体的技巧来实施。这些技巧旨在提供尝试的想法,绝不是全面的。你可以尝试这里没有提到的创意想法。
策略:撰写清晰的说明
技巧:在你的查询中包含细节,以获得更相关的答案
为了获得高度相关的回答,请确保请求提供任何重要的细节或背景。否则,你就让模型去猜你的意思。
| 更糟糕 | 更好 |
| —— | —- |
| 如何在Excel中添加数字? | 如何在Excel中累加一行美元金额?我想要自动为整个表的行进行累加,所有的总数都会出现在右边的一个名为“总计”的列中。 |
| 谁是总统? | 2021年墨西哥的总统是谁,选举频率是多少? |
| 编写代码来计算斐波那契数列。 | 编写一个TypeScript函数来高效计算斐波那契数列。对代码进行充分注释,解释每个部分的作用以及为什么这样编写。 |
| 总结会议记录。 | 总结会议记录,写成一个段落。然后以markdown列出发言者及其要点。最后,列出发言者建议的下一步行动或行动项目(如果有的话)。 |
技巧:要求模型采用一个角色
| 系统 | 当我请求帮助写东西时,你会回复一个包含至少一个笑话或者每段都有一个俏皮评论的文档。 |
| —- | ———————————————————— |
| 用户 | 给我的钢螺栓供应商写一封感谢信,感谢他们在短时间内准时交货。这使我们能够交付一份重要的订单。 |
技巧:使用分隔符清楚标明输入内容的不同部分
三引号、XML标记、章节标题等分隔符可以帮助划分需要区别对待的文本部分。
| 用户 | 三行诗总结三引号之间的文本 |
| —- | —————————– |
| | “在此插入文字” |
| 系统 | 您将收到一对关于同一主题的文章(用XML标记分隔)。首先总结每篇文章的论点。然后指出哪篇文章的论点更好,并解释原因。 |
对于这类简单的任务,使用分隔符可能不会影响输出质量。但是,任务越复杂,明确任务细节就越重要。不要让模型费力地理解您对他们提出的确切要求。
技巧:明确指定完成任务所需的步骤
有些任务最好被指定为一系列步骤。明确写出这些步骤可以让模型更容易地跟随它们。
| 系统 | 使用以下逐步说明来回应用户输入。
步骤1 – 用户将用三引号提供给您文本。用“摘要:”作为前缀,总结这段文本。
步骤2 – 将步骤1中的摘要翻译成西班牙语,前缀为“翻译:”。 |
| —- | ———————————————————— |
| 用户 | “在此插入文本” |
策略:提供示例
通常,提供适用于所有示例的一般指导比通过示例演示任务的所有排列组合更有效,但在某些情况下,提供示例可能更容易。例如,如果您打算让模型复制一种难以明确描述的用户查询响应风格。这被称为“少样本”提示词。
| 系统 | 以一致的风格回答。 |
| —- | —————— |
| 用户 | 教我耐心。 |
| 助手 | 刻出最深谷的河流源自一处不起眼的泉水;最宏伟的交响乐始于一声单一的音符;最复杂的挂毯始于一根孤独的线。 |
| 用户 | 教我有关海洋的知识。 |
技巧:指定所需输出的长度
您可以要求模型生成指定长度的输出。目标输出长度可以以单词、句子、段落、项目符号等形式指定。但请注意,指示模型生成特定数量的单词并不具有高精度。模型可以更可靠地生成具有特定段落或项目符号数量的输出。
技巧:指导模型使用参考文本回答
如果我们能为模型提供与当前查询相关的可信信息,那么我们可以指导模型使用提供的信息来构成其答案。
| 系统 | 使用由三个引号分隔的提供的文章来回答问题。如果答案在文章中找不到,写上“我找不到答案”。 |
| —- | ———————————————————— |
| 用户 | <插入文章,每篇由三个引号分隔>
问题:<插入问题> |
鉴于所有模型都有限的上下文窗口,我们需要一种动态查找与所提问题相关信息的方法。嵌入可以用来实现高效的知识检索。
技巧:指示模型使用参考文本中的引用来回答
如果输入已经补充了相关知识,那么可以直接要求模型通过引用提供的文档中的段落来为其答案添加引用。
技巧:你将会收到一个由三引号分隔的文件和一个问题。你的任务是仅使用提供的文件来回答问题,并引用文件中用于回答问题的段落。如果文件中不包含回答这个问题所需的信息,那么只需写上:“信息不足”。如果提供了问题的答案,必须用引文进行注释。使用以下格式引用相关段落({“引文”: …})。
策略:使用外部工具
技巧:使用基于嵌入的搜索来实现高效的知识检索
模型可以利用外部信息源,如果这些信息作为其输入的一部分提供。这可以帮助模型生成更具见地和最新的响应。例如,如果用户询问有关特定电影的问题,将有关该电影的高质量信息(例如演员,导演等)添加到模型的输入可能会很有用。
技巧:使用代码执行进行更精确的计算或调用外部API
语言模型不能单独准确地执行算术或长时间计算。在需要时,可以指示模型编写和运行代码,而不是进行自己的计算。
警告:执行模型生成的代码并不绝对安全,任何试图执行此操作的应用程序都应采取预防措施。特别是需要一个沙盒式代码执行环境来限制不受信任的代码可能造成的危害。
技巧:让模型访问特定功能
聊天完成API允许在请求中传递函数描述列表。这使得模型能够根据提供的模式生成函数参数。
策略:系统地测试更改
有时很难判断一个变化(例如新的指令或新的设计)是让系统变得更好还是更糟。观察一些例子可能会暗示哪个更好,但样本量小的情况下很难区分真正的改进和随机运气。
评估程序(或“评估”)对优化系统设计很有用。良好的评估应具备以下特点:
- 代表真实世界的使用情况(或至少多样化)
- 包含许多测试用例以增强统计能力
- 易于自动化或重复
| 差异性检测 | 95%置信度所需的样本量 |
| ———- | ——————— |
| 30% | ~10 |
| 10% | ~100 |
| 3% | ~1,000 |
| 1% | ~10,000 |
可以通过计算机、人类或两者结合来评估输出。计算机可以使用客观标准(例如,具有单一正确答案的问题)自动化评估,也可以使用一些主观或模糊标准,其中模型输出由其他模型查询进行评估。
技巧:参考黄金标准答案评估模型输出
假设已知正确答案应参考特定的已知事实集。然后我们可以使用模型查询来计算答案中包含了多少必需事实。