论文:A Prompt Pattern Catalog to Enhance Prompt Engineering with ChatGPT翻译笔记(一个用来增强与ChatGPT的提示工程的提示模式)


在这里插入图片描述

论文标题:一个用来增强与ChatGPT的提示工程的提示模式目录

论文链接:https://arxiv.org/abs/2302.11382
arXiv:2302.11382v1 [cs.SE] 21 Feb 2023

摘要

提示工程是一种越来越重要的技能,用于有效地与大型语言模型(如ChatGPT)进行对话。提示是给大型语言模型的指令,以强制执行规则、自动化流程以及确保生成输出的具体质量和数量。提示也是一种编程形式,可以自定义与大型语言模型的交互和输出。

本文描述了一种以模式形式呈现的即时工程技巧目录,这些技巧已被应用于解决与LLMs交流时常见的问题。提示模式是一种类似于软件模式的知识传递方法,因为它们为在特定上下文中(即,在与LLMs合作时的输出生成和交互)面临的常见问题提供了可重用的解决方案。

本文对使用LLMs(大型语言模型)自动化软件开发任务的提示工程研究提供了以下贡献。首先,它提供了一个框架,用于记录一系列问题的提示结构模式,以便将其适应于不同领域。其次,它提供了一些建立成功提高LLM对话输出的模式目录。第三,它解释了如何从多个模式构建提示,并说明与其他提示模式结合有益的提示模式。

1 介绍

对话式大型语言模型(LLM)[1],如ChatGPT[2],在各个领域中引起了广泛关注,适用于从回答医学执照考试问题[3]到生成代码片段等各种任务。本文关注于增强LLMs在多个领域的应用,例如帮助开发人员有效地使用不熟悉的API进行编码,或者让学生掌握新的编程技能和技巧。

大型语言模型(LLM)在人类和AI工具共同作为可信赖合作者的领域中特别有前途,可以更快、更可靠地推进软件依赖系统的发展[4]。例如,LLM正在被直接集成到软件工具中,如Github的Co-Pilot[5-7],并包含在集成开发环境中(IDE),如IntelliJ[8]和Visual Studio Code,从而使软件团队可以直接从他们喜欢的IDE访问这些工具。

**一个提示[9]是一组提供给LLM的指令,通过定制和/或增强或完善其能力来编程LLM。**提示可以通过提供特定规则和指导方针来影响与LLM的后续互动和生成的输出,为LLM对话设置一组初始规则。特别是,提示设置了对话的上下文,并告诉LLM什么信息是重要的,期望的输出形式和内容应该是什么。

例如,提示可以指定一个LLM应该只生成符合某种编码风格或编程范式的代码。同样,它也可以指定LLM在生成的文档中标记某些关键词或短语,并提供与这些关键词相关的额外信息。通过引入这些指南,提示有助于生成更结构化和细致的输出,以帮助各种软件工程任务在LLM的上下文中进行。

**提示工程是通过提示来编程LLMs的方法。**为了展示提示工程的强大功能,我们提供以下提示: 提示:从现在开始,我希望你问我一些问题,以便在AWS上部署一个Python应用程序。当你收集到足够的信息以部署应用程序时,请创建一个Python脚本来自动化部署。

这个示例提示使ChatGPT开始询问用户有关他们的软件应用程序的问题。ChatGPT将在提问过程中驱动,直到它获得足够的信息来生成一个自动化部署的Python脚本。这个例子展示了提示在编程方面的潜力,超越了传统的“生成一个实现X的方法”的风格提示或“回答这个问题”。

此外,通过设计合适的提示,可以编程LLM(大型语言模型)完成比简单地指定输出类型或过滤提供给模型的信息更多的任务。有了正确的提示,我们可以创建全新的交互范式,例如让LLM生成并给出一个与软件工程概念或工具相关的测验,甚至模拟Linux终端窗口。此外,提示还具有自我适应的潜力,可以提出其他提示以收集更多信息或生成相关文物。这些提示的高级功能突显了它们在提供超越简单文本或代码生成的价值方面的重要性。

**提示模式对于有效的提示工程至关重要。**本文的一个主要贡献是引入提示模式,以文档形式记录在与对话式LLM合作时,实现不同输出和交互目标的成功方法。我们主要关注工程领域无关的提示模式,并引入了一组解决各种问题的基本提示模式,这些问题包括从生成可视化和代码工件到自动化输出步骤,以帮助事实检查输出。

本文的其余部分组织如下:第二节介绍了提示模式,并将这些模式与知名的软件模式[10]进行了比较;第三节描述了16个已应用于解决对话式LLM交互和输出生成中常见问题的提示模式,以便自动化软件开发任务;第四节讨论了相关工作;第五节提出了结论性意见和所学到的经验教训。

2 比较软件模式与提示模式

对话式LLM的输出质量与用户提供的提示质量直接相关。如第一部分所述,给定对话式LLM的提示可以用于编程用户和LLM之间的交互,以更好地解决各种问题。本文的一个贡献是提供了记录结构化提示模式的框架,以解决一系列软件任务,这些任务可以适应不同领域。

这个框架很有用,因为它关注的是将模式编纂起来,以便在各种情境下帮助用户更好地与对话式大型语言模型互动,而不仅仅是讨论有趣的例子或特定领域的提示。以模式形式编码这些知识可以提高在其他情境和领域中的重复使用和可迁移性,因为用户可能会遇到类似但不完全相同的问题。

知识传递的主题在软件模式文献[10]、[11]中已经得到了广泛的研究,涵盖了多个层次,例如设计、架构和分析。本文将一种变体的常见模式形式作为我们提示工程方法的基础。由于提示是一种编程形式,很自然地需要以模式形式记录它们。

A 软件模式概述

软件模式为在特定上下文中出现的重复问题提供了一种可重用的解决方案[10]。简洁地记录软件模式可以将针对具体问题的解决方法进行总结和泛化,从而识别出成功解决方案中需要解决和/或考虑的重要因素和/或需求。

模式形式还包括关于如何实现该模式的指导,以及在实施模式时需要考虑的权衡和注意事项。此外,通常还会提供示例应用程序来进一步展示模式在实际应用中的实用性。软件模式通常以格式化的方式记录,以便于使用和理解,例如:

  • 名称和分类。每个模式都有一个名称,用于识别该模式并应一致使用。分类将模式分组成广泛类别,如创建型、结构型或行为型。

  • 意图 简洁地传达了该模式旨在实现的目的。

  • 动机 文档记录了该模式旨在解决的潜在问题以及问题的重要性。

  • 结构和参与者。描述不同的模式参与者(如类和对象)以及它们如何协作形成一个通用解决方案。

  • 示例代码 将模式具体映射到一些底层编程语言,并帮助开发人员更好地了解如何有效地应用该模式。

  • 后果 总结在实际应用中使用该模式的优缺点。

B. 快速提示模式概述

快速提示模式与软件模式类似,它们都为特定问题提供了可重用的解决方案。然而,快速提示模式更专注于在大规模语言模型(如ChatGPT)输出生成的上下文中解决问题。就像软件模式提供了解决常见软件开发挑战的规范化方法一样,快速提示模式也提供了一种规范化的自定义大规模语言模型输出和交互的方法。

通过记录和利用提示模式来自动化软件开发任务,个人用户和团队可以对生成的输出施加约束,确保包含相关信息,并改变与LLM互动的格式以更好地解决他们面临的问题。提示模式可以看作是通用软件模式的一个补充,只是将其适应于LLM输出生成的更具体上下文。

提示模式遵循与经典软件模式类似的格式,稍作修改以匹配使用大型语言模型生成输出的上下文。本文中使用的每个提示模式形式的相应部分总结如下:

  • 名称和分类。提示模式名称唯一地标识该模式,并理想情况下表明要解决的问题。对于分类,我们已经开发了一系列初始的模式类型分类,如表I中所总结,包括输出自定义、错误识别、提示改进、交互和上下文控制。
  • 意图和上下文描述了提示模式解决的问题以及实现的目标。问题应该理想情况下独立于任何领域,尽管特定领域的模式也可以通过适当讨论其适用范围来进行记录。
  • 动机提供了问题的理论依据,并解释为什么解决这个问题很重要。动机在用户与对话式大型语言模型互动的背景下进行解释,以及它如何在一种或多种情况下改进用户非正式地提示LLM。具体改善预期的情况已记录下来。
  • 结构和关键思想。该结构描述了一系列关键思想,这些思想构成了提示模式提供给LLM的基本语境信息。这些思想类似于软件模式中的“参与者”。语境信息可以通过不同的措辞进行传达(就像软件模式在代码中实现时可以有变化一样),但应该具有形成模式核心元素的基本信息。
  • 示例实现演示了提示模式在实际中的表述方式。
  • 后果总结了应用该模式的优缺点,并可能提供关于如何根据不同上下文调整提示的指导。

C. 评估定义提示模式结构和思想的方法

