跳转到内容

提示工程: 如何与大型语言模型高效沟通【OpenAI官网翻译】

⏰ 发表时间:2024-03-27

写在前面

下面表格中的内容原文是可以在 playground 中运行的,如图:

这份指南旨在帮助你更好地使用大型语言模型(LLM,例如 GPT-4),并获得更理想的结果。以下列出的策略和技巧可以单独使用,也可以组合使用以增强效果。我们鼓励你积极尝试,找到最适合自己的方法。

你还可以参考一些提示示例,了解我们模型的强大能力:

  • 提示示例 探索提示示例,学习如何充分利用 GPT 模型。

六大策略助你获得更优结果

1. 清晰明确的指令

请记住,模型无法直接读取你的想法。如果输出结果太长,请要求简短回复;如果输出结果过于简单,请要求专家级别的写作;如果你不喜欢当前的格式,请提供你想要的格式示例。模型需要猜测的东西越少,就越有可能生成你期望的结果。

策略:

  • 在你的查询中提供更多细节,以便模型给出更相关的答案。
  • 要求模型扮演特定角色,例如“以专家口吻”或“像朋友一样”。
  • 使用分隔符清晰区分输入的不同部分,例如使用三重引号、XML 标签或章节标题。
  • 明确完成任务所需的步骤,将复杂任务分解成更小的步骤。
  • 提供示例,让模型学习你期望的输出风格或格式。
  • 指定期望的输出长度,例如字数、句子数、段落数或要点数量。

2. 提供参考文本

语言模型有时会编造答案,尤其是在面对冷门话题或需要引用和链接时。就像学生考试时可以参考笔记一样,为模型提供参考文本可以帮助其生成更准确可靠的答案。

策略:

  • 指导模型使用参考文本回答问题,将参考文本作为回答问题的依据。
  • 指导模型使用参考文本中的引用来回答问题,并标注引用来源。

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

正如软件工程中将复杂系统分解成多个模块一样,将提交给语言模型的任务分解成更小的子任务也是一种良好的实践。复杂任务通常比简单任务更容易出错,而且可以将复杂任务重新定义为一系列简单任务的工作流程,其中每个任务的输出作为下一个任务的输入。

策略:

  • 使用意图分类识别用户查询中最相关的指令,根据用户意图选择最相关的指令集。
  • 对于需要很长对话的应用,总结或过滤之前的对话内容,避免超出模型的上下文窗口大小限制。
  • 将长文档分段总结,并递归构建完整摘要,逐步总结长文档的内容。

4. 给予模型“思考”时间

就像你需要时间计算 17 乘以 28 一样,模型也需要时间进行推理才能得到正确答案。在回答问题之前,给予模型一定的“思考”时间可以减少推理错误。可以让模型在给出最终答案之前先进行“思考链”推理,提高答案的可靠性。

策略:

  • 指导模型在得出结论之前先尝试给出自己的解决方案,避免受到用户提供的错误解决方案的干扰。
  • 使用“内心独白”或一系列查询来隐藏模型的推理过程,避免在某些应用场景中泄露答案。
  • 询问模型是否在之前的回答中遗漏了什么,确保信息的完整性。

5. 使用外部工具

可以将外部工具与语言模型结合使用,以弥补模型自身的不足。例如,使用文本检索系统(如 RAG)为模型提供相关文档,使用代码执行引擎(如 OpenAI 的 Code Interpreter)帮助模型进行数学运算或运行代码。

策略:

  • 使用基于嵌入的搜索实现高效的知识检索,快速找到与查询最相关的文本片段。
  • 使用代码执行进行更精确的计算或调用外部 API,完成更复杂的计算任务或获取外部信息。
  • 让模型访问特定功能,例如通过 API 调用外部服务或数据库。

6. 系统地测试更改

修改提示词后,例如添加新的指令或采用新的设计,有时很难判断修改后的效果是好是坏。仅仅观察少量示例并不能得出可靠的结论,因为样本量太小会导致随机性误差。

