推广 热搜: 采购方式  甲带  滤芯  气动隔膜泵  减速机  减速机型号  履带  带式称重给煤机  链式给煤机  无级变速机 

谷歌白皮书:提示工程

   日期:2026-01-12 10:03:09     来源:网络整理    作者:本站编辑    评论:0    
谷歌白皮书:提示工程

编者按:我们往往认为一切都取决于模型。GPT、Gemini、Deepseek、Kimi、Claude、LLaMA……仿佛魔法就蕴藏在它们之中。但如果事实并非(仅仅)如此呢?如果真正的区别在于你如何与它们沟通呢?这正是谷歌技术主管Lee Boonstra发表的这份文件的核心理念,它提供了一种与大语言模型有效沟通的方法。

提示工程
Prompt Engineering

作者: Lee Boonstra

Google

2025年2月(这本书实际是2014年10月左右写的)

第 2 页

致谢

内容贡献者
Michael Sherman, Yuan Cao, Erick Armbrust, Anant Nawalgaria, Antonio Gulli, Simone Cammel

策划与编辑
Antonio Gulli, Anant Nawalgaria, Grace Mollison

技术文档工程师
Joey Haymaker

设计师
Michael Lanning

第 3-5 页

目录

  • 简介 - 6
  • 提示工程 (Prompt Engineering) - 7
  • 大语言模型 (LLM) 输出配置 - 8
    • 输出长度 - 8
    • 采样控制 - 9
    • 温度 (Temperature) - 9
    • Top-K 和 Top-P - 10
    • 融会贯通 - 11
  • 提示技术 - 13
    • 系统提示 - 19
    • 角色提示 - 21
    • 上下文提示 - 23
    • 通用提示 / 零样本 (Zero shot) - 13
    • 单样本与少样本 (One-shot & Few-shot) - 15
    • 系统、上下文和角色提示 - 18
    • 后退提示 (Step-back prompting) - 25
    • 思维链 (Chain of Thought, CoT) - 29
    • 自洽性 (Self-consistency) - 32
    • 思维树 (Tree of Thoughts, ToT) - 36
    • ReAct (推理与行动) - 37
    • 自动提示工程 - 40
  • 代码提示 - 42
    • 编写代码的提示 - 42
    • 解释代码的提示 - 44
    • 转换代码的提示 - 46
    • 调试和审查代码的提示 - 48
  • 关于多模态提示? - 54
  • 最佳实践 - 54
    • 提供示例 - 54
    • 设计力求简洁 - 55
    • 对输出要求具体明确 - 56
    • 使用指令而非约束 - 56
    • 控制最大 Token 长度 - 58
    • 在提示中使用变量 - 58
    • 尝试不同的输入格式和写作风格 - 59
    • 对于分类任务的少样本提示,打乱类别顺序 - 59
    • 适应模型更新 - 60
    • 尝试输出格式 - 60
    • JSON 修复 - 61
    • 使用 Schema - 62
    • 与其他提示工程师共同实验 - 63
    • 思维链 (CoT) 最佳实践 - 64
    • 记录各种提示尝试 - 64
  • 总结 - 66
  • 尾注 - 68

第 6 页

简介

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

当考虑大语言模型(LLM)的输入和输出时,文本提示(有时伴随图像提示等其他模态)是模型用来预测特定输出的输入。你不需要成为数据科学家或机器学习工程师——每个人都可以编写提示词。然而,构建最有效的提示词可能很复杂。提示词的许多方面都会影响其有效性:你使用的模型、模型的训练数据、模型配置、你的用词、风格和语气、结构以及上下文都很重要。因此,提示工程是一个迭代的过程。不恰当的提示可能导致模棱两可、不准确的回答,并可能阻碍模型提供有意义的输出。

当你与 Gemini 聊天机器人聊天时,你基本上是在编写提示词。不过,本白皮书主要关注在 Vertex AI 中或通过使用 API 为 Gemini 模型编写提示词,因为通过直接向模型提示,你可以访问温度 (temperature) 等配置。

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

第 7 页

提示工程 (Prompt Engineering)

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

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

第 8 页

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

请随意参考 Google 的提示指南 [2, 3],其中包含简单有效的提示示例。

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

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

LLM 输出配置

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

输出长度

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

第 9 页

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

输出长度限制对于某些 LLM 提示技术尤为重要,例如 ReAct,如果不加限制,LLM 可能会在给出你想要的响应后继续发出无用的 Token。

请注意,生成更多的 Token 需要 LLM 进行更多的计算,导致更高的能耗和可能更慢的响应时间,从而导致更高的成本。

采样控制

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

温度 (Temperature)

温度控制 Token 选择的随机程度。较低的温度适用于期望更确定性响应的提示,而较高的温度可能导致更多样化或意想不到的结果。温度为 0(贪婪解码)是确定性的。

