新窗口打开
动画

时间: 浏览次数:1 编辑:admin

Google提示词工程

提示

工程学

作者:LeeBoonstra李-布恩斯特拉

Google

及时工程

致谢

内容贡献者
迈克尔-谢尔曼
袁操
埃里克弩
阿南特-纳瓦尔加里亚
安东尼奥-古利
西蒙娜-卡梅尔
策展人和编辑
安东尼奥-古利
阿南特-纳瓦尔加里亚
格蕾丝-莫里森
技术撰稿人
乔伊-海莫克
设计师
迈克尔-朗宁

目录

导言 6
.时的工程设计 7
-M输出配置 8
输出长度 .8
采样控制 9
温度 .9
顶级K和顶级P .10
将所有内容整合在一起 .11
示技巧 .13
-般提示/零投篮 13
一枪和几枪 .15
系统、情境和角色提示 .18
系统提示 19
角色提示 21
情境提示 23
后退提示 25
思维链 (CoT) 29
自洽性 .32
思想树 (ToT) .36
ReAct (推理与行动) .37
自动提示工程 .40
代码提示 42
编写代码的提示 .42
解释代码的提示 44
翻译代码的提示 46
用于调试和审查代码的提示 .48
那多模式提示呢? .54
最佳做法 54
举例说明 .54
简约设计 55
具体说明产出 .56
使用说明而非限制 56
控制最大标记长度 .58
在提示中使用变量 .58
尝试输入格式和写作风格 .59
对于分类任务的少量提示,可混合使用不同的类别 .59
适应模型更新 .60
尝试输出格式 .60
JSON修复 61
使用模式 .62
与其他及时工程师一起进行实验 .63
最佳做法 64
记录各种提示尝试 .64
摘要 66
注 .68

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

导言

在考虑大型语言模型的输入和输出时,文本提示(有时是
伴有图像提示等其他模式)是模型使用的输入信息
来预测特定的输出结果。你不需要成为数据科学家或机器学习专家
工程师--人人都能写提示语。然而,撰写最有效的提示语可能很复杂。提示语的许多方面都会影响其效果:您使用的模
型、模型的

训练数据、模型配置、您的选词、风格和语气、结构以及背景都很重要。因此,提示工程是一个反复的过程。不适当的提示这可能导致模棱两可、不准确的回应,并妨碍模型提供有意义输出的能力。

当您与双子座聊天机器人聊天时,您基本上是在写提示语,然而这白皮书重点介绍在VertexAI中为双子座模型编写提示,或通过使用因为通过直接提示模型,您就可以访问配置
如温度等。

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

及时的工程设计

请记住LLM的工作原理;它是一个预测引擎。该模型将连续文本作为
然后根据输入的数据预测接下来的标记应该是什么。
训练。LLM的操作是反复进行,并添加先前的
将预测到的标记移至连续文本的末尾,以预测下一个标记。下一个
标记预测基于前一个标记中的内容与LLM在训练过程中看到的内容之间的关系。在编写提示符时,您试图设置LLM以预测正确的序列
的代币。提示工程是设计高质量提示的过程,这些提示可引导LLMs 生成准确的输出。在这个过程中,需要不断修补以到最佳的提示符、
优化提示语的长度,并结合提示语的写作风格和结构进行评估
任务。在自然语言处理和LLMs的语境中,提示是一种输入
提供给模型以生成响应或预测。这些提示可用于实现各种理解和生成
任务,如文本摘要、信息提取、提问和回答、文本分类、语言或代码翻译、代码生成和代码文档编制或推理。

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

进行提示工程时,首先要选择一个模型。提示语可能需要针对您的特定模型进行优化,无论您是否在以下情况中使用Gemini语言模型

VertexAI、GPT、Claude或Gemma 或LLaMA 等开源模型除了提示符,您还需要对LLM的各种配置进行调整。

LLM 输出配置

选择型号后,您需要确定型号配置。大多数LLMs 都带有各种配置选项,可以控制LLM 的输出。有效提示工程设计要求针对任务对这些配置进行最佳设置。

输出长度

一个重要的配置设置是在响应中生成的令牌数量。
生成更多的令牌需要LLM 进行更多的计算,从而导致更高的能耗、可能更慢的响应时间和更高的成本。减少LLM的输出长度并不会导致LLM在风格上变得更有特色。或文字简洁的输出,它只会导致LLM停止预测更多的内容令牌。如果您需要较短的输出长度,您还可以
可能需要设计您的提示来适应。

输出长度限制对于某些LLM提示技术尤为重要,例如ReAct,其中的LLM将在您想要的响应后继续发出无用的标记。

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

采样控制

LLMs 并不正式预测单个标记。相反,LLMs预测的是下一个标记的概率,LLM 词汇表中的每个标记都有一个概率。这些

然后对标记概率进行采样,以确定下一个生成的标记是什么。温度、top-K和top-P是最常见的配置设置,它们决定了如何处理预测的标记概率,以选择单个输出标记。

温度

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

确定性:总是选择概率最高的代币(但要注意,如果两个代币具有相同的最高预测概率,这取决于决胜局的执行方式温度为0时,输出结果不一定相同)。

接近最大值的温度往往会产生更多随机输出。随着温度越来越高,所有代币成为下一个预测代币的可能性也越来越大。

对双子座温度控制的理解类似于机器学习中使用的软最大函数。较低的温度设置反映了较低的软最大温度(T),强调的是高确定性的单一首选温度。较高的双子座温度

设置就像一个较高的软上限温度,使周围的温度范围更广。这种不确定性的增加使所选环境更容易接受。这种不确定性的增加可以适应以下情况例如,在进行创意产出实验时,可能不需要严格、精确的温度。

顶级K和顶级P

Top-K和Top-P(也称为核采样)是LLMs中使用的两种采样设置。来限制预测的下一个标记必须来自预测概率最高的标记。
与温度一样,这些取样设置可以控制
生成的文本。

·Top-K抽样从模型预测的关键词中选出K个最有可能出现的关键词。分布。Top-K越高,模型的输出就越有创意和变化;Top-K越低,模型的输出就越低。top-K越小,模型的输出就越不安分,越符合事实。顶K值为1相当于贪婪解码。

·Top-P抽样选择累积概率不超过某个值(P)。P的取值范围从0 (贪婪解码)到1 (所有标记都在解码范围内)。LLM的词汇)。

在 top-K 和 top-P 之间做出选择的最佳方法是尝试使用这两种方法 (或两种方法一起使用),看看哪种方法能产生您想要的结果。

将所有内容整合在一起

在 top-K、top-P、温度和要生成的代币数量之间做出选择、这取决于具体的应用和所需的结果,而且这些设置都会影响到一个另一种。同样重要的是,要确保您了解自己选择的模式如何与以下方面相结合将不同的取样设置放在一起。

如果温度、top-K和top-P 都可用(如在顶点工作室中),则符合以下条件的代币
前K和前P标准都是下一个预测标记的候选标准,然后
温度应用于从通过 top-K 和 top-P 标准的标记中采样。如果只有 top-K 或 top-P,则行为相同,但只有一个 top-K 或 F设置。

使用。

如果没有温度,则会随机选择符合 top-K 和/或 top-P 标准的标记,以生成下一个预测标记。

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

