OpenAI官方提示词工程指南

在OpenAI官方给出的提示词工程(Prompt engineering)文档中,提供了六大策略来优化提示词。
  1. 写出清晰的指令
  2. 提供参考文本
  3. 将复杂的任务拆分成更简单的子任务
  4. 给模型时间「思考」
  5. 使用外部工具
  6. 系统地测试变更

下面我们来一一详细介绍。

1、写出清晰的指令

把你想要什么样的结果,完整、清晰地告诉AI。具体技巧有以下6个。

1.1、详细描述你的需求

要保证你的描述里,包含重要的细节或者背景信息,别让AI猜测你的想法。你可以把AI想象成一名超市导购员,让AI知道你需要什么商品,ta才能告诉你商品的准确位子。例如:

不好的描述

好的描述

如何在 Excel 中添加数字?

如何在 Excel 中将一行数字相加?我想自动对整张表的行执行此操作,所有总计最终显示在右侧名为“总计”的列中。

谁是总统?

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

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

编写一个 TypeScript 函数来高效计算斐波那契数列。对代码进行大量注释,解释每个部分的作用以及为什么这样编写。

总结会议记录。

用一段话总结会议记录。然后写下演讲者及其要点的简要列表。最后,列出演讲者建议的下一步措施或行动项目(如果有)。

📣在水豚AI办公网【https://shuitunai.cn/】的“智能对话”模块中,把提示词(需求描述)粘贴进输入框,即可得到AI回答:

1.2、给AI赋予一个角色

告诉AI你需要让它扮演什么角色,这样AI的回答会更好。即让AI知道自己到底是一名超市导购员还是一名医生。例如:

你可以要求AI扮演一个风趣幽默的文员,先输入以下提示词:

每次我要你帮忙写一些内容时,你回复的文档里,每段都至少有一个笑话或者有趣的评论。

然后,你给AI的具体需求是:

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

1.3、使用分隔符,让输入内容清晰有条理

常用的分隔符有三重引号、XML标签、节标题等,你也可以选择其他独特的分隔符。例如:

请帮我总结用三重引号分隔的文本。'''在此处插入文本'''

​​​​​​​1.4、指定完成任务所需的步骤

有些任务最好拆分成一系列步骤。明确地写出步骤可以使模型更容易遵循它们。例如:

使用以下分步说明来回复用户的问题。

步骤1-我会给你提供三重引号分隔的文本。请你用一句话总结文本内容,并加上前缀“摘要:”。

步骤2-将步骤1中的摘要翻译成西班牙语,并加上前缀“翻译:”。

'''在此处插入文本'''

​​​​​​​1.5、提供例子

你可以给AI提供少量示例,AI根据示例进行学习并完成任务。例如:

请从下面的文本中提取技术规格,并以 JSON 格式展示。

示例

输入: Google Nest Wifi, network speed up to 1200Mpbs, 2.4GHz and 5GHz

