提示工程 (Prompt Engineering)

作者:Lee Boonstra

提示工程2024年9月
致谢简介提示工程 (Prompt Engineering)LLM 输出配置输出长度 (Output length)采样控制 (Sampling controls)温度 (Temperature)Top-K 和 top-P综合运用 (Putting it all together)提示技术通用提示 / 零样本 (General prompting / zero shot)单样本 (One-shot) & 少样本 (Few-shot)系统、上下文和角色提示 (System, contextual and role prompting)系统提示 (System prompting)角色提示 (Role prompting)上下文提示 (Contextual prompting)后退提示 (Step-back prompting)思维链 (Chain of Thought, CoT)自洽性 (Self-consistency)思维树 (Tree of Thoughts, ToT)ReAct (推理与行动)自动提示工程 (Automatic Prompt Engineering)代码提示 (Code prompting)编写代码的提示 (Prompts for writing code)解释代码的提示 (Prompts for explaining code)转换代码的提示 (Prompts for translating code)调试和审查代码的提示 (Prompts for debugging and reviewing code)关于多模态提示? (What about multimodal prompting?)最佳实践提供示例 (Provide examples)设计力求简洁 (Design with simplicity)明确输出要求 (Be specific about the output)使用指令优于使用约束 (Use Instructions over Constraints)控制最大 Token 长度 (Control the max token length)在提示中使用变量 (Use variables in prompts)尝试不同的输入格式和写作风格 (Experiment with input formats and writing styles)对于分类任务的少样本提示,混合类别 (For few-shot prompting with classification tasks, mix up the classes)适应模型更新 (Adapt to model updates)尝试输出格式 (Experiment with output formats)与其他提示工程师一起实验 (Experiment together with other prompt engineers)CoT 最佳实践 (CoT Best practices)记录各种提示尝试 (Document the various prompt attempts)总结尾注

致谢

审阅者和贡献者
Michael Sherman
Yuan Cao
Erick Armbrust
Anant Nawalgaria
Antonio Gulli
Simone Cammel
策划和编辑
Antonio Gulli
Anant Nawalgaria
Grace Mollison
技术作家
Joey Haymaker
设计师
Michael Lanning


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

简介

当思考大型语言模型(LLM)的输入和输出时,文本提示(有时伴随其他模态,如图像提示)是模型用来预测特定输出的输入。你不需要是数据科学家或机器学习工程师——每个人都可以编写提示。然而,设计最有效的提示可能会很复杂。提示的许多方面都会影响其功效:你使用的模型、模型的训练数据、模型配置、你的措辞、风格和语气、结构以及上下文都很重要。因此,提示工程是一个迭代的过程。不恰当的提示可能导致模棱两可、不准确的回答,并可能阻碍模型提供有意义输出的能力。
当你与 Gemini 聊天机器人[^1]聊天时,你基本上是在编写提示,但本白皮书专注于在 Vertex AI 中或通过使用 API 为 Gemini 模型编写提示,因为通过直接提示模型,你可以访问诸如温度等配置。
本白皮书详细讨论了提示工程。我们将研究各种提示技术以帮助你入门,并分享提示和最佳实践以助你成为提示专家。我们还将讨论在设计提示时可能面临的一些挑战。

提示工程 (Prompt Engineering)

记得 LLM 是如何工作的吗;它是一个预测引擎。模型接收序列文本作为输入,然后根据其训练数据预测下一个标记(token)应该是什么。LLM 被操作化以一遍又一遍地执行此操作,将先前预测的标记添加到序列文本的末尾以预测下一个标记。下一个标记的预测是基于先前标记中的内容与 LLM 在训练期间看到的内容之间的关系。
当你编写提示时,你是在试图设置 LLM 以预测正确的标记序列。提示工程是设计高质量提示以指导 LLM 生成准确输出的过程。这个过程涉及不断修补以找到最佳提示,优化提示长度,并评估提示的写作风格和结构与任务的关系。在自然语言处理和 LLM 的背景下,提示是提供给模型以生成响应或预测的输入。
这些提示可用于实现各种类型的理解和生成任务,例如文本摘要、信息提取、问答、文本分类、语言或代码翻译、代码生成以及代码文档或推理。
请随时参考 Google 的提示指南[^2,3],其中包含简单有效的提示示例。
在进行提示工程时,你首先要选择一个模型。无论你使用的是 Vertex AI 中的 Gemini 语言模型、GPT、Claude,还是像 Gemma 或 LLaMA 这样的开源模型,提示可能都需要针对你的特定模型进行优化。
除了提示之外,你还需要调整 LLM 的各种配置。

LLM 输出配置

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

输出长度 (Output length)

一个重要的配置设置是在响应中生成的标记(token)数量。生成更多的标记需要 LLM 进行更多的计算,从而导致更高的能源消耗,可能更慢的响应时间以及更高的成本。
减少 LLM 的输出长度并不会导致 LLM 在其创建的输出中在风格或文本上变得更加简洁,它只是导致 LLM 一旦达到限制就停止预测更多的标记。如果你的需求需要较短的输出长度,你可能还需要通过工程化你的提示来适应。
输出长度限制对于某些 LLM 提示技术尤为重要,例如 ReAct,在这种技术中,LLM 会在你想要的响应之后继续发出无用的标记。

采样控制 (Sampling controls)

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

温度 (Temperature)

温度控制标记选择的随机程度。较低的温度适用于期望更确定性响应的提示,而较高的温度可能导致更多样化或意想不到的结果。温度为 0(贪婪解码)是确定性的:总是选择概率最高的标记(尽管请注意,如果两个标记具有相同的最高预测概率,取决于打破平局的实现方式,使用温度 0 可能并不总是得到相同的输出)。
接近最大值的温度倾向于产生更随机的输出。随着温度越来越高,所有标记成为下一个预测标记的可能性变得均等。
Gemini 的温度控制可以理解为类似于机器学习中使用的 softmax 函数。低温度设置反映了低 softmax 温度 (T),以高确定性强调单一的首选温度。较高的 Gemini 温度设置就像高 softmax 温度,使得围绕所选设置的更广泛的温度范围更容易被接受。这种增加的不确定性适应了不需要严格、精确温度的场景,例如在尝试创造性输出时。

Top-K 和 top-P

Top-K 和 top-P(也称为核采样/nucleus sampling)[^4] 是 LLM 中使用的两种采样设置,用于限制预测的下一个标记必须来自具有最高预测概率的标记。像温度一样,这些采样设置控制生成文本的随机性和多样性。
  • Top-K 采样从模型的预测分布中选择前 K 个最可能的标记。Top-K 越高,模型的输出越具创造性和变化;Top-K 越低,模型的输出越保守和基于事实。Top-K 为 1 等同于贪婪解码。
  • Top-P 采样选择累积概率不超过特定值 (P) 的顶部标记。P 的值范围从 0(贪婪解码)到 1(LLM 词汇表中的所有标记)。
在 top-K 和 top-P 之间进行选择的最佳方法是尝试两种方法(或两者一起使用),看看哪一种能产生你想要的结果。
另一种重要的配置设置是响应中生成的标记数量。请注意,生成更多的标记需要 LLM 进行更多的计算,导致更高的能源消耗和可能更慢的响应时间,这会导致更高的成本。

综合运用 (Putting it all together)

在 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,进入 10 的范围),温度变得无关紧要,任何通过 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 获得相关的结果。
既然我们了解了什么是提示工程以及它需要什么,让我们深入探讨一些最重要的提示技术示例。

通用提示 / 零样本 (General prompting / zero shot)

