支持私有化部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


Google: Prompt Engineering白皮书

发布日期:2025-07-08 07:47:18 浏览次数: 1527
作者:LiveThinking

微信搜一搜,关注“LiveThinking”

推荐语

Google最新提示工程白皮书优化版,助你快速掌握AI对话核心技巧。

核心内容:
1. 提示工程基本原理与LLM工作机制解析
2. 优化提示的五大关键要素与实用技巧
3. Vertex AI平台配置与多场景应用指南

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

 



 

Google的这篇提示工程(Prompt Engineering)白皮书在网上有很多翻译版本,但是在学习时总觉得排版有问题(主要是里面的一些示例使用表格显示,转换为md时格式很难调整),于是自己整理了一份,将排版做了一些优化。

以下原文,Enjoy!


你不需要成为数据科学家或机器学习工程师——每个人都可以编写提示。

介绍

在考虑大型语言模型的输入和输出时,文本提示(有时伴随着其他模态,如图像提示)是模型用来预测特定输出的输入。你不需要成为数据科学家或机器学习工程师——每个人都可以编写提示。然而,制作最有效的提示可能很复杂。提示的许多方面都会影响其效果:你使用的模型、模型的训练数据、模型配置、你的措辞、风格和语调、结构和上下文都很重要。因此,提示工程是一个迭代的过程。不充分的提示可能导致模糊、不准确的响应,并可能妨碍模型提供有意义的输出的能力。

当你与Gemini聊天机器人聊天时,1 你基本上是在编写提示,然而本白皮书侧重于在Vertex AI中或通过使用API为Gemini模型编写提示,因为通过直接提示模型,你将可以访问诸如温度等配置。

本白皮书详细讨论了提示工程。我们将探讨各种提示技术,以帮助你入门,并分享成为提示专家的技巧和最佳实践。我们还将讨论你在制作提示时可能面临的一些挑战。

提示工程

记住LLM是如何工作的;它是一个预测引擎。模型将顺序文本作为输入,然后根据其训练数据预测下一个令牌应该是什么。LLM被操作化以一遍又一遍地执行此操作,将先前预测的令牌添加到顺序文本的末尾以预测下一个令牌。下一个令牌的预测基于先前令牌中的内容与LLM在其训练期间看到的内容之间的关系。

当你编写提示时,你正试图设置LLM以预测正确的令牌序列。提示工程是设计高质量提示的过程,以指导LLM产生准确的输出。这个过程包括修改以找到最佳提示,优化提示长度,以及评估提示的写作风格和结构与任务的关系。在自然语言处理和LLM的背景下,提示是提供给模型以生成响应或预测的输入。

这些提示可用于实现各种理解和生成任务,例如文本摘要、信息提取、问答、文本分类、语言或代码翻译、代码生成以及代码文档或推理。

请随时参阅Google的提示指南2,3,其中包含简单有效的提示示例。

在进行提示工程时,你将从选择模型开始。无论你使用Vertex AI中的Gemini语言模型、GPT、Claude还是像Gemma或LLaMA这样的开源模型,提示都可能需要针对你的特定模型进行优化。

除了提示之外,你还需要修改LLM的各种配置。

LLM 输出配置

一旦你选择了你的模型,你就需要确定模型配置。大多数LLM都带有各种控制LLM输出的配置选项。有效的提示工程需要为你的任务优化设置这些配置。

输出长度

一个重要的配置设置是响应中要生成的令牌数。生成更多的令牌需要LLM进行更多的计算,导致更高的能耗、可能更慢的响应时间和更高的成本。

减少LLM的输出长度并不会使LLM在其创建的输出中变得更具风格或文本简洁,它只是导致LLM在达到限制后停止预测更多的令牌。如果你的需求需要较短的输出长度,你可能还需要设计你的提示以适应。

输出长度限制对于某些LLM提示技术尤其重要,例如ReAct,在这种技术中,LLM会在你想要的响应之后继续发出无用的令牌。

采样控制

LLM并不会正式预测单个令牌。相反,LLM会预测下一个令牌可能是什么的概率,LLM词汇表中的每个令牌都会得到一个概率。然后对这些令牌概率进行采样,以确定下一个生成的令牌。温度、top-  和 top-P是确定如何处理预测的令牌概率以选择单个输出令牌的最常见配置设置。

温度(Temperature)

温度控制令牌选择中的随机程度。较低的温度适用于期望更确定性响应的提示,而较高的温度可能导致更多样化或意想不到的结果。温度为0(贪婪解码)是确定性的:总是选择概率最高的令牌(但请注意,如果两个令牌具有相同的最高预测概率,则根据实现平局决胜的方式,你可能不会总是在温度为0时获得相同的输出)。

接近最大值的温度往往会产生更随机的输出。随着温度越来越高,所有令牌成为下一个预测令牌的可能性变得均等。

Gemini的温度控制可以以类似于机器学习中使用的softmax函数的方式来理解。低温设置反映了低的softmax温度(T),强调具有高确定性的单个首选温度。较高的Gemini温度设置就像一个高的softmax温度,使得所选设置周围更广泛的温度范围变得更可接受。这种增加的不确定性适应了刚性、精确的温度可能不是必需的场景,例如在试验创意输出时。

Top-K 和 Top-P

Top-K和Top-P(也称为核采样)【4】是LLM中使用的两种采样设置,用于将预测的下一个令牌限制为来自具有最高预测概率的令牌。与温度一样,这些采样设置控制生成文本的随机性和多样性。

• Top-K采样从模型的预测分布中选择前K个最可能的令牌。Top-K越高,模型的输出就越有创意和多样化;top-K越低,模型的输出就越受限制和真实。Top-K为1等同于贪婪解码。
• Top-P采样选择累积概率不超过某个值(P)的顶部令牌。P的值范围从0(贪婪解码)到1(LLM词汇表中的所有令牌)。

在Top-K和Top-P之间进行选择的最佳方法是试验这两种方法(或两者一起),看看哪一种能产生你想要的结果。

另一个重要的配置设置是响应中要生成的令牌数。请注意,生成更多的令牌需要LLM进行更多的计算,从而导致更高的能耗和可能更慢的响应时间,从而导致更高的成本。

综合应用

在Top-K、Top-P、温度和要生成的令牌数之间进行选择,取决于具体的应用和期望的结果,并且这些设置都会相互影响。确保你了解所选模型如何将不同的采样设置组合在一起也很重要。

如果温度、Top-K和Top-P都可用(如在Vertex Studio中),则同时满足Top-K和Top-P标准的令牌是下一个预测令牌的候选者,然后应用温度从通过Top-K和Top-P标准的令牌中进行采样。如果只有Top-K或Top-P可用,则行为相同,但只使用一个Top-K或P设置。

如果温度不可用,则从满足Top-K和/或Top-P标准的令牌中随机选择,以产生单个下一个预测令牌。

在一个采样配置值的极端设置下,该采样设置要么抵消其他配置设置,要么变得无关紧要。

• 如果将温度设置为0,Top-K和Top-P将变得无关紧要——最可能的令牌将成为下一个预测的令牌。如果将温度设置得非常高(高于1——通常在10s内),温度将变得无关紧要,任何通过Top-K和/或Top-P标准的令牌都将被随机抽样以选择下一个预测令牌。

