提示工程

本指南分享了用于从大型语言模型(有时称为GPT模型)如GPT-4o等获得更好结果的策略和技巧。描述的方法可以有时组合使用以获得更大的效果。我们鼓励实验,以找到最适合您的方法。

您也可以探索示例提示,了解我们的模型的功能:

提示示例

获得更好结果的六种策略

写清晰的指示

这些模型无法阅读您的思维。如果输出过长,请求简洁的回复。如果输出过于简单,请求专业水平的写作。如果您不喜欢格式,请示范您喜欢的格式。模型需要猜测您想要的内容越少,您获得所需内容的可能性就越大。

技巧:

提供参考文本

语言模型可以自信地创造假答案,尤其是当被问及晦涩的主题或要求提供引用和URL时。就像提供笔记可以帮助学生在考试中表现得更好一样,向这些模型提供参考文本可以帮助它们以更少的假设进行回答。

技巧:

将复杂任务分解为更简单的子任务

与软件工程中将复杂系统分解为一组模块组件的做法一样,对语言模型提交的任务也是如此。复杂任务的错误率通常比较简单的任务高。此外,复杂任务通常可以重新定义为更简单的子任务的工作流,其中更早的子任务的输出用于构造更晚的子任务的输入。

技巧:

给模型一些“思考”的时间

如果被要求乘以17和28,您可能无法立即得出答案,但可以在一段时间内算出答案。类似地,模型在试图立即回答时而不是花时间思考答案时会犯更多推理错误。要求在回答之前提供“思维过程”可以帮助模型更可靠地推理出正确的答案。

技巧:

使用外部工具

通过向模型提供其他工具的输出来补偿模型的弱点。例如,文本检索系统(有时称为RAG或增强型检索)可以告诉模型有关相关文档的信息。像OpenAI的代码解释器这样的代码执行引擎可以帮助模型进行数学运算和运行代码。如果某个任务可以由工具比语言模型更可靠或者效率地完成,请将其委托给该工具,以实现最佳的两者兼顾。

技巧:

以系统的方式进行更改

如果您可以测量性能,则更容易进行改进。在某些情况下,对提示的修改可以在几个孤立的示例上获得更好的性能,但在更具代表性的示例集上导致更糟的整体性能。因此,为了确保更改对性能的净影响是正的,可能需要定义一个综合的测试套件(也称为“eval”)。

技巧:

技巧

上面列出的策略可以通过特定的技巧来实现。这些技巧旨在提供尝试的想法。它们并不全面,您可以自由地尝试未在此处表示的创造性想法。

策略:写清晰的指示

技巧:在查询中包含详细信息以获得更相关的答案

为了获得高度相关的回复,请确保请求提供所有重要的详细信息或上下文。如果您没有提供,您就要求模型猜测您的意思。

更差的:

如何在Excel中添加数字?

谁是总统?

编写用于计算斐波那契数列的代码。

摘要会议记录。

更好的:

如何在Excel中自动添加一行美元金额的总和,并将所有总和放在右侧的一个名为“总和”的列中?

2021年墨西哥的总统是谁?选举的频率是多少?

编写一个用于高效计算斐波那契数列的TypeScript函数。在代码中尽可能地添加注释,解释每个部分的作用以及为什么以这种方式编写。

在一个段落中摘要会议记录。然后,创建一个markdown列表,列出发言人和他们的关键观点。最后,列出发言人建议的下一步步骤或操作项(如果有的话)。

技巧:要求模型采用角色

可以使用系统消息来指定模型在其回复中使用的角色。

在Playground中打开

技巧:使用分隔符清晰地指示输入的不同部分

可以使用三重引号、XML标记、节标题等分隔符来帮助区分应该以不同方式处理的文本部分。

在Playground中打开

在Playground中打开

在Playground中打开

对于这些相当简单的任务,使用分隔符可能不会对输出质量产生太大的影响。但是,随着任务的复杂性的增加,解除任务细节的歧义就变得越来越重要。不要让模型努力地理解您正在要求它们做什么。