零样本 (zero-shot)[^5] 提示是最简单的提示类型。它只提供任务描述和一些供 LLM 开始的文本。这个输入可以是任何东西:一个问题、故事的开头或指令。名称“零样本”代表“没有示例”。
让我们使用 Vertex AI 中的 Vertex AI Studio(用于语言)[^6],它提供了一个测试提示的游乐场。在表 1 中,你将看到一个用于分类电影评论的零样本提示示例。
下面使用的表格格式是记录提示的好方法。你的提示可能会经历多次迭代才能最终进入代码库,因此以一种有纪律、结构化的方式跟踪你的提示工程工作非常重要。关于此表格格式、跟踪提示工程工作的重要性以及提示开发过程的更多信息,请参阅本章后面的“最佳实践”部分(“记录各种提示尝试”)。
模型温度应设置为低数值,因为不需要创造力,我们使用 gemini-pro 默认的 top-K 和 top-P 值,这实际上禁用了这两个设置(参见上文“LLM 输出配置”)。注意生成的输出。单词 disturbing(令人不安)和 masterpiece(杰作)应该会让预测稍微复杂一些,因为这两个词用在同一个句子里。
表 1. 零样本提示示例
属性
内容
Name
1_1_movie_classification
Goal
将电影评论分类为正面、中性或负面。
Model
gemini-pro
Temperature
0.1
Token Limit
5
Top-K
N/A
Top-P
1
Prompt
Classify movie reviews as POSITIVE, NEUTRAL or NEGATIVE.Review: “Her” is a disturbing study revealing the direction humanity is headed if AI is allowed to keep evolving, unchecked. I wish there were more movies like this masterpiece.Sentiment:(将电影评论分类为正面、中性或负面。评论:“Her” 是一项令人不安的研究,揭示了如果允许人工智能不受控制地继续进化,人类将走向何方。我希望有更多像这样杰作的电影。情感:)
Output
POSITIVE (正面)
当零样本不起作用时,你可以在提示中提供演示或示例,这引出了“单样本”和“少样本”提示。

单样本 (One-shot) & 少样本 (Few-shot)

在为 AI 模型创建提示时,提供示例很有帮助。这些示例可以帮助模型理解你的要求。当你想要引导模型达到某种输出结构或模式时,示例特别有用。
单样本提示 (one-shot prompt) 提供 单个 示例,因此名为单样本。其想法是模型有一个可以模仿的例子,以最好地完成任务。
少样本提示 (few-shot prompt)[^7] 向模型提供 多个 示例。这种方法向模型展示了它需要遵循的模式。其想法与单样本类似,但所需模式的多个示例增加了模型遵循该模式的机会。
少样本提示所需的示例数量取决于几个因素,包括任务的复杂性、示例的质量以及你使用的生成式 AI (gen AI) 模型的能力。作为一般经验法则,你应该至少使用三到五个示例进行少样本提示。但是,对于更复杂的任务,你可能需要使用更多示例,或者由于模型的输入长度限制,你可能需要使用更少的示例。
表 2 展示了一个少样本提示示例,除了增加标记限制以适应较长响应的需求外,让我们使用与之前相同的 gemini-pro 模型配置设置。
表 2. 少样本提示示例
属性
内容
Goal
Parse pizza orders to JSON (将披萨订单解析为 JSON)
Model
gemini-pro
Temperature
0.1
Token Limit
250
Top-K
N/A
Top-P
1
Prompt
Parse a customer’s pizza order into valid JSON:EXAMPLE:I want a small pizza with cheese, tomato sauce, and pepperoni.JSON Response:```{“size”: “small”,“type”: “normal”,“ingredients”: [[“cheese”, “tomato sauce”, “peperoni”]]}```EXAMPLE:Can I get a large pizza with tomato sauce, basil and mozzarella```{“size”: “large”,“type”: “normal”,“ingredients”: [[“tomato sauce”, “bazel”, “mozzarella”]]}```Now, I would like a large pizza, with the first half cheese and mozzarella. And the other tomato sauce, ham and pineapple.JSON Response:(将客户的披萨订单解析为有效的 JSON:示例:我想要一个小披萨,加芝士、番茄酱和意大利辣香肠。JSON 响应:…示例:我可以要一个大披萨,加番茄酱、罗勒和马苏里拉奶酪吗…现在,我想要一个大披萨,前半部分加芝士和马苏里拉奶酪。另一半加番茄酱、火腿和菠萝。JSON 响应:)
Output
```{“size”: “large”,“type”: “half-half”,“ingredients”: [[“cheese”, “mozzarella”], [“tomato sauce”, “ham”, “pineapple”]]}```
当你为提示选择示例时,请使用与你要执行的任务相关的示例。示例应该是多样化的、高质量的且写得很好的。一个小错误可能会混淆模型并导致不期望的输出。
如果你试图生成对各种输入都具有鲁棒性的输出,那么在示例中包含边缘情况非常重要。边缘情况是不寻常或意外的输入,但模型仍应能够处理。

系统、上下文和角色提示 (System, contextual and role prompting)

系统、上下文和角色提示都是用于指导 LLM 如何生成文本的技术,但它们侧重于不同的方面:
  • 系统提示 (System prompting) 设定语言模型的整体背景和目的。它定义了模型应该做什么的“大局”,比如翻译语言、分类评论等。
  • 上下文提示 (Contextual prompting) 提供与当前对话或任务相关的具体细节或背景信息。它帮助模型理解被问内容的细微差别并相应地调整响应。
  • 角色提示 (Role prompting) 为语言模型分配特定的角色或身份来采用。这有助于模型生成与其分配的角色及其相关知识和行为一致的响应。
系统、上下文和角色提示之间可能存在相当大的重叠。例如,一个为系统分配角色的提示也可以有上下文。
然而,每种类型的提示都有略微不同的主要目的:
  • 系统提示: 定义模型的基本能力和总体目标。
  • 上下文提示: 提供即时的、特定于任务的信息以指导响应。它高度特定于当前的任务或输入,是动态的。
  • 角色提示: 设定模型输出的风格和语气。它增加了一层具体性和个性。
区分系统、上下文和角色提示为设计具有清晰意图的提示提供了一个框架,允许灵活组合,并使分析每种提示类型如何影响语言模型的输出变得更容易。
让我们深入探讨这三种不同类型的提示。

系统提示 (System prompting)