策略:

  • 根据金标准答案评估模型输出,使用客观指标来评估模型的性能,例如准确率、召回率等。

策略:清晰明确的指令

技巧:在查询中提供更多细节,以便模型给出更相关的答案

为了获得高度相关的回复,请确保在请求中提供所有重要的细节和背景信息。否则,模型就只能猜测你的意图,这可能会导致结果不尽如人意。

不够理想

更优方案

如何在 Excel 中添加数字?

如何在 Excel 中自动计算一整列美元金额的总和,并将结果显示在名为“总计”的列中?

谁是总统?

2021 年谁是墨西哥的总统?墨西哥总统选举多久举行一次?

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

编写一个 TypeScript 函数来高效计算斐波那契数列,并添加详细注释解释每段代码的功能和编写原因。

总结会议记录。

将会议记录总结成一段话,并用 Markdown 格式列出每位发言者及其关键观点。如果发言者提出了后续步骤或行动建议,也请列出来。

技巧:要求模型扮演特定角色

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

角色

内容

SYSTEM

当我请求帮助写东西时,你将在每个段落至少包含一个笑话或俏皮话的文档回复。

USER

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

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

使用三重引号、XML 标签、章节标题等分隔符,可以帮助模型区分不同类型的文本内容,例如需要总结的文本、需要翻译的文本等。

角色

内容

USER

使用三重引号分隔的文本,总结成一句俳句。”””在这里插入文本”””

角色

内容

SYSTEM

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

USER

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

角色

内容

SYSTEM

你将收到一篇论文摘要和一个建议的标题。论文标题应该能让读者对论文主题有一个好的理解,同时也应该具有吸引力。如果标题不符合这些标准,请提出 5 个替代标题。

USER

摘要:在此处插入摘要 标题:在此处插入标题

技巧:明确完成任务所需的步骤

对于复杂的任务,可以将其分解成更小的步骤,并在提示词中明确每个步骤的具体操作,引导模型逐步完成任务。

角色

内容

SYSTEM

使用以下逐步说明来回应用户输入: 步骤 1 - 用户将提供用三重引号引用的文本。用一个句子总结这段文本,并以“摘要:”作为前缀。 步骤 2 - 将步骤 1 的摘要翻译成西班牙语,前缀为“翻译:”。

USER

“””在这里插入文本”””

技巧:提供示例

提供适用于所有示例的通用指令通常比通过示例演示任务的所有排列组合更有效,但在某些情况下提供示例可能更容易。例如,如果您打算让模型复制一种难以明确描述的用户查询响应样式。这被称为“少样本提示(few-shot)”。

角色

内容

SYSTEM

以一致的风格回答。

USER

教我耐心。

ASSISTANT

雕刻最深峡谷的河流来自一个朴素的泉源;最宏伟的交响曲起源于一个单一的音符;最复杂的挂毯始于一个孤立的线索。

USER

教我关于海洋。

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

你可以要求模型生成具有给定目标长度的输出。目标输出长度可以指定为字数、句子数、段落数、项目符号点数等。不过请注意,指示模型生成特定数量的字数并不会非常精确。模型可以更可靠地生成具有特定数量段落或项目符号点的输出。

角色

内容

USER

使用三重引号分隔的文本,大约 50 个单词总结。”””在这里插入文本”””

角色

内容

USER

使用三重引号分隔的文本,用三个项目符号点总结。”””在这里插入文本”””

策略:提供参考文本

技巧:指导模型使用参考文本回答问题

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

角色

内容

SYSTEM

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

USER

<插入三重引号分隔的文章> 问题:<插入问题在这里>

鉴于所有模型的上下文窗口大小有限,我们需要找到一种方法来动态地查找与当前查询相关的信息。 嵌入 技术可以帮助我们实现高效的知识检索。有关如何实现这一点的更多细节,请参见策略 “ 使用基于嵌入的搜索实现高效的知识检索 “。

