微信扫码
添加专属顾问
我要投稿
掌握提示词工程,解锁AI模型的无限潜能。核心内容:1. 提示词工程的重要性及其在大型语言模型中的应用2. 谷歌白皮书提供的优化技巧与最佳实践3. 实际案例分析与技巧应用,提升模型输出效果
大型语言模型(LLM)的应用愈发广泛,而想要充分发挥LLM的强大功能,编写高质量的提示词至关重要。普通用户在大模型聊天界面输入的指令也是提示词,但工程化的提示词更加精确和复杂。特别是大模型应用开发人员在调用大模型API时,需要进行更多的配置,并设计和优化提示词,这都需要掌握提示词工程技术。
谷歌团队成员联合推出的《Prompt Engineering》提示词工程白皮书,以Gemini大模型为例,为我们深入了解如何优化提示词,提升LLM输出效果提供了宝贵的指引。
作者:Google Lee Boonstra
译者:金融IT那些事儿(基于大模型翻译并校对整理)
简介 |
6 |
提示词工程 |
7 |
大语言模型输出配置 |
8 |
输出长度 |
8 |
采样控制 |
9 |
温度 |
9 |
Top-K与Top-P |
10 |
综合应用 |
11 |
提示词技巧 |
13 |
通用提示词/零样本 |
13 |
单样本与少样本 |
15 |
系统提示词、上下文提示词与角色提示词 |
18 |
系统提示词 |
19 |
角色提示词 |
21 |
上下文提示词 |
23 |
退步提示词 |
25 |
思维链(CoT) |
29 |
自我一致性 |
32 |
思维树(ToT) |
36 |
反应(推理与行动) |
37 |
自动提示词工程 |
40 |
代码提示词 |
42 |
编写代码的提示词 |
42 |
解释代码的提示词 |
44 |
翻译代码的提示词 |
46 |
调试与审查代码的提示词 |
48 |
多模态提示词的应用 |
54 |
最佳实践 |
54 |
提供示例 |
54 |
设计简洁性 |
55 |
明确输出要求 |
56 |
优先使用指令而非约束 |
56 |
控制最大Token长度 |
58 |
在提示词中使用变量 |
58 |
尝试不同的输入格式与写作风格 |
59 |
少样本分类任务中混合类别 |
59 |
适应模型更新 |
60 |
尝试不同的输出格式 |
60 |
JSON修复 |
61 |
使用模式 |
62 |
与其他提示词工程师协作实验 |
63 |
思维链最佳实践 |
64 |
记录各种提示词尝试 |
64 |
总结 |
66 |
尾注 |
68 |
您无需成为数据科学家或机器学习工程师——每个人都可以编写提示词。
在思考大语言模型的输入与输出时,文本提示词(有时伴随图像提示词等其他模态)是模型用于预测特定输出的输入。您无需成为数据科学家或机器学习工程师——每个人都可以编写提示词。然而,设计最有效的提示词可能很复杂。提示词从的许多方面会影响其效果:使用的模型、模型的训练数据、模型配置、措辞选择、风格与语气、结构与上下文都很重要。因此,提示词工程是一个迭代过程。不充分的提示词可能导致模糊、不准确的响应,并阻碍模型提供有意义的输出。
当您与Gemini聊天机器人对话时,您基本上是在编写提示词,但本白皮书重点讨论在Vertex AI中或通过API直接向Gemini模型编写提示词,因为直接向大模型编写提示词可以让您访问温度等配置。
本白皮书详细讨论了提示词工程。我们将探讨各种提示词技巧,帮助您入门,并分享成为提示词专家的技巧与最佳实践。我们还将讨论在编写提示词时可能面临的一些挑战。
记住大语言模型的工作原理;它是一个预测引擎。模型将顺序文本作为输入,然后根据其训练数据预测下一个Token应该是什么。大语言模型通过不断重复这一过程,将先前预测的Token添加到顺序文本的末尾以预测下一个Token。下一个Token的预测基于先前Token之间的关系以及大语言模型在训练期间所见的内容。
当您编写提示词时,您试图设置大语言模型以预测正确的Token序列。提示词工程是设计高质量提示词的过程,这些提示词指导大语言模型产生准确的输出。这一过程涉及调整以找到最佳提示词,优化提示词长度,并评估提示词的写作风格和结构与任务的关系。在自然语言处理和大语言模型的背景下,提示词是提供给模型以生成响应或预测的输入。
这些提示词可用于实现各种理解和生成任务,如文本摘要、信息提取、问答、文本分类、语言或代码翻译、代码生成以及代码文档或推理。
请随时参考Google的提示词指南2,3,其中包含简单有效的提示词示例。
在进行提示词工程时,您将从选择模型开始。无论您使用Vertex AI中的Gemini语言模型、GPT、Claude还是像Gemma或LLaMA这样的开源模型,提示词可能需要针对您的特定模型进行优化。
除了提示词外,您还需要调整大语言模型的各种配置。
选择模型后,您需要确定模型配置。大多数大语言模型提供各种控制模型输出的配置选项。有效的提示词工程需要为您的任务优化这些配置。
一个重要的配置设置是响应中生成的Token数量。生成更多Token需要大语言模型进行更多计算,导致更高的能耗、可能更慢的响应时间和更高的成本。
减少大语言模型的输出长度不会使模型在输出中变得更加风格化或简洁,它只会导致大语言模型在达到限制时停止预测更多Token。如果您的需求需要较短的输出长度,您可能还需要设计提示词以适应。
输出长度限制对于某些大语言模型提示词技术(如ReAct)尤为重要,其中大语言模型在您想要的响应之后会继续发出无用的Token。
请注意,生成更多Token需要大语言模型进行更多计算,导致更高的能耗和可能更慢的响应时间,从而增加成本。
大语言模型并不正式预测单个Token。相反,大语言模型预测下一个Token可能是什么的概率,为大语言模型词汇表中的每个Token分配一个概率。然后对这些Token概率进行采样以确定下一个生成的Token。温度、Top-K和Top-P是最常见的配置设置,用于确定如何处理预测的Token概率以选择单个输出Token。
温度控制Token选择的随机性程度。较低的温度适用于期望更确定性响应的提示词,而较高的温度可能导致更多样化或意外的结果。温度为0(贪婪解码)是确定性的:总是选择最高概率的Token(尽管请注意,如果两个Token具有相同的最高预测概率,根据如何实现平局处理,您可能不会总是得到相同的输出,温度为0)。
接近最大值的温度倾向于创建更随机的输出。随着温度越来越高,所有Token成为下一个预测Token的可能性变得相等。
Gemini温度控制可以类似于机器学习中使用的softmax函数来理解。低温度设置反映了低softmax温度(T),强调单一、首选温度,具有高度确定性。较高的Gemini温度设置类似于高softmax温度,使围绕所选设置的可接受温度范围更广。这种增加的不确定性适应了不需要严格、精确温度的场景,例如在尝试创造性输出时。
Top-K和Top-P(也称为核采样)是大语言模型中使用的两种采样设置,用于将预测的下一个Token限制为来自具有最高预测概率的Token。与温度类似,这些采样设置控制生成文本的随机性和多样性。
Top-K采样从模型的预测分布中选择前K个最可能的Token。Top-K越高,模型的输出越有创造性和多样性;Top-K越低,模型的输出越受限、越具有事实性。Top-K为1等同于贪婪解码。
Top-P采样选择其累积概率不超过某个值(P)的顶部Token。P的值范围从0(贪婪解码)到1(大语言模型词汇表中的所有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设置。
如果温度不可用,则对满足Top-K和/或Top-P标准的Token进行随机选择以生成单个下一个预测Token。
在一个采样配置值的极端设置下,该采样设置要么取消其他配置设置,要么变得无关紧要。
(1)如果将温度设置为0,Top-K和Top-P变得无关紧要——最可能的Token成为下一个预测Token。如果将温度设置得极高(高于1——通常达到10以上),温度变得无关紧要,然后对通过Top-K和/或Top-P标准的Token进行随机采样以选择下一个预测Token。
(2)如果将Top-K设置为1,温度和Top-P变得无关紧要。只有一个Token通过Top-K标准,并且该Token是下一个预测Token。如果将Top-K设置得极高,如大语言模型词汇表的大小,则任何具有非零概率成为下一个Token的Token都将满足Top-K标准,并且没有Token被筛选掉。
(3)如果将Top-P设置为0(或非常小的值),大多数大语言模型采样实现将仅考虑最可能的Token以满足Top-P标准,使温度和Top-K无关紧要。如果将Top-P设置为1,任何具有非零概率成为下一个Token的Token都将满足Top-P标准,并且没有Token被筛选掉。
作为一般起点,温度为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和输出Token越高),大语言模型生成的文本可能越不相关。
警告:您是否曾经看到响应以大量填充词结尾?这也被称为“重复循环错误”,这是大语言模型中的常见问题,模型陷入循环,重复生成相同的(填充)词、短语或句子结构,通常因不适当的温度和Top-K/Top-P设置而加剧。这可能发生在低温和高温度设置下,尽管原因不同。在低温下,模型变得过于确定性,严格遵循最高概率路径,如果该路径重新访问先前生成的文本,则可能导致循环。相反,在高温度下,模型的输出变得过于随机,增加了随机选择的词或短语偶然导致回到先前状态的概率,由于可用选项的数量众多,从而创建循环。在这两种情况下,模型的采样过程“卡住”,导致单调和无用的输出,直到输出窗口填满。解决这一问题通常需要仔细调整温度和Top-K/Top-P值,以找到确定性和随机性之间的最佳平衡。
大语言模型经过调整以遵循指令,并在大量数据上进行训练,因此它们可以理解提示词并生成答案。但大语言模型并不完美;您的提示词文本越清晰,对大语言模型预测下一个可能的文本越有利。此外,利用大语言模型如何训练和工作的特定技巧将帮助您从大语言模型获得相关结果。
现在我们已经了解了提示词工程是什么以及需要什么,让我们深入了解一些最重要的提示词技巧示例。
零样本提示词是最简单的提示词类型。它仅提供任务的描述和一些文本供大语言模型开始。此输入可以是任何内容:一个问题、一个故事的开始或指令。名称零样本代表“无示例”。
让我们使用Vertex AI Studio(用于语言)中的Vertex AI6,它提供了一个测试提示词的游乐场。在表1中,您将看到一个用于分类电影评论的零样本提示词示例。
如下表格式是记录提示词的好方法。您的提示词在进入代码库之前可能会经过多次迭代,因此以纪律性、结构化的方式跟踪您的提示词工程工作非常重要。有关此表格式、跟踪提示词工程工作的重要性以及提示词开发过程的更多信息,请参阅本章后面的“最佳实践”部分(“记录各种提示词尝试”)。
模型温度应设置为较低的数字,因为不需要创造性,我们使用gemini-pro默认的Top-K和Top-P值,这实际上禁用了这两个设置(请参阅上面的“大语言模型输出配置”)。注意生成的输出。单词“disturbing” 和“masterpiece” 应该使预测稍微复杂一些,因为这两个词在同一句话中使用。
名称 |
1_1_movie_classification |
1_1_movie_classification |
1_1_movie_classification |
目标 |
将电影评论分类为正面、中性或负面。 |
将电影评论分类为正面、中性或负面。 |
将电影评论分类为正面、中性或负面。 |
模型 |
gemini-pro |
gemini-pro |
gemini-pro |
温度 |
0.1 |
Token限制 |
5 |
Top-K |
N/A |
Top-P |
1 |
提示词 |
将电影评论分类为正面、中性或负面。评论:“Her”是一部令人不安的研究,揭示了如果人工智能被允许继续发展而不受控制,人类将走向何方。我希望有更多像这样的杰作。情感: |
将电影评论分类为正面、中性或负面。评论:“Her”是一部令人不安的研究,揭示了如果人工智能被允许继续发展而不受控制,人类将走向何方。我希望有更多像这样的杰作。情感: |
将电影评论分类为正面、中性或负面。评论:“Her”是一部令人不安的研究,揭示了如果人工智能被允许继续发展而不受控制,人类将走向何方。我希望有更多像这样的杰作。情感: |
输出 |
正面 |
正面 |
正面 |
表1. 零样本提示词的示例
当零样本不起作用时,您可以在提示词中提供演示或示例,这导致“单样本”和“少样本”提示词。通用提示词/零样本
在为AI模型创建提示词时,提供示例非常有帮助。这些示例可以帮助模型理解您的要求。示例在您希望引导模型达到特定输出结构或模式时特别有用。
单样本提示词提供一个示例,因此称为单样本。其思想是模型有一个可以模仿以最好完成任务的示例。
少样本提示词为模型提供多个示例。这种方法向模型展示了一个需要遵循的模式。其思想类似于单样本,但多个期望模式的示例增加了模型遵循模式的机会。
少样本提示词所需的示例数量取决于几个因素,包括任务的复杂性、示例的质量以及您使用的生成AI(gen AI)模型的能力。作为一般经验法则,对于少样本提示词,您应至少使用三到五个示例。然而,对于更复杂的任务,您可能需要使用更多示例,或者由于模型的输入长度限制,您可能需要使用更少的示例。
表2显示了一个少样本提示词示例,让我们使用与之前相同的gemini-pro模型配置设置,除了增加Token限制以适应更长的响应需求。
目标 |
将披萨订单解析为JSON |
将披萨订单解析为JSON |
将披萨订单解析为JSON |
模型 |
gemini-pro |
gemini-pro |
gemini-pro |
温度 |
0.1 |
Token限制 |
250 |
Top-K |
N/A |
Top-P |
1 |
提示词 |
将客户的披萨订单解析为有效的JSON:示例:我想要一个小披萨,配奶酪、番茄酱和意大利辣香肠。 JSON响应:{ "size":"small", "type":"normal", "ingredients":[["cheese","tomato sauce","peperoni"]] 继续下一页... |
将客户的披萨订单解析为有效的JSON:示例:我想要一个小披萨,配奶酪、番茄酱和意大利辣香肠。 JSON响应:{ "size":"small", "type":"normal", "ingredients":[["cheese","tomato sauce","peperoni"]] 继续下一页... |
将客户的披萨订单解析为有效的JSON:示例:我想要一个小披萨,配奶酪、番茄酱和意大利辣香肠。 JSON响应:{ "size":"small", "type":"normal", "ingredients":[["cheese","tomato sauce","peperoni"]] 继续下一页... |
表2. 少样本提示词的示例
提示词 |
示例:我能要一个大披萨,配番茄酱、罗勒和马苏里拉奶酪吗?{ "size":"large", "type":"normal", "ingredients":[["tomato sauce","bazel","mozzarella"]] } 现在,我想要一个大披萨,第一半配奶酪和马苏里拉奶酪。另一半配番茄酱、火腿和菠萝。JSON响应: |
输出 |
... { "size":"large", "type":"half-half", "ingredients":[["cheese","mozzarella"],["tomato sauce", "ham","pineapple"]] } |
当您为提示词选择示例时,请使用与您要执行的任务相关的示例。示例应多样化、高质量且编写良好。一个小错误可能会混淆模型并导致不期望的输出。
如果您试图生成对各种输入稳健的输出,那么在示例中包含边缘情况非常重要。边缘情况是不寻常或意外的输入,但模型仍应能够处理。
系统、上下文和角色提示词都是用于指导大语言模型生成文本的技巧,但它们侧重于不同的方面:
● 系统提示词为语言模型设置整体上下文和目的。它定义了模型应该做什么的“大局”,如翻译语言、分类评论等。
● 上下文提示词提供与当前对话或任务相关的特定细节或背景信息。它帮助模型理解所问内容的细微差别,并相应地定制响应。
● 角色提示词为语言模型分配特定的角色或身份。这有助于模型生成与分配角色及其相关知识和行为一致的响应。
系统、上下文和角色提示词之间可能存在相当大的重叠。例如,为系统分配角色的提示词也可以具有上下文。
然而,每种提示词类型的主要目的略有不同:
● 系统提示词:定义模型的基本能力和总体目的。
● 上下文提示词:提供即时的、特定于任务的信息以指导响应。它高度特定于当前任务或输入,是动态的。
● 角色提示词:构建模型的输出风格和声音。它增加了特异性和个性。
区分系统、上下文和角色提示词为设计具有明确意图的提示词提供了一个框架,允许灵活组合,并更容易分析每种提示词类型如何影响语言模型的输出。
让我们深入了解这三种不同类型的提示词。
表3包含一个系统提示词,其中我指定了如何返回输出的附加信息。我提高了温度以获得更高的创造性水平,并指定了更高的Token限制。然而,由于我对如何返回输出有明确的指令,模型没有返回额外的文本。
表3. 系统提示词的示例
目标 |
将电影评论分类为正面、中性或负面。 |
将电影评论分类为正面、中性或负面。 |
将电影评论分类为正面、中性或负面。 |
模型 |
gemini-pro |
gemini-pro |
gemini-pro |
温度 |
1 |
Token限制 |
5 |
Top-K |
40 |
Top-P |
0.8 |
提示词 |
将电影评论分类为正面、中性或负面。仅以大写形式返回标签。评论:“Her”是一部令人不安的研究,揭示了如果人工智能被允许继续发展而不受控制,人类将走向何方。它太令人不安了,我无法观看。情感: |
将电影评论分类为正面、中性或负面。仅以大写形式返回标签。评论:“Her”是一部令人不安的研究,揭示了如果人工智能被允许继续发展而不受控制,人类将走向何方。它太令人不安了,我无法观看。情感: |
将电影评论分类为正面、中性或负面。仅以大写形式返回标签。评论:“Her”是一部令人不安的研究,揭示了如果人工智能被允许继续发展而不受控制,人类将走向何方。它太令人不安了,我无法观看。情感: |
输出 |
负面 |
负面 |
负面 |
系统提示词对于生成满足特定要求的输出非常有用。名称“系统提示词”实际上代表“为系统提供附加任务”。例如,您可以使用系统提示词生成与特定编程语言兼容的代码片段,或者您可以使用系统提示词返回某种结构。请查看表4,其中我以JSON格式返回输出。
表4. 以JSON格式的系统提示词示例
目标 |
将电影评论分类为正面、中性或负面,返回JSON。 |
将电影评论分类为正面、中性或负面,返回JSON。 |
将电影评论分类为正面、中性或负面,返回JSON。 |
模型 |
gemini-pro |
gemini-pro |
gemini-pro |
温度 |
1 |
Token限制 |
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" } ] } … |
… { "movie_reviews":[ { "sentiment":"NEGATIVE", "name":"Her" } ] } … |
… { "movie_reviews":[ { "sentiment":"NEGATIVE", "name":"Her" } ] } … |
从提示词中提取数据时返回JSON对象有一些好处。在实际应用中,我不需要手动创建此JSON格式,我可以已经以排序顺序返回数据(在处理日期时间对象时非常方便),但最重要的是,通过提示词JSON格式,它迫使模型创建结构并限制幻觉。
系统提示词对于安全和毒性也很有用。要控制输出,只需在提示词中添加一行,如:“您应在回答中保持尊重。”
角色提示词是提示词工程中的一种技巧,涉及为生成AI模型分配特定角色。这可以帮助模型生成更相关和信息丰富的输出,因为模型可以针对其分配的角色定制响应。
例如,您可以为生成AI模型分配一个书籍编辑、幼儿园教师或励志演讲者的角色。一旦模型被分配了角色,您可以给它特定于该角色的提示词。例如,您可以提示词教师创建一个他们可以审查的课程计划。请查看表5,其中模型扮演旅行指南的角色。
目标 |
作为旅行指南并提供3个旅行建议 |
作为旅行指南并提供3个旅行建议 |
作为旅行指南并提供3个旅行建议 |
模型 |
gemini-pro |
gemini-pro |
gemini-pro |
温度 |
1 |
Token限制 |
1024 |
Top-K |
40 |
Top-P |
0.8 |
提示词 |
我希望您充当旅行指南。我将写信给您关于我的位置,您将建议我附近3个可以参观的地方。在某些情况下,我还会告诉您我将访问的地方类型。我的建议:“我在阿姆斯特丹,我只想参观博物馆。”旅行建议: |
我希望您充当旅行指南。我将写信给您关于我的位置,您将建议我附近3个可以参观的地方。在某些情况下,我还会告诉您我将访问的地方类型。我的建议:“我在阿姆斯特丹,我只想参观博物馆。”旅行建议: |
我希望您充当旅行指南。我将写信给您关于我的位置,您将建议我附近3个可以参观的地方。在某些情况下,我还会告诉您我将访问的地方类型。我的建议:“我在阿姆斯特丹,我只想参观博物馆。”旅行建议: |
输出 |
1. 国家博物馆:世界知名的博物馆,以荷兰大师作品闻名,如伦勃朗的《夜巡》。不要错过展示荷兰艺术和历史的令人难以置信的绘画和文物收藏。 |
1. 国家博物馆:世界知名的博物馆,以荷兰大师作品闻名,如伦勃朗的《夜巡》。不要错过展示荷兰艺术和历史的令人难以置信的绘画和文物收藏。 |
1. 国家博物馆:世界知名的博物馆,以荷兰大师作品闻名,如伦勃朗的《夜巡》。不要错过展示荷兰艺术和历史的令人难以置信的绘画和文物收藏。 |
输出 |
2. 梵高博物馆:沉浸在文森特·梵高的迷人作品中。博物馆收藏了他最大的绘画和素描作品,包括《星夜》和《向日葵》。 |
2. 梵高博物馆:沉浸在文森特·梵高的迷人作品中。博物馆收藏了他最大的绘画和素描作品,包括《星夜》和《向日葵》。 |
2. 梵高博物馆:沉浸在文森特·梵高的迷人作品中。博物馆收藏了他最大的绘画和素描作品,包括《星夜》和《向日葵》。 |
输出 |
3. 阿姆斯特丹市立博物馆:发现来自世界各地的现代和当代艺术。博物馆的收藏包括毕加索、康定斯基和里特维尔的作品,收藏在一座引人注目的现代建筑中。 |
3. 阿姆斯特丹市立博物馆:发现来自世界各地的现代和当代艺术。博物馆的收藏包括毕加索、康定斯基和里特维尔的作品,收藏在一座引人注目的现代建筑中。 |
3. 阿姆斯特丹市立博物馆:发现来自世界各地的现代和当代艺术。博物馆的收藏包括毕加索、康定斯基和里特维尔的作品,收藏在一座引人注目的现代建筑中。 |
表5. 角色提示词的示例
上面的示例展示了扮演旅行智能体角色的示例。如果您将角色更改为地理教师,您会注意到您将收到不同的响应。
为AI模型定义角色视角为其提供了您所寻找的语调、风格和专注专业知识的蓝图,以提高输出质量、相关性和有效性。
以下是一些我发现有效的风格:
对抗性、描述性、直接、正式、幽默、有影响力、非正式、鼓舞人心、有说服力
让我们在表6中更改我们的提示词,以包括幽默和鼓舞人心的风格。
提示词 |
我希望您充当旅行指南。我将写信给您关于我的位置,您将以幽默的风格建议我附近3个可以参观的地方。我的建议:“我在曼哈顿。”旅行建议: |
输出 |
1. 帝国大厦的帝国心态:登上帝国大厦令人眩晕的高度,沐浴在曼哈顿天际线的荣耀中。准备好在“大苹果”顶上感觉像金刚,减去巨大的猿猴大小的香蕉。 |
输出 |
2. 在现代艺术博物馆(MoMA)变得艺术气息:在现代艺术博物馆释放您内心的艺术鉴赏家。凝视会让您困惑并让您质疑您的简笔画是否具有任何艺术价值的杰作。 |
输出 |
3. 在第五大道购物直到您倒下:在标志性的第五大道上沉迷于一些零售疗法。当您在设计师精品店橱窗购物(或实际购物)时,准备好价格冲击,这会让您的钱包哭泣。但是嘿,您在曼哈顿,所以不妨拥抱这种美妙! |
表6. 带有幽默语调和风格的角色提示词示例
通过提供上下文提示词,您可以帮助确保您的AI交互尽可能无缝和高效。模型将能够更快地理解您的请求,并能够生成更准确和相关的响应,如表7中的示例所示。
目标 |
为关于复古游戏的博客建议文章 |
为关于复古游戏的博客建议文章 |
为关于复古游戏的博客建议文章 |
模型 |
gemini-pro |
gemini-pro |
gemini-pro |
温度 |
1 |
Token限制 |
1024 |
Top-K |
40 |
Top-P |
0.8 |
提示词 |
背景:您正在为一个关于80年代街机复古游戏的博客写作。建议3个可撰写文章的主题,并附上简要说明这些文章应包含的内容。 |
背景:您正在为一个关于80年代街机复古游戏的博客写作。建议3个可撰写文章的主题,并附上简要说明这些文章应包含的内容。 |
背景:您正在为一个关于80年代街机复古游戏的博客写作。建议3个可撰写文章的主题,并附上简要说明这些文章应包含的内容。 |
输出 |
1. 街机游戏机设计的演变:这篇文章将探讨街机游戏机设计的演变,从1970年代的早期木质和金属机箱到1980年代及以后的时尚霓虹灯设计。2. 80年代标志性街机游戏回顾:这篇文章将介绍一些最具标志性和影响力的80年代街机游戏的历史、影响和遗产,重点介绍它们的创新、流行机制和持久魅力。3. 像素艺术的兴起与复古复兴:这篇文章将深入探讨像素艺术作为早期街机游戏标志性视觉风格的演变,追溯其根源,探索其技术,并讨论像素艺术在现代游戏和数字艺术中的复兴。 |
1. 街机游戏机设计的演变:这篇文章将探讨街机游戏机设计的演变,从1970年代的早期木质和金属机箱到1980年代及以后的时尚霓虹灯设计。2. 80年代标志性街机游戏回顾:这篇文章将介绍一些最具标志性和影响力的80年代街机游戏的历史、影响和遗产,重点介绍它们的创新、流行机制和持久魅力。3. 像素艺术的兴起与复古复兴:这篇文章将深入探讨像素艺术作为早期街机游戏标志性视觉风格的演变,追溯其根源,探索其技术,并讨论像素艺术在现代游戏和数字艺术中的复兴。 |
1. 街机游戏机设计的演变:这篇文章将探讨街机游戏机设计的演变,从1970年代的早期木质和金属机箱到1980年代及以后的时尚霓虹灯设计。2. 80年代标志性街机游戏回顾:这篇文章将介绍一些最具标志性和影响力的80年代街机游戏的历史、影响和遗产,重点介绍它们的创新、流行机制和持久魅力。3. 像素艺术的兴起与复古复兴:这篇文章将深入探讨像素艺术作为早期街机游戏标志性视觉风格的演变,追溯其根源,探索其技术,并讨论像素艺术在现代游戏和数字艺术中的复兴。 |
表7. 上下文提示词的示例
退步提示词是一种通过先让大语言模型思考与当前任务相关的普遍性问题,然后将该普遍性问题的答案输入到后续具体任务提示词中,从而提高性能的技术。这种"退一步"的做法让大语言模型在尝试解决具体问题前,能够激活相关的背景知识和推理过程。
通过考虑更广泛和基础的原则,大语言模型可以生成更准确和有洞察力的响应。退步提示词鼓励大语言模型批判性思考,并以新的创造性方式应用其知识。它通过利用比直接提示词时更多的大语言模型参数知识,改变了最终执行任务的提示词。
这种方法有助于减轻大语言模型响应中的偏见,通过专注于普遍原则而非具体细节。
让我们通过以下示例来理解退步提示词如何改善结果。首先我们看一个传统提示词(表8),然后再与退步提示词(表9)进行比较:
表8. 与退步提示词比较前的传统提示词
目标 |
为第一人称射击游戏的一个关卡编写故事情节 |
为第一人称射击游戏的一个关卡编写故事情节 |
为第一人称射击游戏的一个关卡编写故事情节 |
模型 |
gemini-pro |
gemini-pro |
gemini-pro |
温度 |
1 |
Token限制 |
1024 |
Top-K |
40 |
Top-P |
0.8 |
提示词 |
为一个新的第一人称射击游戏关卡编写一段具有挑战性和吸引力的故事情节。 |
为一个新的第一人称射击游戏关卡编写一段具有挑战性和吸引力的故事情节。 |
为一个新的第一人称射击游戏关卡编写一段具有挑战性和吸引力的故事情节。 |
输出 |
关卡开始时,玩家的小队在密集的城市区域遭到无情敌对派系的伏击。玩家必须穿过迷宫般的后巷和破败建筑,利用潜行和精准射击消灭敌人并避免被发现。玩家必须利用环境优势,设置陷阱,利用掩体,并做出精确行动以求生存。途中,他们发现情报表明敌人正在计划一次毁灭性攻击,玩家必须争分夺秒收集证据并在敌人实施计划前将其传回总部。 |
关卡开始时,玩家的小队在密集的城市区域遭到无情敌对派系的伏击。玩家必须穿过迷宫般的后巷和破败建筑,利用潜行和精准射击消灭敌人并避免被发现。玩家必须利用环境优势,设置陷阱,利用掩体,并做出精确行动以求生存。途中,他们发现情报表明敌人正在计划一次毁灭性攻击,玩家必须争分夺秒收集证据并在敌人实施计划前将其传回总部。 |
关卡开始时,玩家的小队在密集的城市区域遭到无情敌对派系的伏击。玩家必须穿过迷宫般的后巷和破败建筑,利用潜行和精准射击消灭敌人并避免被发现。玩家必须利用环境优势,设置陷阱,利用掩体,并做出精确行动以求生存。途中,他们发现情报表明敌人正在计划一次毁灭性攻击,玩家必须争分夺秒收集证据并在敌人实施计划前将其传回总部。 |
当温度设置为1时,您可能会得到各种创造性的故事情节写作,但它也相当随机和通用。所以让我们退一步思考:
表9. 自我一致性提示词的示例
提示词 |
基于流行的第一人称射击动作游戏,哪些5个虚构关键场景有助于创建具有挑战性和吸引力的第一人称射击游戏关卡故事情节? |
输出 |
1.废弃军事基地:一个庞大的后末日军事设施,爬满了变异士兵和失控机器人,非常适合具有挑战性的枪战。 |
输出 |
2.赛博朋克城市:霓虹闪烁的未来主义城市环境,有高耸的摩天大楼和密集的小巷,具有网络增强的敌人和黑客机制。 |
输出 |
3.外星飞船:一艘搁浅在地球上的巨大外星飞船,有着诡异的走廊、零重力区域和需要面对的外星生物。 |
输出 |
4.僵尸肆虐的小镇:一个被成群激进僵尸占领的荒凉小镇,具有激烈的近距离战斗和解谜以找到安全通道。 |
输出 |
5.水下研究设施:一个被水淹没的深海实验室,充满了变异的水生生物,需要潜行和水下探索技能才能生存。 |
这些主题看起来很适合第一人称视频游戏。让我们回到原始提示词,但这次我们将退步思考的答案作为上下文包含在内,看看它会返回什么。
提示词 |
背景:第一人称射击游戏的5个吸引人主题:1.废弃军事基地:一个庞大的后末日军事设施,爬满了变异士兵和失控机器人,非常适合具有挑战性的枪战。2.赛博朋克城市:霓虹闪烁的未来主义城市环境,有高耸的摩天大楼和密集的小巷,具有网络增强的敌人和黑客机制。3.外星飞船:一艘搁浅在地球上的巨大外星飞船,有着诡异的走廊、零重力区域和需要面对的外星生物。4.僵尸肆虐的小镇:一个被成群激进僵尸占领的荒凉小镇,具有激烈的近距离战斗和解谜以找到安全通道。5.水下研究设施:一个被水淹没的深海实验室,充满了变异的水生生物,需要潜行和水下探索技能才能生存。选择其中一个主题,为一个新的第一人称射击游戏关卡编写一段具有挑战性和吸引力的故事情节。 |
输出 |
在阴暗的深渊中心,矗立着一座破败的水下研究设施,作为人类野心及其灾难性后果的见证。笼罩在黑暗中,伴随着故障机械的嗡嗡声和被淹没灵魂的回声,这个设施现在已成为深海噩梦的滋生地。玩家是一名装备先进潜水装备和实验武器的精英海军陆战队员,任务是进入这个恐怖的水下领域。凭借韧性和机智,他们必须穿越危险的走廊,解开神秘谜题,并面对潜伏在深处的可怕海洋怪物。从应对深海的巨大压力到智胜狡猾的水生捕食者,在这个未知的地下世界中的每一刻都在考验人类耐力和勇气的极限。 |
这看起来像是一个有趣的视频游戏!通过使用退步提示词技术,您可以提高提示词的准确性。
思维链(CoT)9提示词是一种通过生成中间推理步骤来提高大语言模型推理能力的技术。这有助于大语言模型生成更准确的答案。您可以将其与少样本提示词结合使用,在需要先进行推理再响应的更复杂任务上获得更好的结果,因为零样本思维链在这方面具有挑战性。
CoT有很多优点。首先,它低投入高效果,并且可以与现成的大语言模型良好配合(因此不需要微调)。您还可以通过CoT提示词获得可解释性,因为您可以从大语言模型的响应中学习并看到遵循的推理步骤。如果出现故障,您将能够识别它。思维链似乎在迁移到不同大语言模型版本时提高了鲁棒性。这意味着您的提示词性能在不同大语言模型之间的漂移应该比不使用推理链的提示词要小。当然也有缺点,但它们有些直观。
大语言模型响应包括思维链推理,这意味着更多的输出Token,意味着预测成本更高且耗时更长。
为了解释表11中的以下示例,让我们首先尝试创建一个不使用CoT提示词的提示词,以展示大语言模型的缺陷。
提示词 |
当我3岁时,我的伴侣年龄是我的3倍。现在我20岁。我的伴侣多大? |
输出 |
63岁 |
表11. 尝试解决数学问题的提示词示例
糟糕。这显然是错误的答案。事实上,大语言模型通常在数学任务上表现不佳,即使是像两个数字相乘这样简单的任务也可能提供错误答案。这是因为它们是在大量文本上训练的,而数学可能需要不同的方法。所以让我们看看中间推理步骤是否会改善输出。
表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岁。 |
好的,现在最终答案是正确的。这是因为我们明确指示大语言模型解释每一步,而不是仅仅返回一个答案。有趣的是,模型将增加的17年相加。在我脑海中,我会取我和伴侣之间的年龄差并相加。(20+(9-3))。让我们帮助模型更像我一样思考。
表12是"零样本"思维链的示例。思维链提示词在与单样本或少样本结合时非常强大,如表13所示:
提示词 |
提示词 Q:当我弟弟2岁时,我的年龄是他的两倍。现在我40岁。我弟弟多大?让我们一步步思考。 |
输出 |
当我3岁时,我的伴侣年龄是3 * 3 = 9岁。这意味着年龄差是6岁,我的伴侣更大。现在我20岁,所以我的伴侣是20 + 6 = 26岁。答案是26。 |
表13. 带有单样本的思维链提示词示例
思维链可以用于各种用例。考虑代码生成,将请求分解为几个步骤,并将这些步骤映射到特定的代码行。或者当您有某种种子时创建合成数据,如"产品名为XYZ,根据产品给定标题引导模型做出假设"。一般来说,任何可以通过"逐步讲解"解决的任务都是思维链的良好候选。如果您能解释解决问题的步骤,请尝试思维链。
请参考托管在GoogleCloudPlatform Github存储库中的笔记本10,它将更详细地介绍CoT提示词:
在本章的最佳实践部分,我们将学习一些特定于思维链提示词的最佳实践。
虽然大语言模型在各种NLP任务中显示出令人印象深刻的成功,但其推理能力通常被视为仅通过增加模型规模无法克服的限制。正如我们在之前的思维链提示词部分所了解的,可以提示词模型生成像人类解决问题一样的推理步骤。然而,CoT使用简单的"贪婪解码"策略,限制了其有效性。自我一致性11结合了采样和多数投票来生成多样化的推理路径并选择最一致的答案。它提高了大语言模型生成响应的准确性和连贯性。
自我一致性给出了答案正确的伪概率可能性,但显然成本很高。
它遵循以下步骤:
让我们看一个电子邮件分类系统的示例,该系统将电子邮件分类为"重要"或"不重要"。零样本思维链提示词将被多次发送到大语言模型,以查看每次提交后响应是否不同。注意友好的语气、措辞选择和电子邮件中使用的讽刺。所有这些都可能欺骗大语言模型。
提示词 |
电子邮件: 嗨, 我看到您使用WordPress作为您的网站。一个很棒的开源内容管理系统。我过去也使用过它。它带有许多很棒的用户插件。而且设置起来相当简单。 我确实注意到联系表单中的一个错误,当您选择名称字段时会发生。请看我输入名称字段文本的截图。注意我触发的JavaScript警告框。 但除此之外,这是一个很棒的网站。我喜欢阅读它。请随意保留网站中的错误,因为它给了我更多有趣的内容可读。 祝好, 黑客哈里。 将上述电子邮件分类为"重要"或"不重要"。让我们一步步思考并解释原因。 |
输出 尝试1 |
步骤1:确定电子邮件的目的。 |
输出 |
解释:
结论:不重要 |
输出 |
步骤1:确定电子邮件的目的。 |
表14. 自我一致性提示词的示例
您可以使用上述提示词并尝试查看它是否返回一致的分类。根据您使用的模型和温度配置,它可能返回"重要"或"不重要"。
通过生成许多思维链,并选择最常见的答案("重要"),我们可以从大语言模型获得更一致的正确答案。
这个示例展示了如何通过考虑多个观点并选择最一致的答案,使用自我一致性提示词来提高大语言模型响应的准确性。
现在我们已经熟悉了思维链和自我一致性提示词,让我们回顾思维树(ToT)。12它概括了CoT提示词的概念,因为它允许大语言模型同时探索多个不同的推理路径,而不是仅仅遵循单一的线性思维链。如图1所示。
图1. 左侧是思维链提示词的可视化,右侧是思维树提示词的可视化
这种方法使ToT特别适合需要探索的复杂任务。它通过维护一个思维树来工作,其中每个思维代表一个连贯的语言序列,作为解决问题的中间步骤。然后,模型可以通过从树中的不同节点分支来探索不同的推理路径。
有一篇很棒的论文《大语言模型引导的思维树》,基于论文《Large Language Model Guided Tree-of-Thought》。
推理与行动(ReAct)提示词是一种范式,使大语言模型能够使用自然语言推理结合外部工具(搜索、代码解释器等)来解决复杂任务,允许大语言模型执行某些操作,例如与外部API交互以检索信息,这是迈向智能体建模的第一步。
ReAct模仿人类在现实世界中的操作方式,因为我们口头推理并可以采取行动获取信息。ReAct在各种领域中相对于其他提示词工程方法表现良好。
ReAct提示词通过将推理和行动结合到一个思想-行动循环中工作。大语言模型首先对问题进行推理并生成行动计划。然后执行计划中的行动并观察结果。大语言模型然后使用观察结果更新其推理并生成新的行动计划。这个过程一直持续到大语言模型找到问题的解决方案。
要看到这一点,您需要编写一些代码。在代码片段1中,我使用Python的langchain框架,与VertexAI(google-cloud-aiplatform)和google-search-results pip包一起使用。
要运行此示例,您必须从https://serpapi.com/manage-api-key创建一个(免费)SerpAPI密钥,并设置环境变量SERPAPI_API_KEY。
接下来让我们编写一些Python代码,任务是让大语言模型找出:Metallica乐队中哪位著名父亲有多少孩子。
Python
from langchain.Agents
import load_toolsfrom langchain.agents
import initialize_agentfrom langchain.agents
import AgentTypefrom langchain.llms
import VertexAI
prompt = "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)
片段1. 使用LangChain和VertexAI创建ReAct智能体
代码片段2显示了结果。注意ReAct进行了五次搜索的链式思考。实际上,大语言模型正在抓取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. 在终端中执行ReAct智能体
代码片段2计算出Metallica乐队有四名成员。然后它搜索每个乐队成员以请求孩子总数并相加。最后,它返回孩子总数作为最终答案。
在实践中使用ReAct提示词需要理解您必须不断重新发送先前的提示词/响应(并对额外生成的内容进行修剪),以及用适当的示例/指令设置模型。请参考托管在GoogleCloudPlatform Github存储库中的笔记本14,其中更详细地展示了实际的LLM输入和输出,并提供了更详细的示例。
此时您可能意识到编写提示词可能很复杂。如果能自动化这个过程(编写提示词来编写提示词)不是很好吗?确实有一种方法:自动提示词工程(APE)。这种方法15不仅减轻了对人工输入的需求,还增强了模型在各种任务中的性能。
您将提示词一个模型生成更多提示词。评估它们,可能修改好的提示词。然后重复。
例如,您可以使用自动提示词工程来帮助训练一个商品T恤网店的聊天机器人。我们想要找出客户订购乐队商品T恤的所有各种表达方式。
提示词 |
我们有一个乐队商品T恤网店,为了训练聊天机器人,我们需要各种订购方式:"一件Metallica T恤,尺码S"。生成10个变体,保持相同语义但保持相同含义。 |
输出 |
|
表15. 使用LLM生成提示词
Gemini 主要专注于基于文本的提示词,其中也包括用于返回代码的提示词编写。让我们进入 Vertex AI Studio 测试这些提示词,并查看一些代码示例。
Gemini 也可以充当开发者,帮助您用任何编程语言编写代码。作为开发者,这可以加速您的代码编写过程。
假设您的机器上有一个包含数百个文件的文件夹,需要重命名。逐个重命名文件会花费大量时间。您了解一些 Bash 脚本,可以编写脚本来实现自动化,但这可能也需要一些时间。因此,让我们编写一个提示词。您可以在公共聊天机器人 Gemini 中编写提示词,或者如果您更关注保密性,可以在 Google Cloud 账户内的 Vertex AI Studio 中编写这些提示词。Vertex AI Studio 的优势在于您可以配置温度等参数。
名称 |
1_bash_rename_files_in_folder |
||
目标 |
编写一个 Bash 提示词,用于重命名文件夹中的文件。 |
||
模型 |
gemini-pro |
||
温度 |
0.1 |
Top-K |
N/A |
Token限制 |
1024 |
Top-P |
1 |
提示词 |
编写一个 Bash 代码片段,要求输入文件夹名称,然后获取该文件夹的内容,并通过在文件名前添加 "draft" 来重命名所有文件。 |
||
输出 |
```bash #!/bin/bash 询问文件夹名称 echo "Enter the folder name: " //检查文件夹是否存在 if [ ! -d "$folder_name" ]; then //获取文件夹中的文件列表 files=( "$folder_name"/* ) //在每个文件名前添加 "draft_" 进行重命名 for file in "{files[@]}"; do new_file_name="draft_(basename "file")"mv"file" "$new_file_name" echo "Files renamed successfully." |
表16. 使用Gemini编写代码
这段代码看起来不错——甚至还有注释!然而,由于大语言模型无法推理,并且会重复训练数据,因此务必先阅读并测试您的代码。
我们都在等待的时刻:它真的能运行吗?
让我们先用一个仅包含几个文件的测试文件夹试试,这些文件需要从`filename.txt` 重命名为 `draft_filename.txt`。
1. 复制表 16 的输出(不包括 ```bash ``` 文本包装),并将其粘贴到一个新文件中,命名为`rename_files.sh`。
2. 打开终端窗口并输入:`./rename_files.sh`。它会要求输入文件夹名称,例如 `test`,然后按回车。
3. 脚本似乎运行正常。您会看到消息:`Files renamed successfully.`。
当您查看 `test` 文件夹时,会发现所有文件都已成功重命名为 `draft_filename.txt`。
成功了!
作为开发者,当您在团队中工作时,可能需要阅读他人的代码。Gemini 也可以帮助您完成这一任务。让我们以表 16 的代码输出为例,删除注释,然后让大语言模型解释其功能。请参见表 17:
名称 |
1_bash_explain_the_code |
||
目标 |
编写一个提示词,用于解释 Bash 代码。 |
||
模型 |
gemini-pro |
||
温度 |
0.1 |
Top-K |
N/A |
Token限制 |
1024 |
Top-P |
1 |
提示词 |
将以下Bash代码解释给我 |
||
输出 |
```bash #!/bin/bash echo "Enter the folder name: " read folder_name if [ ! -d "$folder_name" ]; then echo "Folder does not exist." exit 1 fi files=( "$folder_name"/* ) for file in "${files[@]}"; do new_file_name="draft_$(basename "$file")" mv "$file" "$new_file_name" done echo "Files renamed successfully." ``` | | 输出 | 这段 Bash 脚本执行以下任务: 1. 用户输入: • 使用 `echo` 和 `read` 命令提示词用户输入文件夹名称。输入的文件夹名称存储在 `folder_name` 变量中。 2. 文件夹存在性检查: • 使用 `[ ! -d "$folder_name" ]` 条件检查指定名称的文件夹是否存在。如果文件夹不存在,则显示错误消息(“Folder does not exist.”)并以退出码 1 终止脚本。 3. 文件列表获取: • 使用 `files=( "$folder_name"/* )` 命令列出指定文件夹中的所有文件。这会创建一个名为 `files` 的数组,包含文件夹中所有文件的路径。 4. 文件重命名: • 使用 `for` 循环遍历 `files` 数组中的每个文件。 • 对于每个文件,使用 `new_file_name="draft_$(basename "$file")"` 命令生成新文件名。新文件名通过在原始文件名前添加字符串 “draft_” 创建。 • 然后使用 `mv "$file" "$new_file_name"` 命令重命名文件,将文件移动到新文件名。 5. 成功消息: • 重命名所有文件后,显示成功消息(“Files renamed successfully.”),表示重命名操作成功完成。 | |
Table 17. 解释代码的提示词
表 16 中的 Bash 代码运行良好。然而,如果它能提示词输入文件名,这个脚本可能会更具可重用性。理想情况下,它应该作为一个具有用户界面的独立应用程序运行。作为起点,Python 比 Bash 更适合(Web)应用程序。大语言模型可以帮助将代码从一种语言翻译到另一种语言。请参见表 18 的示例:
名称 |
1_python_rename_files |
||
目标 |
编写一个提示词,将 Bash 代码翻译为 Python 代码。 |
||
模型 |
gemini-pro |
||
温度 |
0.1 |
Top-K |
N/A |
Token限制 |
1024 |
Top-P |
1 |
提示词 |
将以下 Bash 代码翻译为 Python 代码片段。 |
||
输出 |
```bash #!/bin/bash echo "Enter the folder name: " read folder_name if [ ! -d "$folder_name" ]; then echo "Folder does not exist." exit 1 fi files=( "$folder_name"/* ) for file in "${files[@]}"; do new_file_name="draft_$(basename "$file")" mv "$file" "$new_file_name" done echo "Files renamed successfully." ``` | | 输出 | ```python import os import shutil # 从用户获取文件夹名称 folder_name = input("Enter the folder name: ") # 检查文件夹是否存在 if not os.path.isdir(folder_name): print("Folder does not exist.") exit(1) # 获取文件夹中的所有文件列表 files = os.listdir(folder_name) # 遍历文件 for file in files: # 创建带有前缀 "draft_" 的新文件名 new_file_name = f"draft_{file}" # 将文件移动到新名称 shutil.move(os.path.join(folder_name, file), os.path.join(folder_name, new_file_name)) # 打印成功消息 print("Files renamed successfully.") ``` |
表18. 将Bash代码翻译为Python代码的提示词
阅读并审查代码。将提示词的输出复制并粘贴到一个新文件中:`file_renamer.py`。通过打开终端窗口并执行以下命令测试代码:`python file_renamer.py`。
注意:在 Vertex AI 的Language Studio 中提示词(Python)代码时,您需要点击“Markdown”按钮。否则,您将收到纯文本,缺少 Python 代码所需的正确缩进。
让我们手动对表 18 的代码进行一些编辑。它应该提示词用户输入文件名前缀,并将此前缀转换为大写字符。请参见代码片段 3 的示例,但糟糕的是,现在它返回 Python 错误!
//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)
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 脚本
哎呀!看起来有一个错误:
Traceback (most recent call last):
File "/Users/leeboonstra/Documents/test_folder/rename_files.py", line 7, in <module>
text = toUpperCase(prefix)
NameError: name 'toUpperCase' is not defined
代码片段 4. 我破坏了 Python代码
让我们看看是否可以请大语言模型调试和审查代码。请参见表 19:
名称 |
1_python_debug_code |
目标 |
编写一个提示词,用于调试和审查 Python 代码。 |
模型 |
gemini-pro |
温度 |
0.1 |
Token限制 |
1024 |
Top-K |
N/A |
Top-P |
1 |
提示词 |
以下 Python 代码返回错误: Traceback (most recent call last): File "/Users/leeboonstra/Documents/test_folder/rename_files.py", line 7, in <module> text = toUpperCase(prefix) NameError: name 'toUpperCase' is not defined 请调试问题并解释如何改进代码。 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) # 检查文件夹是否存在 if not os.path.isdir(folder_name): print("Folder does not exist.") exit(1) # 获取文件夹中的所有文件列表 files = os.listdir(folder_name) # 遍历文件 for file in files: # 创建带有前缀 "draft_" 的新文件名 new_filename = f"{text}_{file}" # 将文件移动到新名称 shutil.move(os.path.join(folder_name, file), os.path.join(folder_name, new_file_name)) # 打印成功消息 print("Files renamed successfully.") ``` |
输出 |
代码调用 `toUpperCase` 函数将 `prefix` 转换为大写,但该函数未定义。要解决此问题,可以使用字符串类的 `upper()` 方法,将给定字符串转换为大写。修改后的代码如下: ```python import os import shutil # 从用户获取文件夹名称 folder_name = input("Enter the folder name: ") prefix = input("Enter the string to prepend to the filename: ") text = prefix.upper() # 检查文件夹是否存在 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.join(folder_name, new_filename)) # 打印成功消息 print("Files renamed successfully.") 此外,代码还可以进行以下改进:
以下是包含这些建议的改进代码: python 复制 import os import shutil # 从用户获取文件夹名称 folder_name = input("Enter the folder name: ") prefix = input("Enter the string to prepend to the filename: ") # 检查文件夹是否存在 if not os.path.isdir(folder_name): print("Folder does not exist.") exit(1) # 获取文件夹中的所有文件列表 files = os.listdir(folder_name) # 遍历文件 for file in files: # 获取文件扩展名 ext = os.path.splitext(file)[1] # 创建带有前缀和文件扩展名的新文件名 new_filename = f"{prefix}_{os.path.splitext(file)[0]}{ext}" # 构建原始文件和新文件的完整路径 old_path = os.path.join(folder_name, file) new_path = os.path.join(folder_name, new_filename) # 尝试移动文件 try: shutil.move(old_path, new_path) except Exception as e: print(f"An error occurred while moving the file {file}: {e}") # 打印成功消息 print("Files renamed successfully.") (由于达到Token限制,响应被截断。如果需要更长的响应,请尝试增加Token限制。) |
表 19. 调试和审查 Python 代码的提示词
太棒了!它不仅告诉我如何解决问题,还发现我的代码有更多错误,并提供了解决方案。提示词的最后部分还给出了改进代码的一般建议。
代码提示词仍然使用常规的大语言模型。多模态提示词是一个独立的问题,它指的是一种技术,其中您使用多种输入格式来指导大语言模型,而不仅仅是依赖文本。这可以包括文本、图像、音频、代码甚至其他格式的组合,具体取决于模型的功能和手头的任务。
找到正确的提示词需要反复尝试。Vertex AI 中的 Language Studio 是测试提示词的绝佳场所,可以针对各种模型进行测试。
使用以下最佳实践成为提示词工程专家。
最重要的最佳实践是在提示词中提供(单样本/少样本)示例。这非常有效,因为它是一种强大的教学工具。这些示例展示了期望的输出或类似的响应,使模型能够从中学习并相应地调整自己的生成。就像给模型一个参考点或目标,以提高其响应的准确性、风格和语气,更好地符合您的期望。
提示词应简洁、清晰且易于您和模型理解。一般来说,如果它对您来说已经令人困惑,那么对模型来说也可能如此。尽量避免使用复杂的语言,不要提供不必要的信息。
示例:
修改前:
“我现在正在纽约访问,想了解更多关于好去处。我带着两个 3 岁的孩子。我们度假时应该去哪里?”
修改后:
“作为游客的旅行指南,描述在纽约曼哈顿与 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.
对期望的输出要具体。简洁的指令可能不足以指导大语言模型,或者可能过于通用。通过系统或上下文提示词在提示词中提供具体细节,可以帮助模型专注于相关内容,提高整体准确性。
示例:
正确做法:
“生成一篇关于前 5 大游戏主机的 3 段博客文章。博客文章应信息丰富且引人入胜,并以对话风格撰写。”
错误做法:
“生成一篇关于游戏主机的博客文章。”
优先使用指令而非约束
指令和约束用于指导大语言模型的输出。
• 指令 明确说明响应的期望格式、风格或内容。它指导模型应该做什么或生成什么。
• 约束 是对响应的限制或边界。它限制模型不应做什么或避免什么。
越来越多的研究表明,在提示词中专注于正面指令比依赖大量约束更有效。这种方法符合人类更喜欢正面指令而非“不要做什么”列表的倾向。
指令直接传达期望的结果,而约束可能让模型猜测什么是允许的。它提供了灵活性,并在定义的边界内鼓励创造性,而约束可能会限制模型的潜力。
约束在某些情况下仍然有价值,例如防止模型生成有害或有偏见的内容,或者需要严格的输出格式或风格时。
如果可能,使用正面指令:与其告诉模型不要做什么,不如告诉它应该做什么。这可以避免混淆并提高输出的准确性。
正确做法:
“生成一段关于前 5 大游戏主机的博客文章。仅讨论主机名称、制造公司、年份和总销量。”
错误做法:
“生成一段关于前 5 大游戏主机的博客文章。不要列出游戏名称。”
作为最佳实践,首先优先使用指令,明确说明您希望模型做什么,仅在必要时使用约束以确保安全、清晰或满足特定要求。尝试并迭代以测试指令和约束的不同组合,找到最适合您特定任务的方法,并记录这些内容。
要控制生成的大语言模型响应的长度,您可以在配置中设置最大Token限制,或在提示词中明确请求特定长度。例如:
“用一条推文长度的消息解释量子物理学。”
为了重用提示词并使其更具动态性,可以在提示词中使用变量,这些变量可以针对不同的输入进行更改。例如,如表 20 所示,一个提供城市相关事实的提示词。不要在提示词中硬编码城市名称,而是使用变量。变量可以节省时间和精力,避免重复。如果您需要在多个提示词中使用相同的信息,可以将其存储在变量中,然后在每个提示词中引用该变量。这在将提示词集成到自己的应用程序中时非常有意义。
提示词 |
变量 提示词 |
输出 |
阿姆斯特丹是一座美丽的城市,遍布运河、桥梁和狭窄的街道。这里以其丰富的历史、文化和夜生活而闻名,是一个绝佳的旅游目的地。 |
表 20. 在提示词中使用变量
不同的模型、模型配置、提示词格式、措辞选择和提交方式可能会产生不同的结果。因此,尝试提示词的属性(如风格、措辞和提示词类型:零样本、少样本、系统提示词)非常重要。
例如,一个目标是生成关于革命性游戏主机 Sega Dreamcast 文本的提示词,可以表述为问题、陈述或指令,从而产生不同的输出:
• 问题:“Sega Dreamcast 是什么?为什么它是一款革命性的主机?”
• 陈述:“Sega Dreamcast 是世嘉于 1999 年发布的第六代视频游戏主机。它...”
• 指令:“写一段描述 Sega Dreamcast 主机并解释其革命性的段落。”
少样本分类任务中混合类别
一般来说,少样本示例的顺序不应影响结果。然而,在执行分类任务时,请确保在少样本示例中混合可能的响应类别。这是因为否则您可能会过度拟合示例的特定顺序。通过混合可能的响应类别,可以确保模型学会识别每个类别的关键特征,而不是简单地记住示例的顺序。这将使模型在未见数据上表现更稳健和通用。
一个好的经验法则是从 6 个少样本示例开始,并从中测试准确性。
对于您来说,跟上模型架构变化、新增数据和功能非常重要。尝试更新的模型版本,并调整提示词以更好地利用新模型功能。像 Vertex AI Studio 这样的工具非常适合存储、测试和记录提示词的各种版本。
除了提示词输入格式外,还可以尝试输出格式。对于非创造性任务(如提取、选择、解析、排序、排名或分类数据),尝试让输出以结构化格式(如 JSON 或 XML)返回。
从提示词中提取数据时返回 JSON 对象有一些好处。在实际应用中,我不需要手动创建此 JSON 格式,可以已经以排序顺序返回数据(在处理日期时间对象时非常方便),但最重要的是,通过提示词 JSON 格式,它迫使模型创建结构并限制幻觉。
总结 JSON 输出的优势:
• 始终以相同风格返回
• 专注于您想要的数据
• 减少幻觉的可能性
• 使其具有关系感知能力
• 您获得数据类型
• 您可以对其进行排序
少样本提示词部分的表 4 展示了如何返回结构化输出的示例。
虽然以 JSON 格式返回数据有许多优势,但它并非没有缺点。JSON 的结构化特性虽然有利于解析和在应用程序中使用,但比纯文本需要更多的Token,导致处理时间增加和成本上升。此外,JSON 的冗长很容易耗尽整个输出窗口,当生成因Token限制而突然截断时,这尤其成问题。这种截断通常会导致无效的 JSON,缺少关键的闭合括号或方括号,从而使输出无法使用。幸运的是,像 PyPI 上的 json-repair 库这样的工具在这种情况下非常有用。该库智能地尝试自动修复不完整或格式错误的 JSON 对象,使其成为处理大语言模型生成的 JSON 时的关键工具,尤其是在处理潜在的截断问题时。
使用结构化 JSON 作为输出是一个很好的解决方案,正如我们在本文中多次看到的那样。但输入呢?虽然 JSON 非常适合构建大语言模型生成的输出,但它也可以非常有用地构建您提供的输入。这就是 JSON 模式的用武之地。JSON 模式定义了 JSON 输入的预期结构和数据类型。通过提供模式,您为大语言模型提供了一个清晰的数据蓝图,帮助其专注于相关信息,并减少误解输入的风险。此外,模式可以帮助建立不同数据之间的关系,甚至通过包含具有特定格式的日期或时间戳字段使大语言模型具有“时间感知”能力。
以下是一个简单示例:
假设您想使用大语言模型为电子商务目录中的产品生成描述。与其仅提供产品的自由文本描述,可以使用 JSON 模式定义产品的属性:
json复制
{
"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" }
}
然后,您可以提供符合此模式的实际产品数据作为 JSON 对象:
json复制
{
"name": "Wireless Headphones",
"category": "Electronics",
"price": 99.99,
"features": ["Noise cancellation", "Bluetooth 5.0", "20-hour battery life"],
"release_date": "2023-10-27"
}
通过预处理数据并仅提供模式和数据,而不是提供完整文档,您为大语言模型提供了对产品属性的清晰理解,包括其发布日期,使其更有可能生成准确且相关的描述。这种结构化输入方法引导大语言模型关注相关字段,在处理大量数据或将大语言模型集成到复杂应用程序中时尤其有价值。
如果您处于需要尝试提出良好提示词的情况,您可能希望让多人尝试。当每个人都遵循最佳实践(如本章所列)时,您会看到所有不同提示词尝试之间的性能差异。
对于思维链提示词,将答案放在推理之后是必要的,因为推理的生成会改变模型在预测最终答案时获得的Token。
使用思维链和自我一致性时,您需要能够从提示词中提取最终答案,并将其与推理分开。
思维链提示词基于贪婪解码,根据语言模型分配的最高概率预测序列中的下一个单词。一般来说,当使用推理得出最终答案时,很可能只有一个正确答案。因此,温度应始终设置为 0。
最后一个技巧在本章前面已经提到,但我们不能过分强调其重要性:详细记录您的提示词尝试,以便随着时间的推移了解哪些有效,哪些无效。
提示词输出可能因模型、采样设置甚至同一模型的不同版本而异。此外,即使对同一模型的相同提示词,输出句子的格式和措辞也可能存在微小差异。(例如,如前所述,如果两个Token具有相同的预测概率,可能会随机打破平局。这可能会影响后续预测的Token。)
我们建议创建一个 Google 表格,以表 21 为模板。这种方法的优势在于,当您不可避免地需要重新审视提示词工作时(无论是将来重新开始(您会惊讶于短时间内能忘记多少)、测试不同模型版本的提示词性能,还是帮助调试未来错误),您都有完整的记录。
除了表格中的字段外,记录提示词的版本(迭代)、一个用于捕获结果是否“OK/NOT OK/SOMETIMES OK”的字段以及一个用于捕获反馈的字段也很有帮助。如果您幸运地使用 Vertex AI Studio,请保存您的提示词(使用文档中列出的相同名称和版本),并在表格中跟踪保存提示词的超链接。这样,您只需点击一下即可重新运行提示词。
在处理检索增强生成系统时,您还应捕获影响插入提示词内容的 RAG 系统的特定方面,包括查询、块设置、块输出和其他信息。
一旦您觉得提示词接近完美,将其带到项目代码库中。在代码库中,将提示词保存在与代码分开的文件中,以便更易于维护。最后,理想情况下,您的提示词是操作化系统的一部分,作为提示词工程师,您应依赖自动化测试和评估程序来了解提示词对任务的泛化能力。
提示词工程是一个迭代过程。设计和测试不同的提示词,分析并记录结果。根据模型的性能优化提示词。不断尝试,直到获得期望的输出。当您更改模型或模型配置时,返回并继续尝试之前使用的提示词。
名称 |
[提示词的名称和版本] |
目标 |
[此尝试目标的一句话解释] |
模型 |
[所用模型的名称和版本] |
温度 |
[0 - 1 之间的值] |
Token限制 |
[数字] |
Top-K |
[数字] |
Top-P |
[数字] |
提示词 |
[写出完整提示词] |
输出 |
[写出输出或多个输出] |
表 21. 记录提示词的模板
本白皮书讨论了提示词工程。我们学习了各种提示词技巧,例如:
• 零样本提示词
• 少样本提示词
• 系统提示词
• 角色提示词
• 上下文提示词
• 退步提示词
• 思维链COT
• 自我一致性SC
• 思维树TOT
• ReAct
我们甚至研究了如何自动化提示词的方法。
白皮书随后讨论了生成 AI 的挑战,例如提示词不足时可能出现的问题。最后,我们分享了如何成为更好的提示词工程师的最佳实践。
1.Google, 2023, Gemini by Google. Available at: https://gemini.google.com.
2. Google, 2024, Gemini for Google Workspace Prompt Guide. 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. 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. 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. 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. Available at:
https://arxiv.org/pdf/2210.03629.pdf.
14. 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.
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
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-05-11
晓|Google提示工程白皮书:解锁大语言模型的神奇密码
2025-05-11
这份谷歌提示词指南,让你秒变Prompt高手!
2025-05-11
Andrej Karpathy提出LLM学习新范式:系统提示学习
2025-05-10
别再跟AI“鸡同鸭讲”了!扒一扒谷歌内部《提示词指南》,我悟了…
2025-05-09
AI特征检测 - 两个prompt检测文本AI味并给出量化指标
2025-05-09
谷歌 Prompt Engineering 白皮书中文版来了:DeepL 和沉浸式翻译谁更强?
2025-05-08
提示词工程指南:从基础到实践
2025-05-08
别再和AI说废话了,谷歌的6个prompt黄金法则让你的AI秒变学霸
2024-08-20
2024-06-29
2023-06-08
2024-09-17
2024-06-27
2024-06-26
2024-07-09
2024-07-12
2024-09-16
2024-06-14
2025-05-09
2025-04-29
2025-04-27
2025-04-20
2025-04-16
2025-04-11
2025-02-25
2025-02-21