最近我有幸参与了一个与自然语言处理相关的项目,团队选择了大语言模型作为核心技术之一。在一个分类任务中,我们通过精心设计提示词,显著提升了模型的准确率。这个过程让我们积累了一些有用的 “提示词” 经验。接下来,我将分享一些关于 “提示词” 优化的经验和技巧,希望能够帮助大家更好地利用大语言模型。
一、对大语言模型的重新认识
在项目中,我们逐渐意识到,要真正发挥大语言模型的潜力,仅靠工具层面的了解是不够的,还需要对其内部运作机制有所了解。
简单来说,大语言模型通过对海量文本数据进行学习,捕捉文本间的模式和关联,从而实现理解和生成文本的能力。本质上讲,大语言模型是一种统计模型,它对互联网上的公开文本(如新闻、博客、社交媒体、书籍等)进行统计,识别词语间的深层次关系。从这点可以知道,大语言模型所掌握的知识和所具备的能力也是与互联网文本数据中的基本统计特征相对应的。
这让大语言模型具备这样几个值得注意的特点:
- 语义相似性: 它能很好地识别不同词汇之间的关联。
- 常见语法结构和语序: 对日常使用的句式结构了然于胸。
- 部分领域专业术语: 虽然擅长某些领域的专业词汇,但可能在深层次的行业知识上略有不足。
- 模式与关联学习: 通过海量数据,习得了许多模式和关联,但对其背后的逻辑或原理,不一定有更深入的理解。
大语言模型的推理是怎么回事呢?
大语言模型的输出过程可以理解为一系列的条件概率计算。在生成文本时,模型会根据已有的上下文信息,预测下一个词的概率分布,并选择概率最高的词作为输出。这个过程不断重复,直到生成完整的文本。
尽管乍一看似乎缺乏逻辑推理,但实际上,逻辑推理始终潜藏于整个过程。这是因为,词语之间本身就存在着内在的逻辑关联,每个词可以被视为是基于前置词汇进行逻辑推导而得出的结果。因此,每一次新词的生成都是一次微妙的推理过程。互联网文本如此,大语言生成的文本亦是如此。
基于此,我们也可以了解为什么加上 COT 之后模型能输出更准确的结果。因为 COT 为模型注入了更多的推理逻辑过程,有了这些之后,生成的文本在逻辑上就更能成立了,输出正确答案的概率自然也变高了。(COT 是 Chain of Thought 的缩写,即思维链,是一种让模型逐步推理出答案的方法。)
二、提示词优化
了解这些如何能指导我们更好的应用大语言模型呢?那就是提示词优化了。
提示词是与大语言模型交互的途径和关键,它决定了模型如何理解和生成文本。优化提示词被认为是一件非常 tricky 的事情,并不容易。根据我们的经验,在优化提示词时,把上面的对大语言模型特点的理解谨记于心,常常能找到优化的方向。
三、一些提示词优化经验
提示词优化的目的是让大语言模型更好地理解我们的意图,从而生成更准确、更符合预期的输出。
那么大语言模型常常在什么地方出问题呢?我们观察到:
- 理解偏差:大语言模型可能误解了我们的意图,导致输出不符合预期。
- 信息不足:大语言模型可能缺乏足够的信息来生成准确的输出。
- 逻辑错误:大语言模型可能在推理过程中出现逻辑错误,导致输出不准确。
- 推理不足:大语言模型可能输出内容很少,推理不足,导致输出不准确。
- 关注的重点不一致:大语言模型可能关注的重点与我们预期的不一致,导致输出错误。
了解这些可以让我们更好地理解大语言模型的行为,从而更有针对性地优化提示词。
四、下面分享一些具体的优化经验
为了更快的响应速度,一般的提示词会直接让大语言模型输出结果,不要附带其他信息。但是这样一来,出错了就没法知道原因。
1. 为了解决这个问题,我们可以让大语言模型先输出结果,再解释原因
这样一来,如果出错了,就可以根据解释进行分析。例如,我们可以这样提示大语言模型:“请先在第一行直接输出结果,然后换一行开始逐步解释原因”当大语言模型输出错误的结果时,我们可以根据解释的原因来判断错误的原因,从而更有针对性地优化提示词。在上线应用时,只需要设置stop_words为换行符,就可以快速地只获取结果,而不需要解释的原因。
2. 基于大语言模型的解释去分析在哪里表现不好,或者理解有差异,针对性的添加提示词
大模型的解释常常可以帮助我们分析其在哪里表现不好,或者理解有差异。这一方法,通常可以解决由于理解偏差和信息不足带来的问题。我们可以根据这些信息,针对性地添加提示词,来引导大语言模型更准确地理解我们的意图。例如,如果大语言模型在关于分类的定义理解有差异,我们可以在提示词中添加相关的背景知识,来帮助大语言模型更准确地理解。
我在实验过程中,就碰到这样一个例子。我发现大语言模型不能将“钱包”对应到“数字人民币钱包”,而是将其理解为“实体钱包”。我在提示词中添加了“数字人民币钱包”的定义,并说明其简称为“钱包”,就解决了这个问题。再比如,大语言模型可能不能很好的区分两个分类,我们可以在提示词中添加关键的差异点,来帮助大语言模型更准确地理解。当然,这个差异点我们也不用自己想,可以通过询问大语言模型来找到。
我们在实验中的例子是,大语言模型对于用户意图是“完成任务”或者“咨询问题”两个类别识别不够准确。通过分析大语言模型的解释,发现关键的差异在于是否在完成任务的过程中遇到问题。我们在提示词中添加了这一点,模型表现就更好了。
我们都知道COT可以提高大语言模型的正确率,但是COT比较慢,难以应对实时的应用场景。是不是可以把COT编码到提示词中?这样就可以提高正确率,又不会影响响应速度。我们实验发现,这样做是可行的,只需要进行一点抽象即可。
首先,我们可以让大语言模型对错误的用例,使用COT重新解释一遍,如果这次能解释正确,就说明这个逻辑可以参考。但这样的解释可能跟具体的用例强相关,难以直接放到提示词中。这个问题不难解决,我们可以让大语言模型对其他错误的用例也应用COT进行解释,然后找到解释中的共性,将这些共性抽象出来,放到提示词中就可以了。比如,大语言模型有时会把“完成某个特定任务”和“闲聊”混淆,观察大语言模型对错误用例的COT解释,发现大语言模型提到了“是否有目的性”。这是一个很好的共性,我们可以将其提取出来,放到提示词中。把COT编码到提示词中常常能解决逻辑错误和推理不足的问题。
3. 分析性的提示词放在后面,在提示词中编码分析过程,可以提高正确率
这是一个很有意思的发现。一般而言, 我们会把描述任务的提示词放在前面,然后再放需要分析的内容。但事实上这会降低正确率。我们发现,如果把描述任务的提示词放在后面,就可以提高5%左右的正确率。仔细一想,这其实比较符合COT的思路。在COT中,我们也是基于问题进行分析之后得出结果。描述任务的提示词其实蕴含了分析过程,放在后面,一定程度上有COT分析过程的意义,所以可能是更有效的。
4. 保持英文和中文的一致性,不要引入一些隐性的差异
另一个有意思的发现是,大语言模型对于英文和中文的敏感度是不一样的。一些开源的模型,如Llama系列的,其训练数据以英文为主,那么英文的敏感度就可能更高。这给我们的启示是,用英文比用中文可能能取得更好的效果。实际上,在我们项目里面,是中英混合的。我们一开始尝试了多次在提示词中用中文进行解释,但效果一直不够理想。后来我们发现英文名与中文的描述并不是特别一致,我们把一个隐含的结构放在了英文名中。在修改英文名之后,效果就好了很多。
保持中英文一致,常常是解决大语言关注的重点不一致问题的一个不错的方法。
5. 保持提示词使用简洁而严谨的语言风格
简洁而严谨的语言风格,就像是在书写严谨的推理类的文档内容(比如论文),可以让大语言模型更加专注于任务,而不会被其他的信息干扰。在实际应用中,这常常也是有效的,而且,这样的提示词还能节省token,让模型响应更快。
五、总结
大语言模型的能力越来越强大,应用也越来越广泛,但是,实际应用中,我们仍然需要对其进行一些调教,才能更好地发挥其潜力。
本文分享了一些我们对大语言模型的理解,并基于一些实际操作经验分享了我们在提示词设计上的一些发现。希望这些发现能够对大家有所帮助。