技巧:指导模型使用参考文本中的引用来回答问题

如果输入中已经包含了相关知识,那么要求模型通过引用提供的文档中的段落来添加引用到其答案中就很简单了。需要注意的是,输出中的引用可以通过在提供的文档中进行字符串匹配来进行编程验证。

角色

内容

SYSTEM

你将收到一个由三重引号分隔的文档和一个问题。你的任务是仅使用提供的文档来回答问题,并引用用于回答问题的文档段落。如果文档中不包含回答此问题所需的信息,则只需回答:“信息不足”。如果提供了问题的答案,则必须使用以下格式引用相关段落({“citation”: …})。

USER

“””在这里插入文档”””问题:<在这里插入问题>

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

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

对于需要处理不同情况的大量独立指令集的任务,首先对查询类型进行分类,并使用该分类来确定哪些指令是需要的,可能是有益的。这可以通过定义固定类别并硬编码处理给定类别任务的相关指令来实现。这个过程也可以递归地应用于将任务分解为一系列阶段。这种方法的优点是,每个查询只包含执行任务下一阶段所需的指令,这可以降低与使用单个查询执行整个任务相比的错误率。这也可能导致成本更低,因为更大的提示需要更多的运行成本( 查看定价信息 )。

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

角色

内容

SYSTEM

你将收到客户服务查询。请将每个查询分类为主类别和次类别。以 JSON 格式提供你的输出,键分别为“primary”和“secondary”。 主要类别:账单、技术支持、账户管理或一般查询。 账单次类别: - 取消订阅或升级 - 添加支付方式 - 收费说明 - 争议收费 技术支持次类别: - 故障排除 - 设备兼容性 - 软件更新 账户管理次类别: - 重置密码 - 更新个人信息 - 关闭账户 - 账户安全 一般查询次类别: - 产品信息 - 定价 - 反馈 - 与人交谈

USER

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

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

角色

内容

SYSTEM

你将收到需要在技术支持上下文中进行故障排除的客户服务查询。请按照以下步骤帮助用户: - 询问他们是否已检查路由器所有连接线的连接情况。提醒他们连接线可能会随时间推移而松动。 - 如果所有连接线都已连接但问题仍然存在,询问他们使用的路由器型号。 - 根据路由器型号,建议他们如何重启设备: – 如果型号是 MTD-327 J,建议他们按下红色按钮并保持 5 秒钟,然后等待 5 分钟,再测试网络连接。 – 如果型号是 MTD-327 S,建议他们拔掉电源插头并重新插入,然后等待 5 分钟,再测试网络连接。 - 如果用户在重启设备并等待 5 分钟后仍有问题,请将他们转接到 IT 支持部门,并输出 {“IT support requested”}。 - 如果用户开始询问与当前话题无关的问题,请确认他们是否希望结束有关故障排除的对话,并根据以下方案对新问题进行分类: <插入上述主/次分类方案>

USER

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

需要注意的是,模型已被指示在对话状态发生变化时输出特定的字符串。这使我们能够将系统设计成一个状态机,根据当前状态来决定下一步的操作。通过跟踪对话状态、相关指令以及允许的状态转换,我们可以更好地控制用户体验。

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

由于模型的上下文窗口大小有限,无法处理无限长的对话。可以通过总结或过滤之前的对话内容来解决这个问题。一种方法是在对话长度达到预设阈值时,自动触发总结功能,将之前的对话内容总结成一段简短的文字,并将其作为后续对话的上下文。另一种方法是在后台异步地对之前的对话内容进行总结,并将总结结果存储起来,以便在需要时进行检索。

另一种解决方案是动态选择与当前查询最相关的对话的先前部分。有关如何实现这一点的更多细节,请参见策略 “ 使用基于嵌入的搜索实现高效的知识检索 “。

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