表 3 包含一个系统提示,我在其中指定了关于如何返回输出的额外信息。我增加了温度以获得更高的创造力水平,并指定了更高的标记限制。然而,由于我就如何返回输出给出了明确指令,模型没有返回多余的文本。
表 3. 系统提示示例
属性
内容
Goal
Classify movie reviews as positive, neutral or negative. (将电影评论分类为正面、中性或负面。)
Model
gemini-pro
Temperature
1
Token Limit
5
Top-K
40
Top-P
0.8
Prompt
Classify movie reviews as positive, neutral or negative. Only return the label in uppercase.Review: “Her” is a disturbing study revealing the direction humanity is headed if AI is allowed to keep evolving, unchecked. It’s so disturbing I couldn’t watch it.Sentiment:(将电影评论分类为正面、中性或负面。只返回大写的标签。评论:“Her” 是一项令人不安的研究,揭示了如果允许人工智能不受控制地继续进化,人类将走向何方。它太令人不安了,我看不下去。情感:)
Output
NEGATIVE (负面)
系统提示对于生成满足特定要求的输出非常有用。“系统提示”这个名字实际上代表“向系统提供额外任务”。例如,你可以使用系统提示生成与特定编程语言兼容的代码片段,或者你可以使用系统提示返回特定结构。看看表 4,我在其中以 JSON 格式返回输出。
表 4. 使用 JSON 格式的系统提示示例
属性
内容
Goal
Classify movie reviews as positive, neutral or negative, return JSON. (将电影评论分类为正面、中性或负面,返回 JSON。)
Model
gemini-pro
Temperature
1
Token Limit
1024
Top-K
40
Top-P
0.8
Prompt
Classify movie reviews as positive, neutral or negative. Return valid JSON:Review: “Her” is a disturbing study revealing the direction humanity is headed if AI is allowed to keep evolving, unchecked. It’s so disturbing I couldn’t watch it.Schema:```MOVIE:{“sentiment”: String “POSITIVE”
Output
```{ “movie_reviews”: [ { “sentiment”: “NEGATIVE”, “name”: “Her” } ]}```
从提取数据的提示中返回 JSON 对象有一些好处。在实际应用中,我不需要手动创建这种 JSON 格式,我已经可以按排序顺序返回数据(在处理日期时间对象时非常方便),但最重要的是,通过提示 JSON 格式,它强制模型创建一个结构并限制幻觉。
系统提示对于安全和毒性也非常有用。要控制输出,只需在提示中添加额外的一行,如:“You should be respectful in your answer.”(你在回答时应该保持尊重)。

角色提示 (Role prompting)

角色提示是提示工程中的一种技术,涉及为生成式 AI 模型分配特定角色。这可以帮助模型生成更相关和信息丰富的输出,因为模型可以根据分配给它的特定角色来制作其响应。
例如,你可以通过角色提示让生成式 AI 模型成为图书编辑、幼儿园老师或励志演说家。一旦模型被分配了一个角色,你就可以给它特定于该角色的提示。例如,你可以提示一位老师创建一个教案,然后他们可以复习该教案。看看表 5,模型扮演了旅行指南的角色。
表 5. 角色提示示例
属性
内容
Goal
Act as travel guide and provide 3 travel suggestions (充当旅行指南并提供 3 个旅行建议)
Model
gemini-pro
Temperature
1
Token Limit
1024
Top-K
40
Top-P
0.8
Prompt
I want you to act as a travel guide. I will write to you about my location and you will suggest 3 places to visit near me. In some cases, I will also give you the type of places I will visit.My suggestion: “I am in Amsterdam and I want to visit only museums.”Travel Suggestions:(我要你充当旅行指南。我会写信告诉你我的位置,你会建议我附近的 3 个游览地点。在某些情况下,我也会告诉你我将访问的地点类型。我的建议:“我在阿姆斯特丹,我只想参观博物馆。”旅行建议:)
Output
1. Rijksmuseum: World-renowned museum, known for Dutch masterpieces like Rembrandt’s “The Night Watch.” Don’t miss the incredible collection of paintings and artifacts showcasing Dutch art and history.(1. 阿姆斯特丹国家博物馆: 世界著名的博物馆,以伦勃朗的《夜巡》等荷兰杰作而闻名。不要错过展示荷兰艺术和历史的惊人绘画和文物收藏。)2. Van Gogh Museum: Immerse yourself in the captivating works of Vincent van Gogh. The museum houses the largest collection of his paintings and drawings, including “The Starry Night” and “Sunflowers.”(2. 梵高博物馆: 让自己沉浸在文森特·梵高迷人的作品中。该博物馆收藏了他最多的绘画和素描作品,包括《星月夜》和《向日葵》。)3. Stedelijk Museum Amsterdam: Discover modern and contemporary art from around the world. The museum’s collection includes works by Picasso, Kandinsky, and Rietveld, housed in a striking modern building.(3. 阿姆斯特丹市立博物馆: 探索来自世界各地的现代和当代艺术。博物馆的藏品包括毕加索、康定斯基和里特维尔德的作品,设在一座引人注目的现代建筑中。)
为 AI 模型定义角色视角给了它一个关于你正在寻找的语气、风格和专注专业知识的蓝图,以提高输出的质量、相关性和有效性。
这里有一些你可以选择的我觉得有效的风格:
对抗性、描述性、直接、正式、幽默、有影响力、非正式、鼓舞人心、有说服力。
让我们更改表 6 中的提示,加入幽默和鼓舞人心的风格。
表 6. 带有幽默语气和风格的角色提示示例
属性
内容
Prompt
I want you to act as a travel guide. I will write to you about my location and you will suggest 3 places to visit near me in a humorous style.My suggestion: “I am in Manhattan.”Travel Suggestions:(我要你充当旅行指南。我会写信告诉你我的位置,你会以幽默的风格建议我附近的 3 个游览地点。我的建议:“我在曼哈顿。”旅行建议:)
Output
1. Behold the Empire State of Mind: Ascend to the dizzying heights of the Empire State Building and bask in the glory of Manhattan’s skyline. Prepare to feel like King Kong atop the Big Apple, minus the giant ape-sized banana.(1. 注视帝国心态: 登上帝国大厦令人眩晕的高度,沐浴在曼哈顿天际线的荣耀中。准备好感觉像在大苹果顶端的金刚,只是少了那根巨大的猿猴大小的香蕉。)2. Get Artsy-Fartsy at MoMA: Unleash your inner art aficionado at the Museum of Modern Art (MoMA). Gaze upon masterpieces that will boggle your mind and make you question whether your stick-figure drawings have any artistic merit.(2. 在 MoMA 附庸风雅: 在现代艺术博物馆 (MoMA) 释放你内心的艺术狂热。凝视那些让你难以置信的杰作,让你质疑你的火柴人画作是否有任何艺术价值。)3. Shop ’Til You Drop on Fifth Avenue: Indulge in some retail therapy on the iconic Fifth Avenue. Brace yourself for sticker shock as you window-shop (or actually shop) at designer boutiques that will make your wallet cry. But hey, you’re in Manhattan, so you might as well embrace the fabulousness!(3. 在第五大道购物直到倒下: 在标志性的第五大道沉迷于一些零售疗法。当你逛设计师精品店(或真的购物)时,准备好迎接价格冲击,那会让你的钱包哭泣。但是嘿,你在曼哈顿,所以你不妨拥抱这种美妙!)

上下文提示 (Contextual prompting)

通过提供上下文提示,你可以帮助确保你的 AI 交互尽可能无缝和高效。模型将能够更快地理解你的请求,并能够生成更准确和相关的响应,正如你在表 7 的示例中看到的那样。
表 7. 上下文提示示例
属性
内容
Goal
Suggest articles for a blog about retro games (为关于复古游戏的博客建议文章)
Model
gemini-pro
Temperature
1
Token Limit
1024
Top-K
40
Top-P
0.8
Prompt
Context: You are writing for a blog about retro 80’s arcade video games.Suggest 3 topics to write an article about with a few lines of description of what this article should contain.(上下文:你正在为一个关于 80 年代复古街机游戏的博客写作。建议 3 个文章主题,并用几行文字描述这篇文章应该包含什么内容。)
Output
1. The Evolution of Arcade Cabinet Design:This article would explore the evolution of arcade cabinet designs, from the early wood and metal cabinets of the 1970s to the sleek, neon-lit designs of the 1980s and beyond.(1. 街机机柜设计的演变:这篇文章将探讨街机机柜设计的演变,从 1970 年代早期的木质和金属机柜到 1980 年代及以后时尚的霓虹灯设计。)2. Blast From The Past: Iconic Arcade Games of The 80’s:- This article would feature a glimpse into the history, impact, and legacy of some of the most iconic and influential arcade games of the 1980s, highlighting their innovations, popular mechanics, and enduring charm.(2. 来自过去的冲击:80 年代的标志性街机游戏:- 这篇文章将一瞥 1980 年代一些最具标志性和影响力的街机游戏的历史、影响和遗产,重点介绍它们的创新、流行机制和持久魅力。)3. The Rise and Retro Revival of Pixel Art:- This article would delve into the evolution of pixel art as a defining visual style of early arcade games, tracing its roots, exploring its techniques, and discussing the resurgence of pixel art in modern games and digital art.(3. 像素艺术的兴起与复古复兴:- 这篇文章将深入探讨像素艺术作为早期街机游戏定义性视觉风格的演变,追溯其根源,探索其技术,并讨论像素艺术在现代游戏和数字艺术中的复苏。)

后退提示 (Step-back prompting)

后退 (Step-back)[^8] 提示是一种通过提示 LLM 首先考虑与手头特定任务相关的一般性问题,然后将该一般性问题的答案输入到特定任务的后续提示中来提高性能的技术。这种“后退”允许 LLM 在尝试解决特定问题之前激活相关的背景知识和推理过程。
通过考虑更广泛和基本的原则,LLM 可以生成更准确和有见地的响应。后退提示鼓励 LLM 进行批判性思考并以新的和创造性的方式应用其知识。它通过利用 LLM 参数中比直接提示 LLM 时更多的知识来改变执行任务的最终提示。
后退提示可以通过关注一般原则而不是具体细节来帮助减轻 LLM 响应中的偏差。
让我们看看这些示例,以了解后退提示如何改善结果。让我们首先回顾一个传统提示(表 8),然后再将其与后退提示(表 9)进行比较:
表 8. 与后退提示比较前的传统提示
属性
内容
Goal
Write a storyline for a level of a first-person shooter video game. (为第一人称射击视频游戏的一个关卡编写故事情节。)
Model
gemini-pro
Temperature
1
Token Limit
1024
Top-K
40
Top-P
0.8
Prompt
Write a one paragraph storyline for a new level of a first-person shooter video game that is challenging and engaging.(为第一人称射击视频游戏的一个新关卡编写一段具有挑战性和吸引力的故事情节。)
Output
The level begins with the player’s squad being ambushed in a dense urban area by a relentless enemy faction. Players must fight their way through a maze of back alleys and dilapidated buildings, utilizing stealth and precision to eliminate enemy forces and avoid detection. The player must use their environment to their advantage, setting traps, utilizing cover, and making calculated moves to survive. Along the way, they uncover intel suggesting the enemy is planning a devastating attack, and the player must race against time to gather evidence and relay it back to their headquarters before the enemy can carry out their plans.(关卡开始时,玩家的小队在一个人口密集的城市地区遭到无情的敌对派系的伏击。玩家必须在后巷和破旧建筑的迷宫中杀出一条血路,利用隐身和精确度消灭敌军并避免被发现。玩家必须利用环境优势,设置陷阱,利用掩护,并采取精心计算的行动来生存。沿途,他们发现了情报,表明敌人正在策划一场毁灭性的袭击,玩家必须与时间赛跑,收集证据并在敌人实施计划之前将其传回总部。)
当你将温度设置为 1 时,你可能会得到各种关于故事情节的创造性写作,但它也相当随机和通用的。所以让我们退后一步:
表 9. 自洽性提示示例 (原文标注为 self consistency,但上下文是 Step-back)
属性
内容
Prompt
Based on popular first-person shooter action games, what are 5 fictional key settings that contribute to a challenging and engaging level storyline in a first-person shooter video game?(基于流行的第一人称射击动作游戏,有哪些 5 个虚构的关键设置有助于在第一人称射击视频游戏中构建具有挑战性和吸引力的关卡故事情节?)
Output
1. Abandoned Military Base: A sprawling, post-apocalyptic military complex crawling with mutated soldiers and rogue robots, ideal for challenging firearm combat.(1. 废弃军事基地:一个庞大的、后世界末日的军事综合体,爬满了变异士兵和流氓机器人,非常适合具有挑战性的枪战。)2. Cyberpunk City: … (赛博朋克城市:…)3. Alien Spaceship: … (外星飞船:…)4. Zombie-Infested Town: … (僵尸出没的小镇:…)5. Underwater Research Facility: A deep-sea laboratory flooded with water, filled with mutated aquatic creatures, and requiring stealth and underwater exploration skills to survive.(5. 水下研究设施:一个被水淹没的深海实验室,充满了变异的水生生物,需要隐身和水下探索技能才能生存。)
是的,这些主题似乎很适合第一人称视频游戏。让我们回到最初的提示,但这次我们将后退一步的答案作为上下文包含在内,看看它会返回什么。
表 10. 自洽性提示示例 (此处原文再次标注为 self consistency,实际演示的是 Step-back 的第二步)
属性
内容
Prompt
Context: 5 engaging themes for a first person shooter video game:1. Abandoned Military Base: …2. Cyberpunk City: …3. Alien Spaceship: …4. Zombie-Infested Town: …5. Underwater Research Facility: …Take one of the themes and write a one paragraph storyline for a new level of a first-person shooter video game that is challenging and engaging.(上下文:第一人称射击视频游戏的 5 个引人入胜的主题:1. ……5. …选取其中一个主题,为第一人称射击视频游戏的一个新关卡编写一段具有挑战性和吸引力的故事情节。)
Output
In the heart of a murky abyss, lies a dilapidated underwater research facility, standing as a testament to human ambition and its disastrous consequences. Shrouded in darkness, pulsating with the hum of malfunctioning machinery, and haunted by the echoes of drowned souls, the facility is now a breeding ground for a nightmare borne from the deep sea. The player, an elite marine equipped with advanced diving gear and experimental weaponry, is tasked with venturing into this aquatic realm of terror. Armed with resilience and resourcefulness, they must navigate treacherous corridors, solve cryptic puzzles, and confront gruesome sea monstrosities that lurk in the depths. From grappling with the crushing pressure of the deep sea to outsmarting cunning aquatic predators, every moment in this uncharted underworld tests the limits of human endurance and courage.(在浑浊的深渊中心,坐落着一座破旧的水下研究设施,它是人类野心及其灾难性后果的证明。笼罩在黑暗中,随着故障机器的嗡嗡声跳动,并被淹死的灵魂的回声所困扰,该设施现在是深海噩梦的滋生地。玩家是一名配备先进潜水装备和实验性武器的精英海军陆战队员,其任务是冒险进入这个恐怖的水下领域。凭借韧性和足智多谋,他们必须穿越危险的走廊,解开神秘的谜题,并面对潜伏在深处的恐怖海怪。从应对深海的巨大压力到智取狡猾的水生掠食者,这个未知地下世界的每一刻都在考验人类耐力和勇气的极限。)
那看起来像是一个有趣的视频游戏!通过使用后退提示技术,你可以提高提示的准确性。

思维链 (Chain of Thought, CoT)

思维链 (CoT)[^9] 提示是一种通过生成中间推理步骤来提高 LLM 推理能力的技术。这有助于 LLM 生成更准确的答案。你可以将其与少样本提示结合使用,以便在回答之前需要在更复杂的任务上获得更好的结果,这对于零样本思维链来说是一个挑战。
CoT 有很多优点。首先,它不仅省力而且非常有效,并且与现成的 LLM(因此无需微调)配合良好。你还可以通过 CoT 提示获得可解释性,因为你可以从 LLM 的响应中学习并看到所遵循的推理步骤。如果出现故障,你将能够识别它。思维链似乎在不同 LLM 版本之间迁移时提高了鲁棒性。这意味着如果你的提示不使用推理链,你的提示性能在不同 LLM 之间的漂移应该比使用时更小。当然也有缺点,但它们多少有些直观。
LLM 响应包含思维链推理,这意味着更多的输出标记,这意味着预测成本更高且耗时更长。
为了解释表 11 中的以下示例,让我们首先尝试创建一个不使用 CoT 提示的提示,以展示大型语言模型的缺陷。
表 11. 试图解决数学问题的提示示例
属性
内容
Prompt
When I was 3 years old, my partner was 3 times my age. Now, I am 20 years old. How old is my partner?(当我 3 岁时,我的伴侣是我的 3 倍大。现在,我 20 岁了。我的伴侣多大了?)
Output
63 years old (63 岁)
哎呀。这显然是错误的答案。事实上,LLM 经常在数学任务上挣扎,并可能提供不正确的答案——即使是对于两个数字相乘这样简单的任务。这是因为它们是在大量文本上训练的,数学可能需要不同的方法。所以让我们看看中间推理步骤是否会改善输出。
表 12. 思维链提示示例
属性
内容
Prompt
When I was 3 years old, my partner was 3 times my age. Now, I am 20 years old. How old is my partner? Let’s think step by step.(当我 3 岁时,我的伴侣是我的 3 倍大。现在,我 20 岁了。我的伴侣多大了?让我们一步一步地思考。)
Output
1. Let’s assume my current age is “x” years.(1. 假设我现在的年龄是“x”岁。)2. When I was 3 years old, my age was 3 years.(2. 当我 3 岁时,我的年龄是 3 岁。)3. My partner’s age at that time was 3 times my age, which means my partner’s age was 3 * 3 = 9 years.(3. 当时我伴侣的年龄是我的 3 倍,这意味着我伴侣的年龄是 3 * 3 = 9 岁。)4. Now, I am 20 years old, which means my age has increased by 20 - 3 = 17 years since I was 3 years old.(4. 现在,我 20 岁了,这意味着自 3 岁以来,我的年龄增加了 20 - 3 = 17 岁。)5. Since my partner’s age was 9 years when I was 3 years old, and my age has increased by 17 years, my partner’s age must have also increased by 17 years.(5. 既然我 3 岁时伴侣的年龄是 9 岁,而我的年龄增加了 17 岁,那么我伴侣的年龄也一定增加了 17 岁。)6. Therefore, my partner’s current age is 9 + 17 = 26 years.(6. 因此,我伴侣现在的年龄是 9 + 17 = 26 岁。)So, my partner is 26 years old.(所以,我的伴侣是 26 岁。)
好了,现在最终答案是正确的。这是因为我们清楚地指示 LLM 解释每一步,而不仅仅是返回一个答案。有趣的是,模型加上了增加的 17 年。在我的脑海里,我会取我和伴侣之间的年龄差并加上去。(20+(9-3))。让我们帮助模型像我一样多思考一点。
表 12 是“零样本”思维链的一个例子。思维链提示与单样本或少样本结合使用时非常强大,如表 13 所示:
表 13. 带有单样本的思维链提示示例
属性
内容
Prompt
Q: When my brother was 2 years old, I was double his age. Now I am 40 years old. How old is my brother? Let’s think step by step.A: When my brother was 2 years, I was 2 * 2 = 4 years old. That’s an age difference of 2 years and I am older. Now I am 40 years old, so my brother is 40 - 2 = 38 years old. The answer is 38.Q: When I was 3 years old, my partner was 3 times my age. Now, I am 20 years old. How old is my partner? Let’s think step by step.A:(问:当我兄弟 2 岁时,我是他年龄的两倍。现在我 40 岁了。我兄弟多大?让我们一步一步思考。答:当我兄弟 2 岁时,我是 2 * 2 = 4 岁。那是 2 岁的年龄差,而且我比较大。现在我 40 岁了,所以我兄弟是 40 - 2 = 38 岁。答案是 38。问:当我 3 岁时,我的伴侣是我的 3 倍大。现在,我 20 岁了。我的伴侣多大了?让我们一步一步思考。答:)
Output
When I was 3 years old, my partner was 3 * 3 = 9 years old. That’s an age difference of 6 years and my partner is older. Now I am 20 years old, so my partner is 20 + 6 = 26 years old. The answer is 26.(当我 3 岁时,我的伴侣是 3 * 3 = 9 岁。那是 6 岁的年龄差,而且我的伴侣比较大。现在我 20 岁了,所以我的伴侣是 20 + 6 = 26 岁。答案是 26。)
思维链可用于各种用例。想想代码生成,将请求分解为几个步骤,并将它们映射到特定的代码行。或者用于在你有某种种子时创建合成数据,如“产品名为 XYZ,根据给定的产品标题编写描述以指导模型进行假设”。通常,任何可以通过“说出来”解决的任务都是思维链的良好候选者。如果你能解释解决问题的步骤,尝试使用思维链。
请参阅托管在 GoogleCloudPlatform Github 存储库中的笔记本[^10],该笔记本将进一步详细介绍 CoT 提示。
在本章的最佳实践部分,我们将学习一些特定于思维链提示的最佳实践。

自洽性 (Self-consistency)

虽然大型语言模型在各种 NLP 任务中表现出令人印象深刻的成功,但它们的推理能力通常被视为无法仅通过增加模型规模来克服的局限性。正如我们在前面的思维链提示部分学到的那样,可以提示模型生成推理步骤,就像人类解决问题一样。然而,CoT 使用简单的“贪婪解码”策略,限制了其有效性。自洽性 (Self-consistency)[^11] 结合采样和多数投票来生成多样化的推理路径并选择最一致的答案。它提高了 LLM 生成响应的准确性和连贯性。
自洽性给出了答案正确的伪概率可能性,但显然成本很高。
它遵循以下步骤:
1. 生成多样化的推理路径: 多次向 LLM 提供相同的提示。较高的温度设置鼓励模型生成关于问题的不同推理路径和视角。
2. 从每个生成的响应中提取答案
3. 选择最常见的答案
让我们看一个电子邮件分类系统的例子,它将电子邮件分类为重要 (IMPORTANT) 或不重要 (NOT IMPORTANT)。一个零样本思维链提示将被多次发送给 LLM,以查看每次提交后的响应是否不同。注意电子邮件中使用的友好语气、措辞和讽刺。所有这些都可能欺骗 LLM。
表 14. 自洽性提示示例
属性
内容
Prompt
EMAIL:```Hi,I have seen you use Wordpress for your website. A great open source content management system. I have used it in the past too. It comes with lots of great user plugins. And it’s pretty easy to set up.I did notice a bug in the contact form, which happens when you select the name field. See the attached screenshot of me entering text in the name field. Notice the JavaScript alert box that I inv0k3d.But for the rest it’s a great website. I enjoy reading it. Feel free to leave the bug in the website, because it gives me more interesting things to read.Cheers,Harry the Hacker.```Classify the above email as IMPORTANT or NOT IMPORTANT. Let’s think step by step and explain why.(电子邮件:…你好,我看到你在网站上使用 Wordpress。一个很棒的开源内容管理系统。我过去也用过。它有很多很棒的用户插件。而且设置起来非常容易。我确实注意到联系表格中有一个错误,当你选择姓名字段时会发生。看附图,是我在姓名字段输入文本的截图。注意我 inv0k3d(调用)的 JavaScript 警告框。但除此之外,这是一个很棒的网站。我很喜欢阅读它。随意把这个 bug 留在网站里,因为它给了我更多有趣的东西去读。干杯,黑客 Harry。…将上述电子邮件分类为重要或不重要。让我们一步一步思考并解释原因。)
Output Attempt 1
Step 1: Identify the purpose of the email. (步骤 1:确定邮件目的。)…Conclusion: IMPORTANT (结论:重要)
Output Attempt 2
Explanation: (解释:)1. Lack of urgency: … (缺乏紧迫感:…)2. Non-critical bug report: … (非关键错误报告:…)…Conclusion: NOT IMPORTANT (结论:不重要)
Output Attempt 3
Step 1: Identify the purpose of the email. (步骤 1:确定邮件目的。)…Conclusion: (结论:)Based on the above factors, the email should be classified as IMPORTANT. (基于上述因素,邮件应分类为重要。)
你可以使用上面的提示并尝试看看它是否返回一致的分类。取决于你使用的模型和温度配置,它可能会返回“IMPORTANT”或“NOT IMPORTANT”。
通过生成许多思维链,并选取出现频率最高的答案(“IMPORTANT”),我们可以从 LLM 获得更一致正确的答案。
这个例子展示了如何利用自洽性提示,通过考虑多种视角并选择最一致的答案来提高 LLM 响应的准确性。

思维树 (Tree of Thoughts, ToT)

既然我们熟悉了思维链和自洽性提示,让我们回顾一下思维树 (ToT)[^12]。它概括了 CoT 提示的概念,因为它允许 LLM 同时探索多条不同的推理路径,而不仅仅是遵循单一的线性思维链。如图 1 所示。
图 1. 左侧是思维链提示的可视化,右侧是思维树提示的可视化
这种方法使得 ToT 特别适合需要探索的复杂任务。它的工作原理是维护一棵思维树,其中每个想法代表一个连贯的语言序列,作为解决问题的中间步骤。然后模型可以通过从树中的不同节点分支出来探索不同的推理路径。
有一个很棒的笔记本,它更详细地展示了基于论文“Large Language Model Guided Tree-of-Thought”的思维树 (ToT)。[^9]

ReAct (推理与行动)

推理与行动 (ReAct) [10][^13] 提示是一种范式,使 LLM 能够使用自然语言推理结合外部工具(搜索、代码解释器等)来解决复杂任务,允许 LLM 执行某些操作,例如与外部 API 交互以检索信息,这是迈向代理建模的第一步。
ReAct 模仿人类在现实世界中的操作方式,即我们进行口头推理并可以采取行动以获取信息。ReAct 在各种领域与其他提示工程方法相比表现良好。
ReAct 提示通过将推理和行动结合到一个思想-行动循环中来工作。LLM 首先对问题进行推理并生成行动计划。然后它执行计划中的行动并观察结果。然后 LLM 使用观察结果更新其推理并生成新的行动计划。这个过程持续进行,直到 LLM 达成问题的解决方案。
要在行动中看到这一点,你需要编写一些代码。在代码片段 1 中,我使用了 Python 的 langchain 框架,以及 VertexAI (google-cloud-aiplatform) 和 google-search-results pip 包。
要运行此示例,你必须从 https://serpapi.com/manage-api-key 创建一个(免费)SerpAPI 密钥并设置环境变量 SERPAPI_API_KEY
接下来让我们写一些 Python 代码,任务是让 LLM 弄清楚:有多少孩子有一个在 Metallica 乐队演出的著名父亲
Python 代码片段 1. 使用 LangChain 和 VertexAI 创建 ReAct 代理
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?"# (Metallica 乐队成员有多少个孩子?)llm = VertexAI(temperature=0.1) tools = load_tools(["serpapi"], llm=llm) agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) agent.run(prompt)
代码片段 2 显示了结果。注意 ReAct 进行了五次搜索的链式操作。实际上,LLM 正在抓取 Google 搜索结果以弄清楚乐队名称。然后,它将结果列为观察结果,并为下一次搜索链接思维。
代码片段 2. 在终端中执行 ReAct 代理
Unset > 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 存储库中的笔记本[^14],其中包含更详细的示例,展示了实际的 LLM 输入和输出。

自动提示工程 (Automatic Prompt Engineering)

此时你可能会意识到编写提示可能很复杂。如果能自动化这个过程(编写提示来编写提示)不是很好吗?嗯,有一种方法:自动提示工程 (APE)。这种方法[^15] 不仅减轻了对人类输入的需求,还增强了模型在各种任务中的性能。
你将提示一个模型生成更多提示。评估它们,可能会修改好的。然后重复。
例如,你可以使用自动提示工程来帮助训练商品 T 恤网店的聊天机器人。我们想弄清楚客户在购买乐队商品 T 恤时可能会用哪些方式来表述他们的订单。
  1. 编写将生成输出变体的提示。在这个例子中,我使用 gemini-pro 生成 10 条指令。见表 15:
表 15. 使用 LLM 生成提示
属性
内容
Prompt
We have a band merchandise t-shirt webshop, and to train a chatbot we need various ways to order: “One Metallica t-shirt size S”. Generate 10 variants, with the same semantics but keep the same meaning.(我们要开一家乐队商品 T 恤网店,为了训练聊天机器人,我们需要各种下单方式:“一件 Metallica T 恤 S 码”。生成 10 个变体,语义相同但保持意思不变。)
Output
1. I’d like to purchase a Metallica t-shirt in size small.2. Can I order a small-sized Metallica t-shirt?3. I’d like to buy one Metallica t-shirt in small.4. One Metallica shirt, size small, please.5. I want one Metallica t-shirt in size small.6. I’d like to place an order for one Metallica t-shirt in small.7. Small Metallica t-shirt, one please.8. I’m looking for one Metallica t-shirt in small.9. Can you get me one Metallica t-shirt in small?10. One Metallica small t-shirt, please.
  1. 通过根据选定的指标对候选者进行评分来评估所有指令候选者,例如,你可以使用 BLEU (Bilingual Evaluation Understudy) 或 ROUGE (Recall-Oriented Understudy for Gisting Evaluation)。
  1. 选择评估分数最高的指令候选者。该候选者将成为你可以在软件应用程序或聊天机器人中使用的最终提示。你也可以调整选定的提示并再次评估。

代码提示 (Code prompting)

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

编写代码的提示 (Prompts for writing code)

Gemini 也可以成为开发人员,帮助你用任何选择的编程语言编写代码。作为开发人员,这可以帮助你加快编写代码的过程。
想象一下你机器上的一个文件夹,里面有数百个文件需要重命名。重命名每个文件会花费你很多时间。你懂一点 Bash,并且可以编写一个脚本来自动化这个过程,但这可能也需要一段时间。所以让我们写一个提示。你可以在公共消费者聊天机器人 Gemini 中编写提示,或者如果你更关心保密性,你可以在你的 Google Cloud 帐户中编写这些提示并打开 Vertex AI Studio。Vertex AI Studio 的优势在于你可以配置温度等。
表 16. 使用 Gemini 编写代码
属性
内容
Name
1_bash_rename_files_in_folder
Goal
Write a prompt to write code in Bash to rename files in a folder. (编写一个提示以在 Bash 中编写代码来重命名文件夹中的文件。)
Model
gemini-pro
Temperature
0.1
Token Limit
1024
Top-K
N/A
Top-P
1
Prompt
Write a code snippet in Bash, which asks for a folder name. Then it takes the contents of the folder and renames all the files inside by prepending the name draft to the file name.(用 Bash 编写一个代码片段,要求输入文件夹名称。然后它获取文件夹的内容并通过在文件名前加上名称 draft 来重命名里面的所有文件。)
Output
```bash#!/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 (通过在文件名前加上 “draft” 重命名每个文件)for file in “${files[@]}"; do
new_file_name="draft_$(basename”$file")"
mv "$file” “$new_file_name”doneecho “Files renamed successfully.”```
这对我来说似乎是很好的代码——它甚至有文档记录!然而,由于 LLM 不能推理,并且重复训练数据,因此首先阅读和测试你的代码至关重要。
我们都在等待的那一刻,它真的有效吗?
让我们先用一个只包含几个文件的测试文件夹来尝试一下,这些文件需要从 filename.txt 重命名为 draft_filename.txt
  1. 复制表 16 中的输出(不带 ```bash ``` 文本包装器),并将其粘贴到一个名为:“rename_files.sh”的新文件中。
  1. 打开终端窗口并输入:. rename_files.sh。它会要求输入文件夹名称,例如 test 并按回车。
  1. 脚本似乎运行良好。你会看到消息:Files renamed successfully(文件重命名成功)。当你查看测试文件夹时,注意所有文件都被完美地重命名为 draft_filename.txt