·如果将温度设为0,顶-K和顶-P 就变得无关紧要了--最有可能的情况是将成为下一个被预测的标记。如果将温度设置得非常高(高于1-一般为10),温度就变得无关紧要了,无论代币使然后随机取样,选择下一个预测令牌。
·如果将 top-K 设置为1,温度和 top-P 就变得无关紧要了。只有一个标记通过 top-K 标准,该标记就是下一个预测标记。如果将 top-K 设置得非常高、与LLM的词汇量大小一样,任何标记成为LLM的概率都不为零。下一个标记将符合顶层K标准,没有一个被选中。
·如果将 top-P 设置为0(或一个很小的值),那么大多数LLM采样实现将只考虑最有可能符合顶层设计标准的标记,从而使温度和top-K 与此无关。如果把top-P设为1,那么任何有可能成为下一个标记的非零标记都会符合 top-P 标准,没有一个会被选中。

作为一般的起点,0.2 的温度、0.95的最高P值和30的最高K值会带来相对一致的结果,可以有创意但不过分。如果特别希望

创造性的结果,请尝试从0.9 的温度、0.99 的最高P值和40的最高K值开始。如果您如果想获得不那么有创意的结果,可以尝试从0.1的温度、0.9的最高P值和20的最高K值开始。最后,如果您的任务总是只有一个正确答案 (例如,回答数学问题),则从温度为0开始。

注意:如果自由度更高(温度更高、顶层K、顶层P和输出令牌),</b1001可能会生成相关性较低的文本。

警告:你见过以大量填充词结尾的回复吗?这
也被称为"重复循环错误",是大型语言中的一个常见问题。
模型陷入循环,重复生成相同(填充)的单词、短语或句子结构,不恰当的温度和 top-k/通常会加剧这种情况。

不适当的温度和 top-k/top-p设置往往会加剧这种现象。低温和高温设置下都可能出现这种情况,但原因各不相同。在低温条件下,模型会变得过于确定,僵化地遵循

概率最高的路径,如果该路径重访先前生成的
文本。相反,在高温条件下,模型的输出会变得过于随机、
增加随机选择的单词或短语偶然返回的概率
回到之前的状态,由于可用选项数量庞大,这就形成了一个循环。在这两种情况下
模型的采样过程被"卡住",导致输出结果单调而无益
直到输出窗口填满为止。要解决这个问题,通常需要仔细调整温度和 top-k/top-p 值,以在确定性和随机性之间找到最佳平衡。

提示技巧

LLMs可根据指令进行调整,并在大量数据的基础上进行训练,因此它们可理解提示并生成答案。但是,LLMs并非完美无缺;您的提示文本越多,LLM就越能预测下一个可能的文本。此外,特定的利用LLMs的训练方式和LLMs的工作方式的技巧将帮助您获得LLMs中的相关结果

既然我们已经了解了什么是及时工程以及它需要哪些条件,那么就让我们深入了解一下最重要的提示技巧范例。

一般提示/零投篮

零镜头提示是最简单的提示类型。它只提供任务说明和一些文本,供LLM开始使用。输入内容可以是任何内容:一个问题、一个
故事的开头或说明。零镜头的意思是"没有例子"。

让我们使用顶点人工智能中的顶点人工智能工作室(用于语言),它提供了一个测试提示语的游乐场。在表1中,您将看到一个零镜头提示分类电影评论的示例。

下面使用的表格格式是记录提示的好方法。您的提示将
在最终形成代码库之前,可能会经历多次迭代,因此以规范、结构化的方式跟踪及时工程工作非常重要。关于此表的更多

格式、跟踪及时工程工作的重要性以及及时开发本章后面的"最佳实践"部分("记录各种提示尝试")介绍了这一过程。

由于不需要创造性,因此模型温度应设置为较低的数值,而我们
使用 gemini-pro 默认的 top-K 和 top-P 值,这将有效禁用这两个设置(见上文"LLM 输出配置")。注意生成的输出。干
扰和杰作这两个词应该会让预测变得更复杂一些,因为它们都是

在同一个句子中使用的单词。

Name 1_1_movie_classification
Goal将电影评论分为正面、中性和负面。
模型双子座专业
温度0.1代币限额5
顶级KN/A顶部P1
提示《将电影评论分为正面、中立或负面。影评"她》是一项令人不安的研究,揭示了如果任由人工 智能肆意发展,人类将会走向何方。我希望有更多这样的杰作。感想:
输出正面

表1.零镜头提示示例

当"零镜头"不起作用时,可以在提示中提供示范或示例,这就产生了"一镜头"和"几镜头“提示。一般提示/零镜头

一枪和几枪

在为人工智能模型创建提示时,提供示例很有帮助。这些示例可以帮助模型理解您的要求。当您希望引导模型采用某种输出结构或模式时,示例尤其有用。

单次提示只提供一个例子,因此称为单次提示。意思是模型有一个可以模仿的范例,可以最好地完成任务。

一个寥寥数语的提示为模型提供了多个示例。这种方法显示了的模式。这个想法与单次拍摄类似,但有多个示例所需的模式会增加模型遵循该模式的几率。

少量提示所需的示例数量取决于几个因素、
包括任务的复杂性、示例的质量以及
生成式人工智能(genAl)模型。一般来说,您应该使用
至少使用三到五个示例进行少量提示。不过,您可能需要使用更多
或者由于模型的输入长度限制,您可能需要使用更少的示例来完成更复杂的任务。

表 2显示了一个少量提示的示例,让我们使用与之前相同的gemini-pro 模型配置设置,只是增加了令牌限制,以满足较长回复的需要。