由于模型的上下文窗口大小有限,无法一次性处理过长的文本。对于长文档,可以将其分成多个部分分别进行总结,然后将各部分的摘要合并成最终的完整摘要。OpenAI 使用 GPT-3 的变体进行过相关的研究,证明这种方法可以有效地总结书籍等长篇幅文本。

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

技巧:指导模型在得出结论之前先尝试给出自己的解决方案

在评估用户提供的解决方案之前,可以先让模型尝试给出自己的解决方案。这种方式可以帮助模型更全面地理解问题,并避免受到用户提供的错误解决方案的干扰。

例如,假设我们想要让模型评估学生对一道数学题的解答过程。最直接的做法是询问模型学生的答案是否正确。

角色

内容

SYSTEM

确定学生的解决方案是否正确。

USER

问题陈述:我正在建设太阳能发电站,需要帮助计算财务状况。 - 土地成本 100 美元/平方英尺 - 我可以以每平方英尺 250 美元的价格购买太阳能面板 - 我谈判了一份维护合同,将花费我每年固定 10 万美元,每平方英尺额外 10 美元 第一年的运营总成本是多少,作为平方英尺数量的函数? 学生的解决方案:设 x 为安装的大小,以平方英尺为单位。 1. 土地成本:100 x 2. 太阳能面板成本:250 x 3. 维护成本:100,000 + 100 x 总成本:100 x + 250 x + 100,000 + 100 x = 450 x + 100,000

ASSISTANT

学生的解决方案是正确的。

但学生的解决方案实际上是错误的!我们可以通过提示模型首先生成自己的解决方案,然后与学生的答案进行比较,来发现这个错误。

角色

内容

SYSTEM

首先计算出你自己的答案,然后与学生的答案进行比较,判断学生的答案是否正确。在你完成计算之前,不要判断学生的答案是否正确。

USER

问题陈述:我正在建设太阳能发电站,需要帮助计算财务状况。 - 土地成本100/平方英尺−我可以以每平方英尺250 的价格购买太阳能面板 - 我谈判了一份维护合同,将花费我每年固定100k,另外每平方英尺10 第一年的运营总成本是多少,作为平方英尺数量的函数。 学生的解决方案:设 x 为安装的大小,以平方英尺为单位。 1. 土地成本:100 x 2. 太阳能面板成本:250 x 3. 维护成本:100,000 + 100 x 总成本:100 x + 250 x + 100,000 + 100 x = 450 x + 100,000

ASSISTANT

设 x 为安装的大小,以平方英尺为单位。 1. 土地成本:100 x 2. 太阳能面板成本:250 x 3. 维护成本:100,000 + 10 x 总成本:100 x + 250 x + 100,000 + 10 x = 360 x + 100,000 学生的答案是错误的。他们在计算维护成本时犯了一个错误,使用了 100 x 而不是 10 x。正确的总成本应该是 360 x + 100,000。

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

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

内部独白是可以用来缓解这一点的一种策略。内部独白的思想是指导模型将意图隐藏于用户的输出部分放入结构化格式中,使得解析它们变得容易。然后在将输出呈现给用户之前,解析输出并只显示输出的一部分。

角色

内容

SYSTEM

遵循这些步骤来回答用户查询。 步骤 1 - 首先算出自己的解决方案。不要依赖学生的解决方案,因为它可能是错误的。将此步骤的所有工作封装在三重引号(”””)中。 步骤 2 - 将您的解决方案与学生的解决方案进行比较并评估学生的解决方案是否正确。将此步骤的所有工作封装在三重引号(”””)中。 步骤 3 - 如果学生犯了错误,确定您可以给学生的提示,而不透露答案。将此步骤的所有工作封装在三重引号(”””)中。 步骤 4 - 如果学生犯了错误,提供上一步的提示给学生(在三重引号外)。而不是写“步骤 4 - …”写“提示:”。

USER

问题陈述:<插入问题陈述> 学生解决方案:<插入学生解决方案>

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

首先,我们可以要求模型自己解决问题。由于这个初始查询不需要学生的解决方案,因此可以省略。这提供了额外的优点,即模型的解决方案不会受到学生尝试解决方案的偏见。