输出: {"product"."Google Nest Wifi", "speed"."1200Mpbs", "freguencies": ["2.4GHz", “5GHz", "protocol"."WP3”)

输入:Google Pixel 7, 5G network, 8GB RAM, Tensor G2 processor, 128GB of storage, Lemongrass

​​​​​​​1.6、指定所需的输出长度

可以要求模型生成具有给定目标长度的输出。目标输出长度可以根据字数、句子、段落、项目符号等的数量来指定。但是请注意,制定的长度只是一个大概,多少个字这种不会非常精准,但是像多少段落这种需求效果就会比较好。例如:

请用两个段落、100个字概括以下由三引号分隔的文本内容。'''在此处插入文本'''

用3个要点总结由三引号分隔的文本。'''在此处插入文本'''

2、提供参考文本

2.1、让模型使用参考文本进行回答

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

使用提供的由三引号分隔的文章来回答问题。如果在文章中找不到答案,请写“我找不到。”

'''在此处插入文本1''','''在此处插入文本2''','''在此处插入文本3'''

问题:'''在此处插入问题'''

​​​​​​​2.2、让模型通过引用参考文本来回来

如果已经把文本给了模型,可以直接要求模型通过引用所提供文本中的段落来为其答案添加引用。可以提高正确性,增加可验证性。例如:

您将获得一份由三重引号和一个问题分隔的文档。您的任务是仅使用提供的文档回答问题,并引用用于回答问题的文档段落。如果文档不包含回答此问题所需的信息,则只需写:「信息不足」。如果提供了问题的答案,则必须附有引文注释。使用以下格式引用相关段落({「引用」:…})。

'''在此插入文档'''

问题:'''在此处插入问题'''

3、将复杂的任务拆分成更简单的子任务

如果想一次性做完一个很大的项目,出错概率会很高,我们一般要把项目进行拆分,拆成各种细节、子任务、子目标等等。同理,把复杂的任务给拆给更为简单的子任务,大模型会有更好的表现。

具体技巧有以下3点。

3.1、使用意图分类来识别用户查询最相关的指令

先定义好固定类别,并为处理这些类别中的任务硬编码相关指令。同理,有些任务也可以分解成多个阶段。这样做的好处是,每个查询都只包含下一个任务阶段所需要的指令,相比于用一个查询来完成整个任务,这样可以降低错误率,同时也降低成本,因为提示词越长成本越高。

下面举一个客户服务应用的例子,可以先输入以下内容,把查询分类:

你会收到客户服务的查询。请把每个查询分为一个主要类别和一个次要类别,并以 json 格式提供结果,键值分别为:主要类别 和 次要类别。

主要类别包括:账单、技术支持、账户管理或一般咨询。

账单的次要类别包括:

- 取消订阅或升级

- 添加支付方式

- 解释收费

- 争议收费。

技术支持的次要类别包括:

- 故障排除

- 设备兼容性

- 软件更新。

账户管理的次要类别包括:

- 密码重置

- 更新个人信息

- 关闭账户

- 账户安全。

一般咨询的次要类别包括:

- 产品信息

- 定价

- 反馈

- 与人交谈。

基于用户查询的分类,我们可以为模型提供一系列更具体的指令来处理下一步。例如,如果用户需要“故障排除”的帮助:

你将负责处理技术支持中的客户服务咨询,需要进行故障排查。帮助用户的步骤如下:

- 首先,请用户检查路由器的所有电缆连接是否牢固。需要注意的是,电缆有可能随着时间推移而松动。

- 如果确认电缆连接无误但问题依旧,请询问他们使用的路由器型号。

- 接下来,根据路由器型号提供重启设备的具体指导:

-- 若型号为 MTD-327J,建议按住红色按钮 5 秒,然后等待 5 分钟后再检查网络连接。

-- 若型号为 MTD-327S,建议拔掉电源后重新插上,同样等待 5 分钟后检查网络连接。

- 如果重启设备并等待 5 分钟后用户的问题仍未解决,请将他们转接至 IT 支持,并显示 IT 支持请求 的信息。

- 如果用户开始询问与本次故障排查无关的问题,请确认他们是否愿意结束当前的故障排查话题,并按照给定的分类方案处理他们的请求。

'''在此处插入上面的主要/次要分类方案'''

​​​​​​​3.2、对于需要很长对话的对话应用,总结或过滤之前的对话

这个技巧偏开发者,普通用户可以跳过。

由于模型的上下文长度是固定的,用户与助手的对话不能无限延续,尤其是当整个对话内容都包含在上下文窗口中时。

解决这一问题的方法之一是概括之前的对话。当输入内容达到一定长度时,可以触发对部分对话内容进行概括的查询,这样的概括可以作为系统消息的一部分。或者,也可以在整个对话过程中不断后台概括之前的对话内容。

​​​​​​​3.3、分段总结长文档并递归构建完整总结

同样偏开发者,普通用户可以跳过。

例如,要总结一本很长的书,我们可以使用一系列的查询来分别总结书中的每个章节。这些部分的摘要可以被连结并进一步总结,形成摘要的摘要。这个过程可以递归地进行,直至整本书被总结完毕。如果在理解书中后续部分时需要前面章节的信息,那么在总结当前部分内容时附加一个前面内容的连续摘要会是一个实用的技巧。

4、给模型时间「思考」

​​​​​​​4.1、在模型急于得出结论之前,指导模型自己寻找解决方案

如果直接把一道数学题给模型,让模型判断对或者不对,你会发现结果很随机,一会对或者不对,但是如果先让模型自己做一遍,再去判断对与不对,结果就会准非常多了。例子如下:

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

问题概述:我正在搭建一个太阳能发电项目,需要协助计算财务相关的事项。

- 土地的价格是每平方英尺 100 美元

- 我可以以每平方英尺 250 美元的价格购买太阳能板

- 我已经签订了一份保养合同,按照这份合同,我需要支付每年固定的 10 万美元以及每平方英尺额外的 10 美元的费用。

那么,第一年的运营总成本是多少呢?这个成本应该以安装面积(平方英尺数)为变量来计算。

学生的解答:假设安装面积为 x 平方英尺。

1. 土地成本为 100x

2. 太阳能板成本为 250x

3. 维护成本为 100,000 + 10x

总成本为 100x(土地)+ 250x(太阳能板)+ 100,000(固定维护费)+ 10x(额外维护费)= 360x + 100,000

模型可能会回答学生的解答是正确的。然而,学生的解答其实并不正确!我们可以通过引导模型首先产生它自己的解答,从而让它成功地发现这个问题。

首先,你需要自行找出问题的解答,然后把你的解答与学生的解答进行比较,评定学生的解答是否准确。在你没有自行解决这个问题之前,请不要对学生的解答进行判断。

问题概述:我正在搭建一个太阳能发电项目,需要协助计算财务相关的事项。

- 土地的价格是每平方英尺 100 美元

- 我可以以每平方英尺 250 美元的价格购买太阳能板

- 我已经签订了一份保养合同,按照这份合同,我需要支付每年固定的 10 万美元以及每平方英尺额外的 10 美元的费用。

那么,第一年的运营总成本是多少呢?这个成本应该以安装面积(平方英尺数)为变量来计算。

学生的解答:假设安装面积为 x 平方英尺。

1. 土地成本为 100x

2. 太阳能板成本为 250x

3. 维护成本为 100,000 + 10x

总成本为 100x(土地)+ 250x(太阳能板)+ 100,000(固定维护费)+ 10x(额外维护费)= 360x + 100,000

此时,模型给出的回答会是如下:

让我们设定 x 为太阳能发电装置的面积,单位为平方英尺。

1. 土地成本:100x

2. 太阳能板成本:250x

3. 维护成本:100,000 + 10x

总成本:100x + 250x + 100,000 + 10x = 360x + 100,000

学生的解答存在错误。他们在计算维护成本时,错误地以 100x 替代了正确的 10x。第一年运行的正确总成本就是 360x + 100,000 美元。

​​​​​​​4.2、使用内心独白或者一系列查询来隐藏模型的推理过程

本策略同样偏开发者,普通用户可以跳过。

上面的策略表明,在回答特定问题之前,模型对问题进行详细推理有时很重要。对于某些应用,模型得出最终答案所使用的推理过程不适合与用户共享。例如,对于某些辅导学习的应用程序,我们可能希望鼓励学生自己找出答案,但模型对学生解决方案的推理过程可能会向学生透露答案。

内心独白是一种可以用来缓解这种情况的策略。内心独白的理念是指示模型将输出中本应对用户隐藏的部分放入结构化格式中,以便于解析它们。然后在向用户呈现输出之前,对输出进行解析,并且只显示输出的一部分。

按以下步骤回答用户问题。

第 1 步 - 首先独立解决问题。不要依赖学生的答案,因为可能有误。将此步骤的所有内容用三重引号 (''') 包围。

第 2 步 - 将你的解答与学生的答案比较,判断学生的答案是否正确。将此步骤的所有内容用三重引号 (''') 包围。

第 3 步 - 如果学生答案有误,想出一个不直接透露答案的提示。将此步骤的所有内容用三重引号 (''') 包围。

第 4 步 - 如果学生答案有误,给出第 3 步的提示(不用三重引号)。用“提示:” 替代 “第 4 步 - ...”。

问题陈述:<插入问题陈述>

学生解答:<插入学生解答>

​​​​​​​4.3、询问模型在之前的过程中是否遗漏了什么内容

这个技巧在长文本问答中常用,比如我们给了一个文档,在用模型列出与特定问题相关的摘录时,每列出一段后,模型需要决定是继续写下一个还是停止。如果原文很长,模型可能会过早结束,错过一些相关摘录。此时,通过后续prompt来寻找模型之前遗漏的摘录,通常可以获得更好的效果。

你将收到一个文档,其内容由三个引号界定。你的任务是选择与这个问题相关的部分:“在人工智能的发展历史中,发生了哪些重大的范式转变?”请确保你选取的摘录能够完整地提供足够的背景信息,以便理解它们的含义 — 换言之,不要选择那些缺乏重要背景信息的片段。请按照以下 JSON 格式输出结果:[{"excerpt": "..."}, ... {"excerpt": "..."}]

'''在此插入文档'''

模型回答完毕后 ,你可以继续提问:

还有其他相关的摘录吗?请注意不要重复之前的摘录。同时确保所选摘录包含充分的背景信息,使得它们易于理解。也就是说,避免选择那些缺少关键背景的片段。

模型就会继续补充之前遗漏的信息。

5、使用外部工具

本节主要讲外部工具的使用技巧,内容偏开发者,普通用户可以跳过。

​​​​​​​5.1、使用基于嵌入的搜索实现高效知识检索

把外部信息源作为输入的一部分,模型就可以利用这些信息源,这可以帮助模型生成更明智和最新的回答。例如,如果用户询问有关特定电影的问题,将有关该电影的高质量信息(例如演员、导演等)添加到模型的输入中可能会很有用。嵌入可用于实现高效的知识检索,以便可以在运行时将相关信息动态添加到模型输入中。

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

​​​​​​​5.2、利用代码执行来进行精确计算或调用外部 API

大模型的计算能力偏弱,所以如果遇到需要计算的东西,最好让大模型写一段计算的 Python 代码。例如:

你可以通过用三个引号包裹 Python 代码来编写并执行代码,例如 '''code goes here'''。

求解以下多项式的所有实数解:3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10。

另一个场景是调用外部 API。如果模型掌握了正确的 API 使用方法,它就能编写调用这些 API 的代码。我们可以通过提供相关文档和代码示例来指导模型如何使用 API。例如:

你可以通过用三个反引号包裹 Python 代码来编写并执行代码。此外,你还可以使用以下模块帮助用户向朋友发送消息:

```python

import message

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

```

警告:由模型生成的代码执行可能存在安全风险,因此,在任何计划中使用此类代码时必须采取预防措施。特别重要的是,需要一个隔离的代码执行环境,以降低不受信任代码可能带来的风险。

​​​​​​​5.3、让模型访问特定功能

Chat Completions API 允许在请求中传递函数的描述。这样,模型就可以生成符合这些描述的函数参数。这些参数以 JSON 格式由 API 返回,并可以用于执行函数调用。函数调用的结果可以再次输入到模型中,形成一个闭环。这是利用 OpenAI 模型来执行外部函数调用的推荐方法。

6、系统地测试变更

有时,很难确定某个更改(比如新的指令或设计)是否真的改善了系统。观察几个案例可能会有所帮助,但在样本量较小的情况下,很难判断这是真正的改进还是偶然的幸运。可能某些更改在特定输入上提高了性能,但在其他情况下则降低了性能。

评估程序对于优化系统设计非常有用。有效的评估特点是:

  • 能够代表现实世界中的使用情况(或至少具有多样性)
  • 包含众多测试案例,从而拥有更强的统计能力(参见下表中的指南)
  • 可以轻松自动化或重复

需要检测的差异

为了达到 95% 的置信度所需的样本量

30%

约 10

10%

约 100

3%

约 1,000

1%

约 10,000

​​​​​​​6.1、以标准答案为基准评估模型输出

假设我们已经知道对某个问题的正确回答应当涉及一组特定的已知事实。在这种情况下,我们可以通过模型查询来检查回答中包含了哪些必要的事实。

你将接收到用三个引号界定的文本,这些文本应当是对某个问题的回答。请检查答案中是否直接包含以下信息:

- 尼尔·阿姆斯特朗是第一个踏上月球的人。- 尼尔·阿姆斯特朗首次登月的日期是 1969 年 7 月 21 日。

对每一点进行以下操作:

1 - 重申该信息点。

2 - 提供一个与该信息点最接近的答案引用。

3 - 考虑一个不熟悉该话题的人是否能从引用中直接理解该信息点。在做出判断之前,解释为什么能或不能。

4 - 如果第 3 步的答案是肯定的,就写“是”,否则写“否”。

最后,统计“是”的答案数量,并以 {"count": <插入数量>} 的形式呈现。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值