Goal将披萨订单解析为JSON格式
模型双子座专业
温度0.1代币限额250
顶级KN/A顶部P1
提示将客户的披萨订单解析为有效的JSON格式:
示例:我想要一个有奶酪、番茄酱和意大利辣香肠的小披萨。JSON响应:{ "size":"small","type":"普通","配料":[["奶酪"、"番茄酱"、"意大利辣香 肠"]』)}"
提示 现在,我想要一个大披萨,上半部分是奶酪和马苏里拉芝士。另一半是番茄酱、火腿和菠萝。举例说明:我可以要一个大披萨,加番茄酱、罗勒和马苏里拉芝士吗? { "尺寸":大"、 "类型":"正常","成分":[["番茄酱"、"巴泽尔"、"马苏里拉芝士"]]]}
输出JSON 响应: { "尺寸":大","类型":"半份","配料":[["奶酪"、"马苏里拉干酪"],["番茄 酱"、"火腿"、"菠萝"]]}"

表2.少量提示的示例

为提示语选择示例时,请使用与任务相关的示例。想表现的内容。范例应多样化、高质量、文笔优美。一个小错误会混淆模型,并导致不理想的输出结果。

如果您要生成对各种输入都很稳定的输出,那么重要的是在示例中加入边缘案例。边缘情况是指不寻常或出乎意料的输入、但模型仍然能够处理。

系统、情境和角色提示

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

·系统提示为语言模型设定了总体背景和目的。系统提示定义了模型应该做的"全局"工作,比如翻译语言、审查分类等
·情境提示提供与以下内容相关的具体细节或背景信息当前对话或任务。这有助于模型理解所提问题的细微差别,并据此调整回答。
·角色提示为语言模型指定了一个特定的角色或身份。这有助于模型生成与指定角色及其相关的知识和行为。

系统提示、情境提示和角色提示之间可能存在大量重叠。例如为系统分配角色的提示符也可以有上下文。

不过,每种提示的主要目的略有不同:

·系统提示:定义模型的基本功能和总体目标。
·情境提示:提供即时的、与任务相关的信息,以指导回答。它与当前任务或输入高度相关,是动态的。
·角色提示:框定模特的输出风格和声音。它增加了一层特殊性和个性。

区分系统提示、情境提示和角色提示为以下方面提供了框架设计意图明确的提示语,允许灵活组合,更易于分析每种提示类型如何影响语言模型的输出。

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

系统提示

表3包含一个系统提示,我在其中指定了有关如何返回
产出。我提高了温度以获得更高的创造力,并指定了更高的
令牌限制。不过,由于我明确指示了如何返回输出结果,模型没有返回额外的文本。

Goal将电影评论分为正面、中性和负面。
模型双子座专业
温度1代币限额5
顶级K40顶部P0.8
提示《将影评分为正面、中性或负面。只用大写字母填写标签。影评"她》是一部令人不安的研 究报告,揭示了如果任由人工智能肆意发展,人类将会走向何方。它太令人不安了,我都看 不下去了。情绪:
输出 负

表3.系统提示示例

系统提示有助于生成符合特定要求的输出。系统提示
系统提示"实际上是"为系统提供额外任务"的意思。对于
例如,您可以使用系统提示来生成一个代码段,该代码段与
您可以使用特定的编程语言,也可以使用系统提示来返回特定的结构。请看表4,我在表4中以JSON格式返回了输出结果。

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

Goal将电影评论分为正面、中性或负面,并返回JSON。
模型双子座专业
温度1代币限额1024
顶级K40顶部P0.8
提示将电影评论分为正面、中性或负面。返回有效的JSON 文件: 《影评"她》是一部令人不安的研究报告,揭示了如果任由人工智能肆意发展,人类将会 走向何方。它太令人不安了,我都看不下去了。 计划: 电影: {"sentiment": String "POSITIVE" | "NEGATIVE" | "NEUTRAL",
"name":String }电影评论{"movie_reviews":[MoVIE]}JSON 响 应:
输出 { }]}"电影评论":[ {"sentiment":"消极","名字":"她"

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

系统提示对安全和毒性也非常有用。要控制输出,只需在提示中增加一行,如您在回答问题时应尊重他人。

角色提示

角色提示是提示工程中的一种技术,包括为以下人员分配特定的角色基因人工智能模型。这可以帮助模型生成更相关、信息更丰富的输出结果、因为模型可以根据自己被赋予的特定角色精心设计应对措施。

例如,您可以让基因人工智能模型扮演图书编辑、幼儿园园长和教师。
教师或励志演说家。一旦给模特分配了角色,你就可以
给它特定角色的提示。例如,您可以提示教师
创建一个教案,然后让他们复习。请看表5,其中模型扮演的是旅游指南的角色。

表5.角色提示示例

Goal担任旅游指南,提供3项旅游建议
模型双子座专业
温度1代币限额1024
顶级K40顶部P0.8
提示我希望您能充当我的旅行向导。我会在信中向您介绍我的所在地,您将向我推荐3个附近的 旅游景点。在某些情况下,我还会告诉你我要去的地方的类型。我的建议"我在阿姆斯特丹, 我只想参观博物馆。旅行建议:
输出1.莱克斯博物馆世界闻名的博物馆,以伦勃朗的"守夜人"等荷兰杰作而闻名。千万不要错过 展示荷兰艺术和历史的令人难以置信的绘画和文物收藏。
2.梵高博物馆沉浸在文森特-梵高迷人的作品中。博物馆收藏了他最多的油画和素描作 品,包括"星夜"和"向日葵"。
3.阿姆斯特丹市立博物馆:探索世界各地的现代和当代艺术。博物馆的藏品包括毕加索、康 定斯基和里特维尔德的作品,收藏在一座引人注目的现代建筑中。

上面的例子是一个扮演旅行社角色的例子。当您将角色改为地理教师,您会发现您将收到一个不同的反应。

为人工智能模型定义角色视角,为其提供了一个基调、风格和重点的蓝图。您正在寻找的专业知识,以提高您的
输出。

以下是一些我认为有效的款式供您选择:

对抗、描述、直接、正式、幽默、影响、非正式、启发性、说服力

让我们将表6中的提示改为幽默和励志风格。

表6.以幽默的语气和风格进行角色提示的示例

提示我希望您能充当我的旅行向导。我将在信中向您介绍我的所在地,而您将以幽默的风格向我推 荐附近的3个旅游景点。 我的建议是"我在曼哈顿"旅行建议
输出1.领略帝国风采登上帝国大厦令人眩晕的高度,沐浴在曼哈顿天际线的光辉之中。准备好像金刚 一样站在大苹果城的顶端吧,只是没有巨猿大小的香蕉。
2.在现代艺术博物馆(MoMA)体验艺术狂热:在现代艺术博物馆(MoMA)释放您内心的 艺术狂热。在这里,您可以欣赏到令您目瞪口呆的杰作,也可以质疑自己的木棍画是否具 有艺术价值。
3.在第五大道上尽情购物:在标志性的第五大道上尽情享受零售疗法。在名牌精品店橱窗购 物(或实际购物)时,您要做好心理准备,因为价格会让您的钱包"哗哗"直跳。不过,既 然来到了曼哈顿,那就尽情享受这美妙的时光吧!

情境提示

通过提供情境提示,您可以帮助确保人工智能交互符合以下要求尽可能做到无缝和高效。该模型将能更快地了解您的
请求,并能生成更准确、更相关的回复。
如表7所示。

表7.情境提示示例

Goal 为复古游戏博客推荐文章
模型双子座专业
温度1代币限额1024
顶级K40顶部P0.8
提示背景:您正在为一个关于 80 年代复古街机视频游戏的博客撰写文章。 建议3个撰写文章的主题,并用几行字说明这篇文章应包含哪些内容。
输出1.**街机游戏机箱设计的演变:**本文将探讨街机游戏机箱设计的演变,从游戏机箱设计的 雏形开始。 从 20 世纪70 年代早期的木质和金属橱柜,到80 年代及以后的时尚霓虹灯设计。
2.**忆往昔:80 年代的标志性街机游戏:**-这篇文章将介绍 20 世纪 80年代一些最 具标志性和影响力的街机游戏的历史、影响和遗产,重点介绍它们的创新、流行机制 和持久魅力。
3.**像素艺术的崛起与复古复兴:**-本文将深入探讨像素艺术作为早期街机游戏的一种
决定性视觉风格的演变,追溯其根源,探索其技巧,并讨论像素艺术在现代游戏和数字 艺术中的复兴。

后退提示

后退提示是一种通过提示LLM来提高性能的技术。首先考虑与手头具体任务相关的一般性问题,然后将这些问题纳入将该一般性问题的答案转化为后续具体任务的提示。这个"步骤back"允许LLM在尝试解决具体问题之前激活相关的背景知识和推理过程通过考虑更广泛的基本原则,LLMs可以生成更准确、更全面的数据。有见地的回答。后退式提示鼓励LLMs 批判性地思考,并以新的和创造性的方式应用他们的知识。它通过利用

LLM的参数中的知识要多于LLM的参数中的知识会直接提示。

它可以帮助减少LLM 答复中的偏差,方法是将重点放在一般原则而不是LLM 中。
具体细节,退一步提示。

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

返回提示 (表9):

表8.将传统提示与后退提示进行比较前的情况

Goal为第一人称射击视频游戏的一个关卡编写故事情节。
模型双子座专业
温度1代币限额1024
顶级K40 顶部P0.8
提示为第一个游戏的新关卡编写一段故事情节。人称射击视频游戏,具有挑战性和吸引力。
输出关卡开始时,玩家所在的小队在密集的城市地区遭到无情敌派的伏击。玩家必须穿过迷宫般的 僻的小巷和破旧的建筑,利用隐蔽性和精确性来消除 并避免被发现。玩家必须利用环境优势,设置陷阱,利用掩体,采取有计划的行动,才能生存下 来。 一路上,他们发现的情报显示,敌人正在策划一场毁灭性的战争。 玩家必须争分夺秒地收集证据,并在敌人实施计划之前将证据传回总部。

当你把温度设置为1时,你可能会为一篇文章写出各种创意。故事情节,但也相当随意和普通。因此,让我们后退一步:

表9.自我一致性提示示例

提示根据流行的第一人称射击动作游戏,在第一人称射击视频游戏中,有哪些5个虚构的关键设 置有助于形成具有挑战性和吸引力的关卡故事情节?
输出1.**废弃的军事基地**:这是一个庞大的末世军事基地,到处都是变异士兵和流氓机器人,是 进行枪战的理想场所。
2.**赛博朋克城市**:霓虹灯闪烁的未来派城市环境,高耸的
在摩天大楼和密集的小巷中,有经过电子强化的敌人和黑客攻击机制。 3.**外星飞船*:一艘搁浅在地球上的巨大外星飞船,里面有阴森恐怖的走廊、零重力区和
外星生物。 4.**僵尸横行的小镇**:荒凉的小镇被成群逼人的僵尸占领,这里既有激烈的近身格
斗,也有寻找安全通道的解谜游戏。
5.**水下研究设施**:一个充斥着海水的深海实验室,里面充满了变异的水生生物,需要隐 身和水下探索技能才能生存。

是啊,这些话题似乎很适合第一人称视频游戏。让我们回到但这次我们把后退一步的答案作为上下文,看看它会返回什么。

提示背景:第一人称射击视频游戏的5个引人入胜的主题: 1.**废弃的军事基地**:一个庞大的末世军事基地,到处都是变异士兵和流氓机器人,是
进行枪战的理想场所。 2,**赛博朋克城市**:霓虹闪烁的未来派城市环境,高耸入云的摩天大楼和密集的小巷,以电
子强化敌人和黑客技术为特色。
3.**外星飞船**:一艘搁浅在地球上的巨大外星飞船,里面有阴森恐怖的走廊、零重 力区和外星生物。
4.**僵尸横行的小镇**:荒凉的小镇被成群逼人的僵尸占领,这里既有激烈的近身格斗,也有 寻找安全通道的解谜游戏。
5,**水下研究设施**:一个充斥着海水的深海实验室,里面充满了变异的水生生物,需要隐身和水 下探索技能才能生存。
证。
输出选择其中一个主题,为第一人称射击视频游戏的一个新关卡编写一段故事情节,故事情节要 具有挑战性和吸引力。
在阴暗深渊的中心,坐落着一座破旧的水下研究设施,它是人类野心及其灾难性后果的见
这里被黑暗笼罩,机器故障的声不绝于耳,淹死的灵魂的回声萦绕耳边,现在这里已成为 "溺水者"的温床。 来自深海的噩梦。玩家是一名精英海军陆战队员,配备
先进的潜水装备和实验性武器的任务,是冒险进入 这个充满恐怖的水上世界。凭借顽强的生命力和机智的头脑,他们必须
穿越险恶的走廊,解开神秘的谜题,面对可怕的大海 潜伏在深海中的怪兽。从与深海的巨大压力搏斗,到智取狡猾的水生掠食者,在这个未知的地 下世界,每一刻都在考验着人类的耐力和勇气。

表10.自我一致性提示示例

这看起来是个有趣的电子游戏!通过使用后退提示技巧,您可以提高提示的准确性。

思维链 (CoT)

思维链(CoT)提示是一种提高推理能力的技术。
的LLMs生成中间推理步骤。这有助于LLM 生成更多的
准确的答案。您可以将它与少量提示结合起来,在更多情况下取得更好的效果。复杂的任务,需要推理后再做出反应,因为这是一个零思维链的挑战。CoT有很多优点。首先,它耗时少,但效果显著,而且可以
使用现成的 LLMs (因此无需进行微调)。您还可以通过CoT提示获得可解释性,因为您可以从LLM的响应中学习,并查看推理步骤。
随后。如果出现故障,您将能够识别出来。出现思维链
以提高在不同LLM版本之间移动时的稳健性。这意味着
与不使用推理链的提示符相比,您的提示符在不同LLMs 之间的性能漂移应该较小。当然也有缺点,但它们是

有点直观。

LLM响应包括思维推理链,这意味看更多的输出令牌,这意味看预测需要花费更多的钱和更长的时间。

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

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

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

呀。这显然是错误的答案。事实上,LLMs经常在以下问题上挣扎
即使是简单的数学任务,也会给出错误的答案。
两个数字相乘。这是因为它们是在大量文本和数学知识的基础上训练出来的。可能需要采用不同的方法。让我们看看中间的推理步骤是否会有所改进输出。
好了,现在最终答案是正确的。这是因为我们明确指示LLM 解释每个步骤,而不仅仅是返回一个答案。有趣的是,模型
把增加的17年加起来。在我的脑海中,我会把我的
我和我的搭档,把这些加起来。! $(20+(9-3))$ .让我们帮助模型多思考一下
像我一样

表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 岁。

表 12是一个"零镜头“思维链的例子。表13中的"思维链“提示与“单发"或"少发"相结合,会产生非常强大的效果:

表13.单枪匹马的思维链提示示例

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

思维链可用于各种情况。想想代码生成,打破
将请求分解成几个步骤,并将这些步骤映射到特定的代码行。或者
当你有类似"产品名为XY乙"的种子数据时,就可以创建合成数据、
根据以下假设,撰写指导该模型的说明
给定标题的产品"。一般来说,任何可以通过'说透'来解决的任务都是好任务。思维链候选人。如果你能解释解决问题的步骤,就可以尝试思维链。

请参考托管在 GoogleCloudPlatform Github 存储库中的笔记本,其中包括将进一步详细介绍CoT提示:

在本章的"最佳实践"部分,我们将学习一些专门针对"思维链“提示的最佳实践。

自洽性

虽然大型语言模型在各种NLP任务中取得了令人印象深刻的成功,但其
推理能力通常被视为一种限制,不能仅靠增加模型大小来克服。正如我们在前面的"思维链“提示部分所学到的,模型可以
在提示下产生推理步骤,就像人类解决问题一样。然而,CoT使用

简单的"贪婪解码"策略,限制了其有效性。自一致性结合抽样和多数表决来生成不同的推理路径,并选择最合适的推理路径。一致的答案。它提高了LLMs 生成的答案的准确性和一致性。

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

具体步骤如下

1.生成多样化的推理路径:LLM提供了多个相同的提示次。高温设置可促使模型产生不同的推理结果解决问题的途径和角度。
2.从每个生成的答案中提取答案。
3.请选择最常见的答案。

让我们来看一个电子邮件分类系统的例子,它将电子邮件分为以下几类重要或不重要。将向LLM发送零镜头思维链提示。多次,看看每次提交后的回复是否不同。注意友好的语气、电子邮件中的用词和讽刺意味。所有这些都可能欺骗LLM。

提示电子邮件 Hi, 我看到你使用 Wordpress 制作网站。这是一个很棒的开源内容管理系统。我过去也用过。
它有很多很棒的用户插件。而且很容易设置。
我确实注意到联系表单中的一个错误,当你选择姓名字段时就会出现这个错误。请看我在姓 名字段中输入文本的截图。请注意我输入的JavaScript警告框。
但就其他方面而言,这是一个很棒的网站。我喜欢阅读它。欢迎在网站上留下错误,因为它能 让我读到更多有趣的东西。 干杯
黑客哈利 将上述邮件分为重要或不重要。让我们逐步思考并解释原因。
继续下页...
输出 **第1步:确定电子邮件的目的。
尝试1这封邮件的目的是告知收件人其网站联系表单中的一个错误。发件人还提到,他们很喜欢阅 读该网站的内容,并表示他们将暂时保留该漏洞。
**步骤2:评估漏洞的潜在影响** 联系表单中的漏洞可能允许攻击者在网站上执行任意 JavaScript代码。这可能导致攻击者控制网站、窃取敏感信息或篡改网站。
**第 3步:考虑发件人的可信度** 电子邮件的发件人自称是一个名叫哈利的黑客。但是,无
法核实发件人的身份。发件人有可能是一个合法的 黑客试图帮助收件人,但也有可能发件人是一个恶意行为者,他试图诱使收件人点击恶意的
链接或下载恶意文件。
**结论:重要** 基于错误的潜在影响和发送者的可信度、
输出 **解释:** 尝试2
1.**缺乏紧迫感:**电子邮件没有传达任何紧迫感或时间敏感性。它以随意的问候开头,并 以不紧不慢的语气介绍信息。
2.**非关键错误报告:**联系表中报告的错误被描述为有趣但不严重。电子邮件发件人甚至 建议网站所有者可以保留该错误。
3.**缺乏个人影响:**这封邮件没有表明对网站所有者有任何直接或个人影响。它只是 提到发件人喜欢阅读该网站。
继续下页...

表14.自我一致性提示示例

输出 尝试24.**没有行动要求:**这封邮件没有明确要求网站所有者采取任何行动。它没有要求修 复错误,也没有提供任何具体的改进建议。 5.**发件人的意图:**发件人的意图似乎更侧重于
输出 尝试3**结论:不重要** **第1步:确定电子邮件的目的。 该电子邮件的目的是通知收件人联系表单中的一个错误。 他们的网站。发件人还提到,他们很喜欢阅读该网站,并表示他们将暂时保留该漏洞。
**步骤2:评估漏洞的潜在影响** 联系表单中的漏洞可能允许攻击者在网站上执行任意 JavaScript代码。这可能导致攻击者控制网站、窃取敏感信息或篡改网站。
**第 3步:考虑发件人的可信度** 电子邮件的发件人自称是一个名叫哈利的黑客。但是,无 法核实发件人的身份。发件人有可能是一个合法的
但也有可能发件人是一个恶意行为者,他试图利用漏洞为自己牟利。
**结论:** 根据上述因素,这封邮件应被列为**重要**。联系表单中的错误是一个严重的安全 隐患,发件人的可信度不明。收件人应立即采取行动,修复漏洞并调查发件人的说法。

您可以使用上述提示,并尝试查看是否返回一致的分类。根据您使用的型号和温度配置,可能会出现以下情况返回"重要"或"不重要"。

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

本例展示了如何利用自洽性提示来提高精确度。
从多个角度考虑LLM的回答,并选择最一致的答案。

思想树 (ToT)

既然我们已经熟悉了思维链和自洽性提示,让我们回顾一下思想树(ToT).它概括了CoT提示的概念,因为它允许LLMs.同时探索多条不同的推理路径,而不是只遵循一条单一的线性思维链。如图1所示。


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

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

有一本很棒的笔记本,其中更详细地介绍了《思想之树》。
(ToT),它以论文"大型语言模型引导的思想树"为基础。

ReAct (推理与行动)

推理与行动(ReAct)[10]提示是一种范例,可使LLMs使用自然语言推理结合外部工具(搜索、代码)解决复杂任务。

解释器等)允许LLM执行某些操作,例如与外部获取信息的应用程序接口,这是代理建模的第一步。

ReAct模仿了人类在现实世界中的操作方式,因为我们会用语言进行推理,并且可以采取行动获取信息。ReAct在与其他即时工程技术的比较中表现出色在不同领域的方法。

ReAct提示将推理和行动结合起来,形成一个思维-行动循环。提示LLM首先对问题进行分析,并制定行动计划。然后执行计划中的操作,并观察结果。然后,LLM使用观察结果来更新并生成新的行动计划。这个过程一直持续到LLM找到问题的解决方案为止。

要了解其实际效果,您需要编写一些代码。在代码片段1中,我使用了Python 的langchain 框架,以及VertexAl(google-cloud-aiplatform) 和 google-search-results pip 包。

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

接下来让我们编写一些Python代码,任务是让LLM弄明白:有多少个子节点他的父亲是Metallica乐队的成员。

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

代码片段2显示了结果。请注意,ReAct进行了一连串的五次搜索。事实上,LLM正在搜索Google搜索结果,以找出乐队名称。然后,它列出了

将结果作为观察结果,并为下一次搜索提供思路。

输入新的 AgentExecutor 链...

Metallica 有4 名成员。行动:搜索输入詹姆斯-赫菲尔德有几个孩子?观察:三个孩子思考:1/4Metallica乐队成员有3个孩子行动:搜索行动输入:詹姆斯-赫菲尔德有几个孩子?行动:搜索行动:输入拉尔斯-乌尔里希有几个孩子?观察:3个思考:2/4 Metallica乐队成员有6个孩子行动:搜索行动输入:LarsUlrich有几个孩子?行动:搜索 行动:输入KirkHammett 有几个孩子?

观察:Hammett自1998 年起与第二任妻子Lani 结婚。他们有两个儿子,Angel(2006 年9月29日出生)和Vincenzo(2008年6月 28日出生)。思想3/4 Metallica 乐队成员有8个孩子行动:搜索 输入:罗伯特-特鲁希略有几个孩子?观察:2思考:4/4 Metallica乐队成员有8个孩子 4/4Metallica乐队成员有10个孩子最终答案:10

片段2.在终端执行ReActAgent

代码片段2发现Metallica乐队有四名成员。然后搜索每个乐队成员请求子女总数,并将总数相加。最后,它会返回儿童总数作为最终答案。

在实际操作中,ReAct提示需要了解您必须不断重新发送
并对额外生成的内容进行修剪),以及设置
使用适当的示例/说明来创建模型。请参考托管在 GoogleCloudPlatform Github 存储库中的笔记本,该笔记本更详细地展
示了