• 如果将Top-K设置为1,温度和Top-P将变得无关紧要。只有一个令牌通过Top-K标准,该令牌就是下一个预测的令牌。如果将Top-K设置得非常高,例如LLM词汇表的大小,任何具有非零概率成为下一个令牌的令牌都将满足top-K标准,并且没有令牌被筛选掉。
• 如果将Top-P设置为0(或一个非常小的值),大多数LLM采样实现将只考虑最可能的令牌来满足Top-P标准,从而使温度和Top-K变得无关紧要。如果将Top-P设置为1,任何具有非零概率成为下一个令牌的令牌都将满足Top-P标准,并且没有令牌被筛选掉。

作为一般的起点,温度为0.2,Top-P为0.95,Top-K为30将为你提供相对连贯的结果,这些结果可以具有创造性但又不会过分。如果你想要特别有创意的结果,请尝试从温度为0.9,Top-P为0.99和Top-K为40开始。如果你想要创造性较低的结果,请尝试从温度为0.1,Top-P为0.9和Top-K为20开始。最后,如果你的任务总是只有一个正确答案(例如,回答一个数学问题),请从温度为0开始。

注意:随着自由度的增加(更高的温度、Top-K、Top-P和输出令牌),LLM可能会生成相关性较低的文本。

提示技术

LLM经过调整以遵循指令,并在大量数据上进行训练,因此它们可以理解提示并生成答案。但LLM并非完美无缺;你的提示文本越清晰,LLM就越能预测下一个可能的文本。此外,利用LLM训练方式和工作原理的特定技术将帮助你从LLM中获得相关结果。

现在我们了解了什么是提示工程以及它需要什么,让我们深入研究一些最重要的提示技术的例子。

通用提示/零样本(Zero Shot)

零样本提示是最简单的提示类型。它只提供任务的描述和一些供LLM开始的文本。这个输入可以是任何东西:一个问题、一个故事的开头或指令。零样本这个名字代表"没有例子"。

让我们使用Vertex AI中的Vertex AI Studio(用于语言),它提供了一个测试提示的游乐场。在表1中,你将看到一个用于分类电影评论的零样本提示示例。

下面使用的表格格式(译注:为了显示清晰起见,原文中所有的表格都换成了列表的方式)是记录提示的好方法。你的提示在最终进入代码库之前可能会经历多次迭代,因此以一种有纪律、结构化的方式跟踪你的提示工程工作非常重要。关于此表格格式、跟踪提示工程工作的重要性以及提示开发过程的更多信息,请参阅本章后面的"最佳实践"部分("记录各种提示尝试")。

模型温度应设置为较低的数字,因为不需要创造力,并且我们使用gemini-pro默认的top-K和top-P值,这有效地禁用了这两个设置(请参阅上面的"LLM输出配置")。注意生成的输出。"disturbing"和"masterpiece"这两个词应该会使预测变得更复杂一些,因为这两个词用在同一个句子中。

表1. 零样本提示示例

  • • 名称: 11 电影分类
  • • 目标: 将电影评论分类为正面、中性或负面。
  • • 模型: gemini-pro
  • • 参数: 温度:0.1 令牌限制:5 Top-K:不适用 Top-P:1
  • • 提示:
    将电影评论分类为正面、中性或负面。
    评论:"Her"是一部令人不安的研究,揭示了如果允许人工智能不受限制地继续发展,人类将走向何方。我希望有更多像这部杰作一样的电影。

    情绪:
  • • 输出: 正面

当零样本不起作用时,你可以在提示中提供演示或示例,这导致了"单样本"和"少样本"提示。通用提示/零样本

单样本(One Shot)和少样本(Few Shot)

在为AI模型创建提示时,提供示例是很有帮助的。这些示例可以帮助模型理解你的要求。当你希望引导模型遵循特定的输出结构或模式时,示例尤其有用。

单样本提示提供单个示例,因此得名单样本。其思想是模型有一个可以模仿的示例,以最好地完成任务。

少样本提示【7】为模型提供多个示例。这种方法向模型展示了它需要遵循的模式。其思想类似于单样本,但多个所需模式的示例增加了模型遵循该模式的机会。

少样本提示所需的示例数量取决于一些因素,包括任务的复杂性、示例的质量以及你正在使用的生成式AI(gen AI)模型的能力。根据经验,你应该至少使用三到五个示例进行少样本提示。但是,对于更复杂的任务,你可能需要使用更多示例,或者由于模型的输入长度限制,你可能需要使用更少的示例。

表2显示了一个少样本提示示例,让我们使用与之前相同的gemini-pro模型配置设置,只是增加了令牌限制以适应更长的响应需求。

表2. 少样本提示示例

  • • 目标: 将披萨订单解析为JSON
  • • 模型: gemini-pro
  • • 参数: 温度:0.1 令牌限制:250 Top-K:不适用 Top-P:1
  • • 提示:
    将客户的披萨订单解析为有效的JSON:
    示例:
    我想要一个小号披萨,配有奶酪、番茄酱和意大利辣香肠。

    JSON响应:

    ```
    {
    "size": "small",
    "type": "normal",
    "ingredients": [["cheese", "tomato sauce", "peperoni"]]
    }
    ```

    示例:
    我能要一个大号披萨,配有番茄酱、罗勒和马苏里拉奶酪吗

    ```
    {
    "size": "large",
    "type": "normal",
    "ingredients": [["tomato sauce", "bazel", "mozzarella"]]
    }
    ```

    现在,我想要一个大号披萨,一半是奶酪和
    马苏里拉奶酪。另一半是番茄酱、火腿和菠萝。

    JSON响应:
  • • 输出:
    {
      "size": "large",
      "type": "half-half",
      "ingredients": [["cheese", "mozzarella"], ["tomato sauce", "ham", "pineapple"]]
    }

当你为提示选择示例时,请使用与你要执行的任务相关的示例。示例应多样化、高质量且编写良好。一个小错误可能会使模型混淆,并导致不希望的输出。

如果你试图生成对各种输入都具有鲁棒性的输出,那么在示例中包含边缘案例非常重要。边缘案例是异常或意外的输入,但模型仍应能够处理。

系统、上下文(Contextual)和角色(Role)提示

系统、上下文和角色提示都是用于指导LLM如何生成文本的技术,但它们侧重于不同的方面:

  • • 系统提示 为语言模型设定了总体上下文和目的。它定义了模型应该做什么的"大局",比如翻译语言、分类评论等。
  • • 上下文提示 提供与当前对话或任务相关的特定细节或背景信息。它帮助模型理解所提问题的细微差别,并相应地调整响应。
  • • 角色提示 为语言模型分配一个特定的角色或身份供其采用。这有助于模型生成与所分配角色及其相关知识和行为一致的响应。

系统、上下文和角色提示之间可能有相当大的重叠。例如,一个为系统分配角色的提示,也可以有上下文。

然而,每种类型的提示都有一个稍微不同的主要目的:

• 系统提示:定义模型的基本能力和总体目的。
• 上下文提示:提供即时的、特定于任务的信息来指导响应。它高度特定于当前任务或输入,这是动态的。
• 角色提示:构建模型的输出风格和声音。它增加了一层特殊性和个性。

区分系统、上下文和角色提示为设计具有明确意图的提示提供了一个框架,允许灵活组合,并使其更容易分析每种提示类型如何影响语言模型的输出。

让我们深入了解这三种不同类型的提示。

系统提示(System Prompt)

表3包含一个系统提示,其中我指定了关于如何返回输出的附加信息。我提高了温度以获得更高的创造力水平,并指定了更高的令牌限制。然而,由于我关于如何返回输出的明确指示,模型没有返回额外的文本。