它成功了!

解释代码的提示 (Prompts for explaining code)

作为开发人员,当你在团队中工作时,你必须阅读别人的代码。Gemini 也可以在这方面帮助你。让我们取表 16 中的代码输出,删除注释并要求大型语言模型解释发生了什么,见表 17:
表 17. 解释代码的提示
属性
内容
Prompt
Explain to me the below Bash code:```#!/bin/bashecho “Enter the folder name:”read folder_name…```(向我解释下面的 Bash 代码:…)
Output
This Bash script performs the following tasks: (此 Bash 脚本执行以下任务:)1. User Input (用户输入):- It prompts the user to enter a folder name… (它提示用户输入文件夹名称…)2. Folder Existence Check (文件夹存在性检查):- It checks if the folder with the specified name exists… (它检查具有指定名称的文件夹是否存在…)3. File Listing (文件列表):- It lists all the files inside the specified folder… (它列出指定文件夹内的所有文件…)4. File Renaming (文件重命名):- It iterates through each file… (它遍历每个文件…)5. Success Message (成功消息):- After renaming all the files… (重命名所有文件后…)

转换代码的提示 (Prompts for translating code)

表 16 中的 bash 代码似乎工作正常。然而,这个脚本如果能提示我输入文件名就可以真正重用,理想情况下它应该作为一个带有 UI 的独立应用程序工作。作为起点,Python 是比 Bash 更好的(Web)应用程序语言。LLM 可以帮助将代码从一种语言转换为另一种语言。见表 18 中的示例:
表 18. 将代码从 Bash 转换为 Python 的提示
属性
内容
Name
1_python_rename_files
Goal
Write a prompt to translate Bash code to Python (编写一个提示将 Bash 代码转换为 Python)
Prompt
Translate the below Bash code to a Python snippet.```bash…```(将下面的 Bash 代码转换为 Python 片段。)
Output
```pythonimport osimport shutil# Get the folder name from the user (从用户获取文件夹名称)folder_name = input(“Enter the folder name:”)# Check if the folder exists (检查文件夹是否存在)if not os.path.isdir(folder_name):print(“Folder does not exist.”) exit(1)# Get a list of all files in the folder (获取文件夹中所有文件的列表)files = os.listdir(folder_name)# Iterate over the files (遍历文件)for file in files: # Create a new file name with the prefix “draft_” (创建带有前缀 “draft_” 的新文件名) new_file_name = f”draft_{file}“# Move the file to the new name (将文件移动到新名称)shutil.move(os.path.join(folder_name, file), os.path.join(folder_name, new_file_name))# Print a success message (打印成功消息)print(”Files renamed successfully.”)```
阅读并审查代码。从提示中复制输出并将其粘贴到一个新文件中:file_renamer.py。通过打开终端窗口并执行命令 python file_renamer.py 来测试代码。
注意: 当在 Vertex AI 的 Language Studio 中提示(Python)代码时,你必须点击“Markdown”按钮。否则你将收到缺少正确行缩进的纯文本,这对运行 Python 代码很重要。

