自动生成prompt:Automatic prompt engineering
作者:刘小虎,中国科学院计算技术研究所
来自:青稞AI
前言
组内现在正在做大模型相关,笔者负责prompt engineering,在实际工程中会发现prompt对模型的输出影响巨大,可能一个字就会改变模型的输出(笔者用的是量化后的7B model),而且换一个模型,就要改变手工制定的prompt,非常麻烦和受限。因此想到了Automatic prompt engineering。由此记录自己的paper阅读,肯定会有自己的理解错误的地方,如有发现请联系笔者进行更正。
APE: Larger Language models are human-level prompt engineers
paper: Large Language Models Are Human-Level Prompt Engineers
链接:https://arxiv.org/abs/2211.01910
accepted by ICLR 2023
code: https://github.com/keirp/automatic_prompt_engineer
lilian weng's blog: https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/
这篇论文的核心思路就是:
• 从训练集中生成候选prompt
• 评估这些候选prompt,选出得分最高的prompt
• resample, 使用LLM 生成语义相近的prompt(2中得分最高的prompt),然后再进行评估,最终得到prompt
生成候选prompt
论文指出有三种生成候选prompt的方式
• Forward Mode Generation
这个比较直观,就是写一段指令,然后将训练集的输入输出给出,直接让LLM自动生成prompt。这个生成prompt的模板不知道是哪的出处,有网友知道是哪的,可以直接指出。
• Reverse Mode Generation
这个也很直观,就是填补空白的方式。但是这个方式怎么实现呢?我比较疑惑,不知道怎么实现这个填补空白的方式,因为LLM都是一个字一个字的自回归生成。
• Customized Prompts
这一类就是自己根据task来设计了,论文给出了一个示例。我认为就是使用不同的模板来扩充了多样性(可能是我的理解有错误)
评估候选prompt
• Execution accuracy
这种方式其实就是使用GT来进行比较。将得分最高的prompt扔进模型,得到结果和GT进行比较。
• Log probability
给定指令和问题后所得到的所需答案的对数概率
另外,这一步如果在全量训练集上评估,则开销非常大,因此作者提出一种multi-stage策略。大致思想是先在少量subset上评估,然后过滤掉比较差的,循环这一过程直到候选集足够小,此时再在全量训练集上进行评价、挑选。
Resample
使用的是蒙特卡罗搜索的方式。说的这么玄乎,其实还是使用LLM来生成prompt!但是这一步他是使用之前得分最高的prompt再次来生成语义相近的prompt。
这里可以是迭代的方式进行。怎么迭代呢?笔者是这样认为的:
1、得到语义相近的prompt。
2、评估这些prompt。
3、得到得分最高的prompt 重复1、2步骤。
作者实验发现,对于比较难的任务,进行resample能够进一步提升效果。
ProTeGi (Automatic Prompt Optimization with “Gradient Descent and Beam Search)
paper: Automatic Prompt Optimization with "Gradient Descent" and Beam Search
链接:https://arxiv.org/abs/2305.03495
code: https://github.com/microsoft/LMOps/tree/main/prompt_optimization
accepted by EMNLP 2023
这篇文章早就在arxiv上发出来了。当时的缩写还是APO。今年被EMNLP2023收录
首先让我们先来看看这篇论文的整体框架图。
方法:利用数值梯度下降自动优化提示,同时结合beam search和bandit selection procedure提高算法效率。
优势:无需调整超参数或模型训练,ProTeGi可以显著提高提示的性能,并具有可解释性。
什么原理呢?
• 得到当前prompt的“gradient”
这个“gradient”怎么得到的了呢,这是个啥玩意,怎么还有梯度?注意,注意。人家是带引号的!比喻成梯度。这玩意有什么用呢。
文章指出给定一批error samples(当前prompt无法预测正确的),让LLM给出当前prompt预测错误的原因,这一原因即文本形式的“gradient”。使用的还是LLM!
• 将“gradient”输入到LLM中,得到新的prompt
• 和APE一样,resample, 得到语义相近的prompt,然后迭代。
注意注意啊,每轮迭代中,最外层包含一个beam search过程,以便强化探索。这一块就看不懂了, 也是本论文的贡献之一。没有想过改进,所以略过直接使用。
OPRO (Large Language Models as Optimizers)
paper: Large Language Models as Optimizers
链接:https://arxiv.org/abs/2309.03409
code: https://github.com/google-deepmind/opro
首先来看框架图
然后接着看论文对meta-prompt的定义
blue 蓝色的是 solution-score pairs 也就是 prompt + score。这个score怎么来的呢?使用LLM进行打分,也就是Figure 2 中的 objective function evaluator。这应该也是个LLM, 这个LLM和 LLM as optimizer 可以是同一个 也可以不是。** 注意,这个打分其实就是评估新生成的prompt在任务上的表现,说白了就是和GT进行对比(对了+1)**。
orange 橙色 就是指令 meta-instructions.
purple 紫色 就是task description,包含一些任务的examples、优化的目标等
因此, OPRO的核心思路是让LLM基于过往的迭代记录、优化目标,自己总结规律,逐步迭代prompt,整个过程在文本空间上完成。
PE2 (Prompt Engineering a Prompt Engineer)
paper: Prompt Engineering a Prompt Engineer
链接https://arxiv.org/abs/2311.05661
这一篇paper 是 APE 和 APO (ProTeGi)的改进版,集成了这2个方法的优点。
这篇论文主要提出了一个meta-prompt的东东(等等,我去,这玩意和OPRO这篇论文里的好像啊)
提供更细节的指令和内容
• 提供提示工程的教程
• 2阶段的任务描述
• step-by-step 推理的模板
• 明确指定提示与输入之间的相互关系
结合优化的概念
• batch size : 指的就是使用batch size失败的例子
• step size : 指的就是改变原始的prompt中step size个字
• Optimization History and Momentum : 其实就是增加了以外的prompt和修改后的prompt
看完后惊呼道:这是真能写啊。写的玄乎又玄乎的。一图胜千言
给我的感觉就是前面3篇论文的集成版本。
将OPRO中的meta-prompt的概念用到了 APO中了,然后丰富了模板的内容。有反思分析有推理,迭代的让模型自动修改prompt。
总结
• 上述四篇论文基本上是用作推理、选择、反义词等有确定GT的数据集上
• 使用上面4篇论文需要有自己的数据集,而且每一个任务有一个数据集,然后自动生成一个prompt
• automatic PE, 说是自动,其实就是根据模板让模型不断的去试错,告诉他方向,然后达到好的prompt
• 对于开放式的任务,比如摘要、总结、翻译、介绍等这种开放式没有明确GT的任务,可能不适用!!
• 随着迭代输入的token数量会越来越多,可能会受到计算资源的限制。
微信扫码关注该文公众号作者