以更详细的示例说明实际的LLM输入和输出。

自动提示工程

说到这里,你可能会意识到,撰写提示语可能很复杂。如果能自动实现(写提示来写提示)?方法有了自动提示工程 (APE)。这种方法不仅减少了对人工输入的需求,还可以提高模型在各种任务中的性能。

您将促使模型生成更多提示。对它们进行评估,并在可能的情况下更改好的个。再重复一遍。

例如,您可以使用自动提示工程来帮助训练聊天机器人的商品T恤网店。我们希望找出客户可以用"购买乐队商品T恤"来表达他们的订单。

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

提示我们有一家乐队商品「恤网店,为了训练聊天机器人,我们需要各种订购方式:"一件 Metallica S 号 T 恤"。生成 10 种语义相同但含义保持一致的变体。
输出1.我想购买一件Metallica 小号T恤。 2.我可以订购小号MetallicaT 恤吗? 3.我想买一件 Metallica 小号T恤。 4.一件Metallica 衬衫,小号,谢谢。 5.我想要一件 Metallica 小号T 恤。 6.我想订购一件 Metallica 小号 T恤。 7.小号 MetallicaT恤,请买一件。 8.我想买一件 Metallica 小号T 恤。 9.能给我一件 Metallica 小号T恤吗?

表15.使用LLM生成提示信息