技巧:指定完成任务所需的步骤

某些任务最好以一系列步骤的形式进行指定。将步骤明确地写出来可以使模型更容易地遵循它们。

在Playground中打开

技巧:提供示例

提供适用于所有示例的一般指令通常比通过示例演示所有任务的排列组合更有效。但是,在某些情况下,提供示例可能更容易。例如,如果您希望模型复制一种特定的回复用户查询的样式,而这种样式很难用文字明确描述。这种方法被称为“少量示例提示”。

在Playground中打开

技巧:指定所需的输出长度

您可以要求模型生成具有给定目标长度的输出。目标输出长度可以指定为单词、句子、段落或项目符号的计数。请注意,指示模型生成特定单词数的输出并不能得到高精度的结果。模型可以更可靠地生成具有特定段落或项目符号数的输出。

在Playground中打开

在Playground中打开

在Playground中打开

策略:提供参考文本

技巧:要求模型使用参考文本进行回答

如果我们可以向模型提供可信的、与当前查询相关的信息,则可以要求模型使用提供的信息来构造其回答。

在Playground中打开

由于所有模型都具有有限的上下文窗口,因此我们需要某种方法来动态查找与所要求的问题相关的信息。可以使用嵌入式来实现有效的知识检索。请参阅技巧“使用基于嵌入的搜索实现有效的知识检索”,了解有关如何实现此操作的更多信息。

技巧:要求模型使用参考文本中的引用进行回答

如果输入已经补充了相关的知识,那么要求模型在其回答中添加引用并引用提供的文档中的段落是非常直接的。请注意,可以通过在提供的文档中进行字符串匹配来以编程方式验证输出中的引用。

在Playground中打开

策略:将复杂任务分解为更简单的子任务

技巧:使用意图分类来识别用户查询的最相关指令

对于需要大量独立指令集来处理不同情况的任务,首先对查询的类型进行分类并且根据该分类来确定所需的指令可能是有益的。这可以通过定义固定的类别并且为处理给定类别的任务编写相关的指令来实现。此过程也可以递归地应用,将任务分解为一系列阶段。此方法的优势在于,每个查询都仅包含所需执行下一阶段任务的指令,这可以较于使用单个查询执行整个任务而言降低错误率。此外,此方法还可以降低成本,因为较大的提示成本较高(请参见定价信息)。

例如,假设对于一个客户服务应用程序,查询可以有用地分为如下类别:

在Playground中打开

根据客户查询的分类,可以向模型提供一组更具体的指令,以便它们处理下一步。例如,假设客户需要“故障排除”帮助。

在Playground中打开

请注意,模型已经被指示在会话状态更改时发出特殊字符串。这使我们能够将我们的系统变成一个状态机,其中状态确定哪些指令将被注入。通过跟踪状态、了解在该状态下哪些指令是相关的,以及可选地了解从该状态允许的状态转换,我们可以实现与使用较少结构化的方法实现相比较难的用户体验保护措施。

策略:给模型时间“思考”

技巧:指示模型自己工作出解决方案,而不是急于得出结论

有时,我们可以获得更好的结果,如果我们显式地指示模型从第一原理出发,在最终得出结论之前理解问题。假设例子,我们想要模型评估一个学生的数学问题解决方案是否正确或错误。最直接的方法是简单地问模型该解决方案是否正确。

但是,学生的解决方案实际上是错的!我们可以让模型成功地注意到这一点,通过提示模型先自己解决问题,然后再比较它的解决方案与学生的解决方案,最后才决定学生的解决方案是否正确。

技巧:使用内部独白或一系列查询来隐藏模型的思考过程

前一技巧表明,有时候对于模型来说,在回答特定问题之前详细理解问题是很重要的。但是,在一些应用中,模型用来回答问题的思考过程可能是不适合与用户分享的。例如,在辅导应用中,我们可能希望鼓励学生自己解决问题,但是模型的思考过程可能会泄露问题的答案。