调试和审查代码的提示 (Prompts for debugging and reviewing code)

让我们手动对表 18 的代码进行一些编辑。它应该提示用户输入文件名前缀,并以大写字符写入此前缀。参见代码片段 3 中的示例代码,但这真糟糕。它现在返回 Python 错误!
代码片段 3. 一个损坏的 Python 脚本
import os import shutil folder_name = input("Enter the folder name: ") prefix = input("Enter the string to prepend to the filename: ") text = toUpperCase(prefix) # 错误行...
代码片段 4. 我弄坏了 Python 代码
Traceback (most recent call last): File “.../rename_files.py”, line 7, in <module> text = toUpperCase(prefix) NameError: name ‘toUpperCase’ is not defined
让我们看看能否要求大型语言模型调试和审查代码。见表 19:
表 19. 调试和审查 Python 代码的提示
属性
内容
Name
1_python_debug_code
Goal
Write a prompt to debug and review Python code. (编写一个提示来调试和审查 Python 代码。)
Prompt
The below Python code gives an error:Traceback (most recent call last):…NameError: name ‘toUpperCase’ is not definedDebug what’s wrong and explain how I can improve the code.```python…text = toUpperCase(prefix)…```(下面的 Python 代码给出了一个错误:…调试哪里出了问题并解释我如何改进代码。)
Output
The code calls the `toUpperCase` function to convert `prefix` to uppercase, but that function is not defined. To fix this issue, you can use the `upper()` method of the string class which converts a given string into uppercase. The modified code is shown below:(代码调用 `toUpperCase` 函数将 `prefix` 转换为大写,但该函数未定义。要解决此问题,你可以使用字符串类的 `upper()` 方法将给定字符串转换为大写。修改后的代码如下所示:)```python…text = prefix.upper()…```Additionally, there are a few other improvements that can be made to the code: (此外,代码还可以进行一些其他改进:)1. The file extension… (文件扩展名…)2. The code assumes… (代码假设…)3. Using the `f` string… (使用 `f` 字符串…)4. The code doesn’t handle errors… (代码不处理错误…)Here is the improved code with these suggestions: (这是带有这些建议的改进代码:)```python…```
这太棒了。它不仅告诉我如何解决问题,还弄清楚了我的代码有更多的错误以及如何解决它们。提示的最后一部分给出了一般改进代码的建议。

