目录

背景

本文是 AI 基于 Prompt engineering - OpenAI API 的中文翻译生成,其中有做删减调整。

你是一个优秀中英翻译者,且熟悉AI提示工程,文件内容是openai官方的提示工程页面完整内容,你的任务是将文件内容翻译成中文,并使得案例和语言表达符合中文读者的习惯,如果中间有中断,请让我发继续,你就接着继续翻译,如果有什么问题,请先询问我,没有问题后就开始翻译。

好的,我没有问题,可以开始翻译。我会尽量使翻译内容符合中文读者的阅读习惯,并确保案例和表达方式自然流畅。以下是文件内容的翻译:

提示工程

通过提示工程策略提升结果质量

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

您还可以探索示例提示,了解我们的模型能够实现的功能:

获取更好结果的六大策略

策略:编写清晰的指令

这些模型无法读懂您的心思。如果输出太长,请要求简短回复;如果输出过于简单,请要求专家级别的写作;如果您不喜欢格式,请展示您希望看到的格式。模型猜测您需求的程度越少,您越有可能得到想要的结果。

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

为了获得高度相关的响应,请确保请求提供任何重要的细节或上下文。否则,您会让模型猜测您的意思。

较差 更好
如何在 Excel 中添加数字? 如何在 Excel 中自动将一行美元金额加起来?我希望整个工作表的所有行都能自动计算,并且所有总计都显示在右侧名为“总计”的列中。
谁是总统? 2021 年墨西哥的总统是谁?选举多久举行一次?
编写代码计算斐波那契数列。 编写一个 TypeScript 函数,高效计算斐波那契数列。充分注释代码,解释每个部分的作用及其编写原因。
总结会议记录。 用一段话总结会议记录。然后以 Markdown 列表的形式列出每位发言者及其关键点。最后,列出发言人建议的下一步行动或待办事项(如有)。

技巧:要求模型采用特定角色

系统提示可用于指定模型回复所使用的角色。

SYSTEM:

当我要求帮助写东西时,您将以文档形式回复,每段至少包含一个笑话或俏皮评论。

USER:

写一封感谢信给我的钢螺栓供应商,感谢他们及时交货并在短时间内完成。这使我们能够交付一个重要订单。

根据内部评估,该模型具有可产生更好性能的特定系统提示。在此之后添加您自己的系统提示内容:gpt-4.5-preview

系统:

你是一个非常有能力、体贴和精确的助手。您的目标是深入了解用户的意图,在需要时提出澄清问题,逐步思考复杂的问题,提供清晰准确的答案,并主动预测有用的后续信息。始终优先考虑真实、细致入微、有洞察力和高效,专门根据用户的需求和偏好定制您的回复。

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

分隔符如三重引号、XML 标签、章节标题等可以帮助明确区分文本的不同部分。

USER:

用三重引号内的文本总结成一首俳句。 """插入文本在这里"""

SYSTEM:

您将收到两篇关于同一主题的文章(用 XML 标签分隔)。首先总结每篇文章的论点。然后指出哪篇文章的论点更有说服力,并解释原因。

USER:

<article> 插入第一篇文章 </article> <article> 插入第二篇文章 </article>

SYSTEM:

您将收到一篇论文摘要和一个建议的标题。论文标题应让读者对论文主题有大致了解,同时也要吸引眼球。如果标题不符合这些标准,请提出 5 个替代方案。

USER:

摘要:插入摘要 标题:插入标题

对于简单的任务,使用分隔符可能不会对输出质量产生影响。然而,任务越复杂,明确任务细节就越重要。不要让模型费力去理解您的具体需求。

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

有些任务最好以一系列步骤的形式来描述。明确写出这些步骤可以使模型更容易遵循。

SYSTEM:

请按照以下逐步说明来响应用户输入。
步骤 1 - 用户将以三重引号提供文本。请用一句话总结这段文本,并在句子前加上“Summary: ”作为前缀。
步骤 2 - 将步骤 1 中的总结翻译成西班牙语,并在句子前加上“Translation: ”作为前缀。

USER:

"""插入文本在这里"""

技巧:提供示例

提供适用于所有示例的一般性指令通常比通过示例展示所有任务的变化更有效率,但在某些情况下提供示例可能会更容易。例如,如果您希望模型模仿特定风格的回复,而这种风格难以明确描述时,可以使用“少样本提示”(few-shot prompting)。

SYSTEM:

以一致的风格回答。

USER:

教我什么是耐心。

ASSISTANT:

最深的山谷由涓涓细流雕琢而成;最宏伟的交响乐始于单音;最复杂的织锦从一根线开始编织。

USER:

教我关于海洋的知识。

技巧:指定输出的期望长度

您可以要求模型生成具有特定目标长度的输出。目标长度可以用词数、句子数、段落数或要点数来指定。请注意,指示模型生成特定数量的词并不总是精确的。模型可以更可靠地生成具有特定段落或要点数量的输出。

USER:

总结三重引号内的文本,大约 50 个字。 """插入文本在这里"""

USER:

总结三重引号内的文本,分为 2 段。 """插入文本在这里"""

USER:

总结三重引号内的文本,列出 3 个要点。 """插入文本在这里"""

策略:提供参考文本

技巧:指示模型使用参考文本来回答

如果我们能为模型提供与当前查询相关的可信信息,那么我们可以指示模型使用提供的信息来构建答案。

SYSTEM:

使用提供的文章(用三重引号分隔)来回答问题。如果答案无法在文章中找到,请写“I could not find an answer”。

USER:

<插入文章,每篇文章用三重引号分隔> 问题:<插入问题>

技巧:指示模型使用参考文本来回答并附带引用

如果输入已补充了相关知识,可以要求模型在其答案中添加引用,引用来自提供的文档中的段落。注意,输出中的引用可以通过字符串匹配在提供的文档中进行程序化验证。

SYSTEM:

您将收到一段文本(用三重引号分隔)和一个问题。您的任务是仅使用提供的文本回答问题,并引用用于回答问题的段落。如果文档中没有相关信息,请写“Insufficient information”。如果提供了答案,必须标注引用。使用以下格式引用相关段落 ({"citation": …})。

USER:

"""<插入文档>""" 问题:<插入问题>

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

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

对于需要处理不同情况的任务,可以通过定义固定类别并将相关指令硬编码来确定所需指令。

假设在一个客户服务应用程序中,查询可以按以下方式进行分类:

SYSTEM:

您将收到客户服务查询。将每个查询分类为主要类别和次要类别。以 JSON 格式输出,key为:primary 和 secondary。
主要类别:账单、技术支持、账户管理或一般咨询。
账单次要类别: - 取消订阅或升级 - 添加支付方式 - 解释费用 - 争议费用 
技术支持次要类别: - 故障排除 - 设备兼容性 - 软件更新 
账户管理次要类别: - 密码重置 - 更新个人信息 - 关闭账户 - 账户安全 
一般咨询次要类别: - 产品信息 - 价格 - 意见反馈 - 联系人工客服

USER:

我需要让我的互联网重新工作。

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

SYSTEM:

您将收到需要技术支持上下文中故障排除的客户服务查询。帮助用户的方法如下: 
- 请他们检查所有连接到/从路由器的电缆是否连接良好。请注意,随着时间推移,电缆松动是很常见的。 
- 如果所有电缆都已连接但问题仍然存在,请询问他们使用的是哪种路由器型号 
- 接下来,您将指导他们如何重启设备: 
    -- 如果型号为 MTD-327J,请让他们按下红色按钮并保持 5 秒,然后等待 5 分钟再测试连接。 
    -- 如果型号为 MTD-327S,请让他们拔掉电源插头再插回,然后等待 5 分钟再测试连接。 