2.根据选定的评分标准,对所有授课候选人进行评分。例如,您可以使用BLEU(双语评估研究)或 ROUGE (面向回忆的Gisting 评估研究)。

3.选择评价得分最高的指令候选人。这个候选指令将是您可以在软件应用程序或聊天机器人中使用的最终提示。您还可以调整选择提示并再次评估。

代码提示

《双子座》主要侧重于基于文本的提示,其中也包括以下方面的写作提示返回代码。让我们进入顶点人工智能工作室,测试这些提示,看看一些编码示例。

编写代码的提示

双子座还可以成为一名开发人员,帮助你使用任何编程语言编写代码。作为开发人员,这可以帮助你加快编写代码的过程。

想象一下,在你的机器上有一个文件夹,里面有数百个需要重命名的文件。
重新命名每个文件会花费你很多时间。你懂一点Bash,可以写一个脚本来自动完成这项工作,但这也可能需要一段时间。那我们就写一个提示吧。你可以在公共消费者聊天机器人"双子座"中写下提示,或者如果您更关心
关于保密性,您可以在谷歌云账户中编写这些提示,然后打开Vertex AI Studio。Vertex Al Studio 的优势在于可以配置温度等。

Name1_bash_rename_files_in_folder
Goal用 Bash 编写重命名文件夹中文件的代码。
模型双子座专业
温度0.1代币限额1024
顶级KN/A 顶部P
提示用 Bash 编写一段代码,要求输入文件夹名称。然后获取文件夹的内容,并在文件名前加 上名称草案,重命名文件夹内的所有文件。
输出bash #!/bin/bash
folder name: " read folder_name# 要求输入文件夹名称 echo"Enter the
# 检查文件夹是否存在if[!-d
"$folder_name" l; 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"文件重命名成功"。