第 10 页

确定性意味着总是选择概率最高的 Token(尽管要注意,如果两个 Token 具有相同的最高预测概率,根据打破平局的实现方式,在温度为 0 时你可能并不总能得到相同的输出)。

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

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

Top-K 和 Top-P

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

Top-K 采样从模型的预测分布中选择前 K 个最可能的 Token。Top-K 越高,模型的输出就越有创意和多样化;Top-K 越低,模型的输出就越受限和实事求是。Top-K 为 1 相当于贪婪解码。

第 11 页

Top-P 采样选择累积概率不超过特定值 (P) 的前几个 Token。P 的值范围从 0(贪婪解码)到 1(LLM 词汇表中的所有 Token)。

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

融会贯通

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

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

如果温度不可用,则无论什么 Token 满足 Top-K 和/或 Top-P 标准,都将从中随机选择以产生单个下一个预测 Token。

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

第 12 页

如果你将温度设置为 0,Top-K 和 Top-P 变得无关紧要——最可能的 Token 成为下一个预测的 Token。如果你将温度设置得非常高(超过 1——通常达到 10),温度变得无关紧要,无论什么 Token 通过了 Top-K 和/或 Top-P 标准,都会被随机采样以选择下一个预测 Token。

如果你将 Top-K 设置为 1,温度和 Top-P 变得无关紧要。只有一个 Token 通过 Top-K 标准,该 Token 就是下一个预测的 Token。如果你将 Top-K 设置得非常高,比如 LLM 词汇表的大小,任何具有非零概率成为下一个 Token 的 Token 都将满足 Top-K 标准,没有一个会被剔除。

如果你将 Top-P 设置为 0(或非常小的值),大多数 LLM 采样实现将只考虑满足 Top-P 标准的最可能的 Token,使温度和 Top-K 无关紧要。如果你将 Top-P 设置为 1,任何具有非零概率成为下一个 Token 的 Token 都将满足 Top-P 标准,没有一个会被剔除。

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

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

警告: 你有没有见过以大量填充词结尾的回复?这也被称为“重复循环错误”,这是大语言模型中的一个常见问题,模型陷入循环,重复生成相同的(填充)词、短语或句子结构,通常由于不适当的温度和 Top-K/Top-P 设置而加剧。

第 13 页

这种情况在低温和高温设置下都可能发生,尽管原因不同。在低温下,模型变得过于确定性,严格坚持最高概率路径,如果该路径重新访问先前生成的文本,可能会导致循环。相反,在高温下,模型的输出变得过度随机,增加了随机选择的单词或短语偶然导致回到先前状态的概率,由于可用选项数量庞大而产生循环。在这两种情况下,模型的采样过程都会“卡住”,导致单调且无用的输出,直到填满输出窗口。解决这个问题通常需要仔细调整温度和 Top-K/Top-P 值,以找到确定性和随机性之间的最佳平衡。

提示技术

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

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

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

零样本提示是最简单的提示类型。它只提供任务的描述和一些供 LLM 开始的文本。此输入可以是任何内容:一个问题、故事的开头或说明。名称“零样本”代表“没有示例”。

第 14 页

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

下面使用的表格格式是记录提示的好方法。你的提示可能会在进入代码库之前经过多次迭代,因此以有纪律、结构化的方式跟踪你的提示工程工作非常重要。关于此表格格式、跟踪提示工程工作的重要性以及提示开发过程的更多信息,请参见本章后面的“最佳实践”部分(“记录各种提示尝试”)。

模型温度应设置为一个低数字,因为不需要创造力,我们使用 gemini-pro 默认的 Top-K 和 Top-P 值,这实际上禁用了这两个设置(参见上面的“LLM 输出配置”)。注意生成的输出。单词“disturbing”(令人不安)和“masterpiece”(杰作)应该会让预测稍微复杂一些,因为这两个词用在同一个句子里。

第 15 页

表 1. 零样本提示示例

名称
1_1_movie_classification
目标
将电影评论分类为正面、中立或负面。
模型
gemini-pro
温度
0.1
Token 限制
5
Top-K
N/A
Top-P
1
提示词
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》是一项令人不安的研究,揭示了如果允许人工智能不受控制地继续进化,人类将走向何方。我希望有更多像这部杰作一样的电影。
情感:)
输出
POSITIVE(正面)

当零样本不起作用时,你可以在提示中提供演示或示例,这就引出了“单样本”和“少样本”提示。

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

在为 AI 模型创建提示时,提供示例很有帮助。这些示例可以帮助模型理解你的要求。当你希望引导模型进入某种输出结构或模式时,示例特别有用。

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

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

第 16 页

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

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

表 2. 少样本提示示例

