前几天几位学者发表了一篇关于提升大语言模型性能的论文。
通过对大语言模型(GPT-3.5/4和LLaMA-1/2)的深入分析和实验验证,总结出了26条有效提升大语言模型性能的关键原则。
从提示结构、具体性、用户交互、内容风格和复杂任务等方面验证了各条原则的有效性。
在人工设计的ATLAS 基准中,GPT4回答的质量和准确性分别提高了 57.7% 和 67.3%。
实用性还是相当高的,对大家平时使用ChatGPT有非常大的指导意义。
由于原文是英文且专业术语比较多,内容也不够详细,并且有些原则之间重合度过高。
为了方便大家理解,所以川哥在原文的内核之上细化并去除了一些不太贴合的原则。
文章内容有点长,但干货相当足,建议收藏下来仔细阅读。
类别一:内容语言
原则1:不必礼貌
向ChatGPT下指令的时候,没必要添加太多礼貌性的语言。
比如:“请”、“谢谢”、“可不可以”等等,直奔主题。
直接的指令更易于模型理解,减少由于礼貌性语言带来的潜在歧义,从而提高了响应的准确性。
LLM的训练过程中重点在于理解和执行命令,而不是解读语气或礼貌程度,所以礼貌性语言并不会提高模型的性能。
并且由于token限制,越简洁地描述出自己的需求,就越利于大模型的发挥。
原则2:使用肯定性指令
这个原则的核心在于使用积极、明确的表达方式,去掉否定或模糊的语言。
以便提高和ChatGPT交流的效率和清晰度。
比如:
否定指令的例子:不要使用复杂的词汇。肯定性改写:使用简单易懂的词汇。否定指令的例子:别忘了包括所有重要细节。肯定性改写:确保包含所有重要细节。否定指令的例子:不要只给我概述,我需要具体信息。肯定性改写:提供详细的具体信息。通过使用肯定性的语言,我们可以更直接、明确地传达我们的意图和需求。
避免可能的误解或模糊性,让ChatGPT更清晰准确地完成任务。
原则3:人性化指令
在指令中使用短语“以自然、人性化的方式回答问题”。
使用自然和人性化的语言能提高用户与模型的交互质量。
当回答以用户更易理解和关联的方式呈现时,更有可能被正确解读和接受。
尤其是在解释复杂概念或专业知识时,我们更容易理解并记住以自然语言表达的信息。
原则4:客观性指令
在提示中添加短语:“确保你的回答无偏见,不依赖于刻板印象”。
这样可以确保ChatGPT在生成回答时,避免依赖于潜在的偏见或成见。
通过这种方式,GPT可以提供更准确、公正和全面的回答,从而提高其整体性能和可靠性。
▲原论文插图(中文翻译版)
类别二:人机交互
原则1:融入目标受众背景
给大型语言模型(LLM)下达指令时,明确指出这些指令是针对哪种听众的。
比如某个领域的专家或者初学者。
这可以帮助模型更好地理解提问的上下文和预期的回答风格。
比如:
▲ 原论文插图(中文翻译版)
明确了预期听众是“5岁的孩子”之后,模型就知道需要用适合小孩子理解的方式来回答。
从而使用更简单的语言和概念,避免过于复杂或专业的术语。
这样可以确保模型的回答既准确又适合目标听众的理解能力。
原则2:确立主体
加入短语 "Your task is"(你的任务是)和 "You must"(你必须)。
不要以“我”的身份去给ChatGPT下指令。
比如“我希望”,“我需要”等等。
直接告诉ChatGPT这是“你”的任务。
虽然还不清楚这个原则的确切原因,但经过多次实验,这条原则确实可以提升ChatGPT的性能。
原则3:给小费 / 原则4:设置惩罚
本质上是利用情感刺激来提升ChatGPT的性能。
我之前在这篇文章中有过详细的讲解,直接看这篇文章就可以:
《GPT 4.0被降智!教你一句话提高GPT智商!》
原则5:反向提问
允许ChatGPT向我们提问,比如输入提示词:“从现在开始,你可以向我提问以......”
这样可以让ChatGPT从我们这里获得精确的细节和要求。
帮助它有足够的信息提供所需的输出,从而提升回答的精确性。
原则6:给大模型分配角色
很传统的一个提示词技巧,赋予模型特定角色或身份来增强交互和输出的质量。
这样能够帮助模型更好地理解和回应你的需求,特别是在需要专业知识或特定角度的场景中。
比如:
“作为一名历史学家,解释一下罗马帝国的崩溃原因。”
“作为一名经济分析师,评估当前全球经济衰退的原因和可能的长期影响。”
等等……
通过这样的角色设定,模型能够更加精准地理解用户的意图和需求,从而提供更贴切、更加专业的回答。
类别三:提示结构和清晰度
原则1:结构化指令
结构化提示词一直是提示词领域的主流结构之一,适合新手入门以及后期维护。
这篇论文中给出了一个比较简单的结构化模块:
以“###Instruction###”开头;
接着是“###Example###”或“###Question###”;
然后呈现你的内容。
使用一行或多行空白行分隔指令、示例、问题、背景和输入数据。
比如我们用GPT获取关于如何改进团队沟通效率的建议,那就可以使用这种格式来创建提示词:
###Instruction###请提供一些提高项目团队沟通效率的具体建议。###Example###例如,使用每日站立会议来快速更新项目状态。###Question###团队目前遇到的沟通障碍有哪些?如何克服这些难题?首先明确指令:提高沟通效率的建议。
接着提供一个具体的例子:每日站立会议,帮助模型了解你需要的信息类型。
最后提出相关问题,进一步指导模型提供更具体和相关的建议。
通过这样的结构化提示,就能够有效地引导模型,以此获得更准确和有用的回答。
原则2:使用分隔符
“使用分隔符”和“结构化指令”其实在实际应用中有重叠,但这两个原则侧重的方面略有不同。
“结构化指令”强调在构造指令时的整体结构和清晰度,确保指令的各个部分都被明确区分和组织,以便模型能够更好地理解和执行。
而“使用分隔符”更偏向于在提示中使用明确的标记或字符来分隔不同部分的技巧。
这是“结构化指令”的一种具体做法,用于清晰分隔指令中的不同元素,比如指令、例子和问题。
比如OpenAI官方指导手册就明确指出使用三引号、XML标记、节标题可以帮助划分要区别对待的文本部分。
类别四:具体性信息
原则1:明确内容要求
明确指出模型必须遵循的要求,以生成内容的关键词、规则、提示或指令的形式。
比如编写一份报告,总结客户最近的市场表现和潜在的改进策略:
请使用以下关键词和指令来生成市场分析报告:关键词包括 '客户满意度'、'市场趋势'、'竞争对手分析'。报告需要包含以下几个部分:首先是对客户当前市场表现的总结;然后是对竞争对手的分析;最后提出针对我们服务的改进建议。请确保报告结构清晰,语言简洁明了,以便客户容易理解。这样的指令不仅明确了任务的目标和期望结果,还提供了具体的关键词和结构指南。
能够有效帮助GPT减少误解的可能性,更准确高效地理解和执行任务。
原则2:添加必要信息
要编写详尽的论文/文本/段落/文章或任何类型的文本,在指令中指明关于撰写[话题]的[论文/文本/段落],并添加所有必要的信息。
这条原则是在上一条原则的基础上,进一步细化,确保ChatGPT撰写的内容涵盖所有相关的信息。
适用于需要深入探讨特定话题的情况。
比如上一个编写报告的例子。
在原有指令的基础上添加报告相关的具体信息,就可以确保ChatGPT能根据准确的数据进行回答。
当然,如果是一些比较重要的机密信息,还是建议谨慎上传。
类别五:复杂任务和编码提示
原则1:分解任务
把复杂任务分解为一系列简单的交互式指令。
这样可以帮助模型更好地理解任务的每个组成部分,并更准确地聚焦于特定的子任务。
通过交互式提示,逐步引导模型完成整个复杂任务的不同阶段,帮助GPT保持任务的逻辑顺序和结构。
这个原则我在之前的文章中已经有过非常详细的解释和案例拆解了。
可以直接参考这篇文章:
《GPT4变懒!官方确认!教你5步提升GPT性能!》
原则2:示例驱动型提示
其实就是少样本提示。
通过提供几个相关示例,向模型展示所期望的任务类型和格式。
帮助模型更好地理解你的具体需求,减少可能因模糊或不明确的指令而产生的歧义。
包括OpenAI的官方指导手册,也把提供示例作为重要的提示词技巧之一。
原则3:将CoT与少量样本提示相结合。
把思维链(CoT)与少量样本提示相结合,可以创建一种强大的方法,用于指导和优化ChatGPT问题解决过程。
比如你想教会模型解决数学应用题。
那就可以提供几个样本,每个样本都包含一个问题、详细的思考过程(CoT),以及最终的答案。
例如:
问题:“一个篮子里有5个苹果,你拿走了2个,篮子里还有多少个苹果?” 思维链:“开始时篮子里有5个苹果。我拿走了2个苹果。5减去2等于3。所以,篮子里还剩下3个苹果。”答案:3个苹果。 问题:“如果你有3块蛋糕,每块蛋糕切成4份,你总共有多少份蛋糕?”思维链:“每块蛋糕切成4份,所以每块蛋糕有4份。我有3块蛋糕,所以总共是3乘以4等于12份。” 答案:12份。通过这种结合思维链和少量样本提示的方法,可以有效地指导和优化模型在处理复杂问题时的表现。
原则4:逐步思考
使用特定的词语来引导模型的思考过程和输出方式,能够让GPT按照更具体和有序的方式回应。
比如使用“逐步思考”这样的指令时,实际上是在指示模型按照一步一步的方法来处理和解释信息。
这种方式特别适用于复杂或需要详细解释的任务。
因为它鼓励模型分解任务或问题,按照逻辑顺序进行思考和回答,从而提供一个清晰、有条理的答案。
原则5:复杂编码提示管理
处理复杂的编程任务,尤其是当任务涉及到多个文件时,可以使用一个特定的格式来构建指令:
“从现在开始,每当你生成跨越多个文件的代码时,生成一个[编程语言]脚本,该脚本可以运行以自动创建指定的文件或对现有文件进行更改以插入生成的代码。[你的问题]”。
比如我想用GPT生成一个多文件的Python项目,创建一个网页爬虫。
就需要一个主脚本来运行爬虫,一个用于解析网页数据的模块,以及一个用于存储数据的模块。
那我就可以这样构建指令:
从现在开始,每当你生成跨越多个文件的代码时,生成一个Python脚本。该脚本可以运行以自动创建以下文件:一个名为main.py的主脚本,用于运行网页爬虫;一个名为parser.py的模块,用于解析网页数据;以及一个名为storage.py的模块,用于存储爬取的数据。请确保这些脚本可以协同工作,完成网页爬虫的整个任务流程。
这样的指令可以引导语言模型不仅生成需要的代码,还能组织这些代码以适应多文件项目的结构。
通过这种方式,就可以更有效地管理复杂的编程任务,确保各个部分的代码协同工作,实现整个项目的目标。