表3. 系统提示示例

  • • 目标: 将电影评论分类为正面、中性或负面。
  • • 模型: gemini-pro
  • • 参数: 温度:1 令牌限制:5 Top-K:40 Top-P:0.8
  • • 提示:
    将电影评论分类为正面、中性或负面。只返回大写标签。
    评论:"Her"是一部令人不安的研究,揭示了如果允许人工智能不受限制地继续发展,人类将走向何方。它太令人不安了,我看不下去。
    情绪:
  • • 输出: 负面

系统提示对于生成满足特定要求的输出非常有用。"系统提示"这个名字实际上代表"为系统提供一个额外的任务"。例如,你可以使用系统提示来生成与特定编程语言兼容的代码片段,或者你可以使用系统提示来返回某种结构。看看表4,我在其中以JSON格式返回输出。

表4. 带JSON格式的系统提示示例

  • • 目标: 将电影评论分类为正面、中性或负面,返回JSON。
  • • 模型: gemini-pro
  • • 参数: 温度:1 令牌限制:1024 Top-K:40 Top-P:0.8
  • • 提示:
    将电影评论分类为正面、中性或负面。返回有效的JSON:

    评论:"Her"是一部令人不安的研究,揭示了如果允许人工智能不受限制地继续发展,人类将走向何方。它太令人不安了,我看不下去。

    模式:
    ```
    MOVIE:
    {
        "sentiment": String "POSITIVE"| "NEGATIVE"丨"NEUTRAL",
        "name": String
    }
    MOVIE REVIEWS:
    {
        "movie_reviews":[MOVIE]
    }
    ```
    JSON响应:
  • • 输出:
    {
        "movie_reviews":[
            {
                "sentiment":"NEGATIVE",
                "name":"Her"
            }
        ]
    }

从提取数据的提示中返回JSON对象有一些好处。在实际应用中,我不需要手动创建这种JSON格式,我已经可以按排序顺序返回数据(在处理日期时间对象时非常方便),但最重要的是,通过提示JSON格式,它迫使模型创建一个结构并限制幻觉。

系统提示对于安全性和毒性也非常有用。要控制输出,只需在提示中添加一行,例如:"你的回答应该尊重他人。"。

角色提示(Role Prompt)

角色提示是提示工程中的一种技术,它涉及到为生成式AI模型分配一个特定的角色。这可以帮助模型生成更相关和信息更丰富的输出,因为模型可以根据分配给它的特定角色来制作响应。

例如,你可以将一个生成式AI模型角色提示为书籍编辑、幼儿园老师或励志演说家。一旦模型被分配了一个角色,你就可以给它特定于该角色的提示。例如,你可以提示一位老师创建一个他们可以复习的教案。看看表5,其中模型扮演了旅行向导的角色。

表5. 角色提示示例

  • • 目标: 扮演旅行向导并提供3个旅行建议
  • • 模型: gemini-pro
  • • 参数: 温度:1 令牌限制:1024 Top-K:40 Top-P:0.8
  • • 提示:
    我希望你扮演一个旅行向导。我会写信告诉你我的位置,你会建议我附近3个值得参观的地方。在某些情况下,我还会告诉你我将参观的地方类型。

    我的建议:"我在阿姆斯特丹,我只想参观博物馆。"

    旅行建议:
  • • 输出:
    1. 荷兰国家博物馆:世界著名的博物馆,以伦勃朗的《夜巡》等荷兰杰作而闻名。不要错过展示荷兰艺术和历史的令人难以置信的绘画和手工艺品收藏。
    2. 梵高博物馆:沉浸在文森特·梵高迷人的作品中。该博物馆收藏了他最大量的绘画和素描作品,包括《星夜》和《向日葵》。
    3. 阿姆斯特丹市立博物馆:发现来自世界各地的现代和当代艺术。该博物馆的藏品包括毕加索、康定斯基和里特维尔德的作品,坐落在一座引人注目的现代建筑中。

为AI模型定义角色视角,可以为其提供你所寻求的语调、风格和专业知识的蓝图,以提高输出的质量、相关性和有效性。

以下是一些我发现有效的风格,你可以从中选择:

对抗性、描述性、直接、正式、幽默、有影响力、非正式、鼓舞人心、有说服力

让我们更改表6中的提示,以包含幽默和鼓舞人心的风格。

表6. 带有幽默语气和风格的角色提示示例

  • • 提示:
    我希望你扮演一个旅行向导。我会写信告诉你我的位置,你会用幽默的风格建议我附近3个值得参观的地方。

    我的建议:"我在曼哈顿。"

    旅行建议:
  • • 输出:
    1. 看那帝国大厦的心境:登上帝国大厦令人眩晕的高度,沐浴在曼哈顿天际线的荣耀之中。准备好感觉自己就像金刚站在大苹果的顶端,只是没有那根巨猿大小的香蕉。
    2. 在MoMA变得艺术气息十足:在现代艺术博物馆(MoMA)释放你内心的艺术爱好者。凝视那些会让你大开眼界的杰作,让你怀疑自己的简笔画是否具有任何艺术价值。
    3. 在第五大道上尽情购物:在标志性的第五大道上尽情享受购物疗法。当你在这家会让你的钱包哭泣的设计师精品店橱窗购物(或实际购物)时,请为标价带来的震撼做好准备。但是,嘿,你在曼哈顿,所以你最好还是拥抱这种美妙!

上下文提示(Contextual prompt)

通过提供上下文提示,你可以帮助确保你的AI交互尽可能无缝和高效。模型将能够更快地理解你的请求,并能够生成更准确和相关的响应,正如你在表7的示例中看到的那样。

表7. 上下文提示示例

  • • 目标: 为关于复古游戏的博客建议文章
  • • 模型: gemini-pro
  • • 参数: 温度:1 令牌限制:1024 Top-K:40 Top-P:0.8
  • • 提示:
    上下文:你正在为一个关于80年代复古街机视频游戏的博客写作。

    建议3个主题来写一篇文章,并附上几行关于这篇文章应该包含内容的描述。
  • • 输出:
    1. **街机柜设计的演变:**
       本文将探讨街机柜设计的演变,从1970年代早期的木质和金属柜到1980年代及以后的时尚、霓虹灯设计。

    2. **来自过去的冲击:80年代的标志性街机游戏:**
       本文将介绍1980年代一些最具标志性和影响力的街机游戏的历史、影响和遗产,突出其创新、流行机制和持久魅力。

    3. **像素艺术的兴起和复古复兴:**
       本文将深入探讨像素艺术作为早期街机游戏定义性视觉风格的演变,追溯其根源,探索其技术,并讨论像素艺术在现代游戏和数字艺术中的复兴。

回退提示(Step-back prompting)

回退提示【8】是一种提高性能的技术,它通过提示LLM首先考虑一个与手头具体任务相关的一般性问题,然后将该一般性问题的答案输入到后续针对具体任务的提示中。这种"回退"允许LLM在尝试解决具体问题之前激活相关的背景知识和推理过程。

通过考虑更广泛和根本的原则,LLM可以生成更准确、更有见地的响应。回退提示鼓励LLM进行批判性思考,并以新的、创造性的方式应用其知识。它通过利用LLM参数中比直接提示LLM时更多的知识来改变执行任务的最终提示。

通过关注一般原则而非具体细节,回退提示有助于减轻LLM响应中的偏见。