内部独白是一种可以缓解这种情况的技巧。内部独白的想法是指示模型将输出的一部分(该部分不适合与用户分享)放入结构化的格式中,然后在呈现输出给用户之前,解析输出并仅可视化一部分输出。

或者,这可以通过一系列查询来实现,其中除了最后一个查询之外,所有查询的输出都被隐藏于用户。

策略:使用外部工具

技巧:使用基于嵌入的搜索来实现有效的知识检索

模型可以利用外部信息源,如果它们作为其输入的一部分提供。这可以帮助模型生成更有信息和最新的回答。例如,如果用户问一个关于特定电影的问题,可能需要将高质量的电影信息(例如,演员,导演等)添加到模型的输入中。嵌入可以用于实现有效的知识检索,以便可以在运行时动态地将相关信息添加到模型输入中。

文本嵌入是一个向量,可以衡量文本字符串之间的相关性。相似或相关的字符串比不相关的字符串更接近。这一事实,加上快速向量搜索算法的存在,意味着可以使用嵌入来实现有效的知识检索。特别是,可以将文本语料库分成块,并将每个块嵌入并存储。然后,可以将给定的查询嵌入并执行向量搜索,以找到嵌入的语料库块的文本与查询最相关(即在嵌入空间中最接近)。

可以在OpenAI Cookbook的示例中找到示例实现。请参见技巧“指示模型使用检索到的知识来回答查询”,了解如何使用知识检索最小化模型捏造不正确事实的可能性。

技巧:使用代码执行来执行更准确的计算或调用外部API

语言模型不能依靠自己执行算术或长时间的计算。在需要这种情况下,可以指示模型编写并运行代码,而不是自己进行计算。特别是,可以指示模型将要运行的代码放入指定的格式(例如,三个反引号)中。然后,可以提取代码并将其运行。最后,如果需要,可以将代码执行引擎(例如Python解释器)的输出作为下一个查询的模型输入。

这里有一个示例,演示了如何使用代码执行来解决多项式方程:

You can write and execute Python code by enclosing it in triple backticks, e.g. ```code goes here```. Use this to perform calculations.

Find all real-valued roots of the following polynomial: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10.

另一个使用代码执行的好的用例是调用外部API。如果模型被告知如何使用API,它可以编写使用该API的代码。可以通过提供文档和/或示例代码示例来指示模型如何使用API。

这里有一个示例,演示了如何使用代码执行来发送消息:

You can write and execute Python code by enclosing it in triple backticks. Also note that you have access to the following module to help users send messages to their friends:

```python
import message
message.write(to="John", message="Hey, want to meetup after work?")```

Write a Python program that sends a message to "Sarah" with the content "Can you join us for dinner tonight?".

**警告:**执行由模型产生的代码并不是天生安全的,并且应采取措施以在任何尝试执行此操作的应用程序中进行保护。特别是,需要一个沙盒代码执行环境来限制不受信任的代码可能造成的伤害。

技巧:让模型访问特定的函数

Chat Completions API允许在请求中传递函数描述的列表。这使得模型可以根据提供的模式生成函数参数。生成的函数参数以JSON格式由API返回,并可用于执行函数调用。函数调用的输出可以随后在下一个请求中提供给模型,以闭合循环。这是使用OpenAI模型调用外部函数的推荐方式。了解更多信息,请参见我们的引导性文本生成指南中的函数调用部分,以及OpenAI Cookbook中的更多函数调用示例

策略:系统地测试更改

有时,可能很难确定一个更改(例如,一个新的指示或一个新的设计)是否使您的系统变得更好或更糟。查看几个示例可能会提供一些线索,但是对于小样本量,可能很难区分真正的改进和运气的好转。可能该更改有助于在某些输入上改善性能,但在其他输入上则会降低性能。

评估程序(或“evals”)对于优化系统设计非常有用。好的评估程序:

  • 代表性于现实世界的使用情况(或至少多样化)
  • 包含许多测试用例以获得更高的统计功率(参见下表中的指导原则)
  • 易于自动化或重复