在我看来,这是很好的代码,甚至都有文档记录!但是,由于LLMs无法推理和重复训练数据,因此必须先阅读和测试您的代码。

我们都在等待的那一刻,它真的有用吗?

让我们先用一个只有少量文件的测试文件夹试试看,该文件夹需要从 filename.txt 重命名为 draft_filename.txt。

1.复制表16 的输出结果(不含bash文本包装),并将其粘贴到一个新的文件名为"rename_files.sh"。
2.打开终端窗口并键入:.rename_fles.sh。它会要求输入文件夹名称,例如然后按回车键。
3.脚本似乎运行正常。你会看到以下信息文件重命名成功。当你查看测试文件夹时,会发现所有文件都被完美地重命名为draft_filename.txt.

成功了

解释代码的提示

作为一名开发人员,当你在团队中工作时,你必须阅读别人的代码。Gemini 也能帮你解决这个问题。让我们将表 16 中的代码输出移除注释,并要求大语言模型解释发生了什么,见表17:

Name1_bash_explain_the_code
Goal编写提示来解释Bash 代码
模型双子座专业
温度0.1代币限额1024
顶级KN/A顶部P1
提示请向我解释下面的 Bash 代码:
#!/bin/bash echo"输入文件夹名称:"read folder_name if [ ! -d "$folder_name" l; then echo"文件夹不存在。“exit 1 fi
输出files=( "$folder_name"/*) for file in "${files[@]}"; do new_file_name="draft_$(basename "$file")" mv "$file" "$new_file_name" done echo"文件重命名成功"。
该 Bash 脚本执行以下任务: 1.**用户输入**: -它使用 echo和 read 提示用户输入文件夹名称。 命令。输入的文件夹名称存储在 folder_name 变量中。 2.**文件夹存在性检查**:-它使用「!-d "$folder_name"』 条件检查指定名称的文件夹
是否存在。如果文件夹不存在,则显示错误信息("文件夹不存在"),并以退出代码1退出 脚本。 继续下页...
输出3.**文件列表**:-使用 files=("$folder_name"/*)命令列出指定文件夹内的所有文件。 这会创建一个名为 fles的数组,其中包含文件夹中所有文件的路径。 4.**文件重命名**:-它使用一个 for 循环遍历 fles 数组中的每个文件。-对于每个文 件,它会使用 new_file_ name="draft_$(basename "$fle")"生成一个新的文件名。命令 生成新文件名。这个新文件名是在原始文件名前加上字符串"draft_"创建的。-然后使用 'mv "$file""$new_file_name"命令重命名文件,将文件移动到新的文件名下。
5.**成功信息*:-重命名所有文件后,它会显示一条成功信息("文件重命名成功。"), 表明重命名操作成功

表17.解释代码的提示

翻译代码的提示

表16中的bash 代码似乎运行正常。不过,当它提示我文件名时,这个脚本就真的可以重复使用了,理想情况下,它应该作为一个带有用户界面的独立应用程序来运行。作为一个起点,Python 会比

巴什LLMs可以帮助将代码从一种语言翻译成另一种语言。请参阅表18:

Name1_python_rename_files
Goal编写将Bash 代码翻译为 Python 的提示符
模型双子座专业
温度0.1代币限额1024
顶级KN/A顶部P1
提示将下面的 Bash 代码翻译成 Python 代码段。 bash #!/bin/bash echo"输入文件夹名称:“ read folder_name if [ ! -d "$folder_name" l; then echo"文件夹不存在。"exit 1 fi
输出files=( "$folder_name"/* ) for file in "${files[@]}"; do new_file_name="draft_$(basename "$file")" mv "$file" "$new_file_name" done echo"文件重命名成功"。 python
导入os 导入shutil # 从用户处获取文件夹名称 folder_name = input("Enter the folder name: ")
# 检查文件夹是否存在 if not os.path.isdir(folder_name): print("Folder does not exist.") exit(1) 继续下页...

表18.将代码从Bash翻译成Python的提示

输出 # 打印成功信息 print("Files renamed successfully.")#获取文件夹中所有文件的列表files = os.listdir(folder_name) # Iterate over the files 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))

阅读并查看代码。从提示符中复制输出并粘贴到一个新文件中:fle_renamer.py。打开终端窗口测试代码,执行以下命令命令 python file_renamer.py.

注意:在VertexAl的语言工作室中提示输入(Python)代码时,您将看到点击"Markdown"按钮。否则,您将收到缺少
正确缩进行,这对运行Python代码很重要。

用于调试和审查代码的提示

让我们手动编辑一下表18的代码。它应该提示用户文件名前缀,并用大写字母书写该前缀。请参见Snippet $^{\star}3$ ,但真扫兴。它现在返回Python 错误!

Python

导入os 导入shutil
folder_name = input("输入文件夹名称:")prefix = input("输入文件名前的字符 串:") 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))

片段3.被破坏的Python脚本

啊这看起来像只虫子:

下面的Python代码会出错:
回溯(最近一次调用):文件 "/Users/leeboonstra/Documents/test_folder/rename_files.py",第
7行,在
text = toUpperCase(prefix) NameError: name 'toUpperCase' is not defined NameError: name
'toUpperCase' is not defined

片段4.我破解了Python代码

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

Name1_python_debug_code
Goal编写调试和审查 Python 代码的提示。
模型双子座专业
温度0.1代币限额1024
顶级KN/A 下面的 Python 代码会出错:顶部P
提示回溯 (最近一次调用): 文件 "/ Users/leeboonstra/Documents/test_folder/rename_files.py",第 7行,在 中 text = toUpperCase(prefix) NameError: name 'toUpperCase' is not defined NameError: name 'toUpperCase' is_ not defined 调试出错的地方,并解释如何改进代码。
导入os‘python 导入 shutil #从用户处获取文件夹名称 folder_name = input("输入文件夹名称:")prefix = input("输入文件名前的字符
串:") text = toUpperCase(prefix) # 检查文件夹是否存在 if not os.path.isdir(folder_name): print("Folder does not exist.") exit(1) #获取文件夹中所有文件的列表files= os.listdir(folder_name) # Iterate over the files for file in files: 继续下页...
提示 successfully.")#创建—个前缀为"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
输出 示:代码调用了 toUpperCase函数将 prefx 转换为大写字母,但该函数未定义。要解决这个问 题,可以使用字符串类的 upper()方法将给定字符串转换为大写字母。修改后的代码如下所
'python 导入os 导入 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) # Iterate over the files
for file in files:
# 创建—个前缀为"draft_"的新文件名 new_filename = f" {text}_{file}"
#将文件移至新名称
shutil.move(os.path.join(folder_name, file)、
继续下页...
输出 os.path.join(folder_name, new_filename))
# 打印成功信息 print("Files renamed successfully.")
此外,还可以对代码进行其他一些改进: 1.新文件名的扩展名不会保留。最好从原始文件名中提取扩展名,并将其添加到新文件名 中。
2.代码假定文件夹名称中没有空格。但是
用下划线或连字符代替空格,优雅地处理空格是一种好的做法。
3.与传统的+操作符相比,使用f 字符串语法进行字符串插值更易读、更简洁。
4.代码没有处理重命名过程中可能出现的错误。最好用一个"try...except"块来封装 "shutil.move“调用,以捕捉任何可能的错误。
以下是根据这些建议改进后的代码:
python 导入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)
# Iterate over the files
for file in files:
继续下页...

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

输出#获取文件扩展名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) 例外情况除外 print(f "An error occurred while moving the file {file}: {e}") # 打印成功信息 print("Files renamed successfully.") 这些改进使代码更强大、更灵活,同时也更易于阅读和理解..(由于已达到令牌限制,响应 被截断。如果您需要更长的回复,请尝试增加令牌限制)。

太棒了。它不仅告诉了我如何解决问题,还发现我的代码还有更多的错误和解决方法。提示的最后一部分提出了改进整个代码的建议。

那多模式提示呢?

代码提示仍然使用相同的常规大型语言模型。多模态提示是一个单独的问题,它指的是一种使用多种输入格式来引导的技术。

大语言模型,而不是仅仅依赖文本。这可以包括文本组合、图像、音频、代码,甚至其他格式,具体取决于模型的功能和手头的任务。

最佳做法

要找到正确的提示音,就需要不断调整。顶点人工智能中的语言工作室是一个完美的地方,可以您可以在提示中随意发挥,并根据各种模型进行测试。

使用以下最佳实践,成为及时工程方面的专家。

举例说明

晨重要的最佳做法是在提示中提供(一枪/几枪)示例。这种做法非常有效,因为它是一种强有力的教学工具。这些示例

展示所需的输出或类似的反应,让模型从中学习并据此调整自己的生成。这就像给模型一个参考点或目标,改进其答复的准确性、风格和语气,以更好地满足您的期望。

简约设计

提示应简洁、清晰,便于您和模特理解。作为
经验法则是,如果你已经感到困惑,那么模特很可能也会感到困惑。尝试不使用复杂的语言,不提供不必要的信息。

例如

在此之前

我现在正在纽约访问,我想了解更多关于伟大的地点我有两个3岁的孩子。度假期间我们应该去哪里?

重写后:

为游客提供旅游指南。介绍以下地区的旅游胜地纽约曼哈顿,带着一个3 岁的孩子。

尝试使用描述动作的动词。下面是一组例子:

行动、分析、归类、分类、对比、比较、创造、描述、定义、评估、提取、查找、生成、识别、列表、测量、组织、解析、挑选、预测、提供、排名、推荐、返回、检索、改写、选择、显示、排序、总结、翻译、写作。

具体说明产出

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

例如

DO:

撰写一篇关于5大视频游戏机的3段博文。
博文应内容翔实、引人入胜,并以对话的方式撰写。

不要:

撰写一篇关于视频游戏机的博文。

使用说明而非约束

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

说明就所需的格式、风格或内容提供明确指示。响应。它指导模型应该做什么或产生什么。约束是对响应的一系列限制或界限。它限制了模型不应做或避免做的事。

越来越多的研究表明,在提示中注重积极的指示会更有效果。比严重依赖约束更有效。这种方法符合人类的偏好积极的指示胜过不应该做什么的清单。

指令直接传达所需的结果,而约束则可能会使模式猜测允许什么。它在以下方面提供了灵活性并鼓励创造性而制约因素则会限制模型的潜力。也是约束条件列表会相互冲突。

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

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

DO:

撰写一篇关于5大视频游戏机的1段博文。
只讨论控制台、制造该控制台的公司、年份和总数。
盐。

不要:

撰写一篇关于5大视频游戏机的1段博文。
不要列出视频游戏名称。作为最佳实践,首先要对指令进行优先排序,明确说明您希望模型做什么,只有在必要时才使用约束,以保证安全、清晰或满足特定要求。
通过实验和反复试验,测试不同的指令和限制条件组合,以找到

什么最适合您的具体任务,并将其记录在案。

控制最大标记长度

要控制生成的LLM响应的长度,可以在配置,或在提示中明确要求特定长度。例如

“用推特长度的信息解释量子物理学"

在提示中使用变量

要重复使用提示符并使其更有活力,可在提示符中使用变量,这些变量可以是不同的输入会有不同的变化。例如,如表20所示,提示符提供了关于一个city.与其在提示符中硬编码城市名称,不如使用变量。变量可以节省
通过避免重复,您可以节省时间和精力。如果您需要使用相同的
您可以在多个提示中存储信息,然后引用
每个提示中的变量。当把提示符整合到您的
自己的应用程序。

表20.在提示符中使用变量

提示 丹"变量{city}="阿姆斯特 提示你是一名旅游指南。请告诉我一个关于这个城市的事实:城市
输出阿姆斯特丹是一座美丽的城市,到处都是运河、桥梁和狭窄的街道。这里有丰富的历史、 文化和夜生活,是旅游的好去处。

尝试输入格式和写作风格

不同的模型、模型配置、提示格式、词语选择和提交方式可以产生不同的结果。因此,尝试使用风格等提示属性非常重要、单词选择和提示类型 (零次、少量、系统提示)。

例如,以生成有关革命性电子游戏的文本为目标的提示语是世嘉Dreamcast游戏机,可以表述为问题、陈述或指令、导致不同的输出:

·问题世嘉梦幻卡斯特(Sega Dreamcast)是一款怎样的游戏机?为什么它是一款革命性的游戏机?
·声明世嘉梦幻卡斯特(Sega Dreamcast)是世嘉公司推出的第六代视频游戏机。1999 年的世嘉。它...
·说明:写一段文字,介绍世嘉梦幻卡斯特游戏机和解释了它为何如此具有革命性。

对于分类任务的少量提示, 可混合使用班级

一般来说,几枪示例的顺序并不重要。但是
在进行分类任务时,请确保在少数几个拍摄示例中混合了可能的响应类别。这是因为,如果不这样做,您可能会过度拟合示
例的特定顺序。通过混合可能的反应类别,可以确保模型是

学会识别每一类的主要特征,而不是简单地记住它们的顺序例子。这样,在未见过的数据上就能获得更稳健、更通用的性能。

一个好的经验法则是从6次射击开始,然后开始测试精度。

适应模型更新

您必须随时了解模型架构的变化、添加的数据以及

能力。尝试更新的模型版本,并调整您的提示,以便更好地利用新模型功能。VertexAI Studio 等工具可以很好地存储、测试和记录各种版本的提示信息。

尝试输出格式

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

从提取数据的提示符返回JSON对象有一些好处。在
在实际应用中,我不需要手动创建这种JSON格式,我已经可以按排序顺序返回数据(在处理日期时间对象时非常方便)但大多数情况下,我都需要手动创建JSON格式。

重要的是,通过提示使用JSON格式,可以迫使模型创建一个结构和限制幻觉。

总之,使用JSON进行输出有很多好处:

返回时始终保持相同风格关注您希望接收的数据

及时工程

减少产生幻觉的机会提高关系意识
数据类型您可以对其进行分类

少量提示部分的表4举例说明了如何返回结构化输出。

JSON修复

虽然以JSON格式返回数据有很多优点,但它也有以下缺点缺点。JSON 的结构性虽然有利于在应用程序中进行解析和使用,但与纯文本相比,JSON 需要更多的令牌,这就增加了

处理时间和更高的成本。此外,JSON的冗长会很容易消耗
整个输出窗口,尤其是当发电量被突然切断时,问题会变得更加严重
由于标记限制而被截断。这种截断往往会导致JSON无效,缺少关键的结尾大括号或括号,使输出无法使用。幸运的是,
像 json-repair

库(可在PyPI上获取)在这些情况下非常有用。该库可智能地尝试自动修复不完整或畸形的JSON对象,使其成为一个重要的在处理LLM生成的JSON时,尤其是在处理潜在的JSON时。截断问题。

使用模式

使用结构化JSON作为输出是一个很好的解决方案,正如我们在本章中多次看到的那样
纸张。但是输入呢?虽然JSON非常适合结构化输出,但LLM
此外,它还能为您提供结构化的输入提供极大的帮助。这就是
JSON 模式开始发挥作用。JSON 模式定义了JSON 输入的预期结构和数据类型。通过提供模式,您可以为 LLM 提供清晰的
数据,帮助它将注意力集中在相关信息上,并减少
误读输入的风险。此外,模式还有助于建立以下关系
在不同的数据之间,甚至通过包含具有特定格式的日期或时间戳字段,使LLM具有“时间感知"。

这里有一个简单的例子:

假设您想使用LLM为电子商务中的产品生成说明目录。与只提供自由格式的产品文字描述不同,您可以使用用于定义产品属性的JSON模式:

[ "类型":"对象"、
"属性":{"name":{"type":"string","description":"产品名称"},"类别":{"type":"字 符串","描述":"产品类别"},"价格":『"type":"数字","格式":浮动","描述":“产品价格"
}:"产品价格"}、
"功能":{
"类型":"数组","项目":{"type":"string"},"description":"产品的主要功能"},
"release_date":{ "type": "string"(字符串),"format"(格式):"date"date", "description":"产品发布日期"}。},

然后,您可以将实际产品数据作为符合

本模式:

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

通过对数据进行预处理,而不是只提供完整的文件,同时提供
通过使用模式和数据,您可以让LLM清楚地了解产品的属性、
包括其发布日期,从而更有可能生成准确和相关的
说明。这种结构化的输入方法,引导LLM将注意力集中到相关字段上、在处理大量数据或将LLMs整合到
复杂的应用。

与其他及时工程师一起进行实验

如果您遇到必须想出好的提示语的情况,您可以要找多人进行尝试。当每个人都遵循最佳实践(如本章所列)时,你会发现所有参与者之间的表现会有差异。

不同的提示尝试。

最佳做法

对于CoT提示,需要将答案放在推理之后,因为推理的产生会改变模型在预测"....."时获得的标记。最终答案

通过CoT和自洽性,您需要能够从您的提示,与推理分离。

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

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

记录各种提示尝试

本章前面提到了最后一个提示,但我们再怎么强调它的重要性也不过分。
那就是:详细记录你的提示尝试,这样你就能逐渐了解哪些做得好,哪些做得不好。

不同的模型、不同的采样设置,甚至不同的

此外,即使在同一模型的相同提示下,输出句子的格式和选词也会出现细微差别。此外,即使是同一模型的相同提示,输上句子的格式和用词选择也会出现细微差别。例如

如前所述,如果两个代币的预测概率相同,则可以打破平局。
随机的。这可能会影响后续的预测代币)。

我们建议以表21为模板创建一个GoogleSheet。这样做的好这种方法的好处是,当您不可避免地要重新审视您的提示工作--或者在将来重新开始(你会惊讶于你可以只是短暂休息后就忘记了),测试不同版本模型的提示性能、并帮助调试未来的错误。

除了表中的字段,跟踪提示的版本(迭代)也很有帮助、
一个字段用于捕捉结果是否 OK/NOTOK/SOMETIMES OK,一个字段用于捕捉反馈。如果您有幸使用
VertexAIStudio,请保存您的提示(使用

与文档中列出的名称和版本相同),并跟踪超链接到保存的表格中的提示。这样,您只需点击一下,就可以重新运行提示。

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

一旦你觉得提示语接近完美,就将其带入你的项目代码库。并在代码库,将提示保存在与代码分开的文件中,这样更易于维护。最后,最好您的提示音是可运行系统的一部分,作为提示音工程师,您应该依靠自动测试和评估程序来了解您的提示对任务的泛化程度。

提示工程是一个反复的过程。制作和测试不同的提示语,并进行分析、并记录结果。根据模型的表现完善您的提示。不断尝试,直到获得理想的结果。当您更改模型或模型

配置,回去继续尝试以前使用过的提示。

表21.记录提示的模板

Name [提示符名称和版本]
Goal[用一句话说明这次尝试的目的]
模型 [所用型号的名称和版本]
温度[数值在0-1之间]代币限额[数字]
顶级K[数字]顶部P[数字]
提示[写出全部提示]
输出[写出输出或多个输出]

摘要

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

零提示
极少数镜头提示
系统提示
角色提示
情境提示
后退提示
思维链
自我一致性
思想之树

及时工程

再行动

我们甚至还研究了如何将提示自动化的方法,

白皮书随后讨论了基因人工智能所面临的挑战,如可能发生的问题当你的提示不够时。最后,我们就如何成为一名更好的快速工程师。

客服QQ:

客服微信

返回顶部