作者:Lee Boonstra翻译:宝玉(https://baoyu.io)提示工程(Prompt Engineering)2024年9月(September 2024) 致谢(Acknowledgements) ●这份白皮书的完成得益于众多专家的协作和贡献。审阅者、贡献者、策划者、编辑、技术作者和设计师等不同角色的参与,体现了在人工智能领域创建高质量技术文档所涉及的多方面努力和严谨的开发审查流程。这表明,尽管提示工程的概念相对容易理解,但其有效实践和知识传播仍需结构化的方法和清晰的呈现,反映了该领域日益增长的重要性和复杂性1。 目录(Table of contents) ●引言(Introduction)●提示工程(Prompt engineering)●LLM输出配置(LLM output configuration)○输出长度(Output length)○(#采样控制-sampling-controls)■(#温度-temperature)■(#top-k-和-top-p-top-k-and-top-p) ○综合运用(Putting it all together) ●提示技巧(Prompting techniques) ○(#回退提示-step-back-prompting)○(#思维链-chain-of-thought---cot)○(#自我一致性-self-consistency)○(#思维树-tree-of-thoughts---tot)○(#react-推理与行动---reason--act)○自动提示工程(Automatic Prompt Engineering - APE) ●代码提示(Code prompting) ○编写代码的提示(Prompts for writing code)○解释代码的提示(Prompts for explaining code)○翻译代码的提示(Prompts for translating code)○调试和审查代码的提示(Prompts for debugging and reviewing code) ●那么,多模态提示呢?(What about multimodal prompting?) (#最佳实践-best-practices)○提供示例(Provide examples)○简洁设计(Design with simplicity)○(#具体说明输出-be-specific-about-the-output)○使用指令而非约束(Use Instructions over Constraints)○控制最大令牌长度(Control the max token length)○在提示中使用变量(Use variables in prompts)○尝试不同的输入格式和写作风格(Experiment with input formats and writingstyles)○对于带分类任务的少样本提示,混合类别(For few-shot prompting withclassification tasks, mix up the classes)○适应模型更新(Adapt to model updates)○尝试不同的输出格式(Experiment with output formats)○与其他提示工程师一起实验(Experiment together with other promptengineers)○(#cot-最佳实践-cot-best-practices)○记录各种提示尝试(Document the various prompt attempts) ●(#总结-summary)●尾注(Endnotes) ●这份目录清晰地展示了白皮书的结构:从基础概念(引言、基础知识)入手,深入探讨具体技术(从零样本到ReAct),涵盖关键应用(代码),提及未来方向(多模态),并以实用建议(最佳实践)收尾。这种教学式的结构有助于读者理解信息的流向和内容的组织方式1。从基础配置和零样本提示,到复杂的推理技术如CoT、ToT和ReAct,这种递进关系表明,要实现高级LLM应用,需要掌握越来越复杂的技巧。将“代码提示”作为一个主要部分,突显了LLM在软件开发中的重要性。“最佳实践”占有相当大的篇幅,则强调了该领域的经验性和迭代性特点1。 引言(Introduction) 在探讨大型语言模型(LLM)的输入与输出时,文本提示(有时伴随图像等其他模态)是模型用于预测特定输出的输入形式1。编写提示并非数据科学家或机器学习工程师的专利——任何人都可以进行。然而,构建最高效的提示可能相当复杂。提示的有效性受到诸多因素的影响:所使用的模型、模型的训练数据、模型配置、措辞选择、风格语调、结构以及上下文都至关重要1。因此,提示工程是一个迭代的过程。不恰当的提示可能导致模糊、不准确的响应,并阻碍模型提供有意义输出的能力1。 你不需要是数据科学家或机器学习工程师——每个人都可以编写提示。(Youdon’t need to be a data scientist or a machine learning engineer – everyonecan write a prompt.)1 这种表述降低了初学者的门槛,但紧随其后列出的影响因素(模型选择、训练数据、配置、措辞、风格、语调、结构、上下文)揭示了其内在的复杂性。这表明,虽然基本交互很容易,但要获得可靠、高质量的结果,则需要付出刻意的努力和知识积累——这正是“工程”的范畴1。 当用户与Gemini聊天机器人¹交互时,本质上也是在编写提示。然而,本白皮书侧重于在Vertex AI中或通过API为Gemini模型编写提示,因为直接提示模型可以访问温度等配置参数1。这种对直接模型交互(通过Vertex AI/API而非聊天界面)的明确关注,表明对配置(如温度)的精细控制被认为是高级提示工程的基础,这与休闲聊天机器人的使用有所区别。掌握提示工程不仅涉及提示文本本身,还包括操纵模型的生成参数,这对于需要特定创造性或确定性水平的任务至关重要1。 本白皮书将详细探讨提示工程。我们将研究各种提示技巧,帮助您入门,并分享成为提示专家的技巧和最佳实践。我们还将讨论在构建提示时可能遇到的一些挑战1。 提示工程(Prompt engineering) 理解LLM的工作原理至关重要:它是一个预测引擎。模型接收顺序文本作为输入,然后基于其训练数据预测下一个应该出现的令牌(token)。LLM被设计为反复执行此过程,将先前预测的令牌添加到序列文本的末尾,以预测下一个令牌。下一个令牌的预测基于先前令 牌中的内容与LLM在训练期间所见内容之间的关系1。 当编写提示时,实际上是在尝试引导LLM预测正确的令牌序列。提示工程(Promptengineering)是设计高质量提示以引导LLM产生准确输出的过程。这个过程涉及反复调试以找到最佳提示,优化提示长度,并评估提示的写作风格和结构与任务的关系1。在自然语言处理和LLM的背景下,提示是提供给模型的输入,用以生成响应或预测1。 “工程”一词在此处的使用是恰当的,因为它描述了一个涉及“设计”、“优化”、“评估”和“调试”的系统过程。这不仅仅是写作,更是一个针对需求进行系统性改进的过程,类似于传统的工程学科。它将提示创建从简单的提问行为提升为一个有目的、面向目标的设计过程1。 这些提示可用于实现各种理解和生成任务,例如文本摘要、信息提取、问答、文本分类、语言或代码翻译、代码生成以及代码文档编写或推理1。 可以参考Google的提示指南²,³获取简单有效的提示示例1。 在进行提示工程时,首先需要选择一个模型。无论使用Vertex AI中的Gemini语言模型、GPT、Claude,还是像Gemma或LLaMA这样的开源模型,提示都可能需要针对特定模型进行优化1。明确指出提示可能需要针对特定模型(如Gemini, GPT, Claude, Gemma,LLaMA)进行优化,这强调了提示工程并非一种形式完全通用的技能。技术可能是普适的,但最佳措辞和结构可能因模型架构、训练数据和微调的差异而依赖于具体模型。有效的提示工程需要了解目标模型的特性1。 除了提示本身,还需要调试LLM的各种配置1。 LLM输出配置(LLM output configuration) 选定模型后,需要确定模型配置。大多数LLM都带有各种配置选项,用于控制其输出。有效的提示工程需要为特定任务优化设置这些配置1。 输出长度(Output length) 一个重要的配置设置是响应中要生成的令牌数量。生成更多令牌需要LLM进行更多计算,导致更高的能耗、可能更慢的响应时间以及更高的成本1。 减少LLM的输出长度并不会使LLM在其创建的输出中变得风格或文本上更简洁,它只是导致LLM在达到限制时停止预测更多令牌。如果需求需要较短的输出长度,可能还需要相应地设计提示以适应1。需要明确的是:通过配置限制令牌数量(max_tokens)是一种强制截断,它本身并不能促使模型生成简洁的内容。实现简洁通常需要在提示本身中给出具体指令(例如,“用一句话总结”)1。 对于某些LLM提示技术(如ReAct),输出长度限制尤为重要,因为在获得所需响应后, LLM可能会继续发出无用的令牌1。 采样控制(Sampling controls) LLM并非正式地预测单个令牌。相反,LLM预测下一个令牌可能是什么的概率,LLM词汇表中的每个令牌都会获得一个概率。然后对这些令牌概率进行采样,以确定将生成的下一个令牌1。 温度(Temperature)、Top-K和Top-P是最常见的配置设置,它们决定了如何处理预测的令牌概率以选择单个输出令牌1。 温度(Temperature) 温度控制令牌选择中的随机程度。较低的温度适用于期望更确定性响应的提示,而较高的温度可能导致更多样化或意想不到的结果。温度为0(贪婪解码)是确定性的:始终选择概率最高的令牌(但请注意,如果两个令牌具有相同的最高预测概率,根据平局处理方式的不同,温度为0时可能不总是得到相同的输出)1。 接近最大值的温度倾向于产生更随机的输出。随着温度越来越高,所有令牌成为下一个预测令牌的可能性变得均等1。温度参数提供了一个在可预测性/事实准确性(低温)与创造性/多样性(高温)之间的基本权衡。为不同任务选择合适的温度至关重要——事实问答需要低温,而故事生成可能受益于高温1。 Gemini的温度控制可以类似于机器学习中使用的softmax函数来理解。低温度设置类似于低softmax温度(T),强调具有高确定性的单个首选温度。较高的Gemini温度设置类似于高softmax温度,使得所选设置周围更宽范围的温度变得更可接受。这种增加的不确定性适应了那些不需要严格精确温度的场景,例如在尝试创意输出时1。 Top-K和Top-P (Top-K and top-P) Top-K和Top-P(也称为核采样)⁴是LLM中使用的两种采样设置,用于将预测的下一个令牌限制为来自具有最高预测概率的令牌。与温度类似,这些采样设置控制生成文本的随机性和多样性1。 ●Top-K采样从模型预测的分布中选择概率最高的K个令牌。Top-K值越高,模型的输出越具创造性和多样性;Top-K值越低,模型的输出越受限制和基于事实。Top-K为1等同于贪婪解码1。●Top-P采样选择累积概率不超过某个值(P)的最高概率令牌。P的值范围从0(贪婪解码)到1(LLM词汇表中的所有令牌)1。 Top-K和Top-P提供了补充温度控制的不同方式来塑造采样前的概率分布。Top-K限制了选择的数量,而Top-P基于累积概率质量进行限制。Top-K设置了考虑令牌数量的硬限制(例如,只看前40个)。Top-P设置了基于概率总和的限制(例如,考虑令牌直到它们的概 率加起来达到0.95)。这些是不同的机制。理解这种差异允许