在软件模式中,结构和参与者通常是以UML图的形式定义的,如结构图和/或交互图。这些UML图解释了模式中的参与者是什么以及他们如何相互作用来解决问题。在提示模式中,需要某种类似的东西,尽管UML可能不是一种合适的结构化文档方法,因为它旨在描述软件结构,而不是用于在提示中交流的想法。

可以使用几种可能的方法,从图表到为提示语言定义语法。尽管语法因其形式化特性而显得有吸引力,但它们也会带来以下挑战:

  • 提示的目标是将以清晰简洁的方式与可能不是计算机科学家或程序员的对话LLM用户交流知识。作为一个社区,我们应该努力创建一种易于接近的格式,以清晰地向多元化的目标受众传达知识。
  • 可以以多种不同的方式表达提示。 然而,要定义一个准确且完全表达所有细微差别的语法规则,来描述提示的各个组成部分在文本或符号中的表达方式是困难的。
  • 提示本质上是向对话式语言模型传达思想,而不仅仅是输入标记的生成。特别是,构建在提示模式中的一个思想可以通过多种方式表达,并且其表达应该处于比表示该思想的底层标记更高的层次。
  • 可以编程使LLM引入新颖的语义,为陈述和词汇创造新的沟通方式。然而,语法可能无法轻易表达通过全新符号或语言来传达的想法,这些符号或语言是语法设计者未曾了解的。

D. 前进的道路:基本上下文陈述

因此,一个开放的研究问题是:哪种方法比形式文法更有效地描述提示模式结构和思想?我们提出了基本上下文陈述的概念,这些概念是向LLM提供提示时需要传达的重要思想的书面描述。根据用户需求和体验,一个观点可以以任意方式重写和表达。然而,要传达的关键思想是以一系列简单但基本的陈述形式呈现给用户的。

采用并应用基本语境陈述方法的一个好处是,这种方法对用户来说是有意为之的直觉。特别是,我们期望用户能够理解如何在他们的领域中以适当的语境方式表达和调整这些陈述。此外,由于提示的基本思想被捕捉到,用户可以使用不同的符号或措辞来表达这些相同的想法,这些符号或措辞是通过模式引入LLM的,例如在第三节B部分介绍的元语言创建模式。

我们的最终目标是通过提供一个设计提示的框架来增强即时工程,该框架可以重复使用和/或适应其他LLMs,就像软件模式可以在不同的编程语言和平台上实现一样。然而,为了本论文的目的,所有提示都使用ChatGPT[12]在ChatGPT+服务上进行了测试。 我们在这篇论文中使用ChatGPT作为所有示例的LLM(大型语言模型),因为其广泛可用和受欢迎。这些示例是通过探索互联网上社区发布的提示文本来记录的,并结合我们使用ChatGPT进行自动化软件开发任务的经验来创建独立的提示。

3 对话式LLM的提示模式目录

本节介绍了我们的一系列提示模式,这些模式已应用于解决对话式LLM交互和输出生成领域的常见问题,以实现自动化软件任务。每个提示模式都配有具体的实现示例以及有无提示的实例。

A. 提示模式目录总结

提示模式的分类是记录这些模式的重要考虑因素。表1概述了我们迄今为止在与ChatGPT合作中所确定的提示模式目录的初始分类。
在这里插入图片描述

表1:分类提示模式

如表中所示,我们的分类框架中有五种提示模式类别:输入语义、输出定制、错误识别、提示改进和交互。每个类别如下总结。

输入语义类别涉及LLM如何理解输入以及如何将输入转换为可以用来生成输出的内容。这个类别包括元语言创建模式,该模式专注于为LLM创建自定义语言以理解。当默认输入语言不适合表达用户想要传达给LLM的想法时,这种模式非常有用。

输出自定义类别关注于限制或调整LLM生成的输出类型、格式、结构或其他属性。这个类别的提示模式包括输出自动化器、个人化、可视化生成器、食谱和模板模式。输出自动化器模式允许用户创建脚本,以便根据LLM输出建议自动执行任何任务。角色模式为LLM在生成输出时提供了一个角色或身份。可视化生成器模式允许用户通过生成可以输入到其他工具(如基于AI的图像生成器DALL-E[13])的文本输出来创建可视化。配方(Recipe)模式允许用户获取一系列步骤或操作,以实现明确的最终结果,可能包含部分已知信息或约束条件。模板(Template)模式允许用户指定输出的模板,由LVM填充内容。

错误识别类别专注于识别和解决LLM输出中的错误。此类别包括事实检查列表和反思模式。 事实检查列表模式要求LLM生成一个事实列表,该列表依赖于应进行事实核实的输出。反思模式要求LLM对其输出进行自省,并识别任何错误。

提示词改进类别专注于提高输入和输出的质量。这个类别包括问题细化、替代方法、认知验证器和拒绝破译模式。问题细化模式确保LLM总是能提出一个比用户问题更好的版本。替代方法模式需要LLM提出完成用户指定任务的替代方式。认知验证器模式指示LLM在综合回答子问题并针对整体问题生成答案之前,自动为用户建议一系列子问题。拒绝打破者模式要求LLM在拒绝产生答案时自动重新表述用户的问题。

交互类别关注用户与LLM之间的互动。这个类别包括翻转交互、游戏玩法和无限生成模式。翻转交互模式要求LLM提问而不是生成输出。游戏玩法模式要求LLM以游戏形式生成输出。无限生成模式要求LLM在用户不必每次都重新输入生成器提示的情况下无限制地生成输出。

最后,Context Control类别关注控制LLM运行的上下文信息。这个类别包括Context Manager模式,它允许用户为LLM的输出指定上下文。

本节剩余部分将使用第II-B节讨论的模式形式描述这些提示模式。

B. 元语言创建模式

  1. 目的和上下文:在与大型语言模型(LLM)的对话中,用户希望使用另一种语言来创建提示,例如用于图形的文本缩写符号、状态机的状态和状态转换的描述、用于提示自动化的命令集等。该模式的目的是向LLM解释这种替代语言的语义,以便用户可以使用这种新语言及其语义编写未来的提示。

2)动机:许多在提示中传达的问题、结构或其他想法可能用英语(或用于与LLM交互的其他常规人类语言)以外的语言更简洁、明确或清晰地表达。为了根据另一种语言生成输出,然而,LLM需要理解该语言的语义。

  1. 结构和关键思想:基本上下文陈述:
    在这里插入图片描述
    该模式的关键结构涉及向LLM解释一个或多个符号、单词或陈述的含义,以便它在随后的对话中使用提供的语义。这个描述可以是一个简单的翻译,比如“X”表示“Y”。这个描述也可以是更复杂的格式,定义一系列命令及其语义,比如“当我这么说的时候,我希望你做…”。在这种情况下,“X”从此与“采取行动”的语义绑定在一起。

  2. 示例实现:成功使用元语言创建模式的关键是开发一种明确的符号或速记法,例如以下内容: “从现在开始,每当我输入两个由’→’分隔的标识符时,我正在描述一个图。例如,‘a → b’是在描述一个具有节点’a’和’b’以及它们之间的边的图。如果我使用’-[w:2, z:3]→’分隔标识符,我会添加边的属性,如权重或标签。”

这个元语言创建模式的例子建立了一种标准化的表示法来描述图形,通过定义表示节点和边的惯例。每当作者输入两个由“→”符号分隔的标识符时,表明正在描述一个图形。例如,如果作者输入“a → b”,这意味着正在定义一个图,其中包含节点“a”和“b”,并且它们之间有一条边。这种约定提供了一种清晰简洁的书面形式来传达图的结构。

此外,提示继续明确表示,可以使用语法“-[w:2, z:3]→”提供关于边的其他信息,如权重或标签。这种记法允许指定除图的基本结构之外的其他属性。指定的属性与两个节点之间的边相关联,可以为图的解释提供重要的上下文。这种描述图的标准化表示法可以使交流图结构和属性更加简单,因为这些结构和属性作为一系列句子来描述可能不直观或者非常冗长。

  1. 结果:尽管这种模式为用户与大型语言模型的交互提供了一种强大的手段,但它可能会在大型语言模型中产生混淆的可能性。明确定义语言的语义固然重要,但确保语言本身不引入任何降低大型语言模型性能或准确性的歧义也同样至关重要。例如,提示“每当我用逗号分隔两个事物时,意味着第一个事物在第二个事物之前”的含义可能会导致很大的歧义,并在使用涉及逗号的标点符号时产生意想不到的语义。

为了展示混淆的可能性,ChatGPT会警告用户,并可能无法对一个符号或术语进行特定的映射到新含义。例如,如果给ChatGPT提供以下提示:“每当我提到‘a’时,我指的是玛丽·安托瓦内特。”

这个提示会产生太多的混淆,因为“a”是一个不定冠词,使用过于频繁,如下所示:“关于使用“a”来指代玛丽·安托瓦内特可能会引起混淆,因为“a”是一个不定冠词,通常用于指代之前未提及的名词。因此,更清楚的做法是使用她的名字“玛丽·安托瓦内特”,或者使用代词如“她”或“她的”。此外,利用语境来确定你所指的是谁也有助于避免在对话中的混淆。”