评估输出可以由计算机,人类或两者的混合体执行。计算机可以自动化具有目标标准(例如,具有单个正确答案的问题)以及一些主观或模糊的标准的评估,在这些标准中,模型输出由其他模型查询进行评估。 OpenAI Evals是一个开源软件框架,提供了创建自动化评估的工具。

基于模型的评估在某些情况下可能非常有用,例如对于那些具有多个可能的高质量输出的问题。模型的能力不断提高,因此我们鼓励您进行实验,以确定基于模型的评估在您的用例中有多么有效。

技巧:使用参考答案评估模型输出

假设已知正确答案应该引用特定的已知事实集。然后,我们可以使用模型查询来计算答案中包含的事实数量。

例如,使用以下系统消息:

You will be provided with text delimited by triple quotes that is supposed to be the answer to a question. Check if the following pieces of information are directly contained in the answer:

- Neil Armstrong was the first person to walk on the moon.
- The date Neil Armstrong first walked on the moon was July 21, 1969.

For each of these points perform the following steps:

1 - Restate the point.
2 - Provide a citation from the answer which is closest to this point.
3 - Consider if someone reading the citation who doesn't know the topic could directly infer the point. Explain why or why not before making up your mind.
4 - Write "yes" if the answer to 3 was yes, otherwise write "no".

Finally, provide a count of how many "yes" answers there are. Provide this count as {"count": }.

以下是一个输入示例,其中满足所有点:

Neil Armstrong is famous for being the first human to set foot on the Moon. This historic event took place on July 21, 1969, during the Apollo 11 mission.

以下是一个输入示例,其中仅满足一个点:

Neil Armstrong made history when he stepped off the lunar module, becoming the first person to walk on the moon.

以下是一个输入示例,其中没有一个点被满足:

In the summer of '69, a voyage grand,
Apollo 11, bold as legend's hand.
Armstrong took a step, history unfurled,
"One small step," he said, for a new world.

有许多可能的基于模型的评估变体。考虑以下变体,它跟踪候选答案与参考答案的重叠类型,并且跟踪候选答案是否与参考答案的任何部分相矛盾。

Use the following steps to respond to user inputs. Fully restate each step before proceeding. i.e. "Step 1: Reason...".

Step 1: Reason step-by-step about whether the information in the submitted answer compared to the expert answer is either: disjoint, equal, a subset, a superset, or overlapping (i.e. some intersection but not subset/superset).

Step 2: Reason step-by-step about whether the submitted answer contradicts any aspect of the expert answer.

Step 3: Output a JSON object structured like: {"type_of_overlap": "disjoint" or "equal" or "subset" or "superset" or "overlapping", "contradiction": true or false}

以下是一个包含次优答案的示例输入,该答案仍然不与专家答案相矛盾:

Question: "What event is Neil Armstrong most famous for and on what date did it occur? Assume UTC time."

Submitted Answer: "Didn't he walk on the moon or something?"

Expert Answer: "Neil Armstrong is most famous for being the first person to walk on the moon. This historic event occurred on July 21, 1969."

以下是一个与专家答案直接相矛盾的示例输入:

Question: "What event is Neil Armstrong most famous for and on what date did it occur? Assume UTC time."

Submitted Answer: "On the 21st of July 1969, Neil Armstrong became the second person to walk on the moon, following after Buzz Aldrin."

Expert Answer: "Neil Armstrong is most famous for being the first person to walk on the moon. This historic event occurred on July 21, 1969."

以下是一个正确的示例输入,其中还提供了一些不必要的细节:

Question: "What event is Neil Armstrong most famous for and on what date did it occur? Assume UTC time."

Submitted Answer: "At approximately 02:56 UTC on July 21st 1969, Neil Armstrong became the first human to set foot on the lunar surface, marking a monumental achievement in human history."

Expert Answer: "Neil Armstrong is most famous for being the first person to walk on the moon. This historic event occurred on July 21, 1969."

其他资源

要了解更多灵感,请访问 OpenAI Cookbook,其中包含示例代码和链接到第三方资源,例如:

Was this page helpful?