让我们看一些例子,以了解回退提示如何改善结果。在与回退提示(表9)进行比较之前,让我们首先回顾一个传统的提示(表8):

表8. 与回退提示比较之前的传统提示

  • • 目标: 为第一人称射击视频游戏的一个关卡编写故事情节。
  • • 模型: gemini-pro
  • • 参数: 温度:1 令牌限制:1024 Top-K:40 Top-P:0.8
  • • 提示:
    为一个具有挑战性和吸引力的新第一人称射击视频游戏关卡编写一段故事情节。
  • • 输出:
    关卡开始时,玩家的小队在一个密集的城市区域遭到一个无情敌方派系的伏击。玩家必须在迷宫般的后巷和破旧建筑中杀出一条血路,利用潜行和精确度消灭敌方势力并避免被发现。玩家必须利用环境优势,设置陷阱,利用掩体,并采取精心计算的行动才能生存。一路上,他们发现情报表明敌人正在策划一次毁灭性的攻击,玩家必须争分-秒地收集证据,并在敌人实施计划前将其传回总部。

当你将温度设置为1时,你可能会得到各种富有创意的故事情节,但它也相当随机和笼统。所以让我们退一步:

表9. 回退提示示例

  • • 提示:
    根据流行的第一人称射击动作游戏,哪5个虚构的关键设置为第一人称射击视频游戏中具有挑战性和吸引力的关卡故事情节做出了贡献?
  • • 输出:
    1. **废弃的军事基地**:一个庞大的、后末日时代的军事综合体,到处都是变异的士兵和流氓机器人,非常适合具有挑战性的枪战。
    2. **赛博朋克城市**:一个霓虹灯闪烁的未来主义城市环境,有高耸的摩天大楼和密集的胡同,以半机械增强的敌人和黑客机制为特色。
    3. **外星飞船**:一艘搁浅在地球上的巨大外星飞船,有诡异的走廊、零重力区域和需要遭遇的外星生物。
    4. **僵尸出没的小镇**:一个被成群结队的侵略性僵尸占领的荒凉小镇,以激烈的近距离战斗和解谜以寻找安全通道为特色。
    5. **水下研究设施**:一个被水淹没的深海实验室,里面充满了变异的水生生物,需要潜行和水下探索技能才能生存。

是的,这些主题似乎很适合第一人称视频游戏。让我们回到最初的提示,但这次我们将回退的答案作为上下文包含进来,看看它会返回什么。

表10. 回退提示示例

  • • 提示:
    上下文:第一人称射击视频游戏的5个引人入胜的主题:

    1. **废弃的军事基地**:一个庞大的、后末日时代的军事综合体,到处都是变异的士兵和流氓机器人,非常适合具有挑战性的枪战。
    2. **赛博朋克城市**:一个霓虹灯闪烁的未来主义城市环境,有高耸的摩天大楼和密集的胡同,以半机械增强的敌人和黑客机制为特色。
    3. **外星飞船**:一艘搁浅在地球上的巨大外星飞船,有诡异的走廊、零重力区域和需要遭遇的外星生物。
    4. **僵尸出没的小镇**:一个被成群结队的侵略性僵尸占领的荒凉小镇,以激烈的近距离战斗和解谜以寻找安全通道为特色。
    5. **水下研究设施**:一个被水淹没的深海实验室,里面充满了变异的水生生物,需要潜行和水下探索技能才能生存。

    选择其中一个主题,为一个具有挑战性和吸引力的
    新第一人称射击视频游戏关卡编写一段故事情节。
  • • 输出:
    在浑浊的深渊中心,坐落着一座破旧的水下研究设施,
    它是人类雄心及其灾难性后果的见证。
    笼罩在黑暗中,脉动着故障机械的嗡嗡声,并被溺死灵魂的回声所困扰,该设施现在是深海噩梦的滋生地。玩家是一名精英海军陆战队员,配备了先进的潜水装备和实验性武器,任务是冒险进入这个恐怖的水生领域。凭借韧性和足智多谋,他们必须在危险的走廊中航行,解决神秘的谜题,并与潜伏在深处的的可怕海洋怪物对抗。从应对深海的巨大压力到智取狡猾的水生捕食者,在这个未知的地下世界中的每一刻都在考验着人类耐力和勇气的极限。

那看起来像一个有趣的视频游戏!通过使用回退提示技术,你可以提高提示的准确性。

思维链 (CoT)

思维链(CoT)提示是一种通过生成中间推理步骤来提高LLM推理能力的技术。这有助于LLM生成更准确的答案。你可以将其与少样本提示相结合,以在需要响应前进行推理的更复杂任务上获得更好的结果,因为这对于零样本思维链来说是一个挑战。

CoT有很多优点。首先,它省力高效,并且与现成的LLM配合得很好(因此无需微调)。通过CoT提示,你还可以获得可解释性,因为你可以从LLM的响应中学习并查看其遵循的推理步骤。如果出现故障,你将能够识别它。思维链似乎在不同LLM版本之间移动时提高了鲁棒性。这意味着你的提示性能在不同LLM之间的漂移应该比不使用推理链的提示要小。当然也有缺点,但它们有些直观。

LLM响应包括思维链推理,这意味着更多的输出令牌,这意味着预测成本更高,耗时更长。

为了解释表11中的以下示例,让我们首先尝试创建一个不使用CoT提示的提示,以展示大型语言模型的缺陷。

表11. 一个试图解决数学问题的提示示例

  • • 提示:
    我3岁时,我的伙伴是我年龄的3倍。现在,我20岁了。我的伙伴多大了?
  • • 输出:
    63岁

哎呀。这显然是错误的答案。事实上,LLM经常在数学任务上遇到困难,并且可能提供不正确的答案——即使是像两个数相乘这样简单的任务。这是因为它们是在大量文本上训练的,而数学可能需要不同的方法。所以让我们看看中间推理步骤是否会改善输出。

表12. 思维链提示示例

  • • 提示:
    我3岁时,我的伙伴是我年龄的3倍。现在,我20岁了。我的伙伴多大了?让我们一步一步地想。
  • • 输出:
    1. 假设我现在的年龄是"x"岁
    2. 当我3岁时,我的年龄是3岁。
    3. 当时我伙伴的年龄是我的3倍,也就是说我伙伴的年龄是3*3=9岁。
    4. 现在,我20岁了,也就是说从我3岁起,我的年龄增加了20-3=17岁。
    5. 因为我3岁时伙伴9岁,而我的年龄增加了17岁,所以我伙伴的年龄也一定增加了17岁。
    6. 因此,我伙伴现在的年龄是9+17=26岁。

    所以,我的伙伴26岁。

好了,现在最终答案是正确的。这是因为我们明确指示LLM解释每一步,而不仅仅是返回一个答案。有趣的是,模型将增加的17年加了起来。在我的脑海里,我会计算我和我伴侣之间的年龄差,然后把它们加起来。(20 + (9 - 3))。让我们帮助模型更像我一样思考。

表12是"零样本"思维链的一个例子。当与单样本或少样本结合使用时,思维链提示可能非常强大,正如你在表13中看到的那样:

表13. 带单样本的思维链提示示例

  • • 提示:
    问:我弟弟2岁时,我是他年龄的两倍。现在我40岁了。我弟弟多大了?让我们一步一步地想。
    答:我弟弟2岁时,我是2 * 2 = 4岁。年龄差是2岁,我比他大。现在我40岁了,所以我哥哥是40 - 2 = 38岁。答案是38。
    问:我3岁时,我的伙伴是我年龄的3倍。现在,我20岁了。我的伙伴多大了?让我们一步一步地想。
    答:
  • • 输出:
    我3岁时,我的伴侣是3 * 3 = 9岁。年龄差是6岁,我的伴侣比我大。现在我20岁了,所以我的伴侣是20 + 6 = 26岁。答案是26。