目标
将披萨订单解析为 JSON
模型
gemini-pro
温度
0.1
Token 限制
250
Top-K
N/A
Top-P
1
提示词
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"] }
(接下页...)

第 17 页

提示词 (续)
EXAMPLE:
Can I get a large pizza with tomato sauce, basil and mozzarella
JSON Response:
{ "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 响应:)
输出

{  "size": "large",  "type": "half-half",  "ingredients": [["cheese", "mozzarella"], ["tomato sauce", "ham", "pineapple"]] }

当你在为提示选择示例时,请使用与你想要执行的任务相关的示例。示例应该是多样化的、高质量的且写得很好的。一个小错误可能会使模型感到困惑,并导致不理想的输出。

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

第 18 页

系统、上下文和角色提示

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

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

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

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

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

第 19 页

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

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

系统提示

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

表 3. 系统提示示例

目标
将电影评论分类为正面、中立或负面。
模型
gemini-pro
温度
1
Token 限制
5
Top-K
40
Top-P
0.8
提示词
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》... 太令人不安了,我看不下去了。
情感:)
输出
NEGATIVE(负面)

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

第 20 页

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

目标
将电影评论分类为正面、中立或负面,返回 JSON。
模型
gemini-pro
温度
1
Token 限制
1024
Top-K
40
Top-P
0.8
提示词
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" | "NEGATIVE" | "NEUTRAL", "name": String }
MOVIE REVIEWS: { "movie_reviews": [MOVIE] }
JSON Response:
输出

{  "movie_reviews": [   {    "sentiment": "NEGATIVE",    "name": "Her"   }  ] }

第 21 页

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

系统提示对于安全性和毒性也非常有用。要控制输出,只需在提示中添加一行,如:“You should be respectful in your answer.”(你应该在回答中保持尊重)。

角色提示

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

例如,你可以通过角色提示让生成式 AI 模型成为图书编辑、幼儿园老师或励志演说家。一旦模型被分配了一个角色,你就可以给它特定于该角色的提示。例如,你可以提示老师制定一个他们可以复习的教案。请看表 5,模型在其中扮演旅行指南的角色。

第 22 页

表 5. 角色提示示例

目标
充当旅行指南并提供 3 个旅行建议
模型
gemini-pro
温度
1
Token 限制
1024
Top-K
40
Top-P
0.8
提示词
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."
(译:我希望你充当旅行指南。我会写信告诉你我的位置,你会建议我附近的 3 个游览地点。在某些情况下,我也会告诉你我要参观的地方类型。
我的建议:“我在阿姆斯特丹,我只想参观博物馆。”)
输出
Travel Suggestions:
1. Rijksmuseum: World-renowned museum, known for Dutch masterpieces like Rembrandt's "The Night Watch."...
2. Van Gogh Museum: Immerse yourself in the captivating works of Vincent van Gogh...
3. Stedelijk Museum Amsterdam: Discover modern and contemporary art from around the world...
(译:旅行建议:1. 荷兰国立博物馆... 2. 梵高博物馆... 3. 阿姆斯特丹市立博物馆...)

上面的示例展示了扮演旅行代理人角色的例子。如果你将角色更改为地理老师,你会注意到你会收到不同的响应。

为 AI 模型定义角色视角,就像给了它一个关于语气、风格和专注专长的蓝图,以提高输出的质量、相关性和有效性。

第 23 页

以下是一些我觉得有效的风格供你选择:
对抗性 (Confrontational)、描述性 (Descriptive)、直接 (Direct)、正式 (Formal)、幽默 (Humorous)、有影响力 (Influential)、非正式 (Informal)、鼓舞人心 (Inspirational)、有说服力 (Persuasive)

让我们改变表 6 中的提示,加入幽默和鼓舞人心的风格。

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

提示词
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:
1. Behold the Empire State of Mind: Ascend to the dizzying heights of the Empire State Building... Prepare to feel like King Kong...
2. Get Artsy-Fartsy at MoMA: Unleash your inner art aficionado...
3. Shop 'Til You Drop on Fifth Avenue: ...Brace yourself for sticker shock...
(译:旅行建议:
1. 注视帝国心态:登上帝国大厦令人眩晕的高度... 准备好感觉像金刚...
2. 在 MoMA 附庸风雅:释放你内心的艺术狂热者...
3. 在第五大道购物到手软:...准备好被价格标签吓一跳...)

上下文提示

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

第 24 页

表 7. 上下文提示示例