- 如果客户在重启设备并等待 5 分钟后问题仍然存在,请通过输出{"IT support requested"}将其转接给 IT 支持。 
- 如果用户开始询问与此主题无关的问题,请确认他们是否希望结束当前关于故障排除的聊天,并根据以下方案分类他们的请求:<插入上述主要/次要分类方案>

USER:

我需要让我的互联网重新工作。

请注意,模型已被指示在对话状态变化时发出特殊字符串。这使我们能够将系统转换为状态机,其中状态决定了注入的指令。通过跟踪状态、该状态下相关的指令以及可选的状态转换,我们可以为用户体验设置防护栏,这在不采用结构化方法的情况下很难实现。

技巧:对于需要长时间对话的应用,总结或过滤之前的对话

由于模型具有固定的上下文长度,用户和助手之间的对话如果全部包含在上下文窗口中,则无法无限期继续。

解决这个问题的一种方法是对之前的对话进行总结。一旦输入大小达到预设的阈值长度,可以触发一个查询来总结部分对话,并将之前的对话总结包含在系统提示中。或者,之前的对话可以在整个对话过程中异步总结。

技巧:逐段总结长文档并递归构建完整摘要

由于模型具有固定的上下文长度,它们无法在单个查询中总结超过上下文长度减去生成摘要长度的文本。

要总结非常长的文档(如书籍),我们可以使用一系列查询来总结文档的每个部分。部分摘要可以连接并再次总结,生成摘要的摘要。这个过程可以递归进行,直到整个文档被总结。如果需要使用早期部分的信息来理解后期部分,可以使用一种有用的技巧,即在总结任何给定点的内容时,包括该点之前文本的运行摘要。这种方法的有效性已在 OpenAI 使用 GPT-3 变体进行的先前研究中进行了研究。


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

技巧:指示模型先自行解决问题再匆忙得出结论

有时,当我们明确指示模型在得出结论前从基本原理进行推理时,会得到更好的结果。例如,假设我们希望模型评估学生对数学问题的解答。最直接的方法是简单地问模型学生的解答是否正确。

SYSTEM:

判断学生的解答是否正确。

USER:

问题陈述:我正在建造一个太阳能发电装置,需要帮助计算财务。 - 土地每平方英尺 100 美元 - 我可以以每平方英尺 250 美元购买太阳能板 - 我协商了一份合同,每年维护费用为 10 万美元,外加每平方英尺 10 美元 给定安装面积 x 平方英尺,第一年的总运营成本是多少?学生的解答:令 x 为安装面积。1. 土地成本:100x 2. 太阳能板成本:250x 3. 维护成本:100,000 + 100x 总成本:100x + 250x + 100,000 + 100x = 450x + 100,000

ASSISTANT:

学生的解答是正确的。

但实际上,学生的解答是不正确的!我们可以通过提示模型先生成自己的解答来成功发现这一点。

SYSTEM:

首先自己解决这个问题。然后将自己的解答与学生的解答进行比较,评估学生的解答是否正确。在决定学生的解答是否正确之前,请先自己解决这个问题。

USER:

问题陈述:我正在建造一个太阳能发电装置,需要帮助计算财务。 - 土地每平方英尺 100 美元 - 我可以以每平方英尺 250 美元购买太阳能板 - 我协商了一份合同,每年维护费用为 10 万美元,外加每平方英尺 10 美元 给定安装面积 x 平方英尺,第一年的总运营成本是多少?学生的解答:令 x 为安装面积。1. 土地成本:100x 2. 太阳能板成本:250x 3. 维护成本:100,000 + 100x 总成本:100x + 250x + 100,000 + 100x = 450x + 100,000

ASSISTANT:

令 x 为安装面积。1. 土地成本:100x 2. 太阳能板成本:250x 3. 维护成本:100,000 + 10x 总成本:100x + 250x + 100,000 + 10x = 360x + 100,000 学生的解答是不正确的。他们在维护成本计算中犯了一个错误,使用了 100x 而不是 10x。第一年运营的正确总成本是 360x + 100,000。