思维链可用于各种用例。想一想代码生成,将请求分解为几个步骤,并将这些步骤映射到特定的代码行。或者,当你有一些种子(如"产品名为XYZ,根据给定的产品标题编写一个描述,引导模型完成你会做出的假设")时,用于创建合成数据。通常,任何可以通过"说出来"解决的任务都是思维链的好候选者。如果你能解释解决问题的步骤,请尝试思维链。

请参阅GoogleCloudPlatform Github存储库中托管的笔记本【10】,该笔记本将更详细地介绍CoT提示:

在本章的最佳实践部分,我们将学习一些特定于思维链提示的最佳实践。

自洽性(Self-consistency)

虽然大型语言模型在各种NLP任务中取得了令人瞩目的成就,但它们的推理能力通常被视为一个仅通过增加模型大小无法克服的局限性。正如我们在前面的思维链提示部分所学到的,可以提示模型像人类解决问题一样生成推理步骤。然而,CoT使用简单的"贪婪解码"策略,限制了其有效性。自洽性【11】结合了采样和多数投票,以生成多样化的推理路径并选择最一致的答案。它提高了LLM生成的响应的准确性和连贯性

自洽性给出了答案正确的伪概率可能性,但显然成本很高。

它遵循以下步骤

  1. 1. 生成多样化的推理路径:多次向LLM提供相同的提示。高温度设置鼓励模型生成不同的推理路径和对问题的看法。
  2. 2. 从每个生成的响应中提取答案。
  3. 3. 选择最常见的答案。

让我们看一个电子邮件分类系统的例子,它将电子邮件分类为"重要"或"不重要"。一个零样本思维链提示将被多次发送给LLM,以查看每次提交后响应是否不同。注意电子邮件中使用的友好语气、措辞和讽刺。所有这些都可能欺骗LLM。

表14. 自洽性提示示例

  • • 提示:
    电子邮件:
    ```
    嗨,
    我看到你的网站使用了Wordpress。一个很棒的开源内容管理系统。我过去也用过它。它有很多很棒的用户插件。而且设置起来也很容易。

    我确实注意到联系表单中有一个错误,当你选择姓名字段时会发生。请参阅我输入姓名字段文本的附加屏幕截图。注意我调用的JavaScript警报框。

    但其余部分它是一个很棒的网站。我喜欢阅读它。请随意将错误留在网站上,因为它给了我更多有趣的东西来阅读。

    祝好,
    黑客哈里。
    ```

    将以上电子邮件分类为"重要"或"不重要"。让我们一步一步地思考并解释为什么。
  • • 输出尝试 1:
    **步骤1:确定电子邮件的目的。**
    电子邮件的目的是通知收件人其网站联系表单中的一个错误。发件人还提到他们喜欢阅读该网站,并且他们暂时将错误留在原处。

    **步骤2:评估错误的潜在影响。**
    联系表单中的错误可能允许攻击者在网站上执行任意
    JavaScript代码。这可能导致攻击者能够控制网站、窃取敏感信息或污损网站。

    **步骤3:考虑发件人的可信度。**
    电子邮件的发件人自称是名为哈里的黑客。但是,无法验证发件人的身份。发件人可能是试图帮助收件人的合法黑客,但也可能是试图诱骗收件人点击恶意链接或下载恶意文件的恶意行为者。

    **结论:重要**
    根据错误的潜在影响和发件人的可信度,该电子邮件应分类为**重要**。收件人应立即采取行动修复错误并保护其网站免受攻击。
  • • 输出尝试 2:
    **解释:**

    1. **缺乏紧迫性:** 电子邮件没有传达任何紧迫感或时间敏感性。它以随意的问候开始,并以就事论事的口吻呈现信息。
    2. **非关键性错误报告:** 联系表单中报告的错误被描述为有趣但非关键。电子邮件发件人甚至建议网站所有者可以保留该错误。
    3. **缺乏个人影响:** 电子邮件没有表明对网站所有者有任何直接或个人影响。它只是提到发件人喜欢阅读该网站。
    4. **没有行动请求:** 电子邮件没有明确要求网站所有者采取任何行动。它没有要求修复错误或提供任何具体的改进建议。
    5. **发件人的意图:** 发件人的意图似乎更侧重于分享观察结果和表达对网站的兴趣,而不是提出严重关切或请求帮助。

    **结论:不重要**
  • • 输出尝试 3:
    **步骤1:确定电子邮件的目的。**
    电子邮件的目的是通知收件人其网站联系表单中的一个错误。发件人还提到他们喜欢阅读该网站,并且他们暂时将错误留在原处。

    **步骤2:评估错误的潜在影响。**
    联系表单中的错误可能允许攻击者在网站上执行任意
    JavaScript代码。这可能导致攻击者能够控制网站、窃取敏感信息或污损网站。

    **步骤3:考虑发件人的可信度。**
    电子邮件的发件人自称是名为哈里的黑客。但是,无法验证发件人的身份。发件人可能是试图帮助收件人的合法黑客,但也可能是试图利用该错误为自己谋利的恶意行为者。

    **结论:**
    根据以上因素,该电子邮件应分类为**重要**。
    联系表单中的错误是一个严重的安全风险,并且发件人的可信度未知。收件人应立即采取行动修复错误并...

你可以使用以上提示,并尝试查看它是否返回一致的分类。根据你使用的模型和温度配置,它可能会返回"重要"或"不重要"。

通过生成许多思维链,并采纳最常出现的答案("重要"),我们可以从LLM中获得更一致的正确答案。

这个例子说明了如何使用自洽性提示来通过考虑多个角度并选择最一致的答案来提高LLM响应的准确性。

思维树 (ToT)

既然我们已经熟悉了思维链和自洽性提示,那么让我们来回顾一下思维树(ToT)【12】。它概括了CoT提示的概念,因为它允许LLM同时探索多个不同的推理路径,而不仅仅是遵循单一的线性思维链。这在图1中有描述。

图1. 左侧为思维链提示与右侧思维树提示的可视化对比

这种方法使得ToT特别适合需要探索的复杂任务。它的工作原理是维护一个思想树,其中每个思想代表一个连贯的语言序列,作为解决问题的中间步骤。然后,模型可以通过从树中的不同节点分支出来探索不同的推理路径。

有一个很棒的notebook,它更详细地展示了基于论文"大型语言模型引导的思维树"【9】的思维树(ToT)。

ReAct(推理与行动)

推理与行动(ReAct)【13】提示是一种使LLM能够使用自然语言推理结合外部工具(搜索、代码解释器等)解决复杂任务的范式,允许LLM执行某些操作,例如与外部API交互以检索信息,这是迈向代理建模的第一步

ReAct模仿了人类在现实世界中的运作方式,因为我们会口头推理并可以采取行动来获取信息。ReAct在各种领域都优于其他提示工程方法。

ReAct提示通过将推理和行动结合到一个思想-行动循环中来工作。LLM首先对问题进行推理并生成一个行动计划。然后它执行计划中的行动并观察结果。LLM接着使用观察结果来更新其推理并生成一个新的行动计划。这个过程一直持续到LLM找到问题的解决方案。

