章
目
录
大型语言模型(LLM)的应用愈发广泛,而想要充分发挥LLM的强大功能,编写高质量的提示词至关重要。谷歌团队成员联合推出的《Prompt Engineering》提示词工程白皮书,就为我们深入了解如何优化提示词,提升LLM输出效果提供了宝贵的指引。pdf免费下载地址在文末!
一、提示词工程的核心概念
提示词工程,简单来说,就是设计高质量提示词的过程。大型语言模型本质上是预测引擎,它接收文本序列输入,依据训练数据预测下一个标记。编写提示词,就是为模型设定正确的标记序列,引导其生成准确输出。这不仅包括调整提示词内容,找到最佳版本,还涉及优化提示词长度,以及评估写作风格和结构是否契合任务需求。
在自然语言处理场景下,提示词作为模型生成响应或预测的输入,可用于完成诸如文本摘要、信息提取、问答、文本分类、语言或代码翻译、代码生成、代码文档编写及推理等多种任务 。不过,提示词的效果受到多种因素影响,像所选模型版本、训练数据、参数配置、措辞精准度、语言风格与语气、结构设计以及上下文关联性等,所以提示词工程是一个需要持续优化的过程。低质量的提示词可能导致模型输出模糊、错误,限制其生成有价值内容的能力 。
二、LLM输出配置
在进行提示词工程时,选择合适的模型后,还需对模型的各种配置进行调整,以获得理想的输出效果。
(一)输出长度
输出长度是一个关键的配置参数,它用于控制生成响应中的token数量。生成更多token意味着模型需要进行更多计算,这会增加能耗,可能导致响应时间变长,成本也会随之上升。减少输出长度,并不意味着模型输出会更简洁或更具风格,只是让模型在达到长度限制时停止预测token。如果对输出长度有要求,除了调整配置,还可能需要专门设计提示词来满足。比如在一些特定的提示技术(如ReAct)中,输出长度限制就显得尤为重要,否则模型可能会在所需响应之后继续生成无用的token。
(二)采样控制
LLM在预测时,并非直接确定单个标记,而是预测下一个标记的概率分布。温度、Top-K和Top-P这几个配置选项,就是用来决定如何从这些预测概率中选择输出标记的。
- 温度:温度参数主要控制token选择的随机程度。较低温度适用于需要确定性输出的提示,此时模型更倾向于选择概率最高的token;较高温度则可能产生更多样化、更出人意料的结果。当温度为0(即贪婪解码)时,模型完全确定性地选择概率最高的token,但要注意,如果有多个token具有相同的最高预测概率,根据平局处理机制不同,输出也可能存在差异。当温度接近最大值时,所有token被选为下一个预测token的概率趋于均等。以Gemini为例,其温度控制机制与机器学习中的softmax函数原理相似,低温设置类似softmax低温(T),强调单一优选结果,确定性高;高温设置类似softmax高温,接受更宽泛的结果范围,在创意内容生成实验等不需要严格精确输出的场景中,这种灵活性就很适用。
- Top-K与Top-P采样:Top-K和Top-P(又称核采样)是用于限制预测token范围的两种采样设置,它们和温度参数一样,能控制生成文本的随机性和多样性。Top-K采样是从模型预测分布中选取概率最高的K个token,K值越大,输出的创造性越强;K值越小,输出越保守、准确,当K = 1时,就等同于贪婪解码。Top-P采样则是选择累计概率不超过设定值(P)的最高概率token集合,P值范围是从0(贪婪解码)到1(包含所有vocabulary token) 。在实际应用中,最佳实践是通过实验对比这两种方法,或者将它们组合使用,根据具体需求选择最优方案。
- 综合配置:在top-K、top-P、temperature和要生成的token数量之间进行选择,取决于具体的应用场景和预期结果,这些设置之间相互影响。比如在Vertex Studio中,如果temperature、top-K和top-P都可用,那么同时满足top-K和top-P标准的token将成为下一个预测token的候选,然后再应用temperature从这些候选token中进行采样。如果只有top-K或top-P可用,模型行为类似,但仅依据其中一个设置进行操作。若temperature不可用,则从满足top-K和/或top-P标准的token中随机选择,生成下一个预测token。当某个采样配置值设为极端值时,该采样设置要么会抵消其他配置设置的作用,要么变得无关紧要。例如,将温度设置为0,top-K和top-P就不再起作用;将温度设置得非常高(超过1,通常在10以上),温度的作用就可以忽略不计,此时会随机采样通过top-K和/或top-P标准的标记来选择下一个预测的标记 。一般来说,温度为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和输出令牌数量),LLM可能会生成与主题关联度较低的内容。另外,大语言模型中常见的“重复循环错误”,即模型陷入循环,反复生成相同的单词、短语或句子结构,这种情况通常与不恰当的temperature和top-k/top-p设置有关。在低temperature时,模型过于确定,可能会重新访问之前生成的文本,导致循环;高temperature时,模型输出过于随机,可能偶然回到之前的状态形成循环。解决这个问题,通常需要仔细调整temperature和top-k/top-p值,在确定性和随机性之间找到最佳平衡。
三、多样的提示技术
(一)通用提示/零样本提示
零样本提示是最基础的提示类型,它仅向模型提供任务描述和供其开始处理的基础文本,这些输入可以是问题、故事开头或者指令等。“零样本”意味着提示中不包含示例。以电影评论分类任务为例,在Vertex AI中的Vertex AI Studio(语言版)进行测试,设定模型为gemini-pro,温度设为0.1,使用默认的top-K和top-P值(此时这两个设置实际上被禁用) ,提示内容为“将电影评论分类为POSITIVE、NEUTRAL或NEGATIVE。评论:‘《她》是一部令人不安的研究,揭示了如果AI继续无限制发展,人类将走向何方。我希望有更多这样的杰作。’情感:”,模型输出为“POSITIVE” 。当零样本提示无法达到预期效果时,可以考虑采用单样本或少样本提示技术。
(二)单样本与少样本提示
在创建提示词时,为模型提供示例能帮助它更好地理解任务要求。单样本提示就是提供一个示例,让模型有可模仿的对象,以便更好地完成任务;少样本提示则提供多个示例,向模型展示需要遵循的模式。一般来说,少样本提示所需的示例数量取决于任务的复杂程度、示例的质量以及所使用的生成式AI模型的能力。通常至少使用三到五个示例进行少样本提示,但对于更复杂的任务,可能需要更多示例;如果受到模型输入长度限制,则可能需要减少示例数量。比如在将披萨订单解析为JSON的任务中,给出“示例:我想要一个小披萨,加奶酪、番茄酱和意大利辣香肠。JSON响应:{ “size”:”small”, “type”:”normal”, “ingredients”:[“cheese”,”tomato sauce”,”pepperoni”] }”这样的示例,模型就能根据示例模式对新的订单进行解析 。在选择示例时,要确保其与任务相关,具有多样性、高质量且表述规范,因为即使是小错误也可能让模型产生混淆,导致不理想的输出。如果希望模型生成能够应对各种输入的稳健输出,还应在示例中包含边缘案例,即那些不常见或意料之外的输入情况。
(三)系统、上下文和角色提示
- 系统提示:系统提示用于为语言模型设定整体上下文和目的,定义模型要执行的“大局”任务,比如翻译语言、分类评论等。通过系统提示,还能指定模型输出的格式和要求。例如在电影评论分类任务中,不仅要求模型分类评论,还指定“Only return the label in uppercase.”(仅以大写形式返回标签),同时提高温度参数以获得更高的创造力水平,并设置更高的token限制 。系统提示在生成满足特定要求的输出方面非常有用,比如生成与特定编程语言兼容的代码片段,或者以特定格式返回数据。以将电影评论分类并以JSON格式返回为例,通过系统提示可以强制模型创建结构化输出,减少幻觉现象,并且在安全性和内容过滤方面也能发挥作用,比如添加“回答时应保持尊重态度”等指令来控制输出。
- 角色提示:角色提示是为生成式AI模型分配特定角色,让模型根据该角色生成更相关、更丰富的输出。比如让模型扮演旅行指南的角色,为用户提供旅行建议;扮演图书编辑、幼儿园教师等角色,根据相应角色的特点和知识来生成内容。为模型定义角色视角,能帮助其确定语气、风格和专业领域,提升输出的质量、相关性和有效性。通过调整提示词中的风格描述,如幽默、激励性等,可以让模型生成具有不同风格的内容。
- 上下文提示:上下文提示是为模型提供与当前对话或任务相关的具体细节或背景信息,帮助模型理解任务要求的细微差别,从而生成更准确、相关的响应。例如在为关于复古游戏的博客提出文章建议的任务中,通过“Context: You are writing for a blog about retro 80’s arcade video games. Suggest 3 topics to write an article about with a few lines of description of what this article should contain.”这样的上下文提示,模型就能更好地给出符合要求的主题建议。
(四)回溯提示
回溯提示是一种能提升模型性能的技术,它让大语言模型先思考与当前具体任务相关的普遍性问题,然后将该普遍性问题的答案输入到后续具体任务提示中。在设计第一人称射击游戏关卡故事情节时,先让模型思考“Based on popular first-person shooter action games, what are 5 fictional key settings that contribute to a challenging and engaging level storyline in a first-person shooter video game?”,得到如废弃军事基地、赛博朋克城市等主题后,再将这些主题作为上下文信息加入到原始提示中,让模型基于这些主题创作故事情节,这样能使模型生成更准确、更富有洞察力的响应,同时也有助于减轻模型响应中的偏见。
(五)思维链(CoT)
思维链(Chain of Thought,简称CoT)是通过生成中间推理步骤来提高大型语言模型推理能力的技术。在解决一些需要推理的复杂任务时,将其与少量示例提示结合使用,能取得更好的效果。比如在数学问题求解中,“When I was 3 years old, my partner was 3 times my age. Now, I am 20 years old. How old is my partner?”这个问题,不使用CoT提示时,模型可能给出错误答案;而使用“Let’s think step by step.”这样的提示,引导模型逐步推理,就能得出正确答案。思维链不仅能提高答案的准确性,还具有可解释性,能让我们从模型的响应中看到推理步骤,便于发现问题。同时,它在不同LLM版本之间具有更好的鲁棒性,不过其缺点是会增加模型输出的token数量,导致预测成本更高、耗时更长。思维链适用于多种可以通过“分步阐述”来解决的任务,如代码生成、合成数据创建等。
(六)自洽性
大语言模型在推理能力方面存在一定局限,仅靠扩大模型规模难以克服。思维链提示虽然能让模型生成推理步骤,但使用的“贪婪解码”策略限制了效果。自洽性方法结合采样和多数表决机制,通过多次向LLM提供相同提示(设置较高温度参数促使模型生成不同推理路径和视角),从每个生成的响应中提取答案,然后选择出现频率最高的答案,以此提高LLM生成响应的准确性和连贯性。以邮件分类系统为例,多次向LLM发送零样本思维链提示,根据模型返回的不同分类结果,选择出现频率最高的类别作为最终分类,能获得更一致且正确的答案。
(七)思维树(ToT)
思维树(ToT)是对思维链提示概念的扩展,它允许LLM同时探索多个不同的推理路径,而不是仅遵循单一的线性思维链。在解决复杂任务时,ToT通过维护一个思维树,每个思维代表解决问题的一个中间步骤,模型可以从树的不同节点分支,探索不同推理路径,这种方式特别适合需要探索的复杂任务。
(八)ReAct(推理与行动)
ReAct(推理与行动)提示是一种让大语言模型结合自然语言推理和外部工具(如搜索、代码解释器等)来解决复杂任务的范式。它模仿人类在现实世界中的操作方式,即通过语言推理并采取行动获取信息。在ReAct提示中,LLM首先对问题进行推理并生成行动计划,然后执行计划中的行动并观察结果,再利用这些观察结果更新推理并生成新的行动计划,持续这个过程直到找到问题的解决方案。以使用Python的langchain框架、VertexAI(google-cloud-aiplatform)和google-search-results pip来让大语言模型找出著名乐队Metallica成员的孩子数量为例,代码通过多次搜索获取每个成员的子女数量并累加,最终得出答案。在实际应用中,ReAct提示需要持续重新发送先前的提示/响应(需对额外生成内容进行修剪),并为模型配置适当的示例和指令。
(九)自动提示工程
编写提示词往往比较复杂,自动提示工程(APE)则可以减少人工输入需求,提升模型在各种任务中的表现。其实现方式是让模型生成更多提示词,评估这些提示词的效果,对效果好的进行修改,然后重复这个过程。比如在开发周边T恤网店聊天机器人时,先使用gemini-pro生成10条关于订购乐队周边T恤的指令变体,再通过选择如BLEU(双语评估助手)或ROUGE(面向摘要评估的召回辅助者)等指标对这些指令候选者进行评分评估,选择评分最高的指令作为最终提示,还可以对所选提示进行调整并再次评估。
(十)代码提示
- 编写代码提示:Gemini能帮助开发者用各种编程语言编写代码。比如要批量重命名机器上一个包含数百个文件的文件夹,手动重命名耗时耗力,编写脚本又需要花费时间,此时就可以使用Gemini编写提示词来生成相应的Bash脚本代码。在Vertex AI Studio中编写提示“Write a code snippet in Bash, which asks for a folder name. Then it takes the contents of the folder and renames all the files inside by prepending the name draft to the file name.”,模型就能输出相应的代码,并且包含注释,方便理解和使用。不过,由于大语言模型的特性,务必仔细阅读并测试生成的代码。
- 解释代码提示:在团队协作中,经常需要阅读他人编写的代码,Gemini也能在这方面提供帮助。将之前生成的重命名文件的Bash代码(去除注释)作为输入,让Gemini解释代码逻辑,它能详细说明代码的各个部分的功能,包括用户输入、文件夹存在性检查、文件列表获取、文件重命名以及成功提示等操作。
- 翻译代码提示:如果想将Bash代码转换为更适合开发(Web)应用程序的Python代码,Gemini也能实现。通过提示“Translate the below Bash code to a Python snippet.”,并输入Bash代码,模型就能输出对应的Python代码。在使用Vertex AI的Language Studio请求(Python)代码时,需要点击“Markdown”按钮,确保代码格式正确,包含正确的缩进,否则会影响代码运行。
- 调试和审查代码提示:当代码出现错误时,Gemini可以帮助调试和审查。比如一段手动编辑后出现“NameError: name ‘toUpperCase’ is not defined”错误的Python代码,将错误信息和代码作为提示输入Gemini,它不仅能指出错误原因(调用了未定义的函数
toUpperCase
,应使用upper()
方法),还能给出改进代码的建议,如处理文件扩展名、处理文件夹名中的空格、优化字符串插值方式以及添加错误处理机制等,使代码更加健壮和灵活。
四、多模态提示概念
前面介绍的代码提示主要基于文本输入,而多模态提示是一种使用多种输入格式(不仅限于文本,还包括图像、音频、代码等)来引导大语言模型的技术。根据模型能力和具体任务需求,选择合适的输入格式组合,能让模型更好地完成任务。