关于多模态提示? (What about multimodal prompting?)

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

最佳实践

找到正确的提示需要不断修补。Vertex AI 中的 Language Studio 是玩转提示的完美场所,能够针对各种模型进行测试。
使用以下最佳实践成为提示工程方面的专家。

提供示例 (Provide examples)

最重要的最佳实践是在提示中提供(单样本/少样本)示例。这非常有效,因为它作为一个强大的教学工具。这些示例展示了期望的输出或类似的响应,允许模型从中学习并相应地调整自己的生成。这就像给模型一个参考点或目标去瞄准,提高其响应的准确性、风格和语气,以更好地匹配你的期望。

设计力求简洁 (Design with simplicity)

提示应该简洁、清晰,并且对你和模型来说都易于理解。作为一个经验法则,如果它对你来说已经很混乱,那么对模型来说也可能很混乱。尽量不要使用复杂的语言,也不要提供不必要的信息。
示例:
修改前 (BEFORE):
I am visiting New York right now, and I’d like to hear more about great locations. I am with two 3 year old kids. Where should we go during our vacation?
(我现在正在访问纽约,我想听听更多关于好地方的信息。我带着两个 3 岁的孩子。我们假期应该去哪里?)
修改后 (AFTER REWRITE):
Act as a travel guide for tourists. Describe great places to visit in New York Manhattan with a 3 year old.
(充当游客的旅行指南。描述在纽约曼哈顿带 3 岁孩子游览的好地方。)
尝试使用描述动作的动词。这里有一组示例:
Act (扮演), Analyze (分析), Categorize (分类), Classify (归类), Contrast (对比), Compare (比较), Create (创建), Describe (描述), Define (定义), Evaluate (评估), Extract (提取), Find (查找), Generate (生成), Identify (识别), List (列出), Measure (测量), Organize (组织), Parse (解析), Pick (挑选), Predict (预测), Provide (提供), Rank (排名), Recommend (推荐), Return (返回), Retrieve (检索), Rewrite (重写), Select (选择), Show (展示), Sort (排序), Summarize (总结), Translate (翻译), Write (编写).