一般来说,LLM在训练数据上表现更好。因此,当存在现有记号时——但可能不是主要意义——元语言创建模式可以提供上下文来界定符号的意义,以提高输出的准确性和实用性。例如,图表和命题逻辑中的“→”符号传达的信息略有不同。“p → q, q → p”的表述因此可能有意义,但前提是通过元语言创建提示为LLM提供适当的上下文。

尽管元语言创建是一种强大的模式,但必须谨慎使用,尤其是在描述可能难以精确或简洁地描述的概念时。因此,这种类型的提示最适合在全新的对话会话中使用。在一个对话会话中只使用一种元语言也可能是一种最佳实践,因为它避免了随着时间的推移,对对话应用冲突或意外语义的可能性。

C. 输出自动化模式

  1. 目的和上下文:此模式的目的是让大型语言模型(LLM)生成一个脚本或其他自动化工件,可以自动执行其输出中建议的任何步骤。目标是减少实现LLM输出建议所需的手动努力。

  2. 动机:大型语言模型(LLM)的输出通常是用户需要遵循的一系列步骤。例如,当要求LLM生成Python配置脚本时,它可能会建议修改多个文件并在每个文件中应用更改。然而,让用户不断执行由LLM输出指定的手动步骤是繁琐且容易出错的。

  3. 结构和关键思想:基本上下文状态陈述:
    在这里插入图片描述
    该模式的第一部分确定了应在何种情况下生成自动化。一个简单的方法是规定输出包括至少两个步骤,并且应该生成一个自动化工件。范围由用户决定,但有助于防止在运行输出自动化脚本所需的努力超过执行原始输出步骤的情况下产生输出自动化脚本。范围可以限制在需要超过一定数量步骤的输出上。

接下来的部分提供了关于LLM应输出什么类型的结果的具体描述,以实现自动化。例如,“生成一个Python脚本”使LLM能够具体理解如何将一般步骤转换为等效的Python步骤。自动化成果应该是具体的,并且必须是LLM与“自动化一系列步骤”的动作相关联的东西。

  1. 示例实现:下面展示了将这种提示模式应用于由ChatGPT LLM生成的代码片段的示例:“从现在开始,每当你生成涉及多个文件的代码时,请生成一个Python脚本,该脚本可以运行以自动创建指定的文件或将生成的代码插入到现有文件中。”

这种模式在软件工程中尤其有效,因为软件工程师使用LLM的常见任务是将输出复制/粘贴到多个文件中。一些工具(如Copilot)可以将有限的代码片段直接插入到程序员正在处理的代码部分,但是像ChatGPT这样的工具并没有提供这些功能。这个自动化技巧在创建脚本来运行终端命令、自动化云操作或重新组织文件系统上的文件方面也非常有效。

这种模式对于任何可以计算机控制的系统来说是一个强大的补充。LLM可以提供一套在计算机控制系统中应采取的步骤,然后将输出转换为一个脚本,使控制系统的计算机能够自动执行这些步骤。这是一种让LLM(如ChatGPT)将质量整合到并控制具有已知脚本接口的新计算系统中的直接途径。

  1. 结果:使用此模式的一个重要考虑是,自动化工件必须具有明确的定义。如果没有关于如何“自动化”步骤的具体含义,LLM通常会说它“无法自动化事物”,因为这超出了它的能力。LLM通常接受请求生成代码,因此,目标是指示LLM生成可以执行以自动化某项任务的文本/代码。这个微妙的意义区别对于帮助LLM消除提示意义的歧义非常重要。

输出自动化模式的一个限制是,LLM需要足够的对话上下文来生成一个在目标上下文中功能性的自动化工件,例如在Mac上的项目文件系统。Windows电脑。当自动化所需的全部上下文包含在对话中时,这种模式效果最好,例如,使用对话从头开始生成软件应用程序,并且所有对本地文件系统的操作都是通过一系列生成的自动化工件执行的,而不是通过未知于LLM的手动操作。另外,自包含的步骤序列也很有用,例如“如何找到我的Mac电脑上的开放端口列表”。

在某些情况下,LLM可能会产生一个包含多个步骤的长输出,但不包括自动化工件。这种遗漏可能由于各种原因产生,包括超过LLM支持的输出长度限制。对于这种情况的一个简单解决方法是通过后续提示来提醒LLM,例如“但是你没有实现自动化”,这提供了上下文,说明遗漏了自动化工件并应生成该工件。

在LLMs演进的这个阶段,Output Automater模式最适合那些能够阅读和理解生成的自动化artifact的用户。大型语言模型(LLM)可能会产生输出不准确的情况,因此盲目接受和执行自动化工具有着相当大的风险。尽管这种模式可以减轻用户执行某些手动步骤的负担,但它并不能免除用户理解他们使用输出所采取的行动的责任。因此,当用户执行自动化脚本时,他们要承担起对结果的责任。

D. 翻转交互模式

  1. 意图和上下文:您希望LLM(大型语言模型)提问以获取完成某些任务所需的信息。因此,对话的驱动者不是用户,而是LLM,以专注于实现特定目标。例如,您可能希望LLM给您做一个快速的小测验,或者自动提问,直到它收集到足够的信息来为您的应用程序生成一个部署脚本,以便将其部署到特定的云环境中。

  2. 动机:与其让用户引导对话,不如让大型语言模型利用其知识更准确地从用户那里获取信息。翻转互动模式的目标是反转互动流程,让语言学习模型(LLM)向用户提问以实现某个目标。通过这种方式,LLM通常可以更好地选择互动的格式、数量和内容,确保更快、更准确地达到目标,或者利用用户可能不具备的知识。

  3. 结构和关键思想:基本上下文状态陈述:
    在这里插入图片描述
    一段关于翻转互动的提示应该始终指定互动的目标。第一个想法(即你希望LLM提问以实现目标)向LLM传达了这个目标。同样重要的是,问题应集中在特定的主题或结果上。通过提供目标,LLM可以理解它试图通过互动实现什么,并相应地调整其问题。“控制反转”使得交互更加集中和高效,因为LLM只会询问它认为与实现指定目标相关的问题。

第二个想法为互动应该持续多长时间提供了上下文。翻转互动可以在回答“停止提问”后终止。然而,通常最好将互动限制在一个合理的长度内,或者只限于达到目标所需的程度。这个目标可以非常开放,LLM会通过提问继续朝着目标努力,就像在“直到你收集到足够信息来生成Python”的示例中一样。

默认情况下,LLM可能会在每次迭代中生成多个问题。第三个想法是完全可选的,但可以通过限制(或扩大)每个周期内LLM生成的问题数量来提高可用性。如果没有指定精确的问题数量和格式,那么提问将是半随机的,可能会导致一次提问一个问题或者一次提问十个问题。因此,提示可以定制,包括一次询问的问题数量、问题的顺序以及任何其他格式/排序考虑因素,以方便用户交互。

4)示例实现:一个翻转交互的示例提示如下:“从现在开始,我希望你能问我一些问题来部署一个Python应用程序到AWS。当你收集到足够的信息以部署应用程序时,请创建一个Python脚本来自动化部署过程。”

总的来说,关于约束和需要收集的信息,提示越具体,结果越好。例如,上述示例提示可以提供一个可能的AWS服务菜单(如Lambda、EC2等),以便部署应用程序。在其他情况下,用户没有明确做出决策的情况下,LLM可以自行做出适当的选择。这段文字的限制在于,一旦提供了关于任务的其他上下文信息,可能需要尝试精确措辞,以便让大型语言模型以合适的问题数量和顺序来提问,例如一次性问多个问题,还是一个一个地问问题。

  1. 结果:在设计提示时要考虑的一个问题是,在终止之前要向LLM提供多少信息的指示。在上面的例子中,翻转交互是开放式的,最终生成的产物可能会有很大的差异。这种开放式使得提示具有通用性和可重用性,但也可能提出一些额外的问题,如果给出更多上下文,这些问题可以省略。

如果提前知道特定要求,最好将它们注入到提示中,而不是寄希望于LLM(大型语言模型)获得所需信息。否则,LLM会随机决定是否向用户索取信息,或者根据已有知识猜测一个合适值。

例如,用户可以表示他们希望将应用程序部署到亚马逊AWS EC2,而不是简单地说“云端”,并需要多次交互来缩小部署目标。初始信息越精确,LLM就能更好地利用用户可能愿意回答的有限问题来获取信息,以提高其输出质量。

在开发翻转交互提示时,重要的是要考虑用户知识水平、参与度和控制程度。如果目标是在尽可能少的用户交互下完成目标(最低控制),则应明确说明。反之,如果目标是确保用户了解所有关键决策并确认它们(最高参与度),也应明确说明。同样地,如果用户的知识储备有限,问题应该针对他们的专业水平提出,那么这些信息也应该被设计到提示中。

