大语言模型(LLM)使用深度学习——人工智能(AI)中模拟人类大脑神经网络的类型——来为用户的输入,或者叫“指令”,生成和人类回应类似的文本回应。和传统中使用的确定性算法不同,LLM能够解释自然语言命令,并且从基本的补完上半句到复杂的解题都很擅长,因此它既对用户友善,又用途多样。在很短的时间里,LLM已经在技术领域中随处可见,渗透进各种不同的学科当中。对业界和学界的研究者来说,LLM很快成为了写作、编程和可视化时无可替代的工具[2,3,4]。
为何要写指令
和LLM之间的交互乍看起来很简单:输入一个问题,立刻就能得到答案!但是,要想有效率地和这些模型交互就更有挑战性了,涉及到的细节比初看起来更多[5]。这就为使用LLM带来了一个根本的限制:其输出的质量与指令的质量直接相关——这一限制在当前有关LLM能力的讨论中常常被忽视。一份精心撰写的指令可以生成一份精准的回复,这样就能最大程度提高模型表现。相反,指令写得不好就会产生模糊、错误或文不对题的答案。
这种限制很大程度上是因为LLM本身的性质。虽然它有着复杂的算法和巨量的训练数据(包含网页、维基百科、社交网络贴文、学术论文、书籍和说明书等材料),但它本质上还是一个数学模型,缺乏对世界的理解。这些工具被设计来预测文字出现的概率,而不是生成真理。它们会识别训练集数据中的模式(下一个最可能的字元),通过统计学上的概率预测文字。这样生成出的文字非常依赖于训练集数据中所出现的文字模式。
进一步说,因为每个预测出的字元都会影响接下来的字元,前面错一个词就会引发恶性循环,越来越不准。因此指令写得好既能增加每个字元预测准确的概率,也会减小错误不断积累的效应。指令很重要的另一个关键原因在于LLM可以根据上下文学习。这个能力让模型可以暂时适应它们所收到的指令,因此指令对传达上下文信息至关重要。
因此,掌握编写有效指令的艺术与科学——有时被称为“指令工程”——是提升LLM能力的关键。想要得到最优的结果,就得同时拥有领域相关的知识和对模型本身的理解和技术,而这需要通过学习和经验来锻炼。因此,第一条建议就是去摆弄模型。与模型的交互越多,就越能理解其中的细节,以及它能如何帮助我们达成需求。这篇评论列出了可行的策略和规则,以及其背后的原理,为精通此道奠下基础。
引导模型得出解法
LLM缺乏对语义的理解,因此想要它举一反三超出训练集很难。但是,它的参数化能力让它获得了一套昂贵的过往数据(“记忆”),可以从中提取信息。这套记忆来源于训练数据(“长期记忆”)以及指令和交互记录(“工作记忆”)的综合。这两者的组合——推广能力低下但记忆力超群——意味着LLM可以在复杂的任务被拆解成较小的任务和步骤后有效处理它们。
例如,和宽泛的命令把“文本翻译成中文”相比,可以考虑把它拆解成两步:“首先按字面意思翻译,保持含义不变;然后将翻译润色,让它符合中文的语言习惯”。类似地,与其让它直接写出一篇1000字的论文,不如尝试把任务分解成子任务,用具体的指令分别生成出概述、结论和中心论点。
清晰、逐步的指令会降低模糊性和不确定性,因此可以生成更为准确的回复。把更大的任务简化成更小的逐步任务,就可以有效利用LLM稳健的记忆力,并且能通过结构性指示来弥补它有限的抽象能力。
添加相关的语境
LLM比人类的“工作记忆”大多了。因此,想要让它提供精准且符合问题语境的回复,在输入中提供相关的语境就很重要了。一个限定语境的问题应当:
包含具体内容。将你的问题根植于具体的细节之中,这样才能引导LLM产生更为准确,相关的理解。因此,不要让它起草一份求职信,而是把职位广告和你的简历一并提供给它,以增加相关的上下文。
给信息排出优先级。让你的交互基于相关的事实信息。不要问模型怎么才能永远幸福快乐,给它提供一份经同行审议的论文,基于那篇研究问它问题。
这样做的目的不是给LLM灌输大量泛用的知识,而是给它和你的问题相关的细节。当指令中包含了具体的细节时,LLM就会生成更有洞察力,更精细的回复。
指令要明确
你要是想点一杯最喜欢的饮料,不会随便走进一个咖啡馆,说“请来杯咖啡!”。同样,也不要期待LLM能读懂你的心。虽然LLM能准确猜到你的想法、甚至超越期待的时候很令人欣喜,但给出不明确的请求就要承担LLM猜测意图时文不对题的风险。明确性是关键。
要想降低模型预测时的不确定性,说明你想要什么。不要说“润色这篇文章”,而是提供一份更精确的指示,考虑你想要什么样的风格,你的目标受众,以及你有没有某种特定的需求(例如明确性或简洁性)。因此,一段更具体的指示可能是“像个顶级期刊的顶级编辑那样,润色这篇文章让它更为清晰流畅。”
再举一个例子,若是要让它给你建议一个名字,就可以通过加入限制条件来明确要求:“名称必须以动词开头,其隐含的主语/行为主体是用户”。尽量明确地说明任务、目标、想要的重点和任何限制条件。模糊的需求就会导致模糊的回应,而明确的指令有助于:
减少指导语及需要处理的文字的模糊性(例如,使用特定标签、字符或符号作为分隔符)。
让LLM可以专注于你的特定需求方面。
提供清晰的条件来判断模型的准确度。
虽然LLM在设计上追求对话提炼,使用明确指导提前说清目的就可以简化这一流程。你可以说明目的和限制条件来控制对话方向。与此同时,不要对尚未明确定义的目标做过多描述,这也可能会让它走上错误的路线,或是错过意料之外(也可能是更好的)答案。
让它提供多种选项
LLM的能力之一就是它的巨量“长期记忆”。为了挖掘LLM这方面的潜力,可以让它提供一系列选项,而不是一项建议。你可以要求它给出三个类比来解释一个概念,五个点子来引入,十种选项来替换最后一段,或是二十个名字来命名一个函数——让模型给你足够多的思维材料,好从中自由选择。
除了要求多种选项以外,你还可以考虑重复用同样的指令多次生成回复。重新生成回复会让回复中产生更多变化,并改进质量。要求多种选项和重生成回复有很多好处,具体包括:
鼓励模型探索多条出路,这会让模型的输出有更强的创造力和多样性。
为你提供更全面的选项组合,尽量减少得到次优或偏颇的建议的风险。
加快迭代优化。
LLM是一个多能型的思维搭档:问它从多种角度提供大量选项可以丰富你的决策流程。丰富的选项能够解锁最多的效益。
设定角色
LLM巨量的训练数据集意味着它能够模拟各种角色来提供专业的反馈或独特的视角。和征询泛用建议或信息相比,你可以考虑让模型做个角色扮演:让它模仿你的典型读者来提供写作上的反馈;扮演一名写作教练来帮助修订手稿;扮演一只擅长人类生理学的西藏牦牛来解释高海拔的影响;或扮演一块有智慧的奶酪蛋糕来讲奶酪蛋糕比喻——可能性是无限的。设定角色可以:
给模型的回复设定语境,这让它更符合你的特定需求。
能与模型进行更有交互性和吸引人的对话
产出更为精细和专业的信息,这会提升输出的质量。
提出创造性手段来解决问题,鼓励跳出框架的思考。
人格化提供了框架,可以让它使用独特的视角来产出回应。
能利用上LLM的角色扮演能力的话,就能获得更多有针对性和符合语境的回复(并且在过程中获得更多乐趣!)
给它例子,不要光解释
LLM擅长小样本学习(有示例的学习)[6]。因此,一个特别有效的手段就是使用具体的例子来丰富你的意图。不要模糊地讲“以这些数据制图”,考虑提供一个例子:“为这些数据画张条形图,类似附件论文中的图[3]。”就像对理发师描述想要的发型那样,一张图片赛过千言万语。无论是编程时给一段代码还是写作时给一段例句,明文写出的例子会成为模型无价的指南。提供一套可用的参考可以达成很多目的:
明确语境,这让LLM可以更好地理解你的要求的细微之处。
减少达成想要的输出所需的迭代次数。
提供标准以评价模型的输出。
示例可以作为LLM的路线图,引导它生成出和你的期待一致的回复。因此,考虑在你的指令中加入说明性示例来改进表现。
声明想要的输出格式
LLM经常废话太多。明确你想要的格式——重点,阅读水平,语气等等——有助于限制可能结果,改进相关性。例如,不要说“总结关键结论”,可以声明输出格式:“总结出关键结论并分项列举,使用高中生也能理解的语言。”预先声明格式还可以提供清晰的标准来评估LLM的表现。你可以选择:
要求分项列举来简明扼要地总结。
使用轻松的口吻,增加易读性。
增加代码注释,提供说明。
限制回复长度保证简洁,或是限制阅读等级来保证易于理解。
声明你想要的格式可以设定明确期望,简化输入的指令。约束能促进切题。
实验,实验,再实验
什么指令更有效没有一定之规。稍微调整一下可能就会产生显著甚至意外的差异。考虑以下示例:
在一系列推理问题中,在指令中简单加入“一步一步思考”就可以让GPT-3的表现好得多——这是思维链指令的一种[7]。
LLM可以回应情绪性的信息。根据一篇未经同行审议的预印本[8],加入一些短语例如“深呼吸一下——这事对我的职业生涯很重要”或是“我会给好答案200块小费”可以提高回复的质量。
一份未经同行审议的研究提出,可以通过添加“识别出问题中的关键概念并提供一份教程”或“想三个相关但不同的问题”来强化复杂的编程任务中的表现——这是一种类推指令[9]。
虽然LLM在直接面对复杂计算问题时可能会失利,但它们生成可用的计算机代码来解决同样问题时就很出色(例如,“写一段Python代码来解决这个问题”)[10]。
这些例子证明LLM对指令非常敏感。因此你必须实验,实验,再实验!有效率地使用LLM要求你持续进行创造性的实验。你还可以考虑:
调整措辞、长度、详细度和限制条件。
调整不同的示例、语境和指示。
既尝试对话性的指示,也尝试精准说明性的指示。
在不同的LLM上尝试相同的指示。
因此,把指示当成可以测试的假设,然后使用其结果中获得的信息来进行迭代。并非所有尝试都会成功,但每次尝试都会有新的收获。坚持下去,最优结果就会出现。
结论
LLM在自然语言处理的领域里是无人能比的搭档。这篇评论为解锁LLM的全部潜力提供了可执行的策略及其原理。
核心要点包括:将复杂任务拆解成小任务和步骤;使用相关细节提供框架;明确说明目的;以及用示例表明意图。其他推荐包括:设定角色,要求提供选项来利用LLM的广泛性;声明格式来设置预期;不断实验以获得最优结果。
结合起来,这些策略能帮助用户创建详细,结构性的指示,来最有效地处理特定任务。虽然有效编写指令的技术可能不会让你永远幸福快乐,但它一定能让你的工作效率和乐趣得以倍增。
本文来自微信公众号:自然系列 (ID:nature-portfolio),作者:Zhicheng Lin