目标
为关于复古游戏的博客建议文章
模型
gemini-pro
温度
1
Token 限制
1024
Top-K
40
Top-P
0.8
提示词
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 个写文章的主题,并用几行文字描述这篇文章应该包含什么。)
输出
1. **The Evolution of Arcade Cabinet Design** (街机机柜设计的演变)...
2. **Blast From The Past: Iconic Arcade Games of The 80's** (过去的爆炸:80 年代的标志性街机游戏)...
3. **The Rise and Retro Revival of Pixel Art** (像素艺术的兴起和复古复兴)...

第 25 页

后退提示 (Step-back prompting)

Step-back® 提示是一种通过提示 LLM 首先考虑与手头特定任务相关的一般问题,然后将该一般问题的答案馈送到特定任务的后续提示中来提高性能的技术。这种“后退”允许 LLM 在尝试解决特定问题之前激活相关的背景知识和推理过程。

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

通过关注一般原则而不是具体细节,后退提示可以帮助减轻 LLM 响应中的偏见。

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

第 26 页

表 8. 传统提示示例

目标
为第一人称射击视频游戏的一个关卡写故事情节。
模型
gemini-pro
温度
1
Token 限制
1024
Top-K
40
Top-P
0.8
提示词
Write a one paragraph storyline for a new level of a first-person shooter video game that is challenging and engaging.
(译:为第一人称射击视频游戏的一个既具挑战性又引人入胜的新关卡写一段故事情节。)
输出
The level begins with the player's squad being ambushed in a dense urban area by a relentless enemy faction...
(译:该关卡开始于玩家的小队在人口稠密的市区遭到无情敌对派系的伏击...)

当你将温度设置为 1 时,你可能会得到各种关于故事情节的创意写作,但它也相当随机和通用。所以让我们退后一步:

第 27 页

表 9. 后退提示示例(第一步)

提示词
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 个虚构的关键设置有助于在第一人称射击视频游戏中构建具有挑战性和引人入胜的关卡故事情节?)
输出
1. **Abandoned Military Base** (废弃的军事基地)...
2. **Cyberpunk City** (赛博朋克城市)...
3. **Alien Spaceship** (外星飞船)...
4. **Zombie-Infested Town** (僵尸出没的小镇)...
5. **Underwater Research Facility** (水下研究设施)...

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

第 28 页

表 10. 结合后退提示的最终示例

提示词
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 个引人入胜的主题:[...列表...]。选取其中一个主题,为第一人称射击视频游戏的一个既具挑战性又引人入胜的新关卡写一段故事情节。)
输出
In the heart of a murky abyss, lies a dilapidated underwater research facility...
(译:在黑暗深渊的中心,坐落着一个破败的水下研究设施,它是人类野心及其灾难性后果的证明。笼罩在黑暗中,伴随着故障机器的嗡嗡声,并被淹死灵魂的回声所困扰... 玩家作为一名精英海军陆战队员... 被指派冒险进入这个水下恐怖领域...)

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

第 29 页

思维链 (Chain of Thought, CoT)

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

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

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

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

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

提示词
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 岁了。我的伴侣多大了?)
输出
63 years old(63 岁)

第 30 页

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

表 12. 思维链提示示例