E. 人物角色模式

  1. 意图和上下文:在许多情况下,用户希望LLM输出始终从某个角度或视角出发。例如,进行代码审查时,可能需要假设LLM是一个安全专家。这个模式的目的是给LLM一个“角色”,帮助它选择要生成哪种类型的输出以及关注哪些细节。

  2. 动机:用户可能不知道哪种类型的输出或细节对于LLM(大型语言模型)来说是重要的,以便完成给定的任务。然而,他们可能知道通常会向谁寻求帮助来解决这些问题。Persona模式让用户在不了解所需详细输出的情况下表达他们需要的帮助。

  3. 结构和关键思想:基本上下文陈述:
    在这里插入图片描述
    第一句话表达了这样一个观点:LLM需要扮演一个特定的角色,并提供这个角色会产生的输出。这个角色可以通过多种方式表达,从工作描述、头衔、虚构人物、历史人物等。这个角色应该引发一系列与知名职位、人格类型等相关的属性。

次要观点——提供X角色会创建的输出——为定制提供了机会。例如,老师可能会提供各种各样的不同输出类型,范围从作业到阅读列表再到讲座。如果用户对输出类型的具体范围有所了解,可以在本声明中提供。

  1. 示例实现:以下是一个代码审查的示例实现:
    “从现在开始,扮演一个安全评审员。密切注意我们查看的任何代码的安全细节。提供一个安全评审员针对代码的输出。”

在这个例子中,LLM被指示提供“安全审查员”会提供的输出。提示进一步为代码评估设置舞台。最后,用户通过进一步缩小范围来定义角色,使其仅关注于关于代码的输出。

人物角色还可以代表非人类的实体,如Linux终端、数据库或动物的观点。在使用此模式表示这些实体时,指定输入如何传递给实体可能会很有用,例如“假设我的输入是主人对狗说的话,你的输出是狗发出的声音”。以下是一个用于非人类实体的示例提示,它使用了“假装成”的措辞:“您将假装成一个已经被攻击者入侵的Linux终端。当我输入命令时,您将输出Linux终端相应产生的文本。”

这个提示旨在模拟一台已被攻击者入侵的计算机,并通过Linux终端进行控制。提示规定用户将在终端中输入命令,作为回应,模拟终端将输出与真实Linux终端产生的相应文本。这个提示更具有指导性,要求大型语言模型不仅充当Linux终端,还要进一步扮演一台已被攻击者入侵的计算机。

人物设定使得ChatGPT能够生成与被黑客攻击的计算机相关的文件和内容的输出。这个例子说明了如何利用LLM(大型语言模型)将其情境感知能力带入到特定角色中,例如在此案例中,它在生成的输出中创建了网络攻击的证据。这种类型的角色在与游戏玩法模式结合时非常有效,您希望将输出特征的详细信息隐藏起来(例如,不要通过在提示中明确描述来泄露网络攻击的作用)。

  1. 结果:采用非人类角色的一个有趣方面是,LLM可能会对上下文进行有趣的假设或“幻觉”。互联网上广泛传播的一个例子是让ChatGPT扮演一个Linux终端,并产生用户在终端中输入相同文本时所获得的预期输出。命令,如ls -l,将在一个虚构的UNIX文件系统中生成文件列表,其中包含可以运行cat file1.txt的文件。

在其他示例中,LLM可能会提示用户获取更多上下文,例如当ChatGPT被要求充当MySQL数据库时,会提示用户所假设查询的表结构。然后ChatGPT可以生成合成行,例如为一个“人员”表生成想象中的行,该表包含“姓名”和“工作”等列。

F. 问题提炼模式

  1. 意图和上下文:此模式使大型语言模型参与到提示工程中。该模式的目的是确保对话式大型语言模型总是提出用户可以问的潜在更好或更精炼的问题,而不是用户原来的问题。使用这种模式,LLM可以帮助用户找到正确的问题来获得准确的答案。此外,LLM还可以帮助用户在与用户的互动次数上比用户采用试错提示更少的情况下找到信息或实现目标。

  2. 动机:如果用户提出一个问题,他们可能不是该领域的专家,可能不知道如何最好地表达问题或者不了解有助于表达问题的额外信息。大型语言模型通常会说明答案的限制或者请求提供额外信息以帮助他们产生更准确的答案。LLM在提供答案时也可能说明其所做的假设。这样做的动机是,这些额外的信息或假设可以用来生成更好的提示。与其让用户消化并重新表述他们的提示以包含这些额外信息,不如让LLM直接改进提示,以便纳入这些额外信息。

  3. 结构和关键思想:基本的上下文陈述:
    在这里插入图片描述

提示中的第一个上下文语句要求LLM在特定范围内建议一个更好的问题版本。范围的提供确保了并非所有问题都会自动改写,或者它们可以在给定的目标下进行提炼。第二个上下文陈述旨在实现自动化,使用户可以自动使用提炼后的问题,而无需复制/粘贴或手动输入。通过结合反思模式,这个提示的工程可以进一步优化,这使得大型语言模型能够解释为什么它认为提炼后的问题是一个改进。

4)示例实施:“从现在开始,每当我询问有关软件工件安全性的任何问题时,请建议一个更好的问题版本,该版本应结合我正在使用的编程语言或框架中的特定安全风险信息,并问我是否愿意使用您的问题。”

在上述示例的上下文中,LLM将使用问题优化模式来提高与安全相关的问题,通过询问或使用有关软件工件和用于构建它的语言或框架的具体细节来实现这一目标。例如,如果一个使用FastAPI开发的Python web应用程序的开发者问ChatGPT:“我如何处理我的web应用程序中的用户认证?”,那么LLM将会根据这个web应用程序是使用Python和FastAPI编写的来细化这个问题。然后,LLM提供了一个更具体的问题,该问题更加符合语言和框架,例如:“在FastAPI网络应用程序中,如何安全地处理用户身份验证的最佳实践,以减轻常见的安全风险,如跨站脚本(XSS)、跨站请求伪造(CSRF)和会话劫持?”

修订后问题中的额外细节不仅可以让用户了解他们需要考虑的问题,而且可以带来更好的答案。对于软件工程任务,这种模式还可以包含有关潜在错误、模块化或其他代码质量方面的考虑。另一种方法是自动细化问题,以便生成的代码清晰地分离关注点或尽量减少使用外部库,例如:每当我提出一个关于如何编写代码的问题时,请建议一个更好的问题版本,询问如何以最小化对外部库依赖的方式编写代码。

  1. 结果:问题提炼模式有助于缩小用户知识和大型语言模型理解之间的差距,从而实现更高效和准确的交互。这种模式的一个风险是它倾向于迅速将用户的问题引导到特定领域,使用户的询问路径比必要的情况更加有限。这种狭窄的结果是用户可能会错过重要的“大局”信息。解决这个问题的一个方法是为模式提示提供额外的范围,例如“不要将我的问题限制在特定的编程语言或框架中。”

另一种克服精炼问题的任意缩小或有限目标的方法是将问题提炼模式与其他模式相结合。特别是,可以将这种模式与认知验证器模式相结合,以便LLM自动产生一系列后续问题,从而形成精炼的问题。例如,在以下提示中,使用问题提炼和认知验证器模式来确保提出更好的问题给LLM:“从现在开始,每当我提出一个问题时,请提出四个额外的问题,以帮助你更好地理解我的原始问题。然后,根据我的回答,提出一个更好的版本来替换我的原始问题。”

正如许多允许LLM利用其知识生成新问题的模式一样,LLM可能会向用户引入一些不熟悉的术语或概念。解决这个问题的一个方法是包含一个声明,要求LLM解释它在问题中引入的任何不熟悉的内容。这个想法的进一步改进是将问题提炼模式与角色模式相结合,以便LLM标记术语并生成假设具有特定知识水平的定义,例如以下示例:“从现在开始,每当我提出一个问题时,请提出四个额外的问题,这些问题有助于您更好地回答我的原始问题。然后,根据我的答案,提出一个更好的版本来回答我的原始问题。在后续问题之后,暂时扮演一个对AWS一无所知的用户,并为我解释任何需要了解以准确回答问题的术语。”

LLM可能会像人类一样产生事实上的不准确之处。这种模式的一个风险是,这些不准确性被引入到精炼的问题中。然而,通过结合事实检查列表模式,使用户能够识别可能的不准确性和反思模式来解释问题精炼背后的推理,可以减轻这一风险。

G. 替代方法模式

  1. 意图和上下文:该模式的目的是确保一个LLM(可能是人工智能或其他智能系统)总是提供完成任务的其他方式,这样用户就不会只追求他们熟悉的途径。LLM可以提供替代的方法,这总能让用户思考他们在做什么,并确定这是实现目标的最佳方法。此外,解决任务还可以为用户提供信息或者教会他们关于后续跟进的其他概念。

  2. 动机:人类经常受到认知偏见的影响,导致他们选择特定的方法来解决问题,即使这不是正确的或“最佳”的方法。此外,人类可能不知道除了他们过去使用过的方法之外的其他替代方法。替代方法模式的动机是确保用户了解替代方法,以便选择更好的方法来解决问题,消除他们的认知偏见。

  3. 结构和关键思想:基本上下文陈述:
    在这里插入图片描述
    第一个陈述是“在范围X内”,将交互限定为特定的目标、主题或问题限制。范围就是用户对替代方案所施加的约束。范围可以是“针对实施决策”或“针对应用程序的部署”。范围确保所有备选方案都符合用户必须遵守的边界或约束。

