在使用生成式 AI 时,你是否经常遇到 AI 回答了没有问到的问题,或者答案不令人满意的情况?你是不是总是试了很多遍,都得到了满意的答案,却骂了一句“智障”?
事实上,很多时候使用的提示词不够准确,无法准确表达意图。
12 月 15 日,OpenAI 终于在官方文档中发布了一份名为快速工程,提示工程指南,现在终于有了官方认可的实用的提示工程标准参考。
本指南分享了从 GPT-4 等大型语言模型中获得更好结果的策略和方法。 这里描述的方法有时可以结合起来产生更大的效果。
虽然指南指出所提供的示例目前仅适用于 GPT-4,但在实践中,大多数建议适用于所有大型语言模型。
写下清晰的说明
提供参考文本
将复杂的任务拆分为更简单的子任务
给模型时间“思考”。
使用外部工具
系统地测试更改
模型无法读懂你的想法。 如果输出太长,请要求简短回复。 如果输出太简单,请要求专家级写作。 如果您不喜欢该格式,请展示您希望看到的格式。 模型猜测你想要什么的次数越少,你就越有可能得到它。
在查询中包含详细信息以获得更相关的答案:为了获得高度相关的响应,请确保请求提供任何重要的详细信息或上下文。 否则,您将将其留给模型来猜测您的意思。
要求模型承担角色:系统消息可用于指定模型在其回复中承担的角色。
例如,“当我请求帮助写东西时,你回复的文档每个段落至少包含一个笑话或有趣的评论。 ”
使用分隔符清楚地指示输入的不同部分:分隔符,如三引号、XML 标签、章节标题等,可以帮助划分要区别对待的文本部分。
例如,“总结俳句中用三个引号分隔的文本。 您将获得两篇关于同一主题的文章(以<>分隔)。 首先总结每篇文章的论点。 然后指出哪一个提出了更好的论点并解释原因。 “或”您将获得摘要和建议的标题。 标题应该让读者清楚地了解这个主题,但它也应该引人注目。 如果标题不符合这些标准,请建议 5 个替代方案。 ”
对于此类简单任务,使用分隔符可能不会对输出质量产生影响。 但是,任务越复杂,消除任务细节的歧义就越重要。 不要让模型试图确切地理解你想从他们那里得到什么,只要告诉它。
指定完成任务所需的步骤:某些任务最好指定为一系列步骤。 显式写出这些步骤可以使模型更容易遵循这些步骤。
例如,“使用以下分步说明来响应用户输入。
第 1 步 – 用户将提供三个引号中的文本。 用一句话总结文章,前缀为“Summary:”。
第 2 步 – 将第 1 步的摘要翻译成西班牙语,并添加前缀“Translate:”。
举例说明:提供适用于所有示例的一般描述通常比通过示例演示任务的所有排列更有效,但在某些情况下,提供示例可能更容易。 例如,如果打算让模型复制响应用户查询的特定样式,则很难显式描述。 这就是所谓的“几个例子”。 提示。
例如,“以一致的风格回答我的问题。 例如,我说:教我什么是忍耐。 你回答:河流冲刷出最深的山谷,从温柔的泉水中涌出;最伟大的交响乐来自一个音符;最复杂的挂毯都是从单个线程开始的。 ”
指定所需的输出长度:您可以要求模型为给定的目标长度生成输出。 可以根据单词、句子、段落、项目符号等的数量指定目标输出长度。 但请注意,指示模型生成特定数量的单词并不能以很高的精度工作。 该模型可以更可靠地生成具有特定数量的段落或项目符号的输出。
例如,“将用三个引号分隔的文本总结为50个字左右,将其总结为两段,并总结为三个要点。 ”
语言模型可以自信地创建虚假答案,尤其是在被问及深奥的主题或引文时。 正如笔记可以帮助学生在考试中取得更好的成绩一样,为这些模型提供参考文本可以帮助减少模型幻觉。
指示模型使用参考文本进行回答:如果可以为模型提供与当前查询相关的可靠信息,则可以指示模型使用提供的信息来撰写其答案。
例如,“使用用三引号引用的提供的文章回答问题。 如果你在文章中找不到答案,请写“我找不到答案”。 ”
指示模型通过引用参考文本来回答:如果输入补充了相关知识,您可以直接要求模型通过引用所提供文档中的段落来添加对其答案的引用。
例如,“您将获得一个用三引号引用的文档和一个问题。 您的任务是仅使用提供的文档回答问题,并引用用于回答问题的文档的段落。 如果文档不包含回答问题所需的信息,只需写上:“信息不足”。 如果提供了问题的答案,则必须附有引文注释。 使用以下格式引用相关段落()。
将复杂的任务拆分为更简单的子任务
正如在软件工程中将复杂系统分解为一组模块化组件是很好的做法一样,提交到语言模型的任务也是如此。 复杂任务往往比简单任务具有更高的错误率。 另外复杂任务通常可以重新定义为简单任务的工作流,其中早期任务的输出用于构建后续任务的输入
使用意向分类来识别与用户查询最相关的指令:对于需要大量独立指令集来处理不同情况的任务,首先对查询类型进行分类并使用该分类来确定需要哪些指令会很有帮助。 这可以通过定义与处理给定类别中的任务相关的固定类别和硬编码指令来实现。 该过程还可以递归应用,以将任务分解为一系列阶段。 这种方法的优点是,每个查询仅包含执行下一阶段任务所需的指令,与使用单个查询执行整个任务相比,这可以降低错误率。 这也可以降低成本,因为较大的提示的运行成本更高。
例如,第一个聊天机器人只执行以下答案:
当用户输入“故障排除”时,他们可以指定另一个聊天机器人来回答以下问题:
对于需要长时间对话的对话应用,请汇总或筛选以前的对话:由于模型具有固定的上下文长度,因此用户和助手之间的对话(其中整个对话包含在上下文窗口中)不能无限期地继续。 您可以总结上一轮的对话,然后继续下一轮对话。
分段总结长文档,并以递归方式构建完整摘要:由于模型具有固定的上下文长度,因此它们不能用于汇总长度超过上下文长度减去单个查询中生成的摘要长度的文本。 为了总结一个很长的文档(例如一本书),我们可以使用一系列查询来首先总结文档的每个章节。 然后连接并汇总章节摘要,生成摘要的摘要。 此过程可以递归方式执行,直到对整个文档进行汇总。 如果有必要使用上一节中的信息来理解后面的几节,另一个有用的提示是在书中任何给定的点之前包括文本的连续摘要,同时总结该点的内容。
如果你要求将 17 乘以 28,你可能不会马上知道结果,但你可以慢慢计算出来。 同样,当模型试图立即回答而不是花时间弄清楚时,它们会犯更多的推理错误。 寻求“思路链”可以帮助模型更可靠地推导出正确答案。
在匆忙得出结论之前,指示模型找出自己的解决方案:我们可以通过提示模型首先生成自己的解决方案来让模型注意到这一点。
例如,如果我们想要一个模型来评估学生对数学问题的解决方案,你可以问“从制定你自己的问题解决方案开始”。 然后将您的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。 在您自己完成问题之前,不要确定学生的解决方案是否正确。 ”
使用内心独白或一系列查询来隐藏模型的推理过程:前面的策略表明,模型在回答特定问题之前详细推理问题有时很重要。 对于某些应用程序,模型用于得出最终答案的推理过程不适合与用户共享。 内心独白是一种可以用来缓解这种情况的策略。 内心独白的想法是指示模型将原本对用户隐藏的部分输出转换为结构化格式,以便可以轻松解析它们。 然后分析输出,在将输出呈现给用户之前,仅使部分输出可见。
例如,“请按照以下步骤回答用户的问题。
第 1 步 – 首先找出您自己的问题解决方案。 不要依赖学生的解决方案,因为它可能不正确。 将此步骤的所有工作括在三个引号 (“.
第 2 步 – 将您的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。 将此步骤的所有工作括在三个引号 (“.
第 3 步 – 如果学生犯了错误,请确定您可以在不透露答案的情况下给学生哪些提示。 将此步骤的所有工作括在三个引号 (“.
第 4 步 – 如果学生犯了错误,请向学生提供上一步的提示(三引号之外)。 不要写“Step 4 - Write ”Prompt:“。
询问模型在上一个过程中是否遗漏了任何内容:假设我们使用一个模型来列出与特定问题相关的摘录。 列出每个摘录后,模型需要确定是否应开始编写另一个摘录,或者是否应停止。 如果源文档很大,模型通常会过早停止,并且无法列出所有相关的摘录。 在这种情况下,通常可以通过使用后续查询提示模型来查找以前交付中遗漏的任何摘录,从而获得更好的性能。
例如,“您将获得一个用三引号分隔的文档。 您的任务是选择与以下问题相关的摘录:“人工智能历史上发生了哪些重大范式转变。 ”
确保摘录包含解释它们所需的所有相关上下文——换句话说,不要提取缺少重要上下文的小片段。 以 JSON 格式提供输出。 ”
通过为模型提供其他工具的输出来弥补模型的弱点。 例如,文本检索系统(有时称为 RAG 或检索增强生成)可以告诉模型有关文档的信息。 像 OpenAI 的解释器这样的执行引擎可以帮助模型进行数学计算并运行。 如果可以使用工具而不是语言模型更可靠或更高效地完成任务,则可以卸载它以充分利用两者。
使用基于嵌入式的搜索实现高效的知识检索:如果作为输入的一部分提供,则模型可以利用外部信息源。 这可以帮助模型生成更明智和最新的响应。 例如,如果用户询问有关特定电影的问题,则将有关电影的高质量信息(如演员、导演等)添加到模型的输入中可能很有用。 嵌入可用于高效的知识检索,允许在运行时将相关信息动态添加到模型输入中。
文本嵌入是测量文本字符串之间相关性的向量。 相似或相关的字符串比不相关的字符串更紧密地联系在一起。 这一事实和快速向量搜索算法的存在意味着嵌入可用于实现高效的知识检索。 特别是,文本语料库可以拆分为多个块,每个块都可以嵌入和存储。 然后可以嵌入给定的查询,并可以执行向量搜索,以从语料库中找到与查询最相关的嵌入文本块(即嵌入空间中最接近的文本块)。
使用执行来执行更准确的计算或调用外部 API:不能依赖语言模型自行准确地执行算术或长期计算。 如果需要,您可以指示模型编写和运行**,而不是执行自己的计算。 具体而言,您可以指示模型将 ** 设置为指定格式,例如三重反引号。 生成输出后,可以提取并运行它。 最后,如有必要,可以将执行引擎(即 Python 解释器)的输出用作下一个查询的模型输入。
例如,“你可以通过将 python** 括在三个反引号中来编写和执行,例如,将它和它一起放在这里以执行计算。 ”
授予模型对特定特征的访问权限:聊天完成 API 允许在请求中传递功能描述列表。 这使模型能够根据提供的架构生成函数参数。 生成的函数参数由API以JSON格式返回,可用于执行函数调用。 然后,您可以在以下请求中将函数调用提供的输出反馈到模型中,以关闭循环。 这是使用 OpenAI 模型调用外部函数的推荐方法。
如果性能可以衡量,那么改进它就会更容易。 在某些情况下,对提示的修改将导致某些孤立示例的性能更好,但会导致一组更具代表性的示例的整体性能较差。 因此,为了确保更改对性能产生净积极影响,可能需要定义一个全面的测试套件(也称为“评估”)。
参考标准答案评估模型输出:假定已知问题的正确答案应参考一组特定的已知事实。 然后,我们可以使用模型查询来计算答案中包含多少个必需的事实。
例如,“您将获得由三个引号分隔的文本,这应该是您问题的答案。 检查答案中是否直接包含以下信息:
尼尔·阿姆斯特朗是第一个在月球上行走的人。
尼尔·阿姆斯特朗于 1969 年 7 月 21 日首次登陆月球。
对于以下每个要点,请按照下列步骤操作:
1 - 重申这一点。
2 - 提供最接近此答案的引文。
3 - 考虑一个不了解主题的阅读引文的人是否可以直接推断出要点。 在做出决定之前解释原因。
4 - 如果 3 的答案是肯定的,则写“是”,否则写“否”。
最后,计算有多少个“是”。 答案是肯定的。 将此计数提供为 。 ”
坦率地说,提示的本质是如何清楚地表达需求。
模型越大,你的实习助理越清晰,你给它的说明越清晰、越详细,它给你的反馈就越有可能是你想要的。 在这一点上,大型模型与人相同。 甚至有相当多的测试说给予模型激励和承诺,抱怨以赢得模型的同情,并告知模型回答的重要性,都可以提高模型答案的质量,这么大的模型和人有什么不同?
当然,大模型也有一些自身的特点,比如反应快、记忆力差、逻辑能力差等。 如何利用好优势,避免劣势,是老板们不得不思考的问题。
如果您认为本文对您有帮助,欢迎点赞、收藏和分享。 同时,请关注我,获取更多有关人工智能的最新消息和见解!