提示词
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.
(译:...我的伴侣多大了?让我们一步一步思考。)
输出
1. Let's assume my current age is "x" years. (假设我现在 x 岁)
2. When I was 3 years old, my age was 3 years. (当我 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. (那时伴侣 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. (现在我 20 岁,增加了 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. (伴侣也增加了 17 岁)
6. Therefore, my partner's current age is 9+17=26 years. (因此伴侣是 26 岁)
So, my partner is 26 years old.

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

第 31 页

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

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

提示词
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 岁... 答案是 38。
问:当我 3 岁时...)
输出
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,编写描述以引导模型完成你会根据给定的产品标题做出的假设。”通常,任何可以通过“说出来”解决的任务都是思维链的好候选者。如果你能解释解决问题的步骤,请尝试思维链。

请参考托管在 Google Cloud Platform Github 存储库中的笔记本 [10],它将更详细地介绍 CoT 提示。

第 32 页

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

自洽性 (Self-consistency)

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

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

它遵循以下步骤:

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

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

第 33 页

表 14. 自洽性提示示例

提示词
EMAIL:
Hi, I have seen you use Wordpress for your website... I did notice a bug in the contact form... But for the rest it's a great website... 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.
(译:...我注意到联系表单有个 Bug... 随意把 Bug 留在网站上吧...
将上述邮件分类为重要或不重要。让我们一步一步思考并解释原因。)

第 34-35 页

输出 (尝试 1)
...Conclusion: IMPORTANT
(...结论:重要)
输出 (尝试 2)
...Conclusion: NOT IMPORTANT
(...结论:不重要)
输出 (尝试 3)
...Conclusion: IMPORTANT
(...结论:重要)

你可以使用上面的提示并尝试看看它是否返回一致的分类。取决于你使用的模型和温度配置,它可能会返回“IMPORTANT”或“NOT IMPORTANT”。

通过生成许多思维链,并采用最常出现的答案(“IMPORTANT”),我们可以从 LLM 获得更一致正确的答案。

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

第 36 页

思维树 (Tree of Thoughts, ToT)

现在我们熟悉了思维链和自洽性提示,让我们回顾一下思维树 (ToT)。[12] 它概括了 CoT 提示的概念,因为它允许 LLM 同时探索多个不同的推理路径,而不仅仅是遵循单一的线性思维链。如图 1 所示。

[图 1:左侧为思维链提示的可视化,右侧为思维树提示的可视化]

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

有一个很棒的笔记本,它更详细地展示了基于论文“大语言模型引导的思维树”的思维树 (ToT)。

第 37 页

ReAct (推理与行动)

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

ReAct 模仿人类在现实世界中的运作方式,因为我们进行口头推理并采取行动获取信息。ReAct 在各个领域的各种提示工程方法中表现良好。

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

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

第 38 页

要运行此示例,你必须从 serpapi.com 创建一个(免费)SerpAPI 密钥并设置环境变量 `SERPAPI_API_KEY`。

接下来让我们编写一些 Python 代码,让 LLM 弄清楚任务:有多少个孩子有一个在 Metallica 乐队演出的著名爸爸。

Pythonfrom langchain.agents import load_toolsfrom langchain.agents import initialize_agentfrom langchain.agents import AgentTypefrom langchain.llms import VertexAIprompt = "How many kids do the band members of Metallica have?"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)

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

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

第 39 页

> Entering new AgentExecutor chain...Metallica has 4 members. Action: SearchAction Input: How many kids does James Hetfield have?Observation: three childrenThought: 1/4 Metallica band members have 3 childrenAction: SearchAction Input: How many kids does Lars Ulrich have?Observation: 3Thought: 2/4 Metallica band members have 6 childrenAction: SearchAction 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 childrenAction: SearchAction Input: How many kids does Robert Trujillo have?Observation: 2Thought: 4/4 Metallica band members have 10 childrenFinal Answer: 10

片段 2. 在终端执行 ReAct 代理

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

实践中的 ReAct 提示需要理解你必须不断地重新发送先前的提示/响应(并修剪多余的生成内容),并使用适当的示例/指令设置模型。请参考托管在 Google Cloud Platform Github 存储库中的笔记本 [14],它更详细地展示了实际的 LLM 输入和输出以及更详尽的示例。

第 40 页

自动提示工程

在这一点上,你可能会意识到编写提示可能很复杂。如果能自动化这个过程(写一个提示来写提示)岂不是很好?好吧,有一种方法:自动提示工程 (APE)。这种方法 [15] 不仅减轻了人类输入的需要,而且还增强了模型在各种任务中的性能。

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

例如,你可以使用自动提示工程来帮助训练一个商品 T 恤网店的聊天机器人。我们想找出客户可能会用来购买乐队商品 T 恤的所有各种订单措辞。

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

第 41 页

表 15. 使用 LLM 生成提示

提示词
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 个变体,语义相同但保持相同的含义。)
输出
1I’d like to purchase a Metallica t-shirt in size small.2. Can I order a small-sized Metallica t-shirt?3I’d like to buy one Metallica t-shirt in small.4. One Metallica shirt, size small, please.5I want one Metallica t-shirt in size small.6I’d like to place an order for one Metallica t-shirt in small.7. Small Metallica t-shirt, one please.8I’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.

2. 通过根据选定的指标对候选者进行评分来评估所有候选指令。例如,你可以使用 BLEU(双语评估替补)或 ROUGE(面向回忆的要点评估替补)。

3. 选择评估分数最高的候选指令。此候选者将是你可以在软件应用程序或聊天机器人中使用的最终提示。你也可以调整选择的提示并再次评估。

第 42 页

代码提示

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

编写代码的提示

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

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

第 43 页

表 16. 使用 Gemini 编写代码

目标
编写一个提示以用 Bash 编写代码来重命名文件夹中的文件。
模型
gemini-pro
温度
0.1
Token 限制
1024
提示词
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 来重命名里面的所有文件。)
输出

#!/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 无法推理,并且重复训练数据,因此首先阅读和测试你的代码至关重要。

如果你在等待这一刻,它真的有效吗?

第 44 页

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

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

它成功了!

解释代码的提示

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

第 45 页

表 17. 解释代码的提示