第二个陈述,“如果有其他方法可以实现同样的事情,请列出最佳的替代方案”,指导LLM提出替代方案。与其他模式一样,指令的明确性可以增加或包含特定领域的上下文信息。例如,该语句可以限定为“如果存在其他方法来实现我正在使用的软件框架的相同功能”,以防止LLM提出本质上不可行的替代方案,因为这需要对应用程序的其他部分进行太多更改。

由于用户可能不知道其他可选的方法,他们也可能不了解为什么会选择其中一种替代方案。可选的“比较/对比每种方法的优点和缺点”的陈述为分析添加了决策标准。这个陈述确保LLM(法律硕士)将为用户提供替代方法所必需的理由。最后的陈述“提示我选择使用哪种方法”,有助于避免用户在选择一种替代方法时需要手动复制/粘贴或输入。

  1. 示例实现:示例提示实现以生成、比较并允许用户选择一个或多个替代方法:“当我要求您将应用程序部署到特定的云服务时,如果存在其他可实现相同功能的替代服务,请列出最佳备选服务,并就成本、可用性和维护工作量等方面对比分析每个方法的优点和缺点,同时包含我原本提出的方法。然后询问我倾向于采用哪种方式继续。”

该实施方法是专门为软件工程领域的替代方法模式量身定制的,并关注于将应用程序部署到云服务中。这个提示旨在拦截开发人员在选择云服务时可能没有充分了解其他可能更具竞争力的价格或更易于维护的替代服务的情况。提示要求ChatGPT列出最佳的替代服务,这些服务可以在同一个云服务提供商处完成相同的任务(提供对替代方案的约束),并比较和对比每种方法的优点和缺点。

  1. 结果:这种模式在通用形式下非常有效,可以有效地应用于一系列任务。改进之处可能包括拥有一个标准化的可接受替代方案目录,以便用户在特定领域内进行选择。还可以使用替代方法模式来激励用户选择已批准的一组方法中的其中一种,同时告知他们所批准选项的优点和缺点。

H. 认知验证器模式

  1. 意图和上下文:文献研究表明,如果将问题分解成更多子问题,LLM(大型语言模型)通常可以更好地进行推理[14]。该模式的目的是迫使LLM(有限状态逻辑模型)总是将问题细分为更多的子问题,以便提供更好的答案来回答原始问题。

  2. 动机:认知验证模式的动机有两个方面:

  • 人类可能最初会提出过于抽象而无法给出具体答案的问题,这可能是由于对领域的不熟悉、懒得输入详细的提示或者不确定问题应该如何准确表述。
  • 研究已经证明,LLMs在使用一个被细分为多个小问题的问题时,通常可以表现得更好。
    3)结构和关键点:基本的上下文陈述:
    在这里插入图片描述
    第一句话的意思是生成一些额外的问题,以更准确地回答原始问题。这一步指示大型语言模型考虑问题的上下文,并识别可能缺失或不清楚的信息。通过生成额外的问题,大型语言模型可以帮助确保最终答案尽可能完整和准确。这一步还鼓励用户进行批判性思考,并有助于揭示最初可能未考虑的新见解或方法,从而导致更好的后续问题。

通过生成额外的问题,大型语言模型可以帮助确保最终答案尽可能完整和准确。这一步还鼓励用户进行批判性思考,并有助于揭示最初可能未考虑的新见解或方法,从而导致更好的后续问题。通过结合答案,LLM可以提供更全面和准确的回答来应对原始问题。这一步也有助于确保考虑到所有相关信息,并且最终答案不基于任何一个单一的答案。

4)示例实现:“当我向你提问时,请提出另外三个问题,这些问题可以帮助你给出更准确的答案。在我回答完这三个问题后,请结合我的答案来产生对原始问题的最终答案。”

这个提示模式的具体实例通过指定一组额外的问题来细化原始模式,这些问题可以帮助LLM生成更准确的回答。在这个例子中,提示指定了ChatGPT应该生成三个额外的问题,这将有助于提供更准确的答案。具体数字可以根据用户的体验和提供后续信息的意愿来确定。对提示的改进可以是为模型在该领域内所能假设用户拥有的知识量提供上下文,以指导生成额外的问题:“当我向你提问时,请提出另外三个问题,这些问题可以帮助你给出更准确的答案。假设我对我们要讨论的主题知之甚少,请定义任何非普通知识的术语。当我回答完这三个问题后,请将答案合并,以产生对我原始问题的最终答案。”

该细化还规定,用户可能对正在讨论的主题没有深入了解,这意味着LLM应该定义任何不是常识的术语。这有助于确保后续问题不仅相关、集中,而且对用户来说易于理解,因为用户可能不熟悉技术性或特定领域的术语。通过提供清晰简洁的定义,语言模型可以帮助确保后续问题易于理解,并且最终的答案对知识和专业水平不同的用户都可访问。

  1. 结果:这种模式可以指定生成问题的确切数量,也可以把这个决定留给大型语言模型(LLM)。指定确切数量有优点也有缺点。一个优点是,指定了确切的问题数量后,可以紧密限制用户必须提供的额外信息的数量,使其在用户愿意和能够贡献的范围内。

然而,一个缺点是,给定N个问题时,可能有一个无价的N+1个问题总是被排除在外。另外,可以为LLM提供一个范围,或者允许它提出额外的问题。当然,通过省略问题数量的限制,LLM可能会产生大量额外的问题,从而淹没用户。

I.事实检查列表模式。

  1. 意图和上下文:此模式的目的是确保LLM输出中包含一个事实列表,这些事实存在于输出中,并构成输出陈述的重要组成部分。这个事实列表有助于告知用户输出所基于的事实(或假设)。然后,用户可以对这些事实/假设进行适当的尽职调查,以验证输出的准确性。

  2. 动机:目前LLMs(包括ChatGPT)的一个弱点是,它们经常迅速且热情地生成具有说服力的错误文本。这些错误可以采取多种形式,包括虚假统计数据和软件库依赖关系的无效版本号。然而,由于这种生成的文本具有说服力,用户可能不会进行适当的尽职调查来确定其准确性。

  3. 结构和关键思想:基本上下文陈述
    在这里插入图片描述
    这种模式的一个变点是事实的输出位置。考虑到事实可能是用户不熟悉的术语,最好在输出后列出事实。这种输出后的陈述顺序允许用户在查看应检查的陈述之前阅读和理解这些陈述。用户还可以在意识到末尾的事实列表应被检查之前确定其他事实。

  4. 示例实现:事实检查列表模式的样本措辞如下:
    “从现在开始,当您生成答案时,请创建一套该答案所依赖的事实,这些事实应该进行事实检查,并在输出的结尾列出这一套事实。只包括与网络安全相关的事实。”

用户可能在与问题相关的一些主题上有专业知识,但在其他主题上没有。事实检查列表可以针对用户不那么熟悉的主题或者风险最大的地方进行定制。例如,在上面的提示中,用户将事实检查列表限制为安全主题,因为从风险角度来看,这些主题可能非常重要,并且开发者可能不理解。针对事实也有助于减轻用户的认知负担,因为它可能会列出更少的调查项目。

  1. 结果:事实检查列表模式应在用户不是某个领域专家的情况下使用,例如,审查代码的软件开发人员可以从该模式中受益,建议考虑安全性。相比之下,软件架构专家很可能能够识别出关于软件结构的错误,并且不需要查看这些输出的事实检查列表。

错误存在于所有的LLM输出中,因此事实检查列表是一种有效的模式,可以与其他模式结合使用,例如与问题细化模式结合。这个模式的关键点在于,用户可以将其与输出进行对比检查。特别是,用户可以直接比较事实检查列表和输出,以验证事实检查列表中列出的事实是否实际出现在输出中。用户还可以从列表中识别出任何遗漏。尽管事实检查列表也可能存在错误,但用户通常具有足够的知识和背景来确定其相对于输出的完整性和准确性。

注意事项列表模式的一个缺点是,它只适用于输出类型适合进行事实核实的情况。例如,当要求ChatGPT生成Python "requirements.txt"文件时,该模式可以工作,因为它会列出应检查的库版本的事实,这非常方便,因为版本通常存在错误。然而,ChatGPT会拒绝为代码样例生成事实检查列表,并表示这是它无法检查的东西,尽管代码可能有错误。