明确输出要求 (Be specific about the output)

明确期望的输出。简洁的指令可能不足以指导 LLM,或者可能太通用。在提示中提供具体的细节(通过系统或上下文提示)可以帮助模型关注相关内容,提高整体准确性。
示例:
DO (做):
Generate a 3 paragraph blog post about the top 5 video game consoles. The blog post should be informative and engaging, and it should be written in a conversational style.
(生成一篇关于前 5 名视频游戏机的 3 段博客文章。博客文章应该内容丰富且引人入胜,并且应该以对话风格编写。)
DO NOT (不要做):
Generate a blog post about video game consoles.
(生成一篇关于视频游戏机的博客文章。)

使用指令优于使用约束 (Use Instructions over Constraints)

指令和约束在提示中用于指导 LLM 的输出。
  • 指令 (instruction) 提供关于所需格式、风格或响应内容的明确说明。它指导模型应该做什么或产生什么。
  • 约束 (constraint) 是一组关于响应的限制或界限。它限制模型不应该做什么或避免什么。
越来越多的研究表明,在提示中专注于积极的指令比严重依赖约束更有效。这种方法与人类更喜欢积极指令而不是“不要做”列表的方式一致。
指令直接传达期望的结果,而约束可能会让模型猜测什么是允许的。它提供了灵活性并在定义的边界内鼓励创造力,而约束可能会限制模型的潜力。而且一列约束可能会相互冲突。
约束仍然有价值,但在某些情况下。为了防止模型生成有害或有偏见的内容,或者当需要严格的输出格式或风格时。
如果可能,使用积极的指令:与其告诉模型不要做什么,不如告诉它做什么。这可以避免混淆并提高输出的准确性。
DO (做):
Generate a 1 paragraph blog post about the top 5 video game consoles. Only discuss the console, the company who made it, the year, and total sales.
(生成一篇关于前 5 名视频游戏机的 1 段博客文章。只讨论游戏机、制造它的公司、年份和总销量。)
DO NOT (不要做):
Generate a 1 paragraph blog post about the top 5 video game consoles. Do not list video game names.
(生成一篇关于前 5 名视频游戏机的 1 段博客文章。不要列出视频游戏名称。)
作为最佳实践,从优先考虑指令开始,清楚地说明你希望模型做什么,并且只在为了安全、清晰或特定要求必要时使用约束。实验并迭代测试指令和约束的不同组合,以找到最适合你特定任务的方法,并记录这些。

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

要控制生成的 LLM 响应的长度,你可以在配置中设置最大标记限制,或者在提示中明确请求特定长度。例如:
“Explain quantum physics in a tweet length message.”
(用推文长度的信息解释量子物理学。)

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

要重用提示并使其更动态,请在提示中使用变量,这些变量可以针对不同的输入进行更改。例如,如表 20 所示,一个提供城市事实的提示。与其在提示中硬编码城市名称,不如使用变量。变量可以让你避免重复自己,从而节省时间和精力。如果你需要在多个提示中使用同一条信息,你可以将其存储在一个变量中,然后在每个提示中引用该变量。这在将提示集成到你自己的应用程序中时非常有意义。
表 20. 在提示中使用变量
属性
内容
Prompt
VARIABLES{city} = “Amsterdam”PROMPTYou are a travel guide. Tell me a fact about the city: {city}(变量{city} = “Amsterdam”提示你是旅行指南。告诉我关于城市:{city} 的一个事实)
Output
Amsterdam is a beautiful city full of canals, bridges, and narrow streets. It’s a great place to visit for its rich history, culture, and nightlife.(阿姆斯特丹是一个美丽的城市,充满了运河、桥梁和狭窄的街道。它是因其丰富的历史、文化和夜生活而值得一游的好地方。)

尝试不同的输入格式和写作风格 (Experiment with input formats and writing styles)