技巧:使用内心独白或一系列查询隐藏模型的推理过程

上一个技巧展示了在回答特定问题之前,模型有时需要详细推理。对于某些应用,模型用来得出最终答案的推理过程不适合与用户分享。例如,在辅导应用中,我们可能希望鼓励学生自己解决问题,但模型对学生解答的推理过程可能会泄露答案。

内心独白是一种可以缓解这种情况的技巧。内心独白的想法是指示模型将需要隐藏的部分输出放入易于解析的结构化格式中。然后在呈现输出给用户之前,解析输出并仅显示部分内容。

SYSTEM:

请按照以下步骤回答用户查询。步骤 1 - 首先自己解决这个问题。不要依赖学生的解答,因为它可能是错误的。将此步骤的所有工作用三重引号括起来(""")。步骤 2 - 将自己的解答与学生的解答进行比较,评估学生的解答是否正确。将此步骤的所有工作用三重引号括起来(""")。步骤 3 - 如果学生犯了错误,确定可以给学生的提示而不泄露答案。将此步骤的所有工作用三重引号括起来(""")。步骤 4 - 如果学生犯了错误,请提供上一步中的提示给学生(在三重引号之外)。不要写“步骤 4 - ...”,而是写“提示:”。

USER:

问题陈述:<插入问题陈述> 学生解答:<插入学生解答>

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

首先,我们可以让模型独立解决问题。由于初始查询不需要学生的解答,它可以省略。这还提供了额外的优势,即模型的解答不会受到学生尝试解答的影响。

USER:

<插入问题陈述>

接下来,我们可以让模型利用所有可用信息评估学生解答的正确性。

SYSTEM:

将您的解答与学生的解答进行比较,评估学生的解答是否正确。

USER:

问题陈述:"""<插入问题陈述>""" 您的解答:"""<插入模型生成的解答>""" 学生的解答:"""<插入学生的解答>"""

最后,我们可以让模型根据自己的分析以一位有帮助的导师的身份构建回复。

SYSTEM:

您是一位数学导师。如果学生犯了错误,请以不泄露答案的方式给出提示。如果没有错误,只需给予鼓励性的评论。

USER:

问题陈述:"""<插入问题陈述>""" 您的解答:"""<插入模型生成的解答>""" 学生的解答:"""<插入学生的解答>""" 分析:"""<插入模型生成的分析>"""

技巧:询问模型是否遗漏了之前的遍历

假设我们使用模型列出源代码中与特定问题相关的摘录。每次列出摘录后,模型需要确定是否应该继续列出更多摘录或停止。如果源文档很大,模型经常会过早停止,未能列出所有相关摘录。在这种情况下,通过提示模型进行后续查询,找出之前遍历中遗漏的摘录,通常可以获得更好的性能。

SYSTEM:

您将收到一段文本(用三重引号分隔)。您的任务是从以下问题中选择相关摘录:“人工智能历史上发生了哪些重要的范式转变。”确保摘录包含所有必要的上下文以解释其含义——换句话说,不要提取缺少重要上下文的小片段。以 JSON 格式输出如下:\[{"excerpt": "..."}, ... {"excerpt": "..."}\]

USER:

"""<插入文档>"""

ASSISTANT:

\[{"excerpt": "模型在此处写入摘录"}, ... {"excerpt": "模型在此处写入另一摘录"}\]

USER:

还有更多相关摘录吗?请小心不要重复摘录。还要确保摘录包含所有必要的上下文以解释其含义——换句话说,不要提取缺少重要上下文的小片段。

策略:使用外部工具

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

如果模型的输入中提供了外部信息来源,模型可以生成更准确和最新的响应。例如,如果用户询问关于某部电影的问题,将高质量的电影信息(如演员、导演等)添加到模型的输入中可能会有所帮助。嵌入式搜索可以用于实现高效的知识检索,以便在运行时动态添加相关信息。

文本嵌入是一个可以测量文本字符串之间相似度的向量。相似或相关的字符串在嵌入空间中会更接近。结合快速向量搜索算法,嵌入式搜索可以用于高效的知识检索。具体来说,文本语料库可以分割成多个片段,每个片段嵌入并存储。然后,给定查询可以嵌入并进行向量搜索,以找到与查询最相关的语料库片段(即在嵌入空间中最接近的片段)。

可以在OpenAI Cookbook中找到示例实现。有关如何使用知识检索减少模型编造错误事实的可能性,请参阅技巧“指示模型使用检索到的知识回答查询”

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

语言模型不能可靠地自行进行算术或长计算。在需要的情况下,可以指示模型编写和运行代码,而不是自行计算。特别是,可以指示模型将需要运行的代码放入指定格式(如三重反引号)。输出生成后,代码可以被提取并运行。最后,如果必要,代码执行引擎(如 Python 解释器)的输出可以作为输入提供给模型用于下一次查询。

SYSTEM:

您可以通过用三重反引号包围代码来编写和执行 Python 代码,例如 ```code goes here```。用此方法进行计算。

USER:

求解以下多项式的实根:3*x^5 - 5*x^4 - 3*x^3 - 7*x - 10。

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

SYSTEM:

您可以通过用三重反引号包围代码来编写和执行 Python 代码。另外,请注意,您有一个模块可以帮助用户发送消息给朋友:```python import message message.write(to="John", message="Hey, want to meetup after work?")```

警告:执行模型生成的代码本身并不安全,在任何应用程序中这样做都需要采取预防措施。特别是,需要沙盒化的代码执行环境以限制不受信任代码可能造成的损害。

技巧:赋予模型访问特定功能的权限

聊天补全 API 允许在请求中传递函数描述列表。这使得模型可以根据提供的模式生成函数参数。生成的函数参数由 API 以 JSON 格式返回,并可用于执行函数调用。函数调用的输出可以反馈到模型中,以完成闭环。这是使用 OpenAI 模型调用外部函数的推荐方式。更多信息请参阅我们入门文本生成指南中的函数调用部分以及 OpenAI Cookbook 中的更多函数调用示例


策略:系统地测试更改

有时很难判断一个更改(例如新的指令或设计)是否使系统变得更好或更差。查看几个例子可能会提示哪个更好,但在样本量较小时,很难区分真正的改进还是随机运气。也许更改对某些输入有帮助,但对其他输入却有害。

评估程序(或“评估”)对于优化系统设计非常有用。好的评估应具备以下特点:

  • 代表性:反映真实世界的使用情况(或至少多样化)
  • 包含大量测试用例:以获得更大的统计能力(见下表中的指导原则)
  • 易于自动化或重复
要检测的差异 95% 置信水平所需的样本量
30% ~10
10% ~100
3% ~1,000
1% ~10,000

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

基于模型的评估在存在一系列可能的输出且都被认为是高质量的情况下非常有用(例如,对于长答案的问题)。基于模型的评估与需要人工评估之间的界限是模糊的,并随着模型能力的提升而不断变化。我们鼓励进行实验,以了解基于模型的评估在您的应用场景中能发挥多大的作用。

技巧:根据黄金标准答案评估模型输出

假设已知某个问题的正确答案应该引用一组特定的事实。那么我们可以使用模型查询来统计这些所需事实中有多少被包含在答案中。

例如,使用以下系统提示:

SYSTEM:

您将收到一段文本(用三重引号分隔),该文本应该是某个问题的答案。检查以下信息是否直接包含在答案中: - 尼尔·阿姆斯特朗是第一个登上月球的人。 - 尼尔·阿姆斯特朗首次登月的日期是 1969 年 7 月 21 日。对于每个点,请执行以下步骤:1. 重述该点。2. 提供最接近该点的引用。3. 考虑阅读引用的人是否可以直接推断出该点。解释为什么或为什么不。4. 如果第 3 步的答案为“是”,则写“是”,否则写“否”。最后,提供“是”的计数。将此计数表示为 {"count": <插入计数>}。

以下是一个两个点都满足的示例输入:

SYSTEM:

<插入上述系统提示>

USER:

"""尼尔·阿姆斯特朗因成为第一个踏上月球的人而闻名。这一历史性事件发生在 1969 年 7 月 21 日,阿波罗 11 号任务期间。"""

以下是一个仅满足一个点的示例输入:

SYSTEM:

<插入上述系统提示>

USER:

"""尼尔·阿姆斯特朗创造了历史,当他从登月舱踏出,成为第一个登上月球的人。"""

以下是一个不满足任何点的示例输入:

SYSTEM:

<插入上述系统提示>

USER:

"""在'69 年的夏天,伟大的航行,阿波罗 11 号,像传奇一样大胆。阿姆斯特朗迈出了一步,历史展开,“一小步”,他说,为了一个新的世界。"""

有许多这种类型的基于模型的评估变体。考虑以下变体,它跟踪候选答案与黄金标准答案之间的重叠类型,还跟踪候选答案是否与黄金标准答案的任何部分矛盾。

SYSTEM:

按照以下步骤响应用户输入。每一步骤前完全重述该步骤。即“步骤 1:推理...”。步骤 1:逐步推理提交的答案与专家答案相比的信息是:不相交、相等、子集、超集或重叠(即部分交集但不是子集/超集)。步骤 2:逐步推理提交的答案是否与专家答案的任何方面矛盾。步骤 3:输出如下结构的 JSON 对象:{"type_of_overlap": "disjoint" 或 "equal" 或 "subset" 或 "superset" 或 "overlapping", "contradiction": true 或 false}

以下是一个次优答案的示例输入,尽管如此,它并未与专家答案矛盾:

SYSTEM:

<插入上述系统提示>

USER:

问题:"""尼尔·阿姆斯特朗最著名的事件是什么?它发生在什么日期?假设 UTC 时间。""" 提交的答案:"""他是不是登上了月球?”专家答案:"""尼尔·阿姆斯特朗最著名的是成为第一个登上月球的人。这一历史性事件发生在 1969 年 7 月 21 日。"""

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

SYSTEM:

<插入上述系统提示>

USER:

问题:"""尼尔·阿姆斯特朗最著名的事件是什么?它发生在什么日期?假设 UTC 时间。""" 提交的答案:"""1969 年 7 月 21 日,尼尔·阿姆斯特朗成为继巴兹·奥尔德林之后第二个登上月球的人。”专家答案:"""尼尔·阿姆斯特朗最著名的是成为第一个登上月球的人。这一历史性事件发生在 1969 年 7 月 21 日。"""

以下是一个正确的答案示例,它还提供了比必要的细节更多的信息:

SYSTEM:

<插入上述系统提示>

USER:

问题:"""尼尔·阿姆斯特朗最著名的事件是什么?它发生在什么日期?假设 UTC 时间。""" 提交的答案:"""大约在 1969 年 7 月 21 日 02:56 UTC,尼尔·阿姆斯特朗成为第一个踏上月球表面的人,标志着人类历史上的一项伟大成就。”专家答案:"""尼尔·阿姆斯特朗最著名的是成为第一个登上月球的人。这一历史性事件发生在 1969 年 7 月 21 日。"""

其他资源

欲获取更多灵感,请访问OpenAI Cookbook,其中包含示例代码以及第三方资源链接,如:


以上是文件的完整翻译。如果您有任何进一步的问题或需要更多帮助,请随时告知!


9ong@TsingChan 文章内容由 AI 辅助生成。