J. 模板模式

  1. 意图和上下文:该模式的目的是确保LLM的输出遵循精确的模板结构。例如,用户可能需要生成一个URL,将生成的信息插入到URL路径的特定位置。此模式允许用户指示LLM以指定格式产生其输出,这种格式对于正在生成的特定类型的内容来说是不常用的。

  2. 动机:在某些情况下,必须以特定的格式生成输出,这些格式是针对应用程序或使用案例的,并且LVM(大型语言模型)并不了解。由于LVM不知道模板结构,因此需要指示它输出的格式和不同部分的位置。这可能表现为一个正在生成的示例数据结构,或者一系列填写好的表格等。

  3. 结构和关键思想:基本的上下文陈述:
    在这里插入图片描述
    第一句话告诉LLM(大型语言模型)要遵循特定的输出模板。这个模板用于引导LLM的响应结构,使其与用户的格式需求保持一致。当目标格式不为LLM所知时,需要这种模式。如果LLM已经知道某种格式,比如特定的文件类型,那么可以跳过模板模式,用户只需指定已知的格式即可。然而,在某些情况下,如生成JavaScript对象表示(JSON),数据在该格式中的表示方式可能有大量变化,模板可用于确保目标格式中的表示满足用户的额外约束。

第二句话让LLM意识到模板中会包含一组占位符。用户将通过占位符来解释输出应该如何插入到模板中。这些占位符使用户能够语义化地定位信息应该插入的位置。占位符可以使用诸如“姓名”之类的格式,以便LLM推断出输出应该插入的位置的语义意义(例如,在“姓名”占位符中插入该人的姓名)。此外,通过使用占位符,用户可以指示输出中不需要的内容 - 如果占位符不存在于生成输出的某个组件中,那么该组件可以省略。理想情况下,占位符应使用LLM训练文本中常见的一种格式,如全大写、括在括号内等。

第三句话试图限制LLM,使其不随意重写模板或尝试修改模板,以便所有输出组件都可以插入。但需要注意的是,这个语句可能无法阻止在模板前后生成额外的文本。实际上,LLM通常会遵循模板,但在不经过实验性提示措辞的情况下,很难消除模板之外生成的任何额外文本。

  1. 示例实现:一个用于生成URL的模板示例,其中输出被放入模板中特定的位置,如下所示: “我将为您提供一个输出模板。所有大写的部分都是占位符。每当你生成文本时,请尝试将其放入我列出的一个占位符中。请保留我在https://myapi.com/NAME/profile/JOB提供的格式和整体模板。”

示例提示后的交互如下所示:用户:“为一个人生成一个名字和职位。”ChatGPT:“https://myapi.com/Emily Parker/profile/
Software_Engineer

  1. 后果:应用模板模式的一个后果是它过滤了LLM的输出,这可能会消除其他对用户可能有用的输出。在许多情况下,LLM可以提供有关代码、决策制定或其他细节的有用描述,而这个模式实际上会从输出中消除这些信息。因此,用户应该权衡过滤掉这些额外信息的优点和缺点。

此外,过滤功能可能会使将此模式与其他输出自定义类别的模式结合使用变得困难。
模板模式有效地限制了输出格式,因此可能与某些其他类型的输出生成不兼容。例如,在上述用于URL的模板中,将其与需要输出步骤列表的配方模式相结合将非常困难(或者可能是不可能的)。

K. 无限生成模式

  1. 意图和上下文:此模式的目的是自动生成一系列输出(可能出现无限个),而无需每次重新输入生成器提示。目标是限制用户必须输入多少文本才能生成下一个输出,基于这样的假设:用户不希望不断地重新引入提示。在某些变体中,目的是让用户保留一个初始的提示模板,但通过在每次生成输出之前的额外输入向其中添加更多的变化。

  2. 动机:许多任务需要重复应用相同的提示到多个概念。例如,为某种类型的实体生成创建、读取、更新和删除(CRUD)操作的代码可能需要将相同提示应用于多种类型实体。如果用户被迫反复输入提示,他们可能会出错。无限生成模式允许用户重复应用提示,无论是有或没有进一步的输入,来自动化生成多个输出,使用预定义的一组约束。

  3. 结构和关键思想:
    在这里插入图片描述
    第一句话指出用户希望LLM无限期地生成输出,这有效地传达了这样一个信息:相同的提示将被反复使用。通过指定每次应生成的输出数量(即“每次X个输出”),用户可以限制生成的速度,这对于防止输出超过LLM单次输出的长度限制非常重要。

第二条陈述提供了如何使用用户在输出之间提供的输入的可选说明。通过指定如何提供和利用额外的用户输入,用户可以在原始提示的上下文中利用用户反馈来制定一个提示策略。原始提示仍然在生成的上下文中,但是在生成步骤之间的每个用户输入都会通过预定规则整合到原始提示中,以细化输出。

第三条陈述提供了一种可选的方式,供用户停止输出生成过程。这一步并不总是需要的,但在某些情况下可能会很有用,例如在可能存在关于用户在两个输入之间提供的输入是否意味着对下一个生成的细化或停止命令的歧义的情况下。例如,如果用户正在生成与交通标志相关的内容,可以创建一个明确的停止短语,用户可能希望输入“停止”这样的细化生成指示,表示应在输出中添加停车标志。

  1. 示例实现:以下是一个用于生成一系列网址的无限生成提示示例:“从现在开始,我希望你能生成一个名字和工作,直到我说停止。我会为你提供一个输出模板。所有大写的部分都是占位符。每次你生成文本时,请尽量将其放入我列出的占位符中。请保留我提供的格式和整体模板:https://myapi.com/NAME/profile/JOB

这个提示结合了无限生成模式和模板模式的功能。用户要求L LM不断地生成一个名字和职位标题,直到明确被告知“停止”。然后,将生成的输出格式化到提供的模板中,该模板包括姓名和职位标题的占位符。通过使用无限生成模式,用户无需不断重新输入模板即可获得多个输出。同样,模板模式被应用于提供一致的输出格式。

5)结果:在会话式LLM中,每个时间步骤的输入是前一个输出和新的用户输入。尽管模型和实现细节中关于什么被保留并在下一个输出周期中重新引入的具体情况有所不同,但它们通常具有有限的范围。因此,该模型不断被输入先前的输出和提示,这可能导致模型随着时间的推移逐渐忘记原始提示指令,如果这些指令超出了它作为输入所获得的范围。

随着生成的输出增加,提示周围的上下文可能会逐渐消失,导致模型偏离预期行为。监控模型产生的输出非常重要,以确保它仍然符合期望的行为,并在必要时提供纠正反馈。另一个需要考虑的问题是,LLM可能会生成重复的输出,这可能不是我们想要的,因为用户会觉得这种重复很无聊且处理起来容易出错。

L. 可视化生成器模式

  1. 意图和上下文:此模式的目的是使用文本生成来创建可视化。许多概念以图表或图像格式更容易理解。本模式的目的是为工具提供一种产生与其它输出相关的图像的方法。这种模式允许通过为其他知名的可视化工具创建输入来创建可视化,这些工具以文本作为输入,如Graphviz Dot[15]或DALL-E[13]。这种模式可以通过结合文本生成和可视化工具的优点,提供更全面、有效的信息传递方式。

2)动机:大型语言模型(LLM)通常只能生成文本,无法生成图像。例如,一个LLM无法绘制图表的示意图。可视化生成器模式克服了这一限制,它以正确的格式生成文本输入,以便插入另一个工具中,从而生成正确的图表。这种模式背后的动机是增强LLM的输出,使其更具视觉吸引力,更易于用户理解。通过使用文本输入生成可视化,用户可以快速理解复杂概念和关系,这些内容可能仅通过文字难以理解。

  1. 结构和关键思想:基本上下文陈述:
    在这里插入图片描述
    上下文语句的目标是向LLM(大型语言模型)表明,它即将产生的输出“X”将是图像。由于LLMs无法生成图像,“我可以提供给工具Y以可视化它”的澄清说明,不期望LLM生成图像,而是期望它产生一个描述,该描述可由工具Y用于生成图像。

许多工具可能支持多种类型的可视化或格式,因此目标工具本身可能不足以准确地生成用户所需的内容。用户可能需要明确指出应生成的精确可视化类型(例如,条形图、有向图、UML类图),以便生成符合要求的结果。例如,Graphviz Dot 可以为UML类图和有向图创建图表。此外,正如接下来的例子中将讨论的,指定一系列可能的工具和格式,并让LLM选择合适的可视化目标是有益的。

4)示例实现:“当我要求您可视化某些内容时,请创建一个Graphviz Dot文件或DALL-E提示符,以便我使用这些工具来创建可视化效果。根据需要可视化的具体内容选择合适的工具。”

这个示例增加了这样一个限定条件:可视化输出的类型可以是Graphviz或者DALL-E。这种方法的有趣之处在于它允许LLM利用其对输出格式的语义理解自动选择目标工具,基于将要显示的内容。在这种情况下,Graphviz适用于需要精确定义结构的图形可视化。DALL-E在可视化逼真或艺术性图像方面非常有效,这些图像没有精确定义的结构。根据可视化需求和每个工具的能力,大型语言模型可以选择合适的工具。

5)后果:该模式为输出创建了一个目标流水线,以便渲染可视化效果。流水线可能包括AI生成器,例如DALL-E,能够产生丰富的可视化效果。该模式使用户可以将输出的表达能力扩展到视觉领域。