要看到这一点,你需要编写一些代码。在代码片段1中,我正在使用Python的langchain框架,以及VertexAI(google-cloud-aiplatform)和google-search-results pip包。

要运行此示例,你必须从 https://serpapi.com/manageapi-key 创建一个(免费的)SerpAPI密钥,并设置一个环境变量SERPAPI_API_KEY

接下来让我们编写一些Python代码,任务是让LLM找出:一个著名乐队Metallica的成员有多少个孩子。


from langchain.Agents import load_tools 
from langchain.agents import initialize_agent 
from langchain.agents import AgentType 
from langchain.llms import VertexAI

prompt = "How many kids do the band members of Metallica have?"

llm = VertexAI(temperature=0.7)
tools = load_tools(["serpapi"], llm=llm)

agent = initialize_agent(tools, llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent.run(prompt)

代码片段1. 使用LangChain和VertexAI创建ReAct代理

代码片段2显示了结果。请注意,ReAct进行了五次搜索。事实上,LLM正在抓取Google搜索结果以找出乐队名称。然后,它将结果列为观察结果,并链接思想以进行下一次搜索。


> Entering new AgentExecutor chain..   
Metallica has 4 members.   
Action: Search   
Action Input: How many kids does James Hetfield have?   
Observation: three children   
Thought: 1/4 Metallica band members have 3 children   
Action: Search   
Action Input: How many kids does Lars Ulrich have?   
Observation: 3   
Thought: 2/4 Metallica band members have 6 children   
Action: Search   
Action Input: How many kids does Kirk Hammett have?   
Observation: Hammett has been married to his second wife Lani since 1998. They have two sons, Angel (b. September 29, 2006) and Vincenzo (b. June 28, 2008).   
Thought: 3/4 Metallica band members have 8 children   
Action: Search   
Action Input: How many kids does Robert Trujillo have?   
Observation: 2   
Thought: 4/4 Metallica band members have 10 children   
Final Answer: 10

代码片段2计算出Metallica乐队有四名成员。然后它搜索每个乐队成员以请求孩子总数并加总。最后,它返回孩子总数作为最终答案。

在实践中,ReAct提示需要理解你必须持续重新发送先前的提示/响应(并修剪生成的额外内容),并为模型设置适当的示例/指令。请参阅托管在GoogleCloudPlatform Github存储库中的notebook【14】,其中更详细地展示了LLM的实际输入和输出,并提供了一个更复杂的示例。

自动提示工程(Automatic Prompt Engineering)

此时你可能会意识到编写一个提示可能很复杂。如果能将这个过程自动化(编写一个提示来编写提示)就好了。嗯,有一种方法:自动提示工程(APE)。这种方法不仅减轻了人工输入的需求,还提高了模型在各种任务中的性能。

你将提示一个模型生成更多的提示。评估它们,可能会修改好的提示。然后重复。

例如,你可以使用自动提示工程来帮助为一个商品T恤网店训练一个聊天机器人。我们想找出顾客可能用来订购乐队商品T恤的所有不同方式。

  1. 1. 编写将生成输出变体的提示。在这个例子中,我使用gemini-pro生成10条指令。见表15:

    表15. 使用LLM生成提示

  • • 提示:
    我们有一个乐队商品T恤网店,为了训练一个聊天机器人,我们需要各种订购方式:"一件S号的Metallica T恤"。生成10个变体,语义相同但保持原意。
  • • 输出:
    1. 我想购买一件S号的Metallica T恤。
    2. 我可以订购一件S号的Metallica T恤吗?
    3. 我想买一件S号的Metallica T恤。
    4. 一件S号的Metallica T恤,谢谢。
    5. 我要一件S号的Metallica T恤。
    6. 我想下一张订单,要一件S号的Metallica T恤。
    7. S号Metallica T恤,一件,谢谢。
    8. 我在找一件S号的Metallica T恤。
    9. 你能给我拿一件S号的Metallica T恤吗?
    10. 一件S号的Metallica T恤,谢谢。
  • 2. 通过根据选定的指标对候选指令进行评分来评估所有候选指令,例如,你可以使用BLEU(双语评估研究)或ROUGE(面向召回的要点评估研究)。
  • 3. 选择评估分数最高的候选指令。该候选指令将成为你可以在你的软件应用程序或聊天机器人中使用的最终提示。你也可以调整所选提示并再次评估。
  • 代码提示(Code prompting)

    Gemini主要关注基于文本的提示,这也包括编写返回代码的提示。让我们进入Vertex AI Studio并测试这些提示,看看一些编码示例。

    编写代码的提示

    Gemini也可以成为一名开发人员,并帮助你用任何选择的编程语言编写代码。作为一名开发人员,这可以帮助你加快编写代码的过程。

    想象一下,你的机器上有一个包含数百个文件的文件夹,需要重命名。重命名每个文件会花费你大量时间。你懂一点Bash,可以编写一个脚本来自动化这个过程,但这也可能需要一些时间。所以让我们写一个提示。你可以在公共消费者聊天机器人Gemini中编写提示,或者如果你更关心机密性,你可以在你的Google Cloud账户中编写这些提示并打开Vertex AI Studio。Vertex AI Studio的优势在于你可以配置温度等。

    表16. 使用Gemini编写代码

    • • 名称: 1_bash_rename_files_in_folder
    • • 目标: 编写一个提示,用Bash编写代码来重命名文件夹中的文件。
    • • 模型: gemini-pro
    • • 参数: 温度-0.1 令牌限制:1024 Top-K:不适用 Top-P:1
    • • 提示:
      用Bash编写一个代码片段,要求输入文件夹名称。然后它获取该文件夹的内容,并通过在文件名前加上draft来重命名所有文件。
    • • 输出:
      #!/bin/bash

      # Ask for the folder name
      echo"Enter the folder name:"
      read folder_name

      # Check if the folder exists
      if [! -d "$folder_name" ]; then
      echo"Folder does not exist."
      exit 1
      fi

      # Get the list of files in the folder
      files=( "$folder_name"/* )

      # Rename each file by prepending "draft" to the file name 
      for file in"${files[@]}"do
      new_file_name="draft_$(basename "$file")"
      mv"$file""$new_file_name"
      done

      echo "Files renamed successfully."

    这对我来说似乎是很好的代码 - 它甚至有文档记录!但是,由于LLM无法推理,并且会重复训练数据,因此首先阅读和测试您的代码至关重要。

    我们都在等待的时刻,它真的有效吗?

    让我们先用一个只有几个文件的测试文件夹来试试,这些文件需要从filename.txt重命名为draft_filename.txt。

    1. 1. 从表16中复制输出(不带 ```bash ``` 文本包装器),并将其粘贴到一个名为"rename_files.sh"的新文件中。
    2. 2. 打开一个终端窗口并输入:. rename_files.sh。它会要求输入一个文件夹名称,例如test。然后按Enter。
    3. 3. 该脚本似乎运行良好。您将看到消息:文件已成功重命名。当您查看测试文件夹时,会发现所有文件都已完美地重命名为draft_filename.txt

    它成功了!

    解释代码的提示

    作为一名开发人员,当你在团队中工作时,你必须阅读别人的代码。Gemini也可以在这方面帮助你。让我们从表16中获取代码输出,删除注释,并要求大型语言模型解释发生了什么,见表17:

    表17. 使用Gemini解释代码

    • • 名称: 1_bash_explain_the_code
    • • 目标: 编写一个提示来解释Bash代码
    • • 模型: gemini-pro
    • • 参数: 温度-0.1 令牌限制:1024 Top-K:不适用 Top-P:1
    • • 提示:
      请向我解释下面的Bash代码:

      ``` bash
      #!/bin/bash 

      echo "Enter the folder name: "
      read folder_name 

      if[! -d "Sfolder_name" ]; then 
      echo "Folder does not exist." 
      exit 1
      fi done 

      files=( "Sfolder_name"/* ) 

      for file in "${files[@]}"; do
        mv "$file" "draft_$file"
      done
      ```
    • • 输出:
      该脚本将文件夹中的所有文件重命名,在每个文件名前加上"draft_"前缀。

      脚本的工作原理如下:

      1. **`read folder_name`**:此行代码从用户那里获取文件夹名称。
      2. **`if [ ! -d "$folder_name" ]`**:此行代码检查文件夹是否存在。如果不存在,脚本将打印一条错误消息并退出。
      3. **`files=("$folder_name"/*)`**:此行代码获取文件夹中所有文件的列表。
      4. **`for file in "${files[@]}"; do`**:此行代码遍历文件夹中的所有文件。
      5. **`mv "$file" "draft_$file"`**:此行代码通过在每个文件名前面加上"draft_"来重命名文件。

    现在,让我们通过要求LLM调试和审查代码来提升一个层次。在表18中,我将使用Python代码。Python是数据科学和机器学习中最常用的语言之一。我将要求模型审查代码并调试问题。

    表19. 调试和审查Python代码的提示

    • • 名称: 2_python_debug_and_review_code
    • • 目标: 编写一个提示来调试和审查Python代码。
    • • 模型: gemini-pro
    • • 参数: 温度-0.1 令牌限制:2048 Top-K:不适用 Top-P:1
    • • 提示:
      审查并调试下面的Python代码。该代码应该接受一个文件夹名称和文件名前缀作为输入。然后,它应该遍历文件夹中的所有文件,并用文件名前缀重命名它们。

      ```python
      import os

      def rename_files(folder_name, prefix):
        """
        Renames all the files in a folder with a prefix.

        Args:
          folder_name: The name of the folder.
          prefix: The prefix to add to the file names.
        """

        for file in os.listdir(folder_name):
          os.rename(file, prefix + file)

      if __name__ == "__main__":
        rename_files("my_folder", "draft_")
      ```
    • • 输出:
      您提供的Python代码存在一些问题。

      首先,`os.rename()`函数要求您提供文件的完整路径,而不仅仅是文件名。

      其次,您没有处理在重命名文件时可能发生的任何潜在错误。

      第三,您没有提供任何关于如何使用该脚本的文档。

      以下是解决这些问题的代码的更正版本:

      ```python
      import os
      import shutil

      def rename_files(folder_name, prefix):
        """
        Renames all the files in a folder with a prefix.

        Args:
          folder_name: The name of the folder.
          prefix: The prefix to add to the file names.
        """

        # Get a list of all the files in the folder
        files = os.listdir(folder_name)

        # Iterate over the files
        for file in files:
          # Get the file extension
          ext = os.path.splitext(file)[1]

          # Create a new file name with the prefix and the file extension
          new_filename = f"{prefix}_{os.path.splitext(file)[0]}{ext}"

          # Build the full paths for the original and new files
          old_path = os.path.join(folder_name, file)
          new_path = os.path.join(folder_name, new_filename)

          # Try to move the file
          try:
            shutil.move(old_path, new_path)
          except Exception as e:
            print(f"An error occurred while moving the file {file}: {e}")

        # Print a success message
        print("Files renamed successfully.")
      ```

      这些改进使代码更加健壮和灵活,同时也使其更易于阅读和理解...(由于达到令牌限制,响应被截断。如果需要更长的响应,请尝试增加令牌限制。)

    太棒了。它不仅告诉我如何解决问题,还发现我的代码有更多的错误,并告诉了如何解决它们。提示的最后一部分提供了改进代码的通用建议。

    那么多模态提示呢?

    为代码提示仍然使用相同的常规大型语言模型。多模态提示是一个独立的问题,它指的是一种技术,您使用多种输入格式来指导大型语言模型,而不仅仅是依赖文本。这可以包括文本、图像、音频、代码甚至其他格式的组合,具体取决于模型的功能和手头的任务。

    最佳实践

    找到正确的提示需要不断尝试。Vertex AI中的Language Studio是您试用提示的理想场所,您可以在其中针对各种模型进行测试。

    请遵循以下最佳实践,成为提示工程专家。

    提供示例(Provide examples)

    最重要的最佳实践是在提示中提供(单样本/少样本)示例。这非常有效,因为它是一种强大的教学工具。这些示例展示了所需的输出或类似的响应,使模型能够从中学习并相应地调整其生成。这就像给模型一个参考点或目标,以提高其响应的准确性、风格和语调,从而更好地满足您的期望。

    设计力求简洁(Design with simplicity)

    提示应简洁、清晰,易于您和模型理解。根据经验,如果一个提示对您来说已经很混乱,那么它很可能对模型来说也很混乱。尽量不要使用复杂的语言,也不要提供不必要的信息。

    示例:

    修改前

    我现在正在纽约旅游,想了解更多关于好去处的信息。我带着两个3岁的孩子。我们假期应该去哪里?

    修改后

    扮演游客的旅行向导。描述在纽约曼哈顿适合带3岁孩子参观的好地方。

    尝试使用描述动作的动词。以下是一些示例:

    扮演、分析、分类、归类、对比、比较、创建、描述、定义、评估、提取、查找、生成、识别、列出、衡量、组织、解析、挑选、预测、提供、排名、推荐、返回、检索、重写、选择、显示、排序、总结、翻译、编写。

    具体说明输出(Be specific about the output)

    具体说明所需的输出。简洁的指令可能无法充分指导LLM,或者可能过于笼统。在提示中提供具体细节(通过系统或上下文提示)可以帮助模型专注于相关内容,从而提高整体准确性。

    示例:

    推荐做法:

    生成一篇关于排名前5的视频游戏机的3段式博客文章。该博客文章应内容丰富、引人入-,并以对话风格撰写。

    不推荐做法:

    生成一篇关于视频游戏机的博客文章。

    使用说明而非约束(Use Instructions over Constraints)

    说明和约束用于在提示中指导LLM的输出。

    • 说明 提供有关响应的所需格式、风格或内容的明确指示。它指导模型应该做什么或生成什么。
    • 约束 是对响应的一组限制或边界。它限制了模型不应该做什么或避免什么。

    越来越多的研究表明,在提示中专注于积极的说明比过分依赖约束更有效。这种方法与人类更喜欢积极的说明而非一长串禁忌列表的方式相符。

    说明直接传达了期望的结果,而约束可能会让模型猜测什么是允许的。它在定义的边界内提供了灵活性并鼓励创造力,而约束可能会限制模型的潜力。此外,一长串约束可能会相互冲突。

    但在某些情况下,约束仍然很有价值。例如,为了防止模型生成有害或有偏见的内容,或者在需要严格的输出格式或风格时。

    如果可能,请使用积极的说明:与其告诉模型不要做什么,不如告诉它应该做什么。这可以避免混淆并提高输出的准确性。

    推荐做法:

    生成一篇关于排名前5的视频游戏机的1段式博客文章。只讨论游戏机、制造商、年份和总销量。

    不推荐做法:

    生成一篇关于排名前5的视频游戏机的1段式博客文章。
    不要列出视频游戏名称。

    作为最佳实践,请优先使用说明,明确说明您希望模型做什么,仅在出于安全、清晰或特定要求需要时才使用约束。进行实验和迭代,以测试说明和约束的不同组合,找到最适合您特定任务的方法,并记录下来。

    控制最大令牌长度(Control the max token length)

    要控制生成的LLM响应的长度,您可以在配置中设置最大令牌限制,或在提示中明确请求特定长度。例如:

    “用一条推文的长度解释量子物理学。"

    在提示中使用变量(Use variables in prompts)

    为了重用提示并使其更具动态性,请在提示中使用变量,这些变量可以针对不同的输入进行更改。例如,如表20所示,一个提供关于城市事实的提示。与其在提示中硬编码城市名称,不如使用变量。通过允许您避免重复自己,变量可以节省您的时间和精力。如果您需要在多个提示中使用相同的信息,可以将其存储在变量中,然后在每个提示中引用该变量。这在将提示集成到您自己的应用程序中时非常有意义。

    表20. 在提示中使用变量

    • • 提示:
      变量
      {city}= "Amsterdam"
      提示
      你是一名旅行向导。告诉我一个关于城市的事实:{city}
    • • 输出:
      阿姆斯特丹是一座美丽的城市,到处是运河、桥梁和狭窄的街道。它因其丰富的历史、文化和夜生活而成为一个绝佳的旅游胜地。

    尝试不同的输入格式和写作风格

    不同的模型、模型配置、提示格式、措辞和提交可能会产生不同的结果。因此,尝试提示的属性(如风格、措辞和提示类型(零样本、少样本、系统提示))非常重要。

    例如,一个旨在生成关于革命性视频游戏机世嘉Dreamcast文本的提示,可以被表述为一个问题、一个陈述或一个指令,从而导致不同的输出:

    • 问题:世嘉Dreamcast是什么?为什么它是一款如此革命性的游戏机?
    • 陈述:世嘉Dreamcast是世嘉于1999年发布的第六代视频游戏机。它...
    • 指令:写一段描述世嘉Dreamcast游戏机并解释其革命性原因的单段文字。

    对于带分类任务的少样本提示,混合类别

    一般来说,少样本示例的顺序应该无关紧要。但是,在进行分类任务时,请确保在少样本示例中混合可能的响应类别。这是因为您可能因此过拟合示例的特定顺序。通过混合可能的响应类别,您可以确保模型正在学习识别每个类别的关键特征,而不仅仅是记住示例的顺序。这将导致在未见过的数据上获得更稳健和可泛化的性能。

    一个好的经验法则是从6个少样本示例开始,然后从那里开始测试准确性。

    适应模型更新(Adapt to model updates)

    您必须及时了解模型架构的变化、新增的数据和功能。尝试更新的模型版本,并调整您的提示以更好地利用新的模型功能。像Vertex AI Studio这样的工具非常适合存储、测试和记录您提示的各种版本。

    尝试不同的输出格式(Experiment with output formats)

    除了提示输入格式外,还可以考虑尝试输出格式。对于非创造性任务,如提取、选择、解析、排序、排名或分类数据,请尝试让您的输出以JSON或XML等结构化格式返回。

    从提取数据的提示中返回JSON对象有一些好处。在实际应用程序中,我不需要手动创建这种JSON格式,我已经可以按排序顺序返回数据(在处理日期时间对象时非常方便),但最重要的是,通过提示JSON格式,它迫使模型创建一个结构并限制幻觉。

    少样本提示部分的表4显示了一个如何返回结构化输出的示例。

    与其他提示工程师一起进行实验

    如果您发现自己需要想出一个好的提示,您可能希望找多个人来尝试。当每个人都遵循最佳实践(如本章所列)时,您会发现所有不同提示尝试的性能存在差异。

    CoT 最佳实践

    对于CoT提示,将答案放在推理之后是必需的,因为推理的生成会改变模型在预测最终答案时获得的令牌。

    使用CoT和自洽性,您需要能够从提示中提取最终答案,并将其与推理分开。

    对于CoT提示,请将温度设置为0。

    思维链提示基于贪婪解码,根据语言模型分配的最高概率预测序列中的下一个词。一般来说,在使用推理得出最终答案时,很可能只有一个正确的答案。因此,温度应始终设置为0。

    记录各种提示尝试

    最后一个技巧在本章前面已经提到过,但我们怎么强调都不过分:详细记录您的提示尝试,以便您随着时间的推移了解哪些做得好,哪些做得不好。

    提示输出可能因模型、采样设置甚至同一模型的不同版本而异。此外,即使对同一模型的相同提示,输出句子格式和措辞也可能存在细微差异。(例如,如前所述,如果两个令牌具有相同的预测概率,则可能会随机打破平局。这继而会影响后续预测的令牌。)

    我们建议使用表21作为模板创建一个Google表格。这种方法的优点是,当您不可避免地需要重新审视您的提示工作时(无论是为了将来继续使用它(您会惊讶地发现,即使只是短暂的休息,您也会忘记很多东西),还是为了在不同版本的模型上测试提示性能,以及为了帮助调试将来的错误),您都拥有完整的记录。

    除了此表中的字段外,跟踪提示的版本(迭代)、捕获结果是"确定/不确定/有时确定"的字段以及捕-反馈的字段也很有帮助。如果您足够幸运地使用Vertex AI Studio,请保存您的提示(使用与文档中列出的相同名称和版本),并在表格中跟踪指向已保存提示的超链接。这样,您只需单击一下即可重新运行您的提示。

    在使用检索增强生成系统时,您还应该捕获影响将哪些内容插入到提示中的RAG系统的特定方面,包括查询、分块设置、分块输出和其他信息。

    一旦您觉得提示接近完美,就将其应用到您的项目代码库中。在代码库中,将提示保存在与代码分开的文件中,以便于维护。最后,理想情况下,您的提示是可操作化系统的一部分,作为提示工程师,您应该依靠自动化的测试和评估程序来了解您的提示在多大程度上可以推广到一项任务。

    提示工程是一个迭代的过程。制作并测试不同的提示,分析并记录结果。根据模型的性能优化您的提示。不断实验,直到达到理想的输出。当您更改模型或模型配置时,请返回并继续对以前使用的提示进行实验。

    表21. 记录提示的模板

    • • 名称: [您的提示的名称和版本]
    • • 目标: [对此尝试目标的一句话解释]
    • • 模型: [所用模型的名称和版本]
    • • 参数: 温度-[0 - 1之间的值] 令牌限制:[数字] Top-K:[数字] Top-P:[数字]
    • • 提示:
      [写下所有完整的提示]
    • • 输出:
      [写下输出或多个输出]

    总结

    本白皮书讨论了提示工程。我们学习了各种提示技术,例如:

    • • 零提示(Zero Shot)
    • • 少样本提示(Few Shot)
    • • 系统提示(System Prompt)
    • • 角色提示(Role Prompt)
    • • 上下文提示(Contextual Prompt)
    • • 回退提示(Step-back prompting)
    • • 思维链(CoT)
    • • 自洽性(Self Consistency)
    • • 思维树(ToT)
    • • ReAct

    我们甚至研究了如何自动化您的提示。

    然后,白皮书讨论了生成式AI的挑战,例如当您的提示不足时可能发生的问题。最后,我们以如何成为一名更好的提示工程师的最佳实践作为结尾。

 

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询