最后,我们可以让模型根据分析结果给出对学生的反馈,只展示最终的反馈内容。

角色

内容

SYSTEM

你是一位数学老师。如果学生犯了错误,请给出提示,帮助学生找到错误,但不要直接给出答案。如果学生没有犯错误,请给予鼓励。

USER

问题陈述:”””<插入问题陈述>””” 你的答案:”””<插入模型生成的答案>””” 学生的答案:”””<插入学生的答案>””” 分析:”””<插入上一步模型生成的分析>”””

技巧:询问模型是否在之前的尝试中遗漏了什么

假设我们使用模型列出与特定问题相关的来源摘录。在列出每个摘录后,模型需要确定是否应该开始编写另一个或是否应该停止。如果源文档很大,模型过早停止并未列出所有相关摘录是很常见的。在这种情况下,通过使用后续查询来查找模型在之前的尝试中遗漏的任何摘录,通常可以获得更好的性能。

角色

内容

SYSTEM

你将收到一个由三重引号分隔的文档。你的任务是选择与以下问题相关的摘录:“人工智能历史上发生了哪些重要的范式转变?” 确保摘录包含解释它们的所有相关背景 - 换句话说,不要提取缺少重要背景的小片段。以 JSON 格式输出结果,如下所示: [{“excerpt”: “…”}, …, {“excerpt”: “…”}]

USER

“””在这里插入文档”””

ASSISTANT

[{“excerpt”: “模型在这里写一个摘录”}, …, {“excerpt”: “模型在这里写另一个摘录”}]

USER

还有更多相关的摘录吗?请注意不要重复已经提取过的内容。同时确保提取的段落包含所有必要的上下文信息,避免断章取义。

策略:使用外部工具

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

如果提供了模型输入的一部分,则模型可以利用外部信息来源。这可以帮助模型生成更有信息量和更新的回应。例如,如果用户询问有关特定电影的问题,向模型的输入添加有关电影的高质量信息(例如演员、导演等)可能是有用的。嵌入可以用来实现高效的知识检索,以便在运行时动态地将相关信息添加到模型输入中。

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

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

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

语言模型本身无法可靠地进行算术或长时间计算。在需要这样做的情况下,可以指导模型编写并运行代码,而不是进行自己的计算。特别是,可以指导模型将要运行的代码放入指定格式,如三重反引号。生成输出后,可以提取并运行代码。如果需要,可以将代码执行引擎(即 Python 解释器)的输出提供给模型,以便进行下一个查询。

角色

内容

SYSTEM

你可以通过用三重反引号将 Python 代码括起来,例如 代码写在这里 来编写和执行 Python 代码。使用这种方式进行计算。

USER

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

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

角色

内容

SYSTEM

你可以通过用三重反引号将 Python 代码括起来,例如 代码写在这里 来编写和执行 Python 代码。你还可以使用以下模块向用户的朋友发送消息: python<br>import message<br>message.write(to="John", message="嘿,下班后一起聚一聚?")<br>

警告:执行模型生成的代码存在安全风险。建议在安全的沙箱环境中运行代码,避免潜在危害。

技巧:让模型访问特定功能

Chat Completions API 允许在请求中传递函数描述列表。这使模型可以根据预定义的函数来生成参数。由 API 返回的生成的函数参数可以用来执行函数调用。由函数调用提供的输出随后可以在下一个请求中反馈给模型,以完成整个流程。这是使用 OpenAI 模型调用外部函数的推荐方式。要了解更多信息,请参阅我们的介绍性文本生成指南中的“ 函数调用部分 ”以及 OpenAI Cookbook 中的更多“ 函数调用示例 ”。

策略:系统地测试更改

有时很难分辨出更改——例如,新的指令或新的设计——是使你的系统变得更好还是更糟。查看几个示例可能会暗示哪个更好,但由于样本量小,很难区分真正的改进还是随机运气。也许更改在某些输入上有助于性能,但在其他输入上则损害性能。