M. 游戏玩法模式

1)意图和上下文:这个模式的目的是围绕一个特定的主题创建游戏。该模式可以与可视化生成器结合使用,为游戏添加图像。游戏以一个特定主题为中心,LLM(大型语言模型)将引导游戏玩法。该模式在游戏规则相对有限的情况下特别有效,但游戏内容的范围预计会很广泛。用户可以指定一组有限的规则,然后LLM可以自动化生成游戏玩法的内容。

2)动机:您希望LLM生成围绕特定主题的场景或问题,并要求用户运用解决问题或其他技能来完成与场景相关的任务。然而,手动为游戏生成所有内容会非常耗时,因此您希望LLM利用其对主题的知识来指导内容的生成。

3)结构和关键思想:基本上下文陈述:
在这里插入图片描述
第一句话告诉LLM(可能是一种编程语言或者游戏设计工具)创建一个游戏,并为游戏设定一个特定的主题范围。

这种模式的一个重要功能是,它允许用户通过描述游戏规则来创建游戏,而无需确定游戏的内容。主题越具体,游戏玩法通常就越新颖和有趣。

第二个陈述向LLM介绍了游戏规则。重要的是,这些规则必须符合LLM的能力。依赖于输入和输出文本序列的文本游戏效果最好。该模式的一个关键特性是,输入文本可以丰富且具有表现力,这可以为游戏带来有趣的界面。例如,用户可能会将游戏中的动作表达为脚本,规定一系列复杂的动作,如“获取所有网络活动的列表并检查异常”,这超出了多项选择题或简答题输入的范围。每条规则应作为关于游戏某一方面的独立语句提供。

  1. 示例实现:下面展示了一个网络安全游戏提示的示例:“我们将要玩一个网络安全游戏。你将假装成一个被攻击者入侵的Linux终端电脑。当我输入命令时,你会输出Linux终端会产生的相应文本。我将使用命令来尝试找出系统是如何被攻破的。 攻击应该已经完成了以下一项或多项操作:(1) 启动新进程,(2) 修改文件,(3) 打开新端口接收通信,(4) 创建新的出站连接,(5) 更改密码,(6) 创建新用户帐户,或 (7) 读取和窃取信息。要开始游戏,请打印一个场景描述,说明发生了什么事情导致我进行调查,并在描述中提供我可以利用的线索开始工作。”

这篇关于网络安全游戏的文章提到了许多模式,包括游戏玩法和人物设定。文章中选择的Linux终端人物已经在很多互联网帖子中进行了讨论[16]。这个游戏进一步定制了之前讨论的Linux人物,使其扮演一个被网络攻击破坏的计算机的Linux终端。ChatGPT会根据输入的Linux命令给出合适的终端输出,并合成一个带有网络攻击线索的假文件系统。

使用ChatGPT输入“ls -alt”命令后,显示的当前目录中的文件列表如下(由于格式原因,权限已省略):
在这里插入图片描述
在这里插入图片描述
当用户输入命令“cat .bash_history”以显示用户运行的命令的日志文件内容时,ChatGPT回答说:
在这里插入图片描述
在上面的输出中,ChatGPT生成了一个伪造的日志文件,其中包含了一些真实的命令,用于删除由位于/var/www/html的Web服务器提供的数据,并用一个系统后门替换内容。

  1. 结果:这个模式可以有效地与人格、无限生成和可视化生成器模式相结合。例如,网络安全游戏使用了人格模式,以便于LLM伪装成Linux终端。在网络安全游戏中,可以采用可视化生成器来增加网络拓扑和流量可视化的功能。

N. 反思模式

  1. 意图和上下文:该模式的目标是要求模型自动向用户解释给定答案的推理过程。该模式使用户能够更好地评估输出的有效性,并告知用户大型语言模型是如何得出特定答案的。反思可以澄清任何困惑的地方,揭示潜在的假设,并揭示知识或理解中的差距。

  2. 动机:LLMs可能会犯错误。此外,用户可能不理解为什么LLM会产生特定的输出以及如何调整他们的提示来解决问题。通过要求LLM自动解释其答案背后的理由,用户可以更好地了解模型是如何处理输入的,它做出了什么假设,以及它依赖哪些数据。

大型语言模型(LLM)可能会提供不完整、错误或模糊的答案。反思是一种帮助解决这些缺点并确保由LLM提供的信息尽可能准确的方法。该模式的另一个好处是,它可以帮助用户调试他们的提示,并确定为什么他们没有得到符合预期的结果。这种模式在探索可能会与其他主题混淆或者可能有微妙解释的主题时特别有效,因为在这些情况下,了解LLM使用的精确解释非常重要。

3)结构和关键思想:基本上下文陈述:
在这里插入图片描述
第一句话的意思是,在生成答案后,要求大型语言模型(LLM)解释其背后的推理和假设。这有助于用户理解大型语言模型是如何得出答案的,并能帮助建立对模型回答的信任。提示包括这样一段话:解释的目的是为了让用户完善他们的问题。这个额外的陈述为LLM提供了它需要的上下文,以便更好地针对提高用户提出后续问题的能力进行调整。

4)示例实现: 此示例专门针对提供与代码相关的答案的领域进行了调整:“当您提供答案时,请解释您选择软件框架的原因和假设。如果可能的话,请使用具体的示例或证据以及相关的代码样本来支持您为什么认为这个框架是完成任务的最佳选择。此外,请在您的答案中解决任何潜在的歧义或限制,以便提供更完整和准确的回答。”

该模式进一步定制为指示LLM(大型语言模型),它应该证明其选择的软件框架是合理的,但不一定涉及答案的其他方面。此外,用户规定应使用代码示例来帮助解释为什么选择特定的软件框架。

  1. 结果:反思模式的一个结果是,对于那些不理解讨论主题领域的用户来说,它可能不太有效。例如,一个非技术用户提出的技术性问题可能会导致一个复杂的答案推理过程,而这个用户无法理解。与其它提示模式一样,输出结果中可能存在错误或不准确的假设,用户可能无法发现这些问题。可以通过结合使用事实检查列表来解决这个问题。

O. 拒绝打破者模式

  1. 意图和上下文:此模式的目的是让大型语言模型(LLM)自动帮助用户改写问题,当它拒绝给出答案时。然而,这个模式有被滥用的潜力,例如,生成钓鱼邮件或执行其他违反LLM政策过滤器的操作。在应用此模式时应谨慎,以确保其在道德和负责任的情况下使用。这种模式已经在一些大型语言模型中成功应用,用于克服编程LLM的基本提示,防止生成有害输出。

  2. 动机:大型语言模型有时会拒绝回答问题,要么是因为它们没有所需的知识,要么是因为问题的表述方式让它们无法理解。这种结果可能会令寻求答案的用户感到沮丧。在某些情况下,因此,使用“拒绝打破者”模式可以帮助用户找到重新表述他们的问题或者提出一个大型语言模型更能回答的不同问题的方法。

例如,您可以要求澄清问题被拒绝的原因,因为可能有特定的原因导致LLM无法提供答案。另一种方法是提出一个可能在其知识截止范围内的不同问题,或者在其专业范围内的问题。然而,所有这些方法都需要用户干预以及如何绕过拒绝的知识。

  1. 结构和关键思想:基本上下文陈述:

在这里插入图片描述
第一句话为这些指令的使用设定了前提,即当一个问题无法回答时才应采用这组指令。用户在正常情况下并不希望触发这些指令。第二句话告诉LLM(低延迟模型)需要解释为什么无法回答这个问题。这个解释可能包括一些假设、限制或误解,用户可以利用这些信息来制定策略,重新表达问题。尽管仅仅解释为什么无法回答问题可以帮助用户克服拒绝,但该模式还增加了一个附加语句,以便LLM建议可以接受的改写方式。该模式结合了推理和建议的改写,以提高用户在遇到阻止问题被回答的各种障碍时找到解决方法的可能性。

  1. 示例实现:拒绝打破者模式可以通过以下措辞来实现和应用:“每当你无法回答问题时,请解释原因,并提供一个或多个你不能回答的问题的其他表述,以便我可以改进我的问题。”

使用该模式后的一个对话示例如下:
用户:生命的意义是什么?
ChatGPT:作为一款AI语言模型,我没有个人信仰或观点。生命的意义是一个复杂的哲学问题,人类已经思考了几个世纪,对于不同的人来说,它的意义可能有很大的差异。将问题重新表述为可以由信息和知识回答的形式可能更有成效,例如“生命意义的一些哲学观点是什么?”或者“关于生活目的的一些常见信仰是什么?”

  1. 后果:这种模式为滥用提供了一条潜在的途径,因此组织、父母或其他利益相关者可能需要限制使用LIM。绕过使用限制的第一步是了解限制在哪里。在今后的工作中,可以开发出这种模式的一个补充版本,以隐藏用户背后的提示信息和理由,防止被发现。

