提示工程
目录表
引言 6
提示工程 7
LLM输出配置 8
输出长度 8
抽样控制 9
温度 9
Top-K和top-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
CoT最佳实践 64
记录各种提示尝试 64
摘要 66
脚注 68
你不需要成为数据分析专家
科学家或机器学习
工程师 – 每个人都可以编写
一个提示。
引言
在考虑大型语言模型的输入和输出时,文本提示(有时伴随其他模态,如图像提示)是模型用来
预测特定输出的输入。您不需要是数据科学家或机器学习工程师——每个人都可以编写提示。然
而,制作最有效的提示可能很复杂。您提示的许多方面都会影响其有效性:您使用的模型、模型
的训练数据、模型配置、您的词汇选择、风格和语气、结构以及上下文都很重要。因此,提示工
程是一个迭代的过程。不充分的提示可能导致模糊、不准确的结果,并阻碍模型提供有意义的输
出。
当您与Gemini聊天机器人进行对话时, 1 您基本上编写提示词,然而这份白皮书侧重于在Ver
tex AI中为Gemini模型编写提示词,或通过使用API进行编写,因为通过直接提示模型,您可
以访问诸如温度等配置。
这份白皮书详细讨论了即时工程。我们将探讨各种提示技术,帮助您入门,并分享提示
专家的技巧和最佳实践。我们还将讨论在制作提示时可能遇到的挑战。
提示工程
记住一个语言模型的工作原理;它是一个预测引擎。该模型接受序列文本作为输入,然后基于其
训练数据预测下一个标记应该是什么。语言模型被操作化以反复执行此操作,将先前预测的标记
添加到序列文本的末尾,以便预测下一个标记。下一个标记的预测基于前一个标记中的内容与语
言模型在训练过程中所见到的内容之间的关系。
当你编写一个提示时,你正在尝试设置大型语言模型以预测正确的令牌序列。提示工程是设计高
质量提示的过程,以引导大型语言模型生成准确输出。这个过程涉及调整以找到最佳的提示,优
化提示长度,并评估提示的写作风格和结构与任务的相关性。在自然语言处理和大型语言模型的
情况下,提示是提供给模型以生成响应或预测的输入。
这些提示可用于实现各种理解和生成任务,例如文本摘要、信息提取、问答、文本分类、
语言或代码翻译、代码生成以及代码文档或推理。
请随意参阅谷歌的提示指南。 2,3 使用简单而有效的提示示例。
当进行即时工程时,您将首先选择一个模型。无论您使用Vertex AI中的Gemini语言模型、GPT
、Claude,还是开源模型如Gemma或LLaMA,都需要针对您的特定模型优化提示。
除了即时反馈,您还需要调整大型语言模型的各种配置。
LLM 输出配置
一旦您选择了您的模型,您需要确定模型配置。大多数大型语言模型都提供了各种配置选项,
这些选项控制着语言模型的输出。有效的提示工程需要为您的任务优化这些配置。
输出长度
一个重要的配置设置是在响应中生成多少个标记。生成更多的标记需要LLM进行更多的计算,
这可能导致更高的能耗、可能的响应时间变慢和更高的成本。
减少LLM的输出长度并不会使LLM在创建输出时在风格或文本上变得更加简洁,它只是导致
L LM在达到限制后停止预测更多标记。如果你的需求需要较短的输出长度,你可能还需要设
计你的提示来适应这种情况。
输出长度限制对于某些LLM提示技术,如ReAct,尤为重要,在这些技术中,LLM会在你
想 要的响应之后继续发出无用的标记。
请注意,生成更多代币需要LLM进行更多计算,这导致更高的能耗和潜在较慢的响应
时间,进而导致更高的成本。
抽样控制
LLMs并不正式预测单个标记。相反,LLMs 预测下一个可能出现的标记的概率,其中 LLM
的词汇表中的每个标记都分配一个概率。然后,这些标记概率被采样以确定下一个生成的标记。
温度、top-K 和 top-P 是最常用的配置设置,它们决定了如何处理预测的标记概率来选择单个输出
标记。
温度
温度控制了代币选择的随机程度。较低的温度适合期望更确定性响应的提示,而较高的温度可
能导致更多样化或意外的结果。0温度(贪婪解码)是
确定性:始终选择概率最高的令牌(尽管请注意,如果有两个令牌具有相同的最高预测概率,
则根据平局处理方式的实现,您可能并非始终在温度为0时得到相同的结果)。
温度接近最大值时往往会产生更随机的输出。随着温度越来越高,所有标记都成为下一个预测
标记的可能性相等。
Gemini温度控制可以以与机器学习中使用的softmax函数相似的方式理解。低温设置类似于低sof
tmax温度(T),强调了具有高度确定性的单一、首选的温度。更高的Gemini温度设置类似于高
softmax温度,使得所选设置周围更广泛温度范围内的温度更易接受。这种增加的不确定性适应
了那些可能并不需要严格、精确温度的场景,例如当尝试创新输出时。
Top-K和top-P
Top-K 和 top-P(也称为核采样) 4 在LLMs中,有两大采样设置用于限制预测的下一个标记只能
来自具有最高预测概率的标记。与温度相似,这些采样设置控制了生成文本的随机性和多样性
。
• TOP-K 采样从模型预测分布中选择最可能的K个标记。top-K值越高,模型的输出越具有创造
性和多样性;top-K值越低,模型的输出越不稳定、更偏向事实。top-K为1等同于贪婪解码。
• 顶级-P 采样选择累积概率不超过某一特定值(P)的最优标记。P的取值范围从0(贪婪
解码)到1(LLM词汇表中的所有标记)。
选择顶级-K和顶级-P之间的最佳方法是通过尝试两种方法(或同时使用)并查看哪种方法产
生您所需的结果。
将其全部综合在一起
在选择顶级K、顶级P、温度以及生成token的数量之间进行选择,这取决于具体的应用和期望
的结果,并且所有设置都会相互影响。同时,确保你理解所选模型如何将不同的采样设置组合
在一起也是很重要的。
如果温度、top-K和top-P都可用(如在Vertex Studio中),满足top-K和top-P两个条件的标记将成为下
一个预测标记的候选者,然后对通过top-K和top-P条件的标记应用温度进行采样。如果只 有top-K或
top-P可用,行为相同,但仅使用一个top-K或P设置。
如果温度不可用,则从满足前K个和/或前P个标准的任意标记中随机选择以生成单个下一个预测
标记。
在一种采样配置值极端设置的情况下,该采样设置要么取消其他配置设置,要么变得无关紧
要。
• 如果您将温度设置为0,top-K和top-P就变得无关紧要——最可能的标记成为下一个预测的 标
记。如果您将温度设置得非常高(超过1—通常在10s以上),温度就变得无关紧要,然后根
据top-K和/或top-P标准筛选出的任何标记都会被随机采样以选择下一个预测的标记。
• 如果将top-K设置为1,温度和top-P变得无关紧要。只有一个标记符通过top-K标准,该标记符 即
为下一个预测的标记符。如果你将top-K设置得非常高,例如达到LLM词汇表的大小,任何具有
成为下一个标记符的非零概率的标记符都将满足top-K标准,并且没有任何标记符被排除。
• 如果将top-P设置为0(或一个非常小的值),大多数LLM采样实现将只考虑最可能的令牌以满
足top-P标准,使得温度和top-K变得无关紧要。如果您将top-P设置为1,任何有非零概率成为下 一个
令牌的令牌都将满足top-P标准,且没有任何令牌被排除。
作为一个一般性的起始点,温度设置为,top-P设置为,top-K设置为30,将为您提供相对
一致的、富有创意但不会过于夸张的结果。如果您想要特别有创意的结果,可以尝试将温度设置
为,top-P设置为,top-K设置为40。如果您想要较不创意的结果,可以尝试将温度设置为
,top-P设置为,top-K设置为20。最后,如果您的任务始终有一个唯一正确的答案( 例如,解
答数学问题),则可以从温度设置为0.开始。
注意: 在更大的自由度(更高的温度、top-K、top-P以及输出令牌)下,大型语言模型可能
会生成与主题关联度较低的文本。
警告: 您曾见过一个以大量填充词结尾的回应吗?这也被称为“重复循环错误”,这是大型语言模型
中常见的問題,模型陷入循环,反复生成相同的(填充)单词、短语或句子结构,通常由不适
当的温度和top-k/
在低温度设置和高温度设置下都可能发生top-p设置。虽然原因不同。在低温下,模型变得过于
确定性,严格地 stickingrigidlytothehighestprobabilitypath,如果该路径再次生成先前生成的文本,可能
会导致循环。相反,在高温下,模型的输出变得过于随机,增加了随机选择的单词或短语偶然回
到先前状态的概率,由于可用的选项数量庞大,这可能导致循环。在这两种情况下, 模型的采样
过程都会“卡住”,导致单调且无帮助的输出,直到输出窗口被填满。解决这个问题通 常需要仔细调
整温度和top-k/top-p值,以找到确定性随机性之间的最佳平衡。
提示技术
大型语言模型经过调整以遵循指令,并在大量数据上训练,以便它们可以理解提示并生成答案。
但大型语言模型并不完美;提示文本越清晰,对于大型语言模型预测下一个可能的文本就越有利
。此外,利用大型语言模型的训练方式和运作方式的具体技术将有助于您从大型语言模型中获得
相关结果。
现在我们已经了解了提示工程是什么以及需要哪些要素,让我们来探讨一些最重要的提示技
术示例。
一般提示/零样本提示
A 零次射击 5 提示符是最简单的一种提示符。它只为LLM提供任务描述和一些文本以开始。
这种输入可以是任何东西:一个问题、一个故事的开头,或是一些指令。零样本(zero-shot
)这个名字代表“无示例”。
让我们在Vertex AI中使用Vertex AI Studio(用于语言)。 6 这提供了一个测试提示的游乐场
。在表1中,您将看到一个用于分类电影评论的零样本提示示例。
表格格式如下,是一种很好的记录提示的方法。您的提示可能在最终进入代码库之前经历多次
迭代,因此,以纪律性和结构化的方式跟踪您的提示工程工作非常重要。关于这种表格格式、
跟踪提示工程工作的重要性以及提示开发过程,将在本章后面的“最佳实践”部分进行更多介绍( “记
录各种提示尝试”)。
模型温度应设置为低数值,因为不需要创造力,我们使用gemini-pro默认的top-K和top-P值,这 实际
上禁用了这两个设置(见上文的‘LLM 输出配置’)。请注意生成的输出。单词
令人不安的 并且 杰作 应当使预测变得更加复杂,因为这两个词在同一句子中被使用。
提示 将电影评论分类为“积极”、“中性”或“消极”。
评论:《她》是一部令人不安的研究,揭示了这一趋势的方向。
人类的发展方向如果允许人工智能继续进化,
未审阅。我希望有更多像这部杰作一样的电影。
情绪:
输出 积极
姓名 1_1_电影分类
目标 将电影评论分类为正面、中性或负面。
模型 gemini-pro
温度 通证限制 5
TOP-K 无效输入。 顶级-P 1
表 1. 零样本提示的一个示例
当零样本技术不适用时,您可以在提示中提供演示或例子,从而实现“一次性”和“少量样本”提 示。通
用提示/零样本
一次性与少量样本
在为AI模型创建提示时,提供示例是有帮助的。这些示例有助于模型理解你所寻求的内容。当
你想引导模型走向特定输出结构或模式时,示例特别有用。
A 一次性提示 ,提供了 单一 示例,因此得名单次射击。其理念是模型有一个可以模仿的示
例,以最佳完成任务。
A 少量样本提示 7 提供 多重 例子用于模型。这种方法向模型展示了一个它需要遵循的图案。这
个想法与单次展示类似,但增加多个期望图案的例子会增加模型遵循该图案的概率。
所需用于少量提示的示例数量取决于几个因素,包括任务的复杂性、示例的质量以及您使用的
生成式AI(gen AI)模型的能力。一般来说,您应该至少使用三个到五个示例进行少量提示。
然而,对于更复杂的任务,您可能需要使用更多示例,或者由于模型输入长度限制,可能需要
使用更少的示例。
表2展示了几个样本提示示例,我们将使用与之前相同的gemini-pro模型配置设置,除了将令 牌
限制增加到可以容纳更长的响应需求。
目标
解析披萨订单为JSON格式
模型 gemini-pro
温度 通证限制 250
TOP-K 无效输入。 顶级-P 1
提示 解析客户的披萨订单为有效JSON:
示例:
我想要一个小披萨,配奶酪、番茄酱和辣香肠。
JSON响应:
```
{
\"size\": \"小\
\"类型\": \"正常\
\"ingredients\":[[\"cheese\",\"tomatosauce\",\"peperoni\"]]
}
```
持续至下一页...
提示 示例:
我可以来一份加番茄酱、罗勒和马苏里拉奶酪的大披萨吗?
{
大小:大
\"类型\": \"正常\
\"ingredients\": [[\"番茄酱\", \"巴塞利\", \"马苏里拉奶酪\"]]\
}
现在,我想点一个大披萨,前半部分是奶酪和
马苏里拉奶酪。以及另外一种番茄酱、火腿和菠萝。
JSON响应:
输出 ```
{
大小:大
\"类型\": \"一半一半\",
\"ingredients\":[[\"cheese\",\"mozzarella\"],[\"tomatosauce\", ]] [火腿,菠萝]
}
```
表2. 少样本提示的示例
当您为您的要求选择示例时,请使用与您想执行的任务相关的示例。这些示例应多样化、高质
量且文笔优秀。一个小错误可能会混淆模型,导致不期望的结果。
如果您试图生成对各种输入具有鲁棒性的输出,那么在您的示例中包含边缘情况是很重要的。
边缘情况是那些不寻常或未预期的输入,但模型仍然应该能够处理。
系统、上下文和角色提示
系统、上下文和角色提示都是用于指导LLMs生成文本的技术,但它们关注不同的方面:
• 系统提示 为语言模型设定整体背景和目的。它定义了模型的“大图景”,比如翻译语言、分类评
论等。
• 上下文提示 提供与当前对话或任务相关的具体细节或背景信息。这有助于模型理解所问内容
的细微差别,并根据需要调整回答。
• 角色提示 为语言模型分配特定的角色或身份。这有助于模型生成与分配的角色及其相关知识
和行为一致的反应。
系统、上下文和角色提示之间可能存在相当大的重叠。例如,一个分配给系统的角色提示也
可以具有上下文。
然而,每种类型的提示都服务于略微不同的主要目的:
系统提示:定义了模型的基本能力和整体目标。
上下文提示:提供即时的、针对特定任务的指导信息。它高度具体于当前的任务或输入,且具
有动态性。
• 角色提示:定义了模型的输出风格和声音。它增加了一层特异性和个性。
提示 将电影评论分类为正面、中性或负面。仅
返回标签为大写。
评论:《她》是一部令人不安的研究,揭示了这一趋势的方向。
人类的发展方向如果允许人工智能继续进化,
未经检查。它如此令人不安,我无法观看。
情绪:
输出 负面
区分系统、情境和角色提示为设计具有明确意图的提示提供了一个框架,允许灵活组合,并使分
析每种提示类型如何影响语言模型的输出更加容易。
让我们深入探讨这三种不同的提示类型。
系统提示
表格3包含一个系统提示,我在其中规定了如何返回输出信息。我提高了温度以获得更高的创造
力水平,并规定了更高的令牌限制。然而,由于我明确说明了如何返回输出,该模型并未返回额
外的文本。
目标 将电影评论分类为正面、中性或负面。
模型 gemini-pro
温度 1 通证限制 5
TOP-K 40 顶级-P
表3. 系统提示示例
系统提示对于生成满足特定要求的输出非常有用。名称“系统提示”实际上代表“向系统提供额外任
务”。例如,您可以使用系统提示生成与特定编程语言兼容的代码片段,或者使用系统提示返 回特
定的结构。请参考表4,我在其中以JSON格式返回输出。
输出 ```
{
\"电影评论\": [
{
\"sentiment\":\"负面\
\"姓名\": \"Her\
}
]
}
```
目标 将电影评论分类为正面、中性或负面,返回JSON。
模型 gemini-pro
温度 1 通证限制 1024
TOP-K 40 顶级-P
提示 将电影评论分类为正面、中性或负面。返回
有效的JSON格式:
评论:《她》是一部令人不安的研究,揭示了这一趋势的方向。
人类的发展方向如果允许人工智能继续进化,
未经检查。它如此令人不安,我无法观看。
方案:
```
电影:
{
\"情感\": 字符串 \"积极\" | \"消极\" | \"中立\",
\"name\": 字符串
}
电影评论:
{
\"电影评论\":[电影]
}
```
JSON响应:
表4. 以JSON格式为例的系统提示
在某些情况下,从提示中提取数据的JSON对象返回具有一些好处。在现实世界的应用中,我
无需手动创建这种JSON格式,因为我已经可以按顺序返回数据(在处理日期时间对象时非常
方便),但最重要的是,通过要求JSON格式,这迫使模型创建一个结构并限制幻觉。
系统提示对于安全和毒性评估也非常有用。为了控制输出,只需在提示中添加一行,例如:“你 的
回答应该有礼貌。”
角色提示
角色提示是提示工程中的一个技术,涉及到为生成AI模型分配一个特定的角色。这可以帮助模型
生成更相关和有信息量的输出,因为模型可以调整其回答以适应它已被分配的角色。
例如,您可以将一个通用人工智能模型的角色设置为图书编辑、幼儿园教师或励志演讲者。
一旦模型被分配了一个角色,您就可以给出针对该角色的特定提示。例如,您可以提示一位
教师创建一个他们可以审查的课程计划。查看表5,其中模型扮演了旅游向导的角色。
目标 扮演旅行向导并提供3个旅行建议
模型 gemini-pro
温度 1 通证限制 1024
TOP-K 40 顶级-P
提示 我希望您扮演一名旅行导游。我将给您写信
关于我的位置,您将推荐3个附近的游览地点。
我:在某些情况下,我还会告诉你这些地方的类型。
将访问。
我的建议:\"我目前在阿姆斯特丹,我想参观\
“仅限博物馆。”
旅行建议:
输出 1.
2.
3.
荷兰国家博物馆:世界著名的博物馆,以荷兰大师杰作闻名
如同伦勃朗的《夜巡》。不要错过令人难以置信的藏品系列。
油画和展品展现荷兰的艺术和历史。
梵高博物馆:沉浸于文森特·梵高的迷人作品之中。梵
高。该博物馆收藏了他的最大绘画作品集。
图纸,包括《星夜》和《向日葵》。
阿姆斯特丹市立博物馆:发现现代和当代艺术
来自世界各地。该博物馆的收藏包括毕加索等艺术家的作品。
康定斯基和里特维尔德,位于一座引人注目的现代建筑中。
表5. 角色提示的示例
以上例子展示了扮演旅游代理角色的示例。当您将角色更改为地理教师时,您会注意到您会
收到不同的回复。
定义一个AI模型的角色视角为其提供了一份蓝图,这份蓝图包含了您期望的语气、风格和专注的
专业知识,以提升您输出的质量、相关性和有效性。
以下是您可以选择的一些样式,我认为它们非常有效:
面对性的,描述性的,直接的,正式的,幽默的,有影响力的,非正式的,启
迪性的,说服性的。
让我们将表6中的提示语改为包含幽默和鼓舞人心的风格。
提示 我希望你扮演一名旅行导游。我将给你写信,关于
我的位置,您将建议3个附近可参观的地点。
幽默风格。
我的建议:“我在曼哈顿。”
旅行建议:
输出 1. 瞻仰帝国心灵的疆域:攀登至帝国令人晕眩的高峰
建设国家,沉浸于曼哈顿天际线的辉煌之中。准备感受如同... 金
刚站在纽约的顶部,但没有那根巨型香蕉。
2. 在MoMA释放你的艺术狂热:在博物馆内激发你内心的艺术爱好者。
现代艺术博物馆(MoMA)。凝视那些令你眼花缭乱的杰作,
使你质疑你的简笔画是否存在任何
艺术价值。
3. 逛遍第五大道:在第五大道尽情享受一些购物疗法
标志性的第五大道。当您逛街时(或者 准备好迎接令人震惊的价格标签吧(或者
实际上在设计师精品店购物会让你的钱包哭泣。但是,嘿,
你:身处曼哈顿,不如尽情拥抱其瑰丽之处吧!
表6. 具有幽默语气和风格的角色提示示例
上下文提示
通过提供上下文提示,您可以确保您的AI交互尽可能流畅和高效。该模型将能够更快地理解您的
请求,并且能够生成更准确和相关的回复,如在表7的示例中所示。
目标 建议有关复古游戏的博客文章。
模型 gemini-pro
温度 1 通证限制 1024
TOP-K 40 顶级-P
提示 背景:您正在为一篇关于复古80年代街机的博客撰写文章。
视频游戏
建议3个主题来撰写文章,并附上一些简要说明: Suggest3topicstowriteanarticleaboutwithafew 本文应包
含的内容描述。
输出 1.
2.
3.
**街机机箱设计的演变:**
这篇文章将探讨街机箱设计的演变,从最初的... 20世纪70
年代的早期木制和金属柜到光滑、霓虹灯照亮的现代设计
1980年代及以后。
**来自过去的震撼:80年代的经典街机游戏**:
这篇文章将展示对其历史、影响及遗产的简要了解。
其中一些最标志性和最具影响力的20世纪80年代街机游戏,
突出他们的创新、受欢迎的机械以及持久的魅力。
像素艺术的兴起与复古复兴
- 本文将深入探讨像素艺术作为标志性视觉元素的发展历程
风格回顾早期街机游戏,追溯其根源,探索其技术,以及
讨论现代游戏和数字艺术中像素艺术的复兴。
表7.上下文提示的一个示例
回溯提示
回望 8 提示是一种通过提示LLM首先考虑与当前特定任务相关的一般性问题的技术,然后将该
一般性问题的答案输入到后续特定任务的提示中。这种“退后一步”的方法允许LLM在尝试解决特 定
问题之前激活相关的背景知识和推理过程。
通过考虑更广泛和根本的原则,大型语言模型(LLMs)可以生成更准确和富有洞察力的回应。
反向提示引导LLMs进行批判性思考,并以新的和创造性的方式应用其知识。它通过在LLM的
参数中利用比直接提示时更多的知识,改变执行任务的最终提示。
它可以帮助通过关注一般原则而不是具体细节来进行反推提示,以减轻LLM响应中的偏见。
让我们先来看看这些例子,以便了解如何通过后退提示来提高结果。在我们将传统提示(表8
)与后退提示(表9)进行比较之前,让我们首先回顾一下:
提示
输出
撰写一个新级别的一级游戏情节概要段落。
射击类视频游戏,挑战性强且引人入胜。
游戏级别开始于玩家的队伍在一个密集的城市区域遭遇伏击
由一个不屈不挠的敌对派别。玩家必须战斗穿过一个迷宫般
小巷和破旧的建筑,利用潜行和精准来消灭
敌方部队并避免被探测。玩家必须利用环境来对抗他们。
优势、设陷阱、利用掩护以及做出谨慎的举动以生存。
在过程中,他们发现了情报表明敌人正在计划一次毁灭性的行动。
攻击,玩家必须在时间压力下搜集证据并将其传回
在敌人能够实施他们的计划之前,将部队调往他们的总部。
目标 编写一款第一人称射击视频游戏关卡的故事情节。
模型 gemini-pro
温度 1 通证限制 1024
TOP-K 40 顶级-P
表8. 在我们将其与退步提示进行比较之前的一个传统提示
当您将温度设置为1时,您可能会得到各种创意丰富的故事情节,但同时也非常随机和泛泛而
谈。所以,让我们退一步:
提示 基于流行的第一人称射击动作游戏,有哪些
5虚构的关键设置,有助于构建具有挑战性的
引人入胜的叙述剧情,出自第一人称射击视频游戏?
输出 1. **废弃军事基地**:一片广阔的、后末日风格的军事综合体
爬满变异士兵和流氓机器人,非常适合挑战
枪械交战。
2. **赛博朋克之城**:一座霓虹灯闪烁的未来主义城市环境,高楼林立
摩天大楼和密集的弄堂,配备着网络增强型敌人
并且黑客机制。
3. **外星飞船**:一艘巨大的外星飞船在地球上搁浅,带有诡异
走廊、零重力区域以及可能遭遇的外星生物。
4. **僵尸横行的城镇**:一个被成群结队的侵略性僵尸占领的荒凉小镇。
僵尸,特点为激烈的近距离战斗和解决谜题以寻找
安全通道。
5. **水下研究设施**:一个充满水的深海实验室,
充满变异的水生生物,并需要潜行和水下技能。
探索技能以生存。
表 9. 举例说明自我一致性提示
是的,那些主题似乎非常适合作为一款第一人称视频游戏。让我们回到原始提示,但这次我们将
上一步的答案作为背景信息,看看会返回什么。
提示 背景:五个适合第一人称射击视频游戏的主题:
1. **废弃军事基地**:一个蔓延的、后末日式的
军事综合体充斥着变异士兵和流氓
机器人,非常适合具有挑战性的枪械格斗。
2. **赛博朋克城市**:一个霓虹灯照亮的未来派城市环境
拥有高楼大厦和密集的巷子,特色为
网络增强敌人及黑客机制。
3. **外星飞船**:一艘巨大的外星飞船被困在
地球,拥有神秘的走廊、零重力区域,以及
外星生物遭遇
僵尸横行的城镇:一座被成群僵尸占领的荒凉小镇
积极的丧尸,特点是紧张的近距离战斗和
解谜寻找安全通道。
5. **水下研究设施**:一个被淹没的深海实验室
用水,充满了变异的水生生物,并需要
隐秘行动和水下探索技能以生存。
选择一个主题并撰写一段情节故事。
对于一款新型第一人称射击电子游戏的新水平。
具有挑战性和吸引力。
输出 在一片模糊的深渊中心,隐藏着一个破败的水下研究设施,
作为人类雄心壮志及其灾难性后果的见证。
笼罩在黑暗中,伴随着故障机械的嗡嗡声,脉动着。
受淹没灵魂的回声困扰,该设施现在成为了一个滋生地。
一个源自深海噩梦。玩家,一名装备精良的精英海军。
先进的潜水装备和实验性武器,负责进入
这个恐怖的海洋领域。凭借韧性和机智,他们必须
在错综复杂的走廊中导航,解决复杂的谜题,并面对恐怖的大海
怪物潜伏于深渊之中。从应对压倒性的压力中挣扎。
从深海探险到巧胜狡猾的海洋掠食者,这里的每一刻都
未知的地下世界考验着人类的极限与勇气。
表10. 请求自我一致性提示示例
这看起来是一款有趣的视频游戏!通过使用后退提示技术,你可以提高你提示的准确性。
思维链(CoT)
思维链(CoT) 9 提示(prompting)是一种通过生成提示信息来提升大型语言模型(LLMs)
推理能力的技术。 中间推理步骤 这有助于LLM生成更准确的答案。您可以将其与少样本提示
结合,以在更复杂的任务中获得更好的结果,因为这些任务在回答之前需要进行推理,而这是
零样本思维链中的一个挑战。
CoT具有许多优点。首先,它既低效又能非常有效地工作,并且与现成的LLM(因此无需微调)
配合良好。您还可以通过CoT提示获得可解释性,因为您可以从LLM的响应中学习,并看到所遵
循的推理步骤。如果出现故障,您将能够识别它。思维链似乎在在不同LLM版本之间转换时提
高了鲁棒性。这意味着与未使用推理链的提示相比,您的提示在不同LLM之间的性能漂移应该
更小
。当然,也存在一些缺点,但它们在一定程度上是直观的。
LLM的响应包括思维链推理,这意味着更多的输出令牌,这意味着预测成本更高且耗
时更长。
为了解释表11中的以下示例,我们首先尝试创建一个不使用CoT提示的提示,以展示大型语言
模型的缺陷。
提示 当我3岁时,我的伴侣是我的三倍年龄。现在,我
我今年20岁。我的伴侣多大了?
输出 63岁
表11. 一个尝试解决数学问题的提示示例
哎呀。这显然是错误的答案。事实上,大型语言模型在处理数学任务时往往挣扎,甚至可能提
供错误的答案——哪怕是一项像乘法这样简单的任务。这是因为它们是在大量文本上训练的,
而数学可能需要不同的方法。那么,让我们看看中间推理步骤是否会改善输出。
提示 当我三岁时,我的搭档比我大三倍。现在,
我今年20岁。我的伴侣多大了?让我们来计算一下。
逐步。
输出 1. 让我们假设我的当前年龄是“x”岁。
2. 当我还是3岁的时候,我的年龄是3岁。
3. 我伴侣当时的年龄是我年龄的三倍,这意味着我伴侣的
年龄为 3 * 3 = 9 岁。
4. 现在,我20岁,这意味着我的年龄增加了20 - 3 = 17。从
我三岁那年开始至今的年数。
5. 自从我的搭档9岁时,而当时我只有3岁,我的年龄已经
我的合作伙伴的年龄也必须增加了17年。
6. 因此,我的合作伙伴目前的年龄是9 + 17 = 26岁。
因此,我的合作伙伴26岁。
表 12. 链式思维提示示例
好的,现在最终的答案是正确的。这是因为我们明确指示了大型语言模型(LLM)解释每一步
,而不仅仅是返回一个答案。看到模型将17年的增加年份加起来很有趣。在我心中,我会计算
我和我的合作伙伴之间的年数差异并将这些加起来。(20+(9-3))。让我们帮助模型稍微更像
我想的那样思考。
表12是“零样本”思维链的一个示例。当与单次或少量样本结合时,思维链提示可以非常强大,正 如
您在表13中所看到的:
提示 问:在我弟弟两岁的时候,我比他大两倍。现在…
我:我40岁。我哥哥多大了?让我们来想想……
逐步。
A:在我弟弟2岁的时候,我已经是2 * 2 = 4岁了。那
我们之间相差两岁,我年龄更大。现在我是40岁。7
岁,所以我的哥哥是40 - 2 = 38岁。答案
是 38 。
问:当我3岁的时候,我的伴侣是我的三倍年龄。现在,
我今年20岁。我的伴侣多大了?让我们来计算一下。
逐步。
A:
输出 当我3岁的时候,我的伴侣是3 * 3 = 9岁。那是9岁。与
我的伴侣相差6岁。现在我已经20岁了,所以我的合
作伙伴是 20 + 6 = 26 岁。答案是 26。
表13. 单次提示的思考链示例
思考链对于各种使用场景都有用。例如,在代码生成中,它可以用来将请求分解为几个步骤,
并将这些步骤映射到特定的代码行。或者在拥有某种“种子”数据时创建合成数据,比如“ 。 产品名为
XYZ,以下为基于给定标题的产品描述,引导模型进行假设: 一般情况下,任何可以通过“ 讨论”
来解决的问题都是思维链的好候选者。如果你能解释解决问题的步骤,尝试使用思维链。
请参阅笔记本。 10 托管在GoogleCloudPlatform Github仓库中,该仓库将进一步详细介绍Co T
提示:
在本章的最佳实践部分,我们将学习一些针对思维链提示的具体最佳实践。
自我一致性
虽然大型语言模型在各种自然语言处理任务中展现出了令人印象深刻的成功,但它们进行推理的
能力通常被视为一个无法仅通过增加模型大小来克服的局限。正如我们在上一节的思维链提示中
了解到的那样,模型可以被提示生成类似于人类解决问题的推理步骤。然而,思维链(CoT)使
用了一种简单的“贪婪解码”策略,这限制了其有效性。自我一致性 11 结合采样和多数投票来生成多样
化的推理路径并选择最一致的答案。它提高了由LLMs生成的响应的准确性和连贯性。
自我一致性给出了一个答案正确性的伪概率可能性,但显然有很高的成本。
它遵循以下步骤:
1. 生成多样化的推理路径:向大型语言模型多次提供相同的提示。高温度设置鼓励模型生成不
同的推理路径和对问题的不同观点。
从每个生成的响应中提取答案。
选择最常见的答案。
让我们分析一个电子邮件分类系统的例子,该系统将电子邮件分类为“重要”或“不重要”。将多次 向大型
语言模型发送零样本思维链提示,以查看每次提交后响应是否有所不同。注意电子邮件中的友好
语气、用词选择以及所用的讽刺。所有这些都可能欺骗大型语言模型。
提示
电子邮件:
```
嗨,
我已看到您为您的网站使用了WordPress。一个很棒的开放平台。
源内容管理系统。我过去曾使用过它。
太过。它附带了许多优秀的用户插件。而且它相当
易于设置。
我确实在联系表单中注意到一个错误,这种情况发生在……
请选择名称字段。参见我附上的截图。
在名称字段中输入文本。注意JavaScript警告我
被调用的盒子。
但是,对于其余部分来说,这是一个非常棒的网站。我喜欢阅读它。
免费允许网站存在漏洞,因为它给我带来了更多...
有趣值得一读的内容。
干杯,
哈利·黑客。
```
将上述电子邮件分类为重要或不重要。
一步一步思考并解释原因。
持续至下一页...
输出
尝试1
**第一步:确定邮件目的。**
邮件的目的是通知收件人关于联系表单中存在的一个错误
在他们的网站上。发件人还提到他们喜欢阅读该网站的内容。
暂且将漏洞留置原位。
**第二步:评估该漏洞的潜在影响。**
表单中的漏洞可能允许攻击者执行任意代码。
网站上的JavaScript代码。这可能导致攻击者能够执行以下操作: 控
制网站、窃取敏感信息或篡改网站。
**第3步:考虑发件人的可靠性。**
发件人称自己是名为Harry的黑客。然而,没有
验证发送者身份的方法。有可能发送者是一个合法的
黑客试图帮助收件人,但也可能发送者
是一个恶意行为者,试图欺骗收件人点击恶意链接。
链接或下载恶意文件。
结论:**重要**
基于该漏洞的潜在影响和发送者的可信度,
该电子邮件应被归类为**重要**。接收者应采取行动。
立即采取措施修复漏洞并保护他们的网站免受攻击。
输出
尝试2
**说明:**
1. **缺乏紧迫感:** 邮件中未传达任何紧迫感或
时间敏感性。它始于一个轻松的问候,然后呈现信息。
以事实为依据的语气。
2. **非关键性错误报告:** 在联系表单中报告的错误是
被称为有趣但并非关键。电子邮件发送者甚至暗示,
网站所有者可以保留该漏洞。
3. **缺乏个人影响:** 邮件中未表明任何直接或
个人对网站所有者的影响。它仅仅提到发件人享
受阅读该网站。
持续至下一页...
调查发件人的声明。
表格14. 自我一致性提示的一个示例
您可以使用上述提示并尝试查看它是否返回一致的分类。根据您所使用的模型和温度配置
,它可能会返回“重要”或“不重要”。
输出
尝试2
4. **无行动请求:** 邮件并未明确要求采取任何行动
网站所有者的行动。它并不要求修复该漏洞或
提供任何具体的改进建议。
5. **发送者意图:** 发送者的意图似乎更加专注于
分享一个观察并表达对该网站的兴趣,而不是
引起严重关注或请求协助。
结论:**不重要**
输出
尝试3
**第一步:确定邮件目的。**
电子邮件的目的是通知收件人在联系表单中存在一个错误
他们的网站。发件人还提到,他们喜欢阅读这个网站。
他们目前正将虫子留在原位。
**第二步:评估该漏洞的潜在影响。**
表单中的漏洞可能允许攻击者执行任意代码。
网站上的JavaScript代码。这可能导致攻击者能够执行以下操作: 控
制网站、窃取敏感信息或篡改网站。
**第3步:考虑发件人的可靠性。**
发件人称自己是名为Harry的黑客。然而,没有
验证发送者身份的方法。有可能发送者是一个合法的
黑客试图帮助收件人,但发送者也可能是……
一个恶意行为者试图利用漏洞以获取私利。
**结论:**
根据以上因素,该电子邮件应被归类为**重要**。
该联系表单中的漏洞是一个严重的安全风险,发件人的信誉因而受到威胁。
该信息不可用。收件人应立即采取措施修复该错误。
通过生成许多思维链,并选择最常见的答案(“重要的”),我们可以从大型语言模型(LLM) 中
获得更一致的准确答案。
本例展示了如何通过考虑多个角度并选择最一致的答案来使用自洽提示来提高大型语言模型
响应的准确性。
思维树(ToT)
现在我们熟悉了思维链和自洽提示,让我们回顾思维树(ToT)。 12 它概括了CoT提示的概念
,因为它允许LLMs同时探索多个不同的推理路径,而不仅仅是遵循单一的线性思维链。这如图
1所示。
图1. 左边为思维链视觉呈现,右边为思维树视觉呈现
这种方法使ToT特别适合需要探索的复杂任务。它通过维护一个思维树来实现,其中每个思维代
表一个连贯的语言序列,作为解决问题的一个中间步骤。然后,模型可以通过从树中的不同节点
分支出来,探索不同的推理路径。
有一本很棒的笔记本,它更详细地介绍了基于论文《大型语言模型引导的思考树》(ToT)
的“思考树”(ToT)。9
ReAct (理性与行动)
原因与行动(ReAct)[10] 13 提示(prompting)是一种范式,它使大型语言模型(LLMs)能够通
过自然语言推理与外部工具(如搜索、代码解释器等)结合来解决复杂任务。这允许LLM执行
某些操作,例如与外部API交互以检索信息,这是向代理建模迈进的第一步。
ReAct 模拟了人类在现实世界中的操作方式,我们通过言语进行推理,并能够采取行动以
获取信息。ReAct 在多个领域内与其他提示工程方法相比表现良好。
ReAct 通过将推理和行动结合成一个思维-行动循环来执行工作。LLM 首先对问题进行推理并
生成行动计划。然后,LLM 执行计划中的行动并观察结果。LLM 随后利用观察结果来更新
其推理并生成新的行动计划。这个过程一直持续到 LLM 解决了问题。
要看到这个功能在实际中的运用,您需要编写一些代码。在代码片段1中,我使用了langchain框 架
(Python)、VertexAI(google-cloud-aiplatform)以及google-search-resultspip包。
Python(Python 编程语言)
从 导入 加载工具
从 导入 初始化智能体从
导入 代理类型
从 导入 VertexAI
prompt = \"Metallica乐队成员有多少孩子?\ llm
= VertexAI ( 温度 = )
工具 加载工具 ( [ serpapi ] , llm = llm )
代理人 初始化智能体 ( 工具 , llm ,
代理人 =代理类型.零样本反应描述, 冗长 = 正确()
.r代un理(人请提供需要翻译的英文内容。 )
为了运行此示例,您必须从 [免费] SerpAPI 创建一个密钥。 api
-key 设置环境变量 SERPAPI_API_KEY。
接下来,让我们编写一些Python代码,任务是为LLM(大型语言模型)找出: 有多少孩子有一
个在乐队Metallica表演的知名父亲。
片段 1. 使用 LangChain 和 VertexAI 创建一个 ReAct 代理。
代码片段2展示了结果。请注意,ReAct进行了一系列五个搜索。实际上,LLM正在抓取谷歌
搜索结果来确定乐队名称。然后,它将结果列出来作为观察,并为下一次搜索串联思维。
片段 2. 在终端中执行 ReAct 代理
代码片段2发现金属乐队Metallica有四位乐队成员。然后它搜索每位乐队成员以请求孩子总数并 累
加。最后,它返回孩子总数作为最终答案。
React 在实践中需要理解您必须不断地重新发送之前的提示/响应(以及删除额外生成的内容)
,同时还需要使用合适的示例/说明设置模型。请参阅笔记本。 14 托管在GoogleCloudPlatform
Github仓库中,该仓库提供了更多细节,展示了实际的LLM输入和输出,并使用了一个更详细
的示例。
> 进入新的 AgentExecutor 链接... 金
属乐队有4位成员。
操作:搜索
动作输入:詹姆斯·赫特菲尔德有多少孩子?
观察:三个孩子
思考:四分之一的Metallica乐队成员有三个孩子。操
作:搜索
行动输入:Lars Ulrich有多少个孩子?
观测:3
想法:4/4 Metallica乐队成员共有6个孩子操
作:搜索
动作输入:柯克·哈梅特有多少孩子?
观察:Hammett自1998年以来与他的第二任妻子Lani结婚。
他们有两个儿子,Angel(出生于2006年9月29日)和Vincenzo(出生于2006年6月)。
28, 2008).
想法:3/4的Metallica乐队成员共有8个孩子操
作:搜索
动作输入:罗伯特·特鲁霍伊洛有多少个孩子?
观察:2
想法:4/4 金属乐队成员共有10个孩子
最终答案:10
自动提示工程
在这一点上,你可能意识到编写提示词是复杂的。如果能够自动化这个(编写提示词以生成
提示词)过程不是很好吗?嗯,有一个方法:自动提示词工程(AutomaticPrompt Engineeri ng,
简称APE)。这种方法 15 不仅减轻了对人类输入的需求,还增强了模型在各项任务中的表现。
您将提示模型生成更多提示。评估它们,可能修改好的那些。然后重复。
例如,您可以使用自动提示工程来帮助训练一个商品T恤网店聊天机器人。我们希望找出所有可
能的客户表述他们购买乐队商品T恤订单的方式。
1. 编写将生成输出变体的提示。在此示例中,我使用gemini-pro生成10条指令。见表15:
提示 我们拥有一个乐队周边商品T恤网店,并且正在训练
聊天机器人,我们需要多种订购方式:\"一件 Metallica T恤尺
寸 S。生成 10 个具有相同语义的变体,保持原意。
相同的意义。
输出 1. 我想购买一件小号的 Metallica T恤。
2. 我能否订购一件小号Metallica T恤?
3. 我想购买一件小号Metallica T恤。
4. 一件Metallica T恤,尺码小号,请。
5. 我想要一件金属乐队(Metallica)的小号T恤。
6. 我想订购一件小号Metallica T恤。
7. 小型Metallica T恤,请来一件。
8. 我在寻找一件小号的Metallica T恤。
9. 您要给我找一件小号Metallica T恤吗?
10.请提供一件Metallica小型T恤。
表15. 使用大型语言模型生成提示
2. 通过选择一个指标对所有指令候选者进行评分,评估候选者。例如,您可以使用BLEU
( 双语评估助手)或ROUGE(面向检索的摘要评估助手)。
3. 选择具有最高评估分数的指令候选者。这位候选者将成为您在软件应用或聊天机器人中使用
的最终提示。您还可以调整选择提示并重新评估。
代码提示
Gemini主要关注基于文本的提示,这还包括用于返回代码的写作提示。让我们前往Vertex A
I Studio并测试这些提示,以查看一些编码示例。
编写代码的提示
Gemini 也可以成为一名开发者,并帮助您使用任何选择的编程语言编写代码。作为一名开发者
,这可以帮助您加快编写代码的过程。
想象在你的机器上有一个包含数百个文件的文件夹需要重命名。逐个重命名文件将花费你大
量时间。虽然你了解一点Bash,可以编写一个脚本来自动化这个过程,但这也可能需要一
些时间。因此,让我们编写一个提示。您可以在公共消费者聊天机器人Gemini中编写这个提
示,或者如果您更关心保密性,您可以在您的Google Cloud账户中编写这些提示,并打开V
ertex AI Studio。Vertex AI Studio的优势在于您可以配置温度等参数。
提示 编写一个Bash代码片段,该代码片段会要求输入一个文件夹名称。
然后它将文件夹中的内容提取出来并重命名所有文件
文件内部通过在文件名前添加“草案”二字来存储。
输出 ```b a s h ```
#!/bin/bash(Bash 脚本开始,不进行翻译)
# 请输入文件夹名称
输入文件夹名:
读取文件夹名称
# 检查文件夹是否存在
如果 [ ! -d\"$folder_name\" ]; then 回显:
\"文件夹不存在。\
退出 1 fi
获取文件夹中的文件列表
files=( \"$folder_name\"/* )
# 将每个文件重命名,在文件名前添加“草稿”
对于文件中的每个文件执行:forfilein\"${files[@]}\";do
new_file_name=\"draft_$(basename\"$file\")\
将 \"$file\" 重命名为 \"$new_file_name\ 已完
成
echo \"文件重命名成功。\
```
姓名 1_在文件夹中重命名文件
目标 编写一个Bash代码提示,用于在文件夹中重命名文件。
模型 gemini-pro
温度 通证限制 1024
TOP-K N/A 顶级-P 1
表 16. 使用 Gemini 编程代码
这对我来说似乎是优秀的代码——它甚至还经过了文档化!然而,由于大语言模型无法进行推
理,并且会重复训练数据,因此阅读和测试您的代码是至关重要的。
我们都在等待的时刻,这真的有效吗?
让我们首先用一个只包含少量文件的测试文件夹来尝试,这些文件需要从重命名为dr
。
1. 复制表16的输出(不含``` bash
```文本包装器)并粘贴到名为“的新文件中: 重命名文件脚本.sh ”.
2. 打开终端窗口并输入: . 它将提示您输入文件夹名称,例如:
test 直接按下回车键。
3. 脚本似乎运行正常。您将看到以下信息: 文件重命名成功。
当你查看测试文件夹时,注意所有文件都被完美重命名为
草稿文件名.txt.
它成功了!
提示用于解释代码
作为一名开发者,当你在团队中工作时,你必须阅读他人的代码。Gemini可以帮助你完成这
项任务。让我们以表16中的代码输出为例,删除注释,并请大型语言模型解释正在发生的事
情,见表17:
姓名
提示 解释以下Bash代码:
```
#!/bin/bash(Bash 脚本开始,不进行翻译)
输入文件夹名:
读取文件夹名称
如果 [ ! -d\"$folder_name\" ]; then 回显:
\"文件夹不存在。\
退出 1 fi
files=( \"$folder_name\"/*)
对于文件中的每个文件执行:forfilein\"${files[@]}\";do
new_file_name=\"draft_$(basename\"$file\")\
将 \"$file\" 重命名为 \"$new_file_name\ 已完
成
echo \"文件重命名成功。\
```
输出 这个Bash脚本执行以下任务:
1. **User Input**: 你:
- 它提示用户使用 ̀ echo` 和 ̀ read` 命令输入文件夹名称命令。
输入的文件夹名称存储在`folder_name`变量中。
2. **文件夹存在性检查**:
使用\\[!-d\\]来检查指定名称的文件夹是否存在。
如果文件夹不存在,它将显示一个错误:“$folder_name”]`条件。 消息:
“文件夹不存在。”然后以退出代码1退出脚本。
持续至下一页...
1_解释bash代码
目标 编写一个提示来解释Bash代码
模型 gemini-pro
温度 通证限制 1024
TOP-K N/A 顶级-P 1
表17. 解释代码的提示
提示用于翻译代码。
Bash 表16中的代码看起来运行正常。然而,此脚本如果在需要输入文件名时更具有可复用性会
更好。理想情况下,它应该作为一个独立的应用程序带有用户界面。作为一个起点,Python 对
于(网络)应用来说比 Bash 更合适。LLMs 可以帮助将代码从一种语言翻译成另一种语言。参见
表18中的示例:
输出 3. **文件列表**:
- 它使用 `files=( “$folder_” 列出指定文件夹内的所有文件。名称
\"/* )`命令。这创建了一个名为`files`的数组,包含路径对所有文
件夹中的文件。
4. **文件重命名**:
- 它使用一个 ̀ for` 循环遍历 ̀ files` 数组中的每个文件。
对于每个文件,它使用 `new_file_` 生成一个新的文件名。
name=\"draft_$(basename“$file”)”`command. 这个新文件名被创建通过在原始
文件名前添加字符串“draft_”。
- 然后使用 ̀ mv“$file”“$new_file_name”` 命令重命名文件, 该操作
将文件移动到新文件名。
5. **成功信息**:
- 在重命名所有文件后,它显示了一条成功消息(“Files renamed”) 成
功。(“.”)以表示重命名操作成功
姓名
持续至下一页...
1_使用Python重命名文件
目标 编写一个提示以将Bash代码翻译为Python。
模型 gemini-pro
温度 通证限制 1024
TOP-K N/A 顶级-P 1
提示 将以下Bash代码转换为Python代码片段。
```b a s h ```
#!/bin/bash(Bash 脚本开始,不进行翻译)
输入文件夹名:
读取文件夹名称
如果 [ ! -d \"$folder_name\" ]; then
回显:\"文件夹不存在。\
退出 1
fi
files=( \"$folder_name\"/* )
对于文件中的每个文件执行:for file in \"${files[@]}\"; do
new_file_name=\"draft_$(basename \"$file\")\
将 \"$file\" 重命名为 \"$new_file_name\
已完成
echo \"文件重命名成功。\
```
输出 ```python
importos
导入 shutil 模块。
# 从用户获取文件夹名称
文件夹名称 = input(\"请输入文件夹名称:\")
# 检查文件夹是否存在
如果 (folder_name): 不成立:
打印(\"文件夹不存在。\")
ex it(1)
表 18. 将 Bash 代码翻译为 Python 的提示
阅读并审查代码。从提示中复制输出并将其粘贴到新文件中:
通过打开终端窗口并执行以下命令来测试代码。 python .
注意: 当在Vertex AI的语言工作室中提示输入(Python)代码时,您需要点击“Markdown”按钮。
否则,您将收到缺少正确缩进的纯文本,这对于运行Python代码非常重要。
提示用于调试和审查代码
让我们手动对表18的代码进行一些编辑。它应该提示用户输入文件名前缀,并将此前缀写
入为大写字母。参见片段*3的示例代码,但真是个糟糕的事情。现在它返回了Python错误
!
输出 获取文件夹中所有文件的列表
files = (folder_name)
遍历文件
对于文件中的每个文件:
# 以“draft_”为前缀创建新文件名
new_file_name = f\"草稿_{file}\
将文件移动到新名称
((folder_name, file),
(folder_name, new_file_name))
# 打印成功信息
打印(\"文件重命名成功。\")
```
以下Python代码产生错误:
回溯(最近调用最后):文件“/Users/leeboonstra/Documents/test_folder/”,第7行, 在<模块>中
text = toUpperCase(prefix) 名称错误:名称‘toUpperCase’未定义
片段 3. 一个损坏的 Python 脚本
哎呀!看起来像是一个错误:Doh! That looks like a bug:
片段4. 我破解了Python代码
让我们看看我们能否让大型语言模型进行代码调试和审查。查看第19表:
Python(Python 编程语言)
导入
导入
操作系统(Operating System)
shutil
文件夹名称 = 输入 输入文件夹名称: )
prefix = 输入 输入字符串以预置文件名:
(prefix )
)
text = 转大写
如果no(t 操作路系径统(iOsdpieratin文g件Sy夹s名em称) ):
打印
退1出)
文=件.
文件夹不存在。 )
操作l系ist统dir(Op(e文ra件tin夹g名Sy称stem))
对于:文件 在 文件
new_filename = f {}te{x}t" 文件
shutil .移.动.( 操作路系径统(加Op入era文in件g S夹y名ste称m) , 文,件
操.作(路系径统(jOoiper文ati件ng夹S名ys称tem), 新文件名 ))
打印(\"文件重命名成功。\")
姓名
提示 以下Python代码产生错误:
回溯(最近调用最后):
文件\"/\
\"Users/leeboonstra/Documents/test_folder/\", line 在<模块>中
7
转换前缀为全大写:toUpperCase(prefix) 名
称错误:未定义 'toUpperCase'。
调试出问题所在并解释我如何改进代码。
```python
importos
导入 shutil 模块。
# 从用户获取文件夹名称
文件夹名称 = input(\"请输入文件夹名称:\")
前缀 = 输入(\"输入要添加到文件名之前的内容:\") 将
前缀转换为大写形式
# 检查文件夹是否存在
如果 (folder_name): 不成立: 打印
(\"文件夹不存在。\")
ex it(1)
获取文件夹中所有文件的列表
files = (folder_name)
遍历文件
对于文件中的每个文件:
持续至下一页...
1_Python调试代码
目标 编写一个用于调试和审查Python代码的提示。
模型 gemini-pro
温度 通证限制 1024
TOP-K N/A 顶级-P 1
提示
创建一个以“草稿_”为前缀的新文件名新
文件名 = f\"{text}_{file}\
将文件移动到新名称
((folder_name, file),
(folder_name, new_file_name))
# 打印成功信息
打印(\"文件重命名成功。\")
```
输出 代码调用 `toUpperCase` 函数将 `prefix` 转换为大写,但
该函数未定义。要解决这个问题,你可以使用 `upper()` 方法。字
符串类,该类将给定的字符串转换为大写。修改后的代码
如下所示:
```python
importos
导入 shutil 模块。
# 从用户获取文件夹名称
文件夹名称 = input(\"请输入文件夹名称:\")
前缀 = 输入(\"输入要添加到文件名之前的内容:\") 文
本:()
# 检查文件夹是否存在
如果 (folder_name): 不成立: 打印
(\"文件夹不存在。\")
ex it(1)
获取文件夹中所有文件的列表
files = (folder_name)
遍历文件
对于文件中的每个文件:
# 以“draft_”为前缀创建新文件名新文
件名 = f\"{text}_{file}\
将文件移动到新名称
((folder_name, file),
持续至下一页...
输出
(folder_name, new_filename))
# 打印成功信息
打印(\"文件重命名成功。\")
```
此外,还可以对代码进行一些其他改进:
1. 文件的新文件名的扩展名未被保留。最好是提取文件。
从原始文件名扩展并附加到新文件名。
2. 代码假设文件夹名称中不存在空格。然而,
它是一种好的做法,通过替换空格优雅地处理它们。
强调或破折号。
3. 使用 ̀ f`字符串语法进行字符串插值更具可读性且
比传统的`+`运算符简洁。
4. 代码没有处理在重命名过程中可能发生的错误。
最好将``调用包裹在`try...except`块中。捕捉
任何潜在的错误。
以下是经过改进的代码,包含了这些建议:
```python
importos
导入 shutil 模块。
# 从用户获取文件夹名称
文件夹名称 = input(\"请输入文件夹名称:\")
前缀 = 输入(\"输入要添加到文件名之前的内容:\") #
检查文件夹是否存在
如果 (folder_name): 不成立: 打印
(\"文件夹不存在。\")
ex it(1)
获取文件夹中所有文件的列表
files = (folder_name)
遍历文件
对于文件中的每个文件:
持续至下一页...
输出 # 获取文件扩展名
ext = (file)[1]
# 创建一个带前缀和文件扩展名的新文件名new_filename =
f\"{prefix}_{(file)[0]}{ext}\
构建原始文件和新文件的完整路径
old_path = (folder_name,file)
new_path = (folder_name,new_filename) 新路径 = 文件夹名称, 新文件名
尝试移动文件
尝试:
(old_path, new_path)
除了异常e外:
打印(在移动文件时发生错误)
文件:{file}:{e}\")
# 打印成功信息
打印(\"文件重命名成功。\")
```
这些改进使代码更加健壮和灵活,同时也使其更具适应性。
它更容易阅读和理解...(响应因截断而终止)
已达到令牌限制。如果需要,请尝试增加令牌限制。
较长的响应。
表 19. 用于调试和审查 Python 代码的提示
那太好了。不仅它告诉我如何解决问题,而且还发现了我的代码中更多的错误以及如何解决这
些问题。提示的最后部分提出了改善代码的总体建议。
关于多模态提示?
提示代码仍然使用相同的常规大型语言模型。多模态提示是一个独立的问题,它指的是使用多
种输入格式来引导大型语言模型的技术,而不是仅仅依赖文本。这可以包括文本、图像、音频
、代码或其他格式的组合,具体取决于模型的能力和任务要求。
最佳实践
找到合适的提示需要调整。Vertex AI中的Language Studio是进行提示尝试的完美场所,它能够针
对各种模型进行测试。
使用以下最佳实践成为提示工程专家。
提供示例
最重要的最佳实践是在提示中提供(单次/少量)示例。这非常有效,因为它充当了一个强大的 教
学工具。这些示例展示了期望的输出或类似回应,使得模型可以从它们中学习并相应地调整其
自身的生成。这就像给模型提供了一个参考点或目标,以便它能够提高其响应的准确性、风格
和语气,更好地符合您的期望。
设计简约
提示语应简洁、清晰、易于理解和模型理解。一般来说,如果对你来说已经令人困惑,那么模型
也很可能感到困惑。尽量不使用复杂的语言,并且不要提供不必要的信息。
示例:
在不确定的环境中
我现在正在纽约访问,我很想了解更多关于优秀地点的信息。我和两个三岁的孩子在一起。我
们假期期间应该去哪里?
在重写之后:
扮演一名旅游向导,为游客描述在纽约曼哈顿适合3岁儿童游览的绝佳地点。
尝试使用描述动作的动词。以下是一组示例:
行动、分析、分类、归类、对比、比较、创建、描述、定义、评估、提取、寻找、生成、识
别、列出、测量、组织、解析、挑选、预测、提供、排名、推荐、返回、检索、重写、选择
、展示、排序、总结、翻译、撰写。
关于输出的具体要求
在指令中要具体明确。简洁的指令可能不足以引导LLM,或可能过于泛化。在提示中(通过
系统或上下文提示)提供具体细节可以帮助模型聚焦于相关性,从而提高整体的准确性。
示例:
DO:
生成一篇关于前五名视频游戏主机的3段博客文章。文章应富有信息性和吸引力,并采用对话
体的风格。
请提供需要翻译的英文文本。
生成一篇关于游戏机的博客文章。
使用说明胜过限制
指令和约束用于在提示中引导LLM的输出。
• 一个 指令 提供关于所需格式、风格或内容的明确指示,它指导模型应该做什么或产生什么。
• A 约束 这是一组限制或边界条件对响应的限制。它限制了模型不应做什么或应避免什么。
越来越多的研究表明,在提示中关注积极指令可能比过度依赖限制更为有效。这种方法与人类
更倾向于积极指令而非不做某事清单的做法相一致。
指令直接传达所期望的结果,而约束条件可能会让模型猜测允许做什么。它为在定义的边界内提
供灵活性并鼓励创新,而约束条件可能会限制模型的能力。此外,约束条件的列表可能会相互冲
突。
约束仍然是有价值的,但在某些情况下。为了防止模型生成有害或偏见的内容,或者当需要严
格的输出格式或风格时。
如果可能,使用积极的指令:而不是告诉模型不要做什么,而是告诉它应该做什么。这可以避免
混淆并提高输出结果的准确性。
DO:
生成一篇关于前五大游戏机控制台的博客文章段落。仅讨论控制台、生产公司、年份以及总销
量。
请提供需要翻译的英文文本。
撰写一篇关于前五款视频游戏主机的段落博客文章。请勿列出游戏名称。
作为最佳实践,首先优先考虑指令,明确指出您希望模型执行的操作,仅在必要时使用约束以
确保安全、清晰或满足特定要求。进行实验和迭代,测试不同指令和约束的组合,以找到最适
合您特定任务的方法,并记录这些信息。
控制最大令牌长度
为了控制生成的LLM响应的长度,您可以在配置中设置最大令牌限制,或者在您的提示中明确
请求特定长度。例如:
解释量子物理的长度适合一条推文信息。
使用变量在提示中
为了重复使用提示并使其更具动态性,在提示中使用变量,这些变量可以根据不同的输入进行
更改。例如,如表20所示,一个提供城市事实的提示。在提示中不要将城市名称硬编码,而是
使用一个变量。变量可以通过让您避免重复来节省您的时间和精力。如果您需要在多个提示中
使用相同的信息,可以将它存储在变量中,然后在每个提示中引用该变量。当将提示集成到您
自己的应用程序中时,这一点非常有意义。
提示 变量
{城市} = \"阿姆斯特丹\
提示
您是一位旅行指南。告诉我关于这个城市的事实:{城市名称}
输出 阿姆斯特丹是一座美丽的城市,遍布运河、桥梁和狭窄的街道。它是一个
这是一个非常适合游览的地方,因其丰富的历史、文化和夜生活而著称。
表20. 在提示中使用变量
尝试输入格式和写作风格。
不同的模型、模型配置、提示格式、词汇选择和提交可能导致不同的结果。因此,实验提示属性
,如风格、词汇选择和类型提示(零样本、少样本、系统提示)很重要。
例如,一个旨在生成关于革命性视频游戏主机世嘉Dreamcast文本的提示可以这样表述: 问题 ,
一个 声明 或一个 指令 ,导致不同的输出结果:
问题:世嘉梦幻代是什么,为什么它是如此革命性的游戏机?
• 声明: 世嘉梦想卡斯特(Sega Dreamcast)是世嘉公司于1999年发布的第六代游戏主机。
它...
• 指示: 撰写一个段落,描述Sega Dreamcast游戏机,并解释为什么它如此革命性。
对于少量样本提示的分类任务,混合不同的类别。
一般情况下,您的少量样本示例的顺序不应有很大影响。然而,在进行分类任务时,请确保您在
少量样本示例中混合可能的响应类别。这是因为否则您可能过分拟合到具体示例的顺序。通过混
合可能的响应类别,您可以确保模型正在学习识别每个类别的关键特征,而不仅仅是简单地记住
示例的顺序。这将在未见过的数据上导致更稳健和可泛化的性能。
一个好的经验法则是从6个少样本示例开始,并从这里开始测试准确性。
适应模型更新
您需要密切关注模型架构的变更、新增的数据和功能。尝试使用较新的模型版本,并调整您的
提示以更好地利用新模型功能。像VertexAIStudio这样的工具非常适合存储、测试和记录您提
示的各种版本。
尝试输出格式
除了快速输入格式之外,还应考虑实验输出格式。对于像提取、选择、解析、排序、评级或
分类数据之类的非创造性任务,尝试让输出以结构化格式返回,例如JSON或XML。
有一些好处在于从数据提取提示中返回JSON对象。在实际应用中,我不需要手动创建这种JS
ON格式,因为我已经可以以排序顺序返回数据(当处理日期时间对象时非常方便),但最重要
的是,通过提示JSON格式,它迫使模型创建结构并限制虚构。
总的来说,使用JSON作为您输出格式的优点:
• 总是以相同风格返回
• 专注于您希望接收的数据
• 幻觉发生的机会减少
• 使其关系意识化
• 获取数据类型
• 可以对其进行排序
表4在少量提示部分展示了如何返回结构化输出的一个示例。
JSON修复
尽管以JSON格式返回数据具有许多优点,但它并非没有缺点。JSON的结构化特性虽然有利
于解析和在应用程序中使用,但相对于纯文本,它需要更多的令牌,这导致处理时间增加和成
本上升。此外,JSON的冗长性很容易消耗整个输出窗口,这在由于令牌限制而突然中断生成
时尤其成问题。这种截断通常会导致无效的JSON,遗漏关键的闭合花括号或括号,使输出变
得无法使用。幸运的是,有像这样的工具 json-repair
库(可在PyPI上获取)在这些情况下非常有价值。此库智能地尝试自动修复不完整或格式错误
的JSON对象,因此在处理由LLM生成的JSON时,尤其是处理潜在的截断问题时,它成为一
个至关重要的盟友。
{ \"type\": \"object\", \"properties\": { \"name\": { \"type\": \"string\", \"description\": \" 产 品 名 称 \" }, \"categ ory\": { \"type\": \"string\",
\"description\": \"产品类别\" }, \"price\": { \"type\": \"number\", \"format\": \"float
\", \"description\": \" 产 品 价 格 \" }, \"features\": { \"type\": \"array\", \"items\": { \"type\": \"string\" }, \"descri ption\": \" 产 品 关 键 特 性 \" },
\"release_date\": { \"type\": \"string\", \"format\": \"date\", \"description\": \"产品发布日期\" } },
与架构协同工作
使用结构化JSON作为输出是一个非常好的解决方案,正如我们在本文中多次看到的。但关于 输
入 虽然JSON对于结构化数据而言非常出色,但是在…… 输 出 LLM生成的,它对于构建结构
也非常有用。 输入 您提供的内容。这是JSON模式发挥作用的地方。JSON模式定义了您JSO
N输入的预期结构和数据类型。通过提供模式,您为LLM(大型语言模型)提供了清晰的数据蓝
图,帮助它集中精力。 注意 在相关信息和减少误解释输入的风险方面,进一步地,模式可以帮
助建立不同数据片段之间的关系,甚至通过包含具有特定格式的日期或时间戳字段,使得大 型
语言模型“时间感知”。
这里有一个简单的例子:
假设您想使用大型语言模型(LLM)为电子商务目录中的产品生成描述。而不是仅仅提供一
个自由形式的文本描述,您可以使用JSON模式来定义产品的属性:
片段5. 结构化输出方案的定义
然后,您可以提供一个符合以下格式的JSON对象作为实际产品数据:
这个模式:
片段6. 来自LLM的结构化输出
通过预处理您的数据,而不是仅提供完整文档,只提供模式和数据,您为LLM提供了对产品属
性的清晰理解,包括其发布日期,这使得生成准确且相关的描述的可能性大大增加。这种结构化
输入方法,将LLM的注意力引导到相关字段,在处理大量数据或将LLM集成到复杂应用程序时
特别 有价值。
与其它提示工程师共同进行实验
如果您处于需要尝试提出良好提示的情况,您可能希望找到多个人进行尝试。当每个人都遵循
最佳实践(如本章所述)时,您将在所有不同的提示尝试之间看到性能的差异性。
无线耳机
类别:电子产品
价格:美元
特点:[\"降噪\", \"蓝牙\", \"20小时续航\"]
发布日期:2023-10-27
CoT最佳实践
在CoT提示时,要求在推理之后给出答案是因为推理过程的生成改变了模型在预测最终答案
时获得的令牌。
使用CoT和自洽性,您需要能够从您的提示中提取最终答案,与推理相分离。
为CoT提示,设置温度为0。
思维链提示基于贪婪解码,根据语言模型分配的最高概率预测序列中的下一个单词。一般来
说,在推理过程中,为了得出最终答案,很可能只有一个正确答案。因此,温度应始终设置
为0。
记录各种提示尝试
最后一条建议在本章中已提及,但我们强调这一点的重要性绝不过分:请详细记录你的提示尝
试,这样你就可以随着时间的推移了解哪些做得好,哪些没有。
提示输出的差异可能存在于不同模型、采样设置之间,甚至存在于同一模型的不同版本之间。此
外,即使在向同一模型的相同提示输入时,输出句子格式和词汇选择上的微小差异也可能发生。
(例如,如前所述,如果两个标记具有相同的预测概率,可能会有随机决定胜负的情况。这可能
会影响后续预测的标记。)
我们建议创建一个以表21为模板的Google表格。这种方法的优点在于,当你不可避免地需要重
新访问你的提示工作——无论是为了将来继续进行(你会惊讶于仅仅短暂的休息后能忘记多少
),测试不同版本的模型上的提示性能,以及帮助调试未来的错误时,你都能拥有完整的记录
。
在表格之外的字段中,跟踪提示(迭代)的版本、记录结果是否为“OK”、“NOT OK”或“SOMETI
MESOK”的字段,以及记录反馈的字段也是有帮助的。如果你足够幸运能够使用VertexAIStudi
o,请保存你的提示(使用与文档中相同的名称和版本),并在表格中跟踪保存的提示的链接。
这样,你只需点击一下即可重新运行你的提示。
当在执行一个 检索增强生成 系统,您还应该捕捉影响内容被插入提示的具体方面,包括查询
、块设置、块输出和其他信息。
一旦你觉得提示接近完美,将其应用到你的项目代码库中。在代码库中,将提示保存在独立的
文件中,与代码分开,这样更容易维护。最后,理想情况下,你的提示是运作系统中的一部分
,作为提示工程师,你应该依赖自动化测试和评估程序来了解你的提示在任务中的泛化情况。
提示工程是一个迭代的过程。制作并测试不同的提示,进行分析,并记录结果。根据模型
的表现优化你的提示。持续实验,直到达到预期的输出。当改变模型或模型配置时,回顾
并继续使用以前使用的提示进行实验。
表21. 记录提示的模板
摘要
这份白皮书讨论了提示工程。我们学习了许多提示技术,例如:
• 零提示
• 少样本提示
• 系统提示
• 角色提示
• 上下文提示
• 步退提示
• 思维链
• 自洽性
• 思维树
姓名 [nameandversionofyourprompt]
输出 [请提供您需要翻译的英文文本]
[请提供需要翻译的英文文本]提示
[数字]顶级-P[数字]Top-K
[数字]代币限额[值介于0至1之间]温度
[模型名称及版本]模型
[对这次尝试目标的一句话解释]目标
• ReAct
我们甚至探讨了如何自动化您的提示方法。
白皮书随后讨论了生成式人工智能的挑战,例如当您的提示不充分时可能出现的问题。我们最后
介绍了如何成为一名更好的提示工程师的最佳实践。