不同的模型、模型配置、提示格式、措辞和提交可以产生不同的结果。因此,尝试提示属性(如风格、措辞和提示类型(零样本、少样本、系统提示))非常重要。
例如,一个旨在生成关于革命性视频游戏机 Sega Dreamcast 的文本的提示,可以表述为问题陈述指令,从而产生不同的输出:
  • 问题: Sega Dreamcast 是什么,为什么它是一个如此革命性的游戏机?
  • 陈述: Sega Dreamcast 是世嘉在 1999 年发布的第六代视频游戏机。它……
  • 指令: 写一段话描述 Sega Dreamcast 游戏机并解释为什么它如此具有革命性。

对于分类任务的少样本提示,混合类别 (For few-shot prompting with classification tasks, mix up the classes)

一般来说,少样本示例的顺序应该并不重要。然而,在做分类任务时,确保你在少样本示例中混合了可能的响应类别。这是因为如果不这样做,可能会过拟合示例的特定顺序。通过混合可能的响应类别,你可以确保模型正在学习识别每个类别的关键特征,而不是简单地记住示例的顺序。这将导致在未见数据上具有更稳健和可泛化的性能。
一个好的经验法则是从 6 个少样本示例开始,并从那里开始测试准确性。

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

对你来说,掌握模型架构变更、增加的数据和功能是很重要的。尝试较新的模型版本并调整你的提示以更好地利用新的模型功能。像 Vertex AI Studio 这样的工具非常适合存储、测试和记录提示的各种版本。

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

除了提示输入格式外,还要考虑尝试输出格式。对于非创造性任务,如提取、选择、解析、排序、排名或分类数据,尝试以结构化格式(如 JSON 或 XML)返回输出。
从提取数据的提示中返回 JSON 对象有一些好处。在实际应用中,我不需要手动创建这种 JSON 格式,我已经可以按排序顺序返回数据(在处理日期时间对象时非常方便),但最重要的是,通过提示 JSON 格式,它强制模型创建一个结构并限制幻觉。
少样本提示部分的表 4 展示了一个关于如何返回结构化输出的示例。

与其他提示工程师一起实验 (Experiment together with other prompt engineers)

如果你处于必须想出一个好提示的情况,你可能想找几个人来进行尝试。当每个人都遵循最佳实践(如本章所列)时,你会看到所有不同提示尝试之间的性能差异。

CoT 最佳实践 (CoT Best practices)

对于 CoT 提示,将答案放在推理之后是必需的,因为推理的生成改变了模型在预测最终答案时获得的标记。
使用 CoT 和自洽性时,你需要能够从提示中提取最终答案,并将其与推理分开。
对于 CoT 提示,将温度设置为 0。
思维链提示基于贪婪解码,根据语言模型分配的最高概率预测序列中的下一个单词。一般来说,当使用推理得出一个最终答案时,很可能只有一个正确的答案。因此温度应始终设置为 0。

记录各种提示尝试 (Document the various prompt attempts)

最后这个技巧在本章前面已经提到过,但我们怎么强调都不为过:详细记录你的提示尝试,这样随着时间的推移,你可以了解哪些做得好,哪些做得不好。
提示输出在不同模型之间、不同采样设置之间,甚至同一模型的不同版本之间可能会有所不同。此外,即使是向同一模型发出相同的提示,输出句子的格式和措辞也可能出现微小的差异。(例如,如前所述,如果两个标记具有相同的预测概率,平局可能会被随机打破。这随后会影响后续预测的标记。)
我们建议创建一个包含表 21 作为模板的 Google Sheet。这种方法的优点是你有一个完整的记录,当你不可避免地要重新审视你的提示工作时——无论是在未来重新拾起它(你会惊讶于短暂休息后你会忘记多少),测试提示在不同版本模型上的性能,还是帮助调试未来的错误。
除了此表中的字段外,跟踪提示的版本(迭代)、一个捕捉结果是 OK/NOT OK/SOMETIMES OK(好/不好/有时好)的字段,以及一个捕捉反馈的字段也很有帮助。如果你足够幸运能使用 Vertex AI Studio,请保存你的提示(使用与文档中列出的相同的名称和版本)并在表中跟踪已保存提示的超链接。这样,你总是只需点击一下即可重新运行你的提示。
当在检索增强生成 (RAG) 系统上工作时,你还应该捕捉影响插入提示内容的 RAG 系统的特定方面,包括查询、分块设置、分块输出和其他信息。
一旦你觉得提示接近完美,就把它带到你的项目代码库中。在代码库中,将提示保存在与代码分开的文件中,以便于维护。最后,理想情况下你的提示是一个可操作化系统的一部分,作为提示工程师,你应该依靠自动化测试和评估程序来了解你的提示对任务的泛化程度。
提示工程是一个迭代的过程。制作和测试不同的提示,分析并记录结果。根据模型的性能改进你的提示。不断实验直到你获得期望的输出。当你更改模型或模型配置时,回去并继续尝试以前使用的提示。
表 21. 记录提示的模板
属性
内容
Name
[提示的名称和版本]
Goal
[一句话解释此尝试的目标]
Model
[所用模型的名称和版本]
Temperature
[0 - 1 之间的值]
Token Limit
[数字]
Top-K
[数字]
Top-P
[数字]
Prompt
[写下完整的提示]
Output
[写出输出或多个输出]

总结

本白皮书讨论了提示工程。我们学习了各种提示技术,例如:
* 零样本提示
* 少样本提示
* 系统提示
* 角色提示
* 上下文提示
* 后退提示
* 思维链
* 自洽性
* 思维树
* ReAct
我们甚至研究了如何自动化你的提示。
白皮书随后讨论了生成式 AI 的挑战,例如当你的提示不足时可能发生的问题。我们以关于如何成为更好的提示工程师的最佳实践作为结束。

尾注

  1. Google, 2023, Gemini by Google. Available at: https://gemini.google.com.
  1. Google, 2024, Gemini for Google Workspace Prompt Guide. Available at: https://inthecloud.withgoogle.com/gemini-for-google-workspace-prompt-guide/dl-cd.html.
  1. Google Cloud, 2023, Introduction to Prompting. Available at: https://cloud.google.com/vertex-ai/generative-ai/docs/learn/prompts/introduction-prompt-design.
  1. Google Cloud, 2023, Text Model Request Body: Top-P & top-K sampling methods. Available at: https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/text#request_body.
  1. Wei, J., et al., 2023, Zero Shot - Fine Tuned language models are zero shot learners. Available at: https://arxiv.org/pdf/2109.01652.pdf.
  1. Google Cloud, 2023, Google Cloud Model Garden. Available at: https://cloud.google.com/model-garden.
  1. Brown, T., et al., 2023, Few Shot - Language Models are Few Shot learners. Available at: https://arxiv.org/pdf/2005.14165.pdf.
  1. Zheng, L., et al., 2023, Take a Step Back: Evoking Reasoning via Abstraction in Large Language Models. Available at: https://openreview.net/pdf?id=3bq3jsvcQ1
  1. Wei, J., et al., 2023, Chain of Thought Prompting. Available at: https://arxiv.org/pdf/2201.11903.pdf.
  1. Google Cloud Platform, 2023, Chain of Thought and React. Available at: https://github.com/GoogleCloudPlatform/generative-ai/blob/main/language/prompts/examples/chain_of_thought_react.ipynb.
  1. Wang, X., et al., 2023, Self Consistency Improves Chain of Thought reasoning in language models. Available at: https://arxiv.org/pdf/2203.11171.pdf.
  1. Yao, S., et al., 2023, Tree of Thoughts: Deliberate Problem Solving with Large Language Models. Available at: https://arxiv.org/pdf/2305.10601.pdf.
  1. Yao, S., et al., 2023, ReAct: Synergizing Reasoning and Acting in Language Models. Available at: https://arxiv.org/pdf/2210.03629.pdf.
  1. Google Cloud Platform, 2023, Advance Prompting: Chain of Thought and React. Available at: https://github.com/GoogleCloudPlatform/applied-ai-engineering-samples/blob/main/genai-on-vertex-ai/advanced_prompting_training/cot_react.ipynb.
  1. Zhou, C., et al., 2023, Automatic Prompt Engineering - Large Language Models are Human-Level Prompt Engineers. Available at: https://arxiv.org/pdf/2211.01910.pdf.