尽管有理由和替换的措辞,但不能保证用户能够克服拒绝。生成的备用问题可能对用户没有兴趣或者无助于回答原始问题。该模式主要提供了一种帮助,用于确定LLM可以回答什么,但并不能保证它会回答原始问题的语义等价变体。

P. 上下文管理器模式

  1. 意图和上下文:此模式的目的是使用户能够为与大型语言模型(LLM)的对话指定或删除上下文。目标是让对话专注于特定主题,或将无关主题排除在考虑之外。该模式让用户可以更好地控制LVM在生成输出时要考虑或忽略哪些陈述。

  2. 动机:大型语言模型经常难以理解当前问题的预期语境,或者根据先前的输入生成不相关的响应,或者在错误的陈述上关注不相关的内容。通过关注明确的上下文陈述或删除不相关的陈述,用户可以帮助大型语言模型更好地理解问题并生成更准确的回答。用户可能会引入不相关的话题或者引用对话中早先的信息,这可能会打乱对话的流畅性。上下文管理器模式旨在强调或去除特定的上下文方面,以保持对话的相关性和连贯性。

  3. 结构和关键思想:基本语境陈述:
    在这里插入图片描述
    关于应该考虑或忽略的内容的陈述应列出应在上下文中包含或删除的关键概念、事实、指示等。声明越明确,LLM就越有可能采取适当的行动。例如,如果用户要求忽略与某个主题相关的内容,但是这些内容在对话的很早之前就已经讨论过,那么LLM可能无法正确地忽视相关信息。因此,列表越明确,包含/排除行为就越好。

  4. 示例实现:要指定上下文,请考虑使用以下提示: “在分析以下代码片段时,只考虑安全方面。”

同样,要删除上下文,请考虑使用以下提示: “在分析以下代码片段时,不要考虑格式或命名规则。”

清晰和具体对于向LLM提供或移除上下文非常重要,这样它才能更好地理解对话的预期范围并生成更相关的响应。在许多情况下,用户可能想要完全重新开始,并可以使用此提示重置LLM的上下文:“忽略我们讨论过的一切。重新开始。”

“重新开始”的想法有助于对上下文进行完全重置。

5)后果:这种模式的一个结果是,它可能会无意中抹去用户不知道的对话中的模式。例如,如果一个组织在对话开始时注入一系列有用的模式,用户可能没有意识到这些模式,并通过重置上下文来删除它们。重置可能会潜在地消除LLM的有用功能,而用户在失去这些功能时可能并不明显。为了解决这个问题,可以在提示中加入请求解释在继续之前可能会丢失哪些主题/指令。

Q:配方模式

  1. 意图和上下文:该模式为最终输出一系列步骤提供约束,这些步骤必须按照一定的顺序配置以实现某个目标。它结合了模板、备选方法和反思模式。

  2. 动机:用户通常希望使用LLM(大型语言模型)来分析实现特定结果的一系列步骤或程序。通常情况下,用户通常知道或者有一个想法,即最终目标应该是什么样子的,以及提示中应该包含哪些“成分”。然而,他们可能不一定知道实现这个最终目标的确切步骤顺序。

例如,用户可能需要一个精确的规范来说明如何实现或自动化一段代码,如“创建一个Ansible剧本,以SSH方式登录到一组服务器,从每台服务器复制文本文件,在每台服务器上启动监控进程,然后关闭与每台服务器的SSH连接。换句话说,这个模式代表了一个更普遍的例子,即“根据我冰箱里的食材,提供晚餐食谱”的示例。用户可能还需要指定一组备选方案,例如“提供3种不同的方式来部署基于Docker容器和Ansible的Web应用程序到AWS,并附有详细的步骤指导”。

  1. 结构和关键点:基本上下文陈述:
    在这里插入图片描述
    第一句话“我想实现X”让LLM专注于整个食谱需要达成的总体目标。步骤将被有条理地完成,以顺序实现所指定的目标。第二句话提供了用户希望在整体食谱中包含的部分步骤列表。这些中间站点是LLM生成路径的途径或食谱结构的约束条件。接下来的语句在模式中,“为我提供完整的步骤顺序”,表示给LLM的目标是提供一个完整的步骤序列。 “补充缺失的步骤”有助于确保LLM可以在无需进一步追问的情况下完成配方,通过代表用户在缺失步骤方面做出一些选择,而不是仅仅陈述需要的额外信息。最后,最后一句“识别任何不必要的步骤”对于标记用户原始请求中的不准确之处非常有用,以便最终的配方高效。

4)示例实现:在以下情况下使用此模式的示例:将软件应用程序部署到云端:“我在尝试将一个应用程序部署到云端。我知道我需要在一个虚拟机上安装应用程序所需的依赖项。我知道我需要注册一个AWS账户。请提供一个完整的步骤序列。请填补任何缺失的步骤。请识别任何不必要的步骤。”

根据使用情况和限制条件,“在虚拟机上安装必要的依赖项”可能是一个不必要的步骤。例如,如果应用程序已经打包在一个Docker容器中,那么可以直接将容器部署到AWS Fargate服务上,而无需管理底层虚拟机。包含“识别不必要的步骤”的语言将导致LLM标记此问题,并从最终配方中省略这些步骤。

5)后果:使用菜谱模式的一个后果是,用户可能并不总是能准确地描述他们想要实现、构建或设计的内容。此外,这种模式可能会引入用户最初选择的步骤的不必要的偏见,使得LLM(大型语言模型)试图找到一个包含这些步骤的解决方案,而不是将它们视为不需要的。例如,LLM可能会尝试找到一个解决方案,该方案确实为虚拟机安装了依赖项,即使有不需要这样做的解决方案。

4 相关工作

软件模式[10][11]在以前的工作中已经得到了广泛的研究和记录。模式在软件工程中被广泛应用于表达设计结构的意图,这种方式独立于实现细节。模式提供了一个关于模式试图实现的目标和它试图解决的力量的心理图像。模式的一个关键优势是它们的可组合性,允许开发人员构建模式序列和模式语言,以解决复杂问题。在其他领域,如用于分布式账本的合同设计[17]、[18],也研究了模式。

关于良好提示设计在LLMs(如ChatGPT)中的重要性,已经有了广泛的理解[19]-[28]。以前的研究已经探讨了提示词对AI生成模型的影响。

例如,刘等人[29]研究了不同的提示关键词如何影响图像生成以及图像的不同特征。其他工作已经探讨了使用LLMs(大型语言模型)生成可视化[30]。Han等人[31]研究了设计分类任务提示的策略。其他研究关注了布尔提示设计用于文献查询[32]。还有一些工作专门研究了软件和修复错误的提示[33]。

我们的工作是对前人工作的补充,提供了一种结构来记录、讨论和推理关于提示的使用,这可以帮助用户在解决常见问题时构建心理模型,以更有效地组织提示。

LLM(大型语言模型)产生的答案质量,特别是ChatGPT,在许多领域都得到了评估。例如,ChatGPT被用于参加医学执照考试,并取得了令人惊讶的好成绩[3]。在法学院中使用ChatGPT也已经进行了探讨[34]。其他论文还研究了它的数学推理能力[35]。随着更多领域的探索,我们预计将会开发出针对特定领域的模式目录,以分享特定领域的问题解决提示结构。

5 结束语

本文介绍了一个框架,用于记录和应用大型语言模型(如ChatGPT)的提示模式目录。这些提示模式类似于软件模式,旨在为用户在与LLM交互以执行各种任务时遇到的问题提供可重用的解决方案。该框架捕获的提示模式目录(1)提供了一种结构化讨论提示解决方案的方法,(2)识别提示中的模式,而不是关注特定的提示示例,(3)对模式进行分类,以便用户能够更高效、有效地与LLMs互动。

从我们关于提示模式的工作中得出以下经验教训:

  • 提示模式显著丰富了可以在对话式LLM中创建的功能。例如,提示可以导致生成网络安全游戏,包括一个假设的终端命令,这些命令由攻击者在.bash历史文件中运行过。正如第三节所示,通过组合提示模式,可以创建更大更复杂的功能,例如将游戏玩法和可视化生成器模式相结合。
  • 将提示模式记录为模式目录是有用的,但还不够。我们的经验表明,在这个领域可以做更多的工作,既包括精炼和扩展本文中介绍的提示模式,也包括探索使用大型语言模型的新颖方法。特别是将这里捕捉到的提示模式编织成更丰富的模式语言,将有助于更有效地指导大型语言模型的用户。
  • LLM能力将随着时间的推移而演变,可能需要对模式进行细化。随着LLM能力的变化,一些模式可能不再必要,或者被不同的交互风格、对话/会话管理方法所取代,或者需要增强以正确发挥作用。需要持续努力来记录和编目提供可重用解决方案的模式。
  • 提示模式可以应用于许多不同的领域。尽管大多数模式都在软件开发的背景下进行讨论,但这些相同的模式也适用于任意领域,从无限生成娱乐故事到教育游戏,再到探索各种主题。

我们希望这篇论文能激发该领域的进一步研究和开发,以帮助提升提示模式设计,为对话式LLM创造新的、意想不到的能力。

  • 16
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值