目标
编写一个提示来解释 Bash 代码
提示词
Explain to me the below Bash code:
[...代码片段...]
(译:向我解释下面的 Bash 代码:...)
输出
This Bash script performs the following tasks:1. **User Input**:- It prompts the user to enter a folder name using the `echo` and `read` commands. The entered folder name is stored in the `folder_name` variable.2. **Folder Existence Check**:- It checks if the folder with the specified name exists using the `[ ! -“$folder_name” ]` condition. If the folder does not exist, it displays an error message (“Folder does not exist.”) and exits the script with an exit code of 1.3. **File Listing**:- It lists all the files inside the specified folder using the `files=( “$folder_name”/* )` command. This creates an array called `files` containing the paths to all the files in the folder.4. **File Renaming**:- It iterates through each file in the `files` array using a `for` loop.- For each file, it generates a new file name using the `new_file_name=”draft_$(basename “$file”)” ` command. This new file name is created by prefixing the original file name with the string “draft_”.- It then renames the file using the `mv “$file” “$new_file_name”` command, which moves the file to the new file name.5. **Success Message**:- After renaming all the files, it displays a success message (“Files renamed successfully.”) to indicate that the renaming operation was successful

第 46 页

转换代码的提示

表 16 中的 bash 代码似乎工作正常。然而,当它提示我输入文件名时,这个脚本真的可以重用,理想情况下它应该作为一个带有 UI 的独立应用程序工作。作为一个起点,Python 将是比 Bash 更好的(Web)应用程序语言。LLM 可以帮助将代码从一种语言翻译成另一种语言。参见表 18 中的示例:

第 47 页

表 18. 将代码从 Bash 转换为 Python 的提示

目标
编写一个提示将 Bash 代码转换为 Python
提示词
Translate the below Bash code to a Python snippet.
[...Bash 代码...]
(译:将下面的 Bash 代码翻译成 Python 片段。)
输出

import os import 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) # ...(接下页)

第 48 页

阅读并审查代码。从提示中复制输出并将其粘贴到一个名为 `file_renamer.py` 的新文件中。通过打开终端窗口并执行以下命令 `python file_renamer.py` 来测试代码。

注意: 当在 Vertex AI 的 Language Studio 中提示(Python)代码时,你必须点击“Markdown”按钮。否则你将收到缺少正确行缩进的纯文本,这对运行 Python 代码很重要。

调试和审查代码的提示

让我们手动对表 18 的代码进行一些编辑。它应该提示用户输入文件名前缀,并将此前缀写成大写字符。参见片段 3 中的示例代码,但这太糟糕了。它现在返回 Python 错误!

第 49 页

Pythonimport osimport shutilfolder_name = input("Enter the folder name: ")prefix = input("Enter the string to prepend to the filename: ")text = toUpperCase(prefix)if not os.path.isdir(folder_name):print("Folder does not exist.")exit(1)files = os.listdir(folder_name)for file in files:new_filename = f"{text}_{file}"shutil.move(os.path.join(folder_name, file), os.path.joi(folder_name, new_file_name))print("Files renamed successfully.")

片段 3. 一个损坏的 Python 脚本

哎呀!这看起来像一个 Bug:

The below Python code gives an error:Traceback (most recent call last): File “/Users/leeboonstra/Documents/test_folder/rename_files.py”, line 7in <module> text = toUpperCase(prefix)NameError: name ‘toUpperCase’ is not defined

片段 4. 我弄坏了 Python 代码

让我们看看能不能让大语言模型来调试和审查代码。请看表 19:

第 50-53 页

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

目标
编写一个提示来调试和审查 Python 代码。
提示词
The below Python code gives an error:
Traceback (most recent call last):...
NameError: name 'toUpperCase' is not defined
Debug what's wrong and explain how I can improve the code.
[...代码...]
(译:下面的 Python 代码报错... 调试出了什么问题并解释我如何改进代码。)
输出
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...
(译:代码调用 'toUpperCase' 函数将 'prefix' 转换为大写,但该函数未定义。要解决此问题,你可以使用字符串类的 'upper()' 方法...)

Additionally, there are a few other improvements that can be made to the code: (此外,代码还有一些其他可以改进的地方:)
1. The file extension of the new filenames is not kept... (新文件名的扩展名未保留...)
2. The code assumes that there are no spaces in the folder name... (代码假设文件夹名称中没有空格...)
3. Using the f-string syntax... (使用 f-string 语法...)
4. The code doesn't handle errors... (代码未处理错误...)

Here is the improved code with these suggestions: (这是包含这些建议的改进代码:)
[...改进后的代码...]

太棒了。它不仅告诉了我如何解决问题,还指出了我的代码有更多 Bug 以及如何解决它们。提示的最后部分给出了改进代码的一般建议。

第 54 页

关于多模态提示?

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

最佳实践

找到正确的提示需要反复试验。Vertex AI 中的 Language Studio 是一个完美的场所,可以针对各种模型测试你的提示。

使用以下最佳实践成为提示工程的专业人士。

提供示例

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

第 55 页

设计力求简洁

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

示例:

修改前: 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 岁的孩子。我们在假期应该去哪里?)

修改后: 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(编写)。

第 56 页

对输出要求具体明确

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

示例:

做: 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 段博客文章。博客文章应该内容丰富且引人入胜,并且应该以对话风格编写。)

不要做: Generate a blog post about video game consoles.(生成一篇关于视频游戏机的博客文章。)

使用指令而非约束

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

指令提供有关响应的所需格式、风格或内容的明确指示。它指导模型应该做什么或产生什么。

约束是对响应的一组限制或界限。它限制了模型不应该做什么或避免什么。

第 57 页

越来越多的研究表明,专注于积极的指令比严重依赖约束更有效。这种方法与人类比起一列不该做的事情更喜欢积极的指令是一致的。

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

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

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

做: ...Only discuss the console, the company who made it, the year, and total sales.(...仅讨论主机、制造它的公司、年份和总销量。)

不要做: ...Do not list video game names.(...不要列出视频游戏名称。)

作为最佳实践,首先确定指令的优先级,清楚地说明你希望模型做什么,并且仅在为了安全、清晰或特定要求所必需时才使用约束。实验并迭代以测试不同的指令和约束组合,以找到最适合你特定任务的组合,并记录这些内容。

第 58 页

控制最大 Token 长度

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

"Explain quantum physics in a tweet length message."(用一条推文的长度解释量子物理学。)

在提示中使用变量

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

表 20. 在提示中使用变量

提示词
VARIABLES
{city} = "Amsterdam"
PROMPT
You are a travel guide. Tell me a fact about the city: {city}
(译:变量 {city} = "阿姆斯特丹"。提示:你是一个旅行指南。告诉我一个关于 {city} 的事实。)
输出
Amsterdam is a beautiful city...(阿姆斯特丹是一个美丽的城市...)

第 59 页

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

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

例如,一个目标是生成关于革命性视频游戏机 Sega Dreamcast 的文本的提示,可以表述为问题、陈述或指令,从而产生不同的输出。

对于分类任务的少样本提示,打乱类别顺序

一般来说,你的少样本示例的顺序应该无关紧要。但是,在进行分类任务时,请确保在少样本示例中混合可能的响应类别。这是因为如果不这样做,你可能会过拟合示例的特定顺序。通过混合可能的响应类别,你可以确保模型正在学习识别每个类别的关键特征,而不是简单地记住示例的顺序。这将导致在未见数据上具有更鲁棒和通用的性能。

第 60 页

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

适应模型更新

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

尝试输出格式

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

从提取数据的提示中返回 JSON 对象有一些好处... 最重要的是,通过提示 JSON 格式,它强制模型创建一个结构并限制幻觉。

总之,使用 JSON 进行输出的好处:

  • 总是以相同的风格返回
  • 专注于你想要接收的数据
  • 减少幻觉的机会
  • 使其具有关系意识
  • 你会得到数据类型
  • 你可以对其进行排序

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

第 61 页

JSON 修复

虽然以 JSON 格式返回数据提供了许多优势,但并非没有缺点。JSON 的结构化性质虽然有利于解析和在应用程序中使用,但需要比纯文本多得多的 Token,导致处理时间增加和成本升高。此外,JSON 的冗长很容易消耗整个输出窗口,当生成因 Token 限制而突然切断时,这尤其成问题。这种截断通常会导致无效的 JSON,缺少关键的闭合大括号或括号,使输出无法使用。幸运的是,像 json-repair 库(在 PyPI 上可用)这样的工具在这些情况下可能非常有价值。这个库智能地尝试自动修复不完整或格式错误的 JSON 对象,使其成为处理 LLM 生成的 JSON 时的重要盟友,尤其是在处理潜在的截断问题时。

第 62 页

使用 Schema (模式)

使用结构化 JSON 作为输出是一个很好的解决方案。但是输入呢?虽然 JSON 非常适合构建 LLM 生成的输出,但它对于构建你提供的输入也非常有用。这就是 JSON Schema 发挥作用的地方。JSON Schema 定义了 JSON 输入的预期结构和数据类型。通过提供 Schema,你给了 LLM 一个关于它应该期望的数据的清晰蓝图,帮助它将注意力集中在相关信息上,并减少误解输入的风险。

这是一个简单的例子:

假设你想使用 LLM 为电子商务目录中的产品生成描述。你可以使用 JSON schema 定义产品的属性:

{ "type""object", "properties": { "name": { "type""string""description""Product name" }, "category": { "type""string""description""Product category" }, "price": { "type""number""format""float""description""Product price" }, "features": { "type""array", "items": { "type""string" }, "description""Key features of the product" }, "release_date": { "type""string""format""date""description""Date the product was released"} },

片段 5. 结构化输出 Schema 的定义

第 63 页

然后,你可以提供符合此 Schema 的实际产品数据作为 JSON 对象:

{ "name": "Wireless Headphones", "category": "Electronics", "price": 99.99, "features": [ "Noise cancellation", "Bluetooth 5.0", "20-hour battery life"], "release_date": "2023-10-27"}

片段 6. 来自 LLM 的结构化输出

通过预处理数据,且仅提供 Schema 和数据而不是完整的文档,你让 LLM 对产品的属性(包括其发布日期)有了清晰的理解,从而使其更有可能生成准确且相关的描述。这种结构化输入方法引导 LLM 关注相关字段,在处理大量数据或将 LLM 集成到复杂应用程序中时特别有价值。

与其他提示工程师共同实验

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

第 64 页

思维链 (CoT) 最佳实践

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

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

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

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

记录各种提示尝试

最后一条建议在本章之前已经提到过,但我们怎么强调都不为过:详细记录你的提示尝试,以便你可以随着时间的推移了解什么做得好,什么做得不好。

提示输出可能因模型、采样设置甚至同一模型的不同版本而异。此外,即使是对同一模型的相同提示,输出句子格式和选词也可能出现微小差异。

第 65 页

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

表 21. 记录提示的模板

名称
[提示的名称和版本]
目标
[对此尝试目标的简短解释]
模型
[所用模型的名称和版本]
温度
[0 - 1 之间的值]
Token 限制
[数字]
Top-K / Top-P
[数字]
提示词
[写出完整的提示]
输出
[写出输出或多个输出]

提示工程是一个迭代过程。制作和测试不同的提示,分析并记录结果。根据模型的性能改进你的提示。不断实验,直到达到预期的输出。

第 66 页

总结

本白皮书讨论了提示工程。我们学习了各种提示技术,例如:零样本提示、少样本提示、系统提示、角色提示、上下文提示、后退提示、思维链、自洽性、思维树、ReAct。

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

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

第 68 页

尾注与参考文献

1. Google, 2023, Gemini by Google. Available at: https://gemini.google.com

2. Google, 2024, Gemini for Google Workspace Prompt Guide [Google Workspace Gemini 提示指南]. Available at: https://inthecloud.withgoogle.com/gemini-for-google-workspace-prompt-guide/dl-cd.html

3. Google Cloud, 2023, Introduction to Prompting [提示简介]. Available at: https://cloud.google.com/vertex-ai/generative-ai/docs/learn/prompts/introduction-prompt-design

4. Google Cloud, 2023, Text Model Request Body: Top-P & top-K sampling methods [文本模型请求体:Top-P 和 Top-K 采样方法]. Available at: https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/text#request_body

5. Wei, J., et al., 2023, Zero Shot - Fine Tuned language models are zero shot learners [零样本 - 微调后的语言模型是零样本学习者]. Available at: https://arxiv.org/pdf/2109.01652.pdf

6. Google Cloud, 2023, Google Cloud Model Garden [Google Cloud 模型花园]. Available at: https://cloud.google.com/model-garden

7. Brown, T., et al., 2023, Few Shot - Language Models are Few Shot learners [少样本 - 语言模型是少样本学习者]. Available at: https://arxiv.org/pdf/2005.14165.pdf

8. 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

9. Wei, J., et al., 2023, Chain of Thought Prompting [思维链提示]. Available at: https://arxiv.org/pdf/2201.11903.pdf

10. Google Cloud Platform, 2023, Chain of Thought and React [思维链和 React]. Available at: https://github.com/GoogleCloudPlatform/generative-ai/blob/main/language/prompts/examples/chain_of_thought_react.ipynb

11. Wang, X., et al., 2023, Self Consistency Improves Chain of Thought reasoning in language models [自洽性提高了语言模型中的思维链推理]. Available at: https://arxiv.org/pdf/2203.11171.pdf

12. Yao, S., et al., 2023, Tree of Thoughts: Deliberate Problem Solving with Large Language Models [思维树:大语言模型的深思熟虑解决问题]. Available at: https://arxiv.org/pdf/2305.10601.pdf

13. Yao, S., et al., 2023, ReAct: Synergizing Reasoning and Acting in Language Models [ReAct:协同语言模型中的推理和行动]. Available at: https://arxiv.org/pdf/2210.03629.pdf

14. Google Cloud Platform, 2023, Advance Prompting: Chain of Thought and React [高级提示:思维链和 React]. Available at: https://github.com/GoogleCloudPlatform/applied-ai-engineering-samples/blob/main/genai-on-vertex-ai/advanced_prompting_training/cot_react.ipynb

15. 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

 
打赏
 
更多>同类资讯
0相关评论

推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  皖ICP备20008326号-18
Powered By DESTOON