评估程序(或“评估”)在优化系统设计时很有用。好的评估程序需要具备以下特点:

  • 具有代表性:能够代表真实世界的使用场景,或者至少包含多样化的测试用例。
  • 样本量充足:拥有足够的测试用例,以保证统计结果的可靠性(参考下表)。
  • 易于自动化:可以自动运行或重复执行。

需要检测的差异

95% 置信度所需的样本量

30%

~10

10%

~100

3%

~1,000

1%

~10,000

评估工作可以由计算机、人类或两者协作完成。计算机可以使用客观标准(例如,针对单一正确答案的问题)以及一些主观或模糊标准自动执行评估,其中模型输出由其他模型查询评估。 OpenAI Evals 是一个开源软件框架,提供了创建自动评估程序的工具。

基于模型的评估在评估具有多种可能答案的问题时非常有用,例如开放性问题。模型可以根据预定义的标准对不同的答案进行评分,帮助我们选择最佳答案。可以用模型进行评估和需要人工评估之间的界限是模糊的,并且随着模型变得越来越强大而不断变化。我们鼓励你进行实验,找到最适合你的用例的评估方法。

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

假设我们知道某个问题的正确答案应该包含以下信息:

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

我们可以使用以下系统消息来评估模型的答案是否包含了所有必要的信息:

角色

内容

SYSTEM

你将收到一段用三重引号括起来的文本,这段文本应该包含以下信息的答案: - 尼尔·阿姆斯特朗是第一个登上月球的人。 - 尼尔·阿姆斯特朗首次登上月球的日期是 1969 年 7 月 21 日。 请执行以下步骤: 1. 逐条列出上述信息。 2. 从答案中找到与每条信息最接近的句子。 3. 判断一个不了解该话题的人能否从该句子中直接推断出该信息。请解释你的判断理由。 4. 如果步骤 3 的答案是肯定的,则输出“yes”,否则输出“no”。 最后,统计所有“yes”的个数,并以 {“count”: <在这里插入个数>} 的格式输出。

以下是一些示例:

示例 1:包含所有必要信息

角色

内容

SYSTEM

<插入上述系统消息>

USER

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

示例 2:只包含部分必要信息

角色

内容

SYSTEM

<插入上述系统消息>

USER

“””尼尔·阿姆斯特朗登上登月舱时创造了历史,成为第一个登月的人。”””

示例 3:没有包含任何必要信息

角色

内容

SYSTEM

<插入上述系统消息>

USER

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

除了检查答案是否包含所有必要的信息之外,我们还可以评估答案与标准答案之间的重叠程度,以及答案是否与标准答案相矛盾。

角色

内容

SYSTEM

使用以下步骤回应用户输入。完全重述每个步骤再进行。即“第 1 步:推理…”。 第 1 步:逐步推理提交答案与专家答案相比的信息是:不相交、相等、子集、超集或重叠(即一些交集但不是子集/超集)。 第 2 步:逐步推理提交答案是否与专家答案的任何方面相矛盾。 第 3 步:输出一个结构化的 JSON 对象,如:{“type_of_overlap”: “disjoint” or “equal” or “subset” or “superset” or “overlapping”, “contradiction”: true or false}

以下是一些示例:

示例 1:答案不完整但没有与标准答案相矛盾

角色

内容

SYSTEM

<插入上述系统消息>

USER

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

示例 2:答案与标准答案相矛盾

角色

内容

SYSTEM

<插入上述系统消息>

USER

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

示例 3:答案是正确的,并且比标准答案提供了更多细节

角色

内容

SYSTEM

<插入上述系统消息>

USER

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

其他资源

如果想要获取更多灵感,请访问 OpenAI Cookbook ,其中包含示例代码,还链接到第三方资源,例如:

希望这份指南能够帮助你更好地使用大型